천객만래 [千客萬來] (It has an interminable succession of visitors)

RAD Studio 버전

IT - 개발 2019.01.10 14:44

RAD Studio에는 Professional, Enterprise Architect의 3 가지 버전이 있습니다. 

각 에디션의 차이, 기능 자세한 내용은 RAD Studio 제품 버전 및기능 목록 을 참조하십시오.



Posted by SB패밀리

2018년 1월, 12월 프로그래밍 언어 인기도 순위


네덜란드 티오베(TIOBE) 회사가 매달 검색엔진 통계를 이용하여 발표하는 개발언어 인기도 순위


2018년12월



2018년 1월


1년 전 / 1개월 전 정보이지만 대략 트렌드 파악이 간다.

2019년 1월은 어떨지 조만간 확인하도록 하고

C#은 6위, DELPHI는 11위 정도를 유지하고 있구나.


https://www.tiobe.com/tiobe-index/

Posted by SB패밀리

Windows 7 에서 델파이 도움말 사용하기


ARCHITECTURE에 따라 x86 (32bits)    x64 (64bits) 설치


Windows6.1-KB917607-x64.msu

Windows6.1-KB917607-x86.msu



'IT - 개발' 카테고리의 다른 글

API, 라이브러리, SDK, 프레임워크, 플랫폼 - 관한여  (0) 2018.12.16
마이랩뷰 사이트 운영 종료 안내  (0) 2018.10.30
Windows 7 에서 델파이 도움말 사용하기  (0) 2018.10.29
PI System  (0) 2018.10.13
DAS, NAS, SAN 개념  (0) 2018.09.27
IaaS PaaS SaaS  (0) 2018.09.19
Posted by SB패밀리

델파이 메모리 누수 리포트 하기






https://youtu.be/rTkQt5CK4bw

Posted by SB패밀리

Rad Studio XE 버전별 멀티디바이스 지원 정보




안드로이드, iOS, Android, 아이오에스, RAD Studio, DELPHI, 모바일,

Posted by SB패밀리

[워터마킹] DCT영역에서의 적응적 워터마킹 구현 예

2001.07.31



제목 : DCT영역에서의 적응적 워터마킹 구현 프로그램 
개발언어 : 델파이 
플랫폼 : Win9x/NT 
제작자 : 배경환(97),김해권(93),이재근(94),이정환(Prof) 
제작일 : 1999년11월 3일 Watermarking simulator 0.1.119 버젼이 드디어 공개되었습니다. 사정상 소스의 공개는 불가능함을 알려드리며, 가장 단순화 시켜서 적응적 워터마킹을 구현하는 예를 보여드립니다. 11월 3일자로 공개하며, Hue의 "Hidden Digital Watermarking in Images" 논문을 참조하여 만들었습니다. 



19991103_public.zip



Posted by SB패밀리

Delphi 설치 후 TADOConnection(dbgo)이 없다?



델파이(Rad Studio)를 설치했는데


프로젝트를 로딩하는 중에 TADOConnection이 없다고 나온다면.?


황당하지만 어쩔 수 없이 수동으로 등록을 해주어야 한다.


<Delphi 2010 기준>

TADOConnection

C:\Program Files (x86)\Embarcadero\RAD Studio\7.0\bin\dclado140.bpl

* install package 메뉴를 선택해서 위의 bpl을 등록한다.



아래의 방법도 있다.

설치 DVD(ISO)에서 dbpack_setup.exe를 실행해서 modify 옵션으로 설치하면 package가 델파이에 등록된다.


Database package

[DVD Drive]:\Install\dbpack_setup.exe

(RAD Studio 설치후 데이터베이스(ex:adodb)패키지가 없을 실행해서 modify 실행)





Posted by SB패밀리

델파이 컴포넌트

delphi VCL



http://sf.net/projects/graphics32http://www.graphics32.org/wiki/
February 25, 2005: Release of Graphics32 1.7.1. 
개발환경 : D4,5,6,7,2005 C5,6

Graphics32 is a library designed for fast 32-bit graphics handling on Delphi and Kylix. Optimized for 32-bit pixel formats, it provides fast operations with pixels and graphic primitives, and in most cases Graphics32 outperforms the standard TCanvas? classes. It is almost a hundred times faster in per-pixel access and about 2–5 times faster in drawing lines. 

Features
Some of Graphics32 features include: 

Fast per-pixel access up to 100 times faster compared to standard TBitmap?; 
High-performance Bitmap alpha blending (including per-pixel alpha blending); 
Pixel, line and polygon antialiasing with sub-pixel accuracy (combined with alpha blending); 
Arbitrary polygon transformations and custom fillings; 
Bitmap resampling with high quality reconstruction filters (e.g. Lanczos, Cubic, Mitchell); 
A unique state-of-the-art rasterization system; 
Affine transformations of bitmaps: rotations, scaling, etc with sub-pixel accuracy; 
Arbitrary projective transformations of bitmaps; 
Arbitrary remapping transformations of bitmaps (e.g. for Warping, Morphing); 
Flexible supersampling implementation for maximum sampling quality; 
Flicker-free image displaying components with optimized double buffering via advanced MicroTiles? based repaint optimizer; 
Multiple customizible easy-to-use overlay layers; 
Locking of bitmaps for safe multithreading; 
A property editor for RGB and alpha channel loading; 
Design-time loading of image formats supported by standard TPicture; 
Works on Borland Delphi, C++ Builder and Kylix. 

