본문 바로가기
Delphi Tip/+Tip

Delphi Tip

by MonoSoft 2022. 3. 24.
728x90
반응형

Delphi Tip

 

임시 스트링 리스트 사용

임시 스트링 리스트를 사용하는 것이 어떤경우 훨씬

빠른 결과를 나타낼 수 있다.

 

ListBox1.Clear;

Ini := TIniFile.Create('win.ini');

ReadSection('Colors', ListBox1.Items);

Ini.Free;

 

위와같이 하는 대신에 이렇게 해 보자.

 

StrList := TStringList.Create;

ListBox1.Clear;

Ini := TIniFile.Create('win.ini');

ReadSection('Colors', StrList);

Ini.Free;

ListBox1.Items.Assign(StrList);

StrList.Free

 

리소스로부터 비트맵 로드

MyBitmap.Handle := LoadBitmap(HInstance, 'BITMAPID');

물론 이 전에 RES파일을 실행파일에 구겨넣어야 한다.

 

{$R MYSTUFF.RES}

 

폼위에 있는 컴포넌트의 갯수 찾기

폼위에 몇개의 컴포넌트가 있는지 알고 싶다면,

ComponentCount메소드를 사용하면 된다. 예를들어

아래의 코드는 폼위에 있는 모든 판넬의 색깔을

파랗게 바꾼다.

 

procedure TForm1.Button1Click(Sender: TObject);

var

a : Integer;

begin

for a:= 1 to ComponentCount do

if Components[a-1] is TPanel then

TPanel(Components[a-1]).Color := clBlue;

end;

 

컴포넌트를 이름으로 찾기

FindComponent 메소드를 사용하면, 컴포넌트를 이름으로

찾을 수 있다. 아래 예제는 에디트박스에 나타난 이름으로

컴포넌트를 찾고, 그 색깔을 바꾸고 있다.

 

procedure TForm1.Button1Click(Sender: TObject);

var

MyComponent : TComponent;

begin

MyComponent := FindComponent(Edit1.Text);

if MyComponent is TPanel then

TPanel(MyComponent).Color := clBlue;

end;

 

프로그램의 메모리 요구를 줄이기.

프로그램이 OLE를 사용하지 않는다면 이렇게 해 보자

FreeLibrary(GetModuleHandle('OleAut32'));

노턴유틸리티에 의하면, 델파이 프로그램은 실행시

1메가 이상의 메모리를 차지한다고 한다.

위의 코드를 수행함으로써 OleAut32.dll과 OLE32.Dll이

사용하는 만큼의 메모리를 아낄 수 있다.

 

마우스의 동작범위 제한하기

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

var

R : TRect;

begin

R := BoundsRect;

InflateRect(R,-30,-30);

ClipCursor(@R);

end;

 

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

ClipCursor(Nil);

end;

네모나지 않은 폼 만들기

아래의 소스는 폼을 타원형으로 만들어 준다.

procedure TForm1.FormCreate(Sender: TObject);

var

R : HRgn;

begin

R := CreateEllipticRgn(-15,-15,Width+15,Height+15);

SetWindowRgn(Handle,R,True);

end;

 

현재 시스템의 언어체계 알기 (한/영 윈도 판단)

시스템에 설치된 IME의 버전을 알아내는 루틴이다.

setlength(s, Max_PAth);

VerLanguageName(GetSystemDefaultLangID, PChar(S), max_path);

SetLength (S, StrLen (PChar(S)));

caption := s;

 

데스크탑의 위치 알아내기. (델 2.01 이상)

uses 문에 Shlobj를 포함

var

s : String;

PIDL : PItemIDList;

begin

SetLength(S, MAX_PATH);

SHGetSpecialFolderLocation(Application.Handle, CSIDL_DESKTOP, PIDL);

SHGetPathFromIDList(PIDL, PChar(S));

SetLength (S, StrLen (PChar(S)));

Caption := s;

end;

 

아래는 상수의 목록이다.

CSIDL_DESKTOP = $0000;

CSIDL_PROGRAMS = $0002;

CSIDL_CONTROLS = $0003;

CSIDL_PRINTERS = $0004;

CSIDL_PERSONAL = $0005;

CSIDL_FAVORITES = $0006;

CSIDL_STARTUP = $0007;

CSIDL_RECENT = $0008;

CSIDL_SENDTO = $0009;

CSIDL_BITBUCKET = $000A;

CSIDL_STARTMENU = $000B;

CSIDL_DESKTOPDIRECTORY = $0010;

CSIDL_DRIVES = $0011;

CSIDL_NETWORK = $0012;

CSIDL_NETHOOD = $0013;

CSIDL_FONTS = $0014;

CSIDL_TEMPLATES = $0015;

 

Set 변수 조작

Set 변수에서 +, -조작은 바람직 하지 못하다.

대신에 Include(), Exclude() 를 사용하자!!!

 

컴포넌트 위의 마우스 존재여부

Controls.Pas 에 나와있는 컴포넌트 메시지를 이용한다.

마우스가 컨트롤 안에 들어오면 CM_MOUSEENTER 가 발생하고,

반대로 커서가 밖으로 나가면 CM_MOUSELEAVE가 발생한다.

컴포넌트의 메소드로 다음을 추가합니다.

procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;

procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;

 

그런 다음 함수의 구현부에서

 

procedure TMyCompo.CMMouseEnter(var Message: TMessage);

begin

TForm(parent).Caption := '들어왔네!';

end;

 

procedure TMyCompo.CMMouseLeave(var Message: TMessage);

begin

TForm(parent).Caption := '나갔네!';

end;

스트링에서 원하는 캐릭터 삭제

function CharDelete(Const Str : String ; Const C : Char) : String;

var

Temp : String;

begin

