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);
'Delphi Tip > +Tip' 카테고리의 다른 글
윈도우버전별 바탕화면 경로 알아내기 (0) | 2022.03.28 |
---|---|
윈도우 화면보호기 상태확인 (0) | 2022.03.25 |
안드로이드에서 MessagDlg 사용방법(주의 점) (0) | 2022.03.11 |
왕초보를 위한 아주 기본적인 Tips (0) | 2022.03.07 |
윈도우 포커스 및 최상위로 올리기/활성화 (0) | 2022.02.23 |
댓글