As of version 1.5.1b Graphics32 is licensed under the terms of the Mozilla Public License. 

+++++ 설치

Graphics32 supports Delphi versions 4, 5, and 6, and C++ Builder 5.

Note, because some properties of range bars and gage bars have been changed, you can obtain some error messages while opening your previous Graphics32 projects. Just ignore these messages and Delphi will fix DFM files automatically.



Unzip the files; 
Add location of main installation directory to Tools | Environment Options | Library | Library Path. 
Select File | Open... on the menu bar. Set Files of type to Delphi package source, locate and open GR32_DSGN_D6.dpk (GR32_DSGN_D5 for Delphi5, GR32_DSGN_D4 for Delphi4 or GR32_DSGN_B5 for C++ Builder); 
A package editor window will appear. Click Compile, then click Install; 
If compiler asks whether you want to save changes, usually it is a good idea to choose No. 



+++++ 설명:

Additional Topics
Line Patterns

Using TImage32

Classes (Alphabetical)
TAffineTransformation

TArrowBar

TBitmap32

TBitmap32Collection

TBitmap32Item

TBitmap32List

TBitmapLayer

TByteMap

TCustomGaugeBar

TCustomImage32

TCustomImgView32

TCustomLayer

TCustomMap

TCustomPaintBox32

TCustomRangeBar

TGaugeBar

TImage32

TImgView32

TIVScrollProperties

TLayerCollection

TPaintBox32

TPaintStages

TPolygon32

TPositionedLayer

TProjectiveTransformation

TRangeBar

TRubberbandLayer

TThreadPersistent

TTransformation
Classes (Hierarchy)
TArrowBar

TCustomGaugeBar

TGaugeBar

TCustomRangeBar

TRangeBar

TBitmap32Collection

TBitmap32Item

TBitmap32List

TCustomLayer

TPositionedLayer

TBitmapLayer

TRubberbandLayer

TCustomPaintBox32

TCustomImage32

TCustomImgView32

TImgView32

TImage32

TPaintBox32

TIVScrollProperties

TLayerCollection

TPaintStages

TPolygon32

TThreadPersistent

TCustomMap

TBitmap32

TByteMap

TTransformation

TAffineTransformation

TProjectiveTransformation


Routines
AlphaComponent  Creating Points  Lighten  
AlphaToGrayscale  Creating Rectangles  OffsetRect  
ApplyLUT  EMMS  Polygon  
Blend  EqualRect  Polyline  
BlendEx  Fixed Point Math  PolyPolygon  
BlockTransfer  Gray32  PolyPolyline  
BlueComponent  GreenComponent  PtInRect  
Color32  HSLtoRGB  RedComponent  
ColorAdd  InflateRect  RGBtoHSL  
ColorMax  Intensity  SetAlpha  
ColorMin  IntensityToAlpha  SetBorderTransparent  
ColorModulate  IntersectRect  SetGamma  
ColorSub  Invert  StretchTransfer  
ColorToGrayScale  InvertRGB  Transform  
Combine  IsRectEmpty  WinColor  

Types
Arrays  TFloatMatrix  TRBHandles  
Color Types  TLUT8  TRBStyle  
Point Types  TPaintBoxOptions  TRectRounding  
Rectangle Types  TPaintStage  TSize  
TConversionType  TPixelCombineEvent  TSizeGripStyle  
TDrawMode  TPolyFillMode  TStretchFilter  
TFixed  TRBBackgnd  

Variables
MMX_ACTIVE  

Constants
Color Constants  IdentityMatrix  Paint Stage Constants  
G32Version  Layer Options Bits  

Units
GR32  GR32_Filters  GR32_Polygons  
GR32_Blend  GR32_Image  GR32_RangeBars  
GR32_ByteMaps  GR32_Layers  GR32_Transforms  



Graphics32_1_7_1.zip


Posted by SB패밀리

델파이 영상처리 VCL Sobakcc Lab [2003.10.16 ver 0.1.10]







SB_Lab

제작: 소백촌닭(sobakcc@nate.com) http://sb.pe.kr
내용: 영상처리 관련 컴포넌트