Temp := Str;

while Pos(C,Temp) > 0 do Delete(Temp,Pos(C,Temp),1);

Result := Temp;

end;

 

스트링 그리드에서 오른쪽 정렬.

StringGrid의 DrawCell 이벤트를 아래와 같이 작성한다.

procedure TForm1.StringGrid1DrawCell(Sender:TObject; Col,Row:Longint,

Rect:TRect; State:TGridDrawState);

var oldalign : word;

begin

if (row=0) or (col<2) then

stringGrid1.canvas.font.style := StringGrid1.canvas.font.style +

[fsbold];

if col<>1 then

begin

oldalign:=settextalign(StringGrid1.canvas.handle,ta_right);

StringGrid1.canvas.textrect(rect,rect.right-2,rect.top+2,

StringGrid1.cells[col,row]);

settextalign(StringGrid1.canvas.handle,oldalign);

end

else

StringGrid1.canvas.textrect(rect,rect.left+2,rect.top+2,

StringGrid1.cells[col,row]);

StringGrid1.canvas.font.style := StringGrid1.canvas.font.style-[fsbold];

end;

 

파일의 날짜와 크기

function SizeOfFile(const FileName: String): LongInt;

// 파일 이름으로 파일의 크기 알아내기.

var fd : TWIN32FindData;

hFind : THandle;

begin

Result := 0;

try

hFind := FindFirstFile(pChar(FileName), fd);

if (hFind <> INVALID_HANDLE_VALUE) and

((fd.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) = 0) then

Result := fd.nFileSizeLow;

finally

windows.FindClose(hFind);

end;

end;

 

function DateOfFile(const FileName: String): String;

// 파일의 날짜를 스트링으로 반환.

var

FileHandle : THandle;

begin

Result := '';

try

FileHandle := FileOpen(FileName, fmOpenRead);

if FileHandle > 0 then

Result := DateToStr(FileDateToDateTime(FileGetDate(FileHandle)));

finally

FileClose(FileHandle);

end;

end;

 

function IconOfFile(const FileName : String; IconID : Integer) : THandle;

// 아이콘의 핸들을 리턴하는 함수.

// IconID = SHGFI_LARGEICON : 32X32, SHGFI_SMALLICON : 16X16

var

SHFileInfo : TSHFileInfo;

begin

SHGetFileInfo(PChar(FileName), 0, SHFileInfo, SizeOf(SHFileInfo),

IconID or SHGFI_ICON);

Result := SHFileInfo.hIcon;

end;

 

DC를 스크롤 하기

The ScrollDC function scrolls a rectangle of bits

horizontally and vertically.

 

힌트의 위치및 색깔 조작

procedure TForm1.DoOnShowHint(var HintStr: string;

var CanShow: Boolean; var HintInfo: THintInfo);

var

XYPoint : TPoint;

begin

if HintInfo.HintControl = PlayBtn then

begin

getcursorpos(XYPoint);

XYPoint.Y := XYPoint.Y + 15;

with HintInfo do

begin

HintPos := XYPoint; // 이 버튼 힌트의 위치 바꾸기.

HintColor := clAqua; // 이 버튼의 색깔만 바꾸기

HintMaxWidth := 50; // 이 버튼 힌트 워드랩 주기.

end;

end;

end;

 

procedure TForm1.FormCreate(Sender: TObject);

begin

Application.OnShowHint := DoOnShowHint;

end;

 

다른 프로그램의 실행

Uses ShellAPI

(*-------------------------------------------------------------------*)

FUNCTION WINRUN(COMMAND,PARAMS,WORKDIR:STRING) : BOOLEAN;

(* 명령어, 파라미터, 작업디렉토리를 인수로 받아서 실행한다.

(*-------------------------------------------------------------------*)

BEGIN

COMMAND:=COMMAND+#0;

PARAMS:=PARAMS+#0;

WORKDIR:=WORKDIR+#0;

RESULT := TRUE;

 

IF SHELLEXECUTE(0{HANDLE},Nil{'OPEN'{},@COMMAND[1],@PARAMS[1],

@WORKDIR[1],SW_SHOWNORMAL)<32 THEN

BEGIN

RESULT := FALSE;

MESSAGEDLG('FAILED TO EXECUTE '+COMMAND,MTERROR,[MBOK],0);

END;

END;

 

17번을 조금 수정해 다른 프로그램이 끝날때까지 기다리는 함수.

(*-------------------------------------------------------------------*)

FUNCTION WINRUN(COMMAND,PARAMS,WORKDIR:STRING) : BOOLEAN;

(* 명령어, 파라미터, 작업디렉토리를 인수로 받아서 실행한다.

(*-------------------------------------------------------------------*)

var inst : THandle;

BEGIN

COMMAND:=COMMAND+#0;

PARAMS:=PARAMS+#0;

WORKDIR:=WORKDIR+#0;

RESULT := TRUE;

inst := SHELLEXECUTE(0{HANDLE},'OPEN',@COMMAND[1],@PARAMS[1],

@WORKDIR[1],SW_HIDE);

IF inst<32 THEN

BEGIN

RESULT := FALSE;

MESSAGEDLG('FAILED TO EXECUTE '+COMMAND,MTERROR,[MBOK],0);

END else begin

while GetModuleUsage(inst) <> 0 do Application.ProcessMessages;

end;

END;

 

스트링을 좌우로 정렬하기.

format( '%10s', formatFloat( '#,0', aNumber) );

위와같이 한다면, 10자리 문자열이 만들어지며 우측으로 정렬이 된다.

좌측으로 정렬을 원한다면 '%-10s'라고 주면 된다.

 

시간과 날짜의 표시

FormatDateTime('yyyy/mm/dd hh:nn:ss :',Now);

728x90
반응형

댓글