/****************************************************************************

[비고]

컴포넌트 상에 버그나 개선할 점이 있다면 홈페이지나 메일로 알려주시면
고맙겠습니다.

/****************************************************************************

[VERSION HISTORY]

### 2003.10.16 ver 0.1.10

  - Added: TSBImageEffect: Brighten,SharpenEdge,Spray추가.

### 2003.10.14 ver 0.1.9

  - Added: SB_ImageEffect: Source 이미지로 원본과 사용본 선택가능.
  - Added: SB_ImageEffectView: Source 이미지로 원본과 사용본 선택가능.
  - Added: CropMode 추가로 CropRect(영역) 리턴가능.
  - Fixed: UseOriginalBitmap = False 일경우 DblClick() 기능 버그 수정.

### 2003.10.09 ver 0.1.8

  - Added: TSBImageEffectView VCL - Image View기능. (Zoom, FittoWindow, Aspect, Image Effect기능)

### 2003.10.08 ver 0.1.7

  - Added: TSBImage32 VCL

### 2003.10.07 ver 0.1.6

  - Added: Sharpening, Free Rotate.

### 2003.10.06 ver 0.1.5

  - Added: Zoom(AntiAlias 포함), Cropping, Blurring.

### 2003.10.02 ver 0.1.4

  - Added: Flip-Horizontal, Flip-Vertical.

### 2003.10.01 ver 0.1.3

  - Added: 'Gaussian Blur', 'SplitBlur', 'Add Color-Noise', 'Add Mono-Noise',
           'AntiAlias', 'Contrast', 'FishEye', 'Lightness', 'Darkness',
           'Saturation', 'Mosaic', 'Twist', 'SplitLight', 'Tile', 'SpotLight',
           'Trace', 'Emboss', 'Solarize', 'Posterize', 'Grayscale', 'Invert'.



Sobakcc_Lab.zip


Posted by SB패밀리






소백촌닭 : 델파이에서 암호화 DLL 생성
델파이/씨빌더에서 암호화 DLL 사용 예제

DLL 작성 : 델파이 5 버전




Posted by SB패밀리

아래의 과정을 거치는 것 외에 특별한 것은 없음..

클립보드 이미지 데이터 -> 비트맵 -> JPEG






uses 에 Jpeg, ClipBrd 추가해야 함.


procedure SaveClipBoardPicture(ImgPath: String);

var

  Btm: TBitmap;

  Jpg: TJpegImage;


begin  

  Btm:=TBitmap.Create;

  Jpg:=TJpegImage.Create;

  try

      // 1. 클립보드 -> 비트맵

      Btm.Assign(ClipBoard);

      // 2. 비트맵 -> JPEG

      Jpg.Assign(Btm);


      // 압축퀄리티 설정

      Jpg.CompressionQuality:=50;

      // 파일로 저장

      Jpg.SaveToFile(ImgPath);

  finally

    FreeAndNil(Jpg);

    FreeAndNil(Btm);

  end;

end;

Posted by SB패밀리

[DELPHI TIP] TAdvStringGrid에 Combobox 사용하는 방법..




두가지 방법이 있습니다.
셀을 수정할때 콤보박스나 기타 컨트롤이 표시되는방법과
첨부터 나와있는방법....

두가지다 해보면요...
GetEditorType 이벤트를 이용하시면 에디트하실 때만 보입니다. 1번컬럼을 그렇게 만들어보겠습니다.

그리고 2,3번은 radio버튼으로 만들어보겠습니다. 
첨부터 보이실려면 Formcreate이벤트나 기타 함수에서 한번 만들어주시면됩니다.
Formcreate에서 만들어보죠.

먼저 폼생성시

procedure TForm1.FormCreate(Sender: TObject);
var
i:integer;

begin
radopt1:=tstringlist.Create;
radopt1.Add('Delphi');
radopt1.Add('C++Builder');
radopt1.Add('JBuilder');
radopt2:=tstringlist.Create;
radopt2.Add('Std');
radopt2.Add('Prof');
radopt2.Add('C/S');
with Grid do
begin
ColCount := 4;
RowCount := 10;
for i:=1 to rowcount-1 do
begin
addradio(2,i,0,-1,radopt1);
addradio(3,i,1,-1,radopt2);
end;
DefaultRowHeight := 70;
DefaultColWidth := 120;
Options := Options + [goEditing];

end;
end;

다음과 같이 해줍니다.
Grid함수중 addradio함수를 이용해서 radio버튼이 나와야 할곳에 for문으로 미리 다 출력해서 만들어두는 방식입니다.
Options에 goEdting속석이 들어가있어야 수정이 가능하므로 그때 수정시 column1에 콤보박스가 보입니다.

클릭했을때 내용을 보시기 위해서는 

Grid이벤트중 OnGetEditorType 이벤트를 만들어주시면됩니다.
procedure TForm1.gridGetEditorType(Sender: TObject; ACol,
ARow: Integer; var AEditor: TEditorType);
begin
With Grid do begin
case ACol of
1: begin
aEditor := edComboList;
ClearComboString;
AddComboString('대구');
AddComboString('대전');
AddComboString('서울');
AddComboString('평양');
end;
end; // case
end; // with
end; // procedure



지원가능한 컨트롤은 ...
TEditorType = (edNormal,edSpinEdit,edComboEdit,edComboList,edEditBtn,edCheckBox,
edDateEdit,edDateEditUpDown,edTimeEdit,edButton,edDataCheckBox,edNumeric,
edPositiveNumeric,edFloat,edCapital,edMixedCase,edPassword,edUnitEditBtn,
edLowerCase,edUpperCase,edFloatSpinEdit,edTimeSpinEdit,edDateSpinEdit,
edNumericEditBtn,edFloatEditBtn,edCustom,edRichEdit,edNone
{$IFDEF TMSUNICODE}
, edUniEdit,edUniComboEdit,edUniComboList,edUniEditBtn, edUniMemo
{$ENDIF}
);
이렇습니다. 참고하시고요.

창훈 wrote:
> 안녕하세요..

> TAdvStringGrid.. 예제만 보더라도.. 그 기능이 정말로 막강하지않나 싶습니다.. 그래서 그런지 프로퍼티 창에 나열된 속성만 하더라도 정말 많네요..

> 그 중에 가장 기본이 될 만한 Combobox를 쎌 안에 넣는 방법이 필요해서.. 데모프로그램도 보았습니다만.. 그리고, 해당 사이트에 있는 설명도 보았습니다만.. 영어가 짧아서 인지.. 어떤 프로퍼티가 어떤 값으로 설정되어야 한다는 명확한 이야기를 찾지 못했고, 그래서 결국 여러분께 다시 도움을 청합니다..

> Combobox 를 넣기 위한 프로퍼티 속성은 어떻게 되어야 하는지요..?





출처: http://cyhome.cyworld.com/?home_id=a4202130&postSeq=7853519

Posted by SB패밀리

MS Access SQL IIF 함수 - SQL Case 함수


MS Access 에서 SQL문으로 경우에 따른 필드값을 출력하고 싶을 때


IIF (expression, resulttrue, resultfalse) 함수를 사용한다.


expression = 비교구문

resulttrue = 맞다면 출력할 값

resultfalse = 다르다면 출력할 값


여러개의 경우 수가 나오면 


IIF()함수를 여러개를 사용하면 된다.


IIF (expression, resulttrue, IIF (expression, resulttrue, resultfalse))



    -- Access: 
    SELECT alias = IIF(Column<>0, "Yes", "No") 
        FROM table 
     
    -- SQL Server: 
    SELECT alias = CASE WHEN Column<>0 THEN 'Yes' Else 'No' END 
        FROM table
     
    SQL Server's CASE also supports multiple outcomes, for example: 
     
    SELECT alias = CASE 
        WHEN Column='a' THEN 'US' 
        WHEN Column='b' THEN 'Canada' 
        ELSE 'Foreign' 
        END 
    FROM table


델파이에서 TADOQuery에서 SQL문으로 구현하고자 할 때에는 다음과 같은 예로 사용하면 된다.


  ADOQryUnit.SQL.Close;

  ADOQryUnit.SQL.Clear;

  ADOQryUnit.SQL.Add('SELECT *, ');

  ADOQryUnit.SQL.Add('IIF(VCT = 0, "방향", IIF(VCT = 1, "비례", IIF(VCT = 2, "서보", ""))) AS CType ');

  ADOQryUnit.SQL.Add('FROM DeviceModelUnitInfo UI ');








Posted by SB패밀리

Delphi7에서 GIF 파일을 핸들링하는 법에 대해 간단히 포스팅해보겠습니다.

 

먼저 Rx Library가 같이 설치된 상태라고 가정하고 진행하겠습니다.

(RX Library - http://sourceforge.net/projects/rxlib/ )

 

가장 먼저 할일은 사용할 파일을 use에 아래와 같이 넣어줍니다.

 

view plaincopy to clipboardprint?

uses Animate, GIFCtrl;   

 

다음으로는 객체를 생성해야 겠죠. 여기서는 동적으로 생성

(폼을 사용하지 않고 생성하는 법에 대해 기술하겠습니다)

 

 

view plaincopy to clipboardprint?

GIFtest := TRxGIFAnimator.Create(ParentImage);  

with GIFtest do  

begin  

    Parent := ParentImage;  

    AutoSize := True;  

    Left := 0;  

    Top := 0;  

    Animate := False;  

    Visible := True;  

    Image.LoadFromFile('C:\test.gif');  

end;  

 

위와 같이 객체를 생성해주는 부분에서

객체를 생성하고 부모와 좌표를 적당히 설정하면 끝!

 

그리고 애니메이션이 필요한 경우에는  Animate속성을 True로 설정하면 됩니다.


팁 출처: 인터넷



Posted by SB패밀리

delphi TPanel or TForm 을 투명하게



procedure TForm1.Button1Click(Sender: TObject);
begin
ClearPanel(TPanel(panel1));//전달인수를 폼으로 하면 폼또한 투명효과를 줄 수 있다. 
end;

procedure TForm1.ClearPanel(var panel : TPanel);
var  I : Integer;
    FullRgn, ClientRgn, ControlRgn : THandle;
    Margin, MarginX, MarginY, X, Y : Integer; 
begin 
    Margin := (panel.Width - panel.ClientWidth) div 2; 
    FullRgn := CreateRectRgn(0, 0, panel.Width, panel.Height); 
    MarginX := Margin; 
    MarginY := panel.Height - panel.ClientHeight - Margin; 
    ClientRgn := CreateRectRgn(MarginX, MarginY, MarginX + panel.ClientWidth, 
                                                 MarginY + panel.ClientHeight); 
    CombineRgn(FullRgn, FullRgn, ClientRgn, RGN_DIFF); 
    for I:=0 to panel.ControlCount-1 do begin 
        X := MarginX + panel.Controls[I].Left; 
        Y := MarginY + panel.Controls[I].Top; 
        ControlRgn := CreateRectRgn(X, Y, X + panel.Controls[I].Width, 
                                          Y + panel.Controls[I].Height); 
        CombineRgn(FullRgn, FullRgn, ControlRgn, RGN_OR); 
    end; 
    SetWindowRgn(panel.Handle, FullRgn, True); 
end;


Posted by SB패밀리

TList의 활용.

많은 데이터들을 관리하기 위해서는 리스트를 사용해야 한다.

C++과는 다르게 델파이는 TList라는 클래스가 이를 도와준다.

실제로 TList는 다른 비슷한 기능의 부모 클래스이기도 하다.

일단 데이터를 관리하기 위해서 따로 유닛을 만들어 관리하는 것이 편리하다. 폼의 중간에 던져 놓으면 참 보기 힘들다.

기본 뼈대를 먼저 만들어보자.

unit uMyDataList;
 
interface
 
uses classes;
 
type
  TMyDataList = class(TList)
    private
    protected
    public
  end;
 
implementation
 
end.

짠, 이렇게 간단하다.

이제 담은 동적인 데이터의 형식을 만들어여 한다. 왜냐면 TList는 포인터만 가지고 있을 뿐 데이터 자체를 가지지 않는다.
알고보면 당연한 것이다.

  // type 절에 추가된다.
  PMyDataItem = ^TMyDataItem;  // 포인터 형의 데이터 형식을 정의
  TMyDataItem = record         // 데이터 형식의 정의
     value : integer;          // 넣고자 하는 데이터 형식을 넣는다. 임의로 내용을 정의했다.
    offset : integer;
    others : pointer;         
  end;

데이터 형식의 정의에 대해서는 더 설명하지는 않겠다.

데이터들은 동적으로 관리된다.

자, 이제는 데이터를 추가/삽입/삭제을 하는 루틴이 필요하다.

// interface
...
type
  TMyDataList = class(TList)
    private
    protected
      function GetItem(Index : integer):PMyDataItem;
      procedure SetItem(Index : integer; Item : PMyDataItem);
    public
      // destructor
      // destructor Destroy; override; // 소멸자
      // functions
     function AddItem(Value, offset : integer; others : pointer):integer; // 데이터 추가
      procedure InsertItem(Index : integer; Value, offset : integer; others : pointer); // 데이터 삽입
      procedure DeleteItem(Index : integer); // 데이터 삭제
      procedure Clear; override; // 리스트를 모두 삭제
      //
      property ItemList[Index : integer]:PMyDataItem read GetItem write SetItem; // 해당 데이터이 포인터를 가져온다
  end;
...

아쉽게도 override를 할 수 있는 함수가 몇개 없다.

위와 관련된 부모 클래스 TList의 선언은 아래와 같다. 한번 확인해보자.

    // destructor Destroy; override; // 소멸자. TObject에서 상속된다.
    function Add(Item: Pointer): Integer; // 데이터 추가
    procedure Clear; virtual; // 데이터를 모두 삭제
    procedure Delete(Index: Integer); // 데이터를 삭제
    procedure Insert(Index: Integer; Item: Pointer); // 데이터 삽입
    property Items[Index: Integer]: Pointer read Get write Put; default; // 데이터의 포인터를 가져온다.

정렬과 같은 기능도 있으나 그냥 생략하기로 하겠다.

사실 데이터의 포인터를 가져오는 것은 필요가 없을수도 있다.

type이 없는 Pointer는 다른 type을 가지는 pointer에 타입캐스팅없이 바로 대입이 된다.

먼저 데이터를 추가/삽입하는 부분을 만들어보자.

implementation
...
function TMyDataList.AddItem(Value, offset : integer; others : pointer):integer; // 데이터 추가
var
  NewItem : PMyDataItem; // 동적 생성을 위한 포인터형 변수를 선언.
begin
  result := -1; //  되돌림값 초기 설정. 되돌값은 새로이 추가된 데이터의 인덱스를 되돌린다.
  New(NewItem); // 동적 데이터 생성
  if NewItem<;>;nil then
  try
    // 데이터의 대입.
    NewItem.Value := Value;
    NewItem.offset := offset;
    NewItem.others := others;
    // 리스트에 추가
     result := Add(NewItem);
  except
    // 에러가 나면 추가 작업을 포기한다. 
    // 이미 동적 데이터를 생성했으므로 추가가 실패한 경우에는 생성한 동적 데이터를 없앤다.
    Dispose(NewItem);
  end;
end;
...
procedure TMyDataList.InsertItem(Index : integer; Value, offset : integer; others : pointer); // 데이터 삽입
var
  NewItem : PMyDataItem; // 동적 생성을 위한 포인터형 변수를 선언.
begin
  New(NewItem); // 동적 데이터 생성
  if NewItem<;>;nil then
  try
    // 데이터의 대입.
    NewItem.Value := Value;
    NewItem.offset := offset;
    NewItem.others := others;
    // 리스트에 삽입
     Insert(Index, NewItem);
  except
    // 에러가 나면 삽입 작업을 포기한다. 
    // 이미 동적 데이터를 생성했으므로 삽입이 실패한 경우에는 생성한 동적 데이터를 없앤다.
    Dispose(NewItem);
  end;
end;

New/Dispose는 같이 동적 변수를 생성시키는데 사용한다. 다르게 GetMem/FreeMem을 이용해도 된다.

동적 변수를 생성하고 그 변수의 값을 할당시키는 것으로 함수는 끝난다.

거의 일어날 가능성이 없지만 도중에 예외가 발생하면 동적 변수를 해제하도록 만드는게 좋다.

하지만 string이나 인터페이스 등등이 있는 경우에는 Getmem/Freemem은 사용하지 않는게 좋다.

삽입과 추가는 별로 다르지 않다.

이제는 데이터의 참조하는 프로퍼티(property)를 작성해보자.

interface
...
      property ItemList[Index : integer]:PMyDataItem read GetItem write SetItem; // 해당 데이터이 포인터를 가져온다
      // 이 선언의 의미는 간단하다. 
     // 배열형식으로 접근할 수 있는 데이터의 인덱스는 integer형이며 PMyDataItem이 얻어지며,
     // GetItem 함수로 읽고, SetItem 프로시져로 쓴다는 의미이다.
     // 꼭 선언한 필요는 없지만, 편하게 클래스를 사용하기 위해서는 선언해주는 것이 좋다.
...
implementation
...
// 데이터 포인터를 읽어온다.
function TMyDataList.GetItem(Index : integer):PMyDataItem;
begin
  result := PMyDataItem(Items[Index]);
end;
// 데이터 포인터를 새로운 값으로 써넣는다.
procedure TMyDataList.SetItem(Index : integer; Item : PMyDataItem);
begin
  Items[Index] := Item;
end;
...

아주 간단하다. 그냥 타입 캐스팅과 대입만 하면 끝이다.

파스칼은 형식에 민감해서 포인터를 다룰 때도 이러한 고생이 조금 따르지만,

몇자 더 써넣는다고 손가락이 부러지는 것은 아니라고 생각된다.

이제는 데이터를 삭제할 부분을 만들어보자.

...
procedure TMyDataList.DeleteItem(Index : integer); // 데이터 삭제
var
  Item : PMyDataItem;
begin
  // 데이터를 가져온다
  Item := ItemList[Index];
  // 동적 생성된 변수를 해제한다.
  if Item<;>;nil then begin
    try
      // others는 포인터로 다른 동적 데이터를 담을려고 포인터로 선언한 것이다. 
      // 만약 다른 용도이거나 일반 변수라면 해제할 필요가 없다.
      // 단지 동적 변수 안에 동적 변수를 관리하는 방법을 보여주기 위해 선언한 것 뿐이다.
      if Item.others<;>;nil then Dispose(Item.others);
    except
    end;
    // 동적 변수를 해제한다. 
    // 이후에 리스트에 담긴 ItemList[Index] 포인터는 의미없는 값이 된다.
    dispose(Item);
  end;
  // 리스트에 동적 변수를 가리키는 포인터를 삭제한다.
  // 필요에 따라 ItemList[Index] := nil; 을 부가적으로 넣어도 된다.
  Delete(Index);
end;
...

삭제를 하는 경우에는 생성된 동적 변수의 해제가 필요하다. 그렇지 않으면 메모리에 계속 남아있게 된다.

마지막으로 객체가 파괴되거나 리스트 내용을 모두 삭제할 때 필요한 Clear 프로시저를 만든다.

TList의 소멸자 Destroy는 Clear를 호출한다. 그래서 따로 소멸자를 선언하지 않았다.

...
procedure TMyDataList.Clear; // 리스트를 모두 삭제
var
  Index : integer; // 루프를 위해 선언
  Item : PMyDataItem;
begin
  if Count>;0 then
    for Index:=0 to Count-1 do begin
      Item := ItemList[Index];
      if Item<;>;nil then begin
        try
          // others는 포인터로 다른 동적 데이터를 담을려고 포인터로 선언한 것이다. 
          // 만약 다른 용도이거나 일반 변수라면 해제할 필요가 없다.
          // 단지 동적 변수 안에 동적 변수를 관리하는 방법을 보여주기 위해 선언한 것 뿐이다.
          if Item.others<;>;nil then Dispose(Item.others);
        except
        end;
        // 동적 변수를 해제한다. 
        // 이후에 리스트에 담긴 ItemList[Index] 포인터는 의미없는 값이 된다.
        dispose(Item);
      end;
    end;
  // 부모 클래스의 Clear를 호출한다.
  inherited Clear;
end;
...

Clear 프로시저는 Delete와 마찬가지로 간단하다.

다른 점이라면 루프를 돌면서 각각의 데이터를 해제시킨 후 부모 클래스의 Clear를 호출한다는 점이다.

DeleteItem을 호출해서 해결할 수도 있지만 오버헤드(overhead)를 줄이기 위해 그냥 직접 구현을 했다.

실제로 이 클래스를 사용하면 아래와 같이 할 수 있다.

...
var
  MyOwnList : TMyDataList;
...
  MyOwnList := TMyDataList.Create;
  ...
  MyOwnList.AddItem(10,20,nil);
  MyOwnList.InsertItem(0,10,20,nil);
  MyOwnList.DeleteItem(1);
  Writeln(MyOwnList.ItemList[0].Value);
  ...
  MyOwnList.Free;
...

검색의 구현을 위해서는 루프를 돌려 해당값을 비교하게 만들면 된다.

이로써 간단히 TList를 사용해서 자신만의 데이터들을 담는 리스트를 사용할 수 있게 되었다.

보다 많은 기능들의 구현은 좀 더 깊이 연구하면 직접할 수 있을 것이다.

말주변이 없는 글이지만 도움이 되었기를.



출처: http://blog.naver.com/PostView.nhn?blogId=barcoder&logNo=60053164009


Posted by SB패밀리

sobakcc Control Package v 1.0


2005.01.03


컨트롤 팩키지 버전 1.0이 공개되었습니다.


벌써 만들어 놓은지는 몇년이 지났지만 그동안 구석에 놔두다가 이렇게 올려봅니다.
비주얼 컴포넌트의 컨트롤을 모아둔 팩키지입니다.
이 컴포넌트들은 Flat-Style의 모양으로 각종 컨테이너 컴포넌트 상에 위치하게 됩니다.



* FlatStyle의 비주얼 컴포넌트
* 전체 31개의 컴포넌트가 팩키지 안에 들어 있습니다.


* TCCAboutBox, TCCAlignEdit, TCCAnimation, TCCAnimWnd, TCCButton, 
TCCCheckBox, TCCCheckListBox, TCCColorComboBox, TCCComboBox, TCCDBComboBox,
TCCDBEdit, TCCDBLookupComboBox, TCCDBMemo, TCCEdit, TCCGauge, 
TCCGroupBox, TCCHint, TCCLinkText, TCCListBox, TCCMaskEdit,
TCCMemo, TCCPanel, TCCProgressBar, TCCRadioButton, TCCShape,
TCCSound, TCCSpeedButton, TCCSpinEditFloat, TCCSpinEditInteger, TCCSplitter, TCCTabControl


팩키지를 등록할 수 있는 팩키지 파일 *.bpl과 각 컨트롤의 컴파일된 파일인 *.dcu 파일들이 포함되어 있습니다.

컴포넌트 팔레트에 있는 팩키지의 모습입니다.

Win32 버전에 대해서 자주는 아니지만 지속적으로 컴포넌트를 추가할 예정입니다.
버그가 몇개가 있을지는 모르겠습니다만 버그가 발견된다면 게시판으로 알려주시면 감사하겠습니다.

*.bpl을 포함한팩키지 파일이 무료배포 됩니다








Posted by SB패밀리




Form에서 어느 포커스에 있어도 키 입력을 받아, ESC 키를 누르면 Form 이 닫히도록 할 수 있다.


방법은 다음과 같다.


- Form 의 Key Preview 속성을 True 로 설정한다.

- Form 의 OnKeyPress 이벤트 핸들러에 다음 코드를 작성한다.


if ( Key = #27 ) then

  begin

    Form1.Close;

  end;


위와 같이 OnKeyPress 이벤트 핸들러를 작성하면 Form 의 어느 곳에서나 ESC 키를 누렀을 때 Form1 이 Close 된다.







 

비슷한 방법으로 Edit 컨트롤에서 Enter 키나 Tab키를 눌렀을 때 특정 동작을 수행하도록 할 수도 있다. 

이 때는 Edit 컨트롤의 OnKeyPress 이벤트 핸들러를 위와 같이 작성한다.



if ( Key = #13 ) then

  begin

    Button1.Click;

  end;


만약 위와 같이 Edit 컨트롤의 OnKeyPress 이벤트 핸들러를 작성하면 Edit 컨트롤에서 문자열을 입력한 후 엔터키를 누르면 Button1 의 Click 메소드를 호출할 수 있다.

Posted by SB패밀리

델파이에서 그래픽 파일(JPG, GIF, PNG) 다루기



델파이에서는 기본적으로 TImage 라는 컴포넌트로 이미지를 다루는데,

이것은 그냥 BMP 파일을 다루는 것 같습니다.


델파이 2007에서는 JPG와 GIF 형식을 바로 보여줄 수 있습니다.

델파이 2009에서는 PNG 형식을 추가로 바로 보여줄 수 있게 되었습니다.


PNGImage 라는 오픈소스를 아예 Embarcadero에서 사버렸습니다.

머, GIF쪽은 저자가 직접 기증?한거이지만...


델파이 2009에서 TImage 컴포넌트에 각각의 그래픽 파일을 보여주는 예제는 다음과 같습니다.

각각의 이미지 파일을 처리하기 위해서는 

uses PNGImage, JPEG, GIFImg;


구문을 앞부분에 사용하여야만 합니다.





procedure TForm1.Button1Click(Sender: TObject);

var

  Extension : String;

  PNG : TPNGImage;

  JPG : TJPEGImage;

  GIF : TGIFImage;

begin


  // 저장된 파일의 확장자명을 추출한다.

  Extension := ExtractFileExt(OutputFilePath);

  Extension := LowerCase(Extension);


  // GIF 파일 형식인 경우,

  if Extension = '.gif' then

  begin

    GIF := TGIFImage.Create;

    try

      GIF.LoadFromFile(OutputFilePath);

      Image1.Picture.Assign(GIF);

      Image1.Stretch := True;

      Image1.Visible := True;

    finally

      GIF.Free;

    end;



  end

  // JPG 파일 형식인 경우,

  else if Extension = '.jpg' then

  begin

    JPG := TJPEGImage.Create;

    try

      JPG.LoadFromFile(OutputFilePath);

      Image1.Picture.Assign(JPG);

      Image1.Stretch := True;

      Image1.Visible := True;

    finally

      JPG.Free;

    end;

  end

  // PNG 파일 형식인 경우,

  else if Extension = '.png' then

  begin

    PNG := TPngImage.Create;

    try

      PNG.LoadFromFile(OutputFilePath);

      Image1.Picture.Assign(PNG);

      Image1.Stretch := True;

      Image1.Visible := True;

    finally

      PNG.Free;

    end;

  end;

end;


출처: http://hook.tistory.com/181?srchid=BR1http://hook.tistory.com/181

Posted by SB패밀리



델파이에서 쓰는 Format의 간단한 사용례

Format 함수 정의

class function Format ( Const StrFormat : string; Const Args : array of const ) :string;

StrFormat 정의 형식

%[Index:][-][표시할 자리수][.0을 채울 자리수]Type

■ 타입 종류

  d = 정수

  e = 지수표시

  f = 소수점 두번째 자리 이후 반올림

  g = 입력된 대로 표시

  m = 통화

  n = 수치 쉼표 표시(소수점 두번째 자리 이후 반올림)

  p = 포인터

  s = 문자열

  u = 부호없는 정수

  x = 16진수

■ 포멧 형식 관련 사용례

  sMsg:String;

  sMsg := '';

  sMsg := sMsg + #13#10 + Format('<%%10d>   = <%10d>', [12345]);

  sMsg := sMsg + #13#10 + Format('<%%-10d>  = <%-10d>', [12345]);

  sMsg := sMsg + #13#10 + Format('<%%.7d>   = <%.7d>', [12345]);

  sMsg := sMsg + #13#10 + Format('<%%10.5d> = <%10.5d>', [12345]);

  sMsg := sMsg + #13#10;

  sMsg := sMsg + #13#10 + Format('<%%7.4d>, [123]       = <%7.4d>', [123]);

  sMsg := sMsg + #13#10 + Format('<%%*.4d>, [7, 123]    = <%*.4d>', [7, 123]);

  sMsg := sMsg + #13#10 + Format('<%%*.*d>, [7, 4, 123] = <%*.*d>', [7, 4, 123]);

  sMsg := sMsg + #13#10;

  sMsg := sMsg + #13#10 + Format('Index Usage = %s %s %s %1:s %s',

                     ['A', 'B', 'C', 'D', 'E']);

▶ 결과

<%10d>   = <     12345>

<%-10d>  = <12345     >

<%.7d>   = <0012345>

<%10.5d> = <     12345>

<%7.4d>, [123]       = <   0123>

<%*.4d>, [7, 123]    = <   0123>

<%*.*d>, [7, 4, 123] = <   0123>

Index Usage = A B C B C

■ 포멧 타입 관련 사용례

  sMsg:String;

  sMsg := '';

  sMsg := sMsg + #13#10 + Format('%%d = %d', [-12345]);

  sMsg := sMsg + #13#10 + Format('%%e = %e', [12345.6789]);

  sMsg := sMsg + #13#10 + Format('%%f = %f', [123.456789]);

  sMsg := sMsg + #13#10 + Format('%%g = %g', [12.3456789]);

  sMsg := sMsg + #13#10 + Format('%%n = %n', [12345.6789]);

  sMsg := sMsg + #13#10 + Format('%%m = %m', [12345.6789]);

  sMsg := sMsg + #13#10 + Format('%%p = %p', [addr(sMsg)]);

  sMsg := sMsg + #13#10 + Format('%%s = %s', ['FormatTest']);

  sMsg := sMsg + #13#10 + Format('%%u = %u', [12345]);

  sMsg := sMsg + #13#10 + Format('%%x = %x', [12345]);

▶ 결과

%d = -12345

%e = 1.23456789000000E+004

%f = 123.46

%g = 12.3456789

%n = 12,345.68

%m = \12,346

%p = 0012F5B4

%s = FormatTest

%u = 12345

%x = 3039

 

Posted by SB패밀리