본문 바로가기

Delphi Tip253

Application.ProcessMessages의 역할과 주의점 Application.ProcessMessages의 역할과 주의점 델파이에서 Application.ProcessMessages는  현재 대기 중인 Windows 메시지를 즉시 처리하도록 하는 함수입니다.  주로 루프나 지연 작업 중 UI가 멈추지 않도록 할 때 사용됩니다.  하지만 과도한 사용은 오히려 성능과 안정성에 부정적인 영향을 줄 수 있어  신중하게 써야 합니다. procedure TForm1.Button1Click(Sender: TObject); var   I: Integer; begin   for I := 1 to 100 do   begin     Label1.Caption := Format('진행 중: %d%%', [I]);     Application.ProcessMessages; // U.. 2025. 4. 8.
ExtractFilePath와 ExtractFileName을 활용한 파일 경로 분리 ExtractFilePath와 ExtractFileName을 활용한 파일 경로 분리 파일 전체 경로에서 폴더 경로 또는 파일 이름만  따로 추출하고 싶을 때 ExtractFilePath와 ExtractFileName 함수를  사용하면 매우 편리합니다.  설정 파일, 로그 파일, 사용자 선택 파일 처리 시 자주 사용됩니다. uses   System.SysUtils; procedure SplitFilePath; var   FullPath, PathOnly, FileOnly: string; begin   FullPath := 'C:\Program Files\MyApp\data.txt';   PathOnly := ExtractFilePath(FullPath);   // "C:\Program Files\MyApp.. 2025. 4. 3.
TComboBox.Items.Objects를 활용한 데이터 연동 TComboBox.Items.Objects를 활용한 데이터 연동  TComboBox에 표시되는 항목에 추가 정보를 함께  저장하고 싶을 때 Items.Objects를 활용하면 유용합니다.  각 항목에 객체 또는 포인터를 연결해 비즈니스 로직과 연동할 수 있습니다. procedure TForm1.FormCreate(Sender: TObject); begin   ComboBox1.Items.AddObject('사과', TObject(PtrInt(100)));   ComboBox1.Items.AddObject('바나나', TObject(PtrInt(200)));   ComboBox1.Items.AddObject('오렌지', TObject(PtrInt(300))); end; procedure TForm1.Com.. 2025. 4. 2.
TStopwatch를 이용한 실행 시간 측정 TStopwatch를 이용한 실행 시간 측정  성능 분석이나 특정 코드 블록의 처리 시간을 측정할 때는  System.Diagnostics 유닛의 TStopwatch를 사용하는 것이  가장 간편하고 정확합니다.  특히 반복 루프나 쿼리 실행 시간 측정에 유용합니다. uses   System.Diagnostics, System.SysUtils; procedure MeasureExecutionTime; var   Stopwatch: TStopwatch;   I: Integer; begin   Stopwatch := TStopwatch.StartNew;   // 시간 측정 대상 코드   for I := 1 to 1000000 do     Inc(I);   Stopwatch.Stop;   ShowMessage(.. 2025. 3. 27.
타이머(TTimer)를 이용한 주기적 작업 처리 타이머(TTimer)를 이용한 주기적 작업 처리 타이머(TTimer)를 이용한 주기적 작업 처리 TTimer는 주기적으로 어떤 작업을 수행하고 싶을 때 유용하게  사용할 수 있는 컴포넌트입니다.  예를 들어, UI 갱신, 자동 저장, 상태 체크 등에 활용 procedure TForm1.FormCreate(Sender: TObject); begin   Timer1.Interval := 1000;  // 1000ms = 1초   Timer1.Enabled := True; end; procedure TForm1.Timer1Timer(Sender: TObject); begin   Label1.Caption := TimeToStr(Now);  // 매초 현재 시간 표시 end; Interval 속성은 실행 간격(.. 2025. 3. 24.
[1편] VCL 컴포넌트란? 개요 및 기본 개념 VCL 컴포넌트   1. VCL(Visual Component Library)이란?VCL(Visual Component Library)은 Delphi에서 제공하는 UI 컴포넌트 라이브러리로, Windows 애플리케이션을 쉽게 개발할 수 있도록 다양한 UI 요소를 제공합니다. Delphi 개발 환경에서는 VCL을 활용하여 폼 기반(Form-based) 애플리케이션을 제작하며, 코드 작성 없이 드래그 앤 드롭 방식으로 UI를 구성할 수 있습니다.✔ VCL을 사용하면?UI 개발 속도 향상: 컴포넌트를 배치하고 속성을 조정하는 것만으로 UI 제작이 가능복잡한 UI 요소를 쉽게 구성: TButton, TEdit, TPanel 등 다양한 컴포넌트 제공강력한 Windows 네이티브 지원: 윈도우즈 환경에 최적화된 U.. 2025. 2. 17.
Frame을 활용한 최종 통합 및 실행 Frame을 활용한 최종 통합 및 실행  이제까지 Frame을 활용하여 폴더 탐색, 파일 목록 정리, 이미지 표시 기능을 각각 독립적으로 구현하는 방법을 알아봤습니다.이번 포스팅에서는 이 모든 Frame을 하나로 통합하여완전한 Image Viewer 프로그램을 실행하는 과정을 살펴보겠습니다. Frame을 활용한 최종 구조우리가 구현한 Image Viewer는 아래와 같은 3개의 주요 Frame을 포함합니다:TfrFolder Frame폴더 트리 탐색 기능 담당선택된 폴더의 이미지 파일 목록을 TfrImageList에 전달TfrImageList Frame전달받은 이미지 파일 목록을 정렬하여 나열클릭하면 선택된 이미지를 강조 표시TfrImage Frame개별 이미지를 표시하고 선택 이벤트를 처리이제 이 Fra.. 2025. 1. 30.
Frame 활용 실습 주요 구현 코드 Frame 활용 실습 주요 구현 코드 이번 포스팅에서는 Delphi에서 Frame을 활용하여 실제로 구현하는 주요 코드를 살펴보겠습니다.이를 통해 Frame을 활용한 프로그래밍이 얼마나 강력하고 효율적인지 체험할 수 있습니다.특히, 코드 작성의 흐름과 중요한 메서드의 동작 방식을 중심으로 설명하겠습니다. Frame 활용 실습 목표폴더 탐색 및 파일 로딩사용자가 특정 폴더를 선택하면 해당 폴더의 파일 목록을 불러옵니다.이미지 표시 및 정렬선택된 파일 중 이미지를 화면에 정렬하여 표시합니다.독립적인 코드 관리Frame을 활용하여 각 기능을 분리해 관리합니다. Frame의 주요 메서드 구현1. 폴더 탐색 기능 (TfrFolder)폴더 트리 구조를 탐색하고, 선택된 폴더의 파일 목록을 가져오는 역할을 합니다. .. 2025. 1. 24.
Delphi에서 Frame 추가 및 설정하기 Delphi에서 Frame 추가 및 설정하기   프로그래밍에서 Frame은 독립적인 UI 요소를 구성하고 관리하는 데 매우 유용합니다.이번 포스팅에서는 Delphi IDE에서 Frame을 추가하고 설정하는 방법을 단계별로 설명하겠습니다.이를 통해 Frame 기반 프로젝트를 시작하는 데 필요한 기본기를 익힐 수 있습니다. Frame 추가하기Delphi에서 Frame을 추가하는 방법은 간단합니다.새 프로젝트 생성Delphi IDE에서 File > New > VCL Forms Application을 선택합니다.기본적으로 생성된 폼(Form)은 Form1이라는 이름을 가집니다.Frame 추가File > New > Other... 메뉴를 선택합니다.Delphi Files > Frame을 선택한 뒤, 새 Frame.. 2025. 1. 23.
Frame 구조 설계와 분업화 Frame 구조 설계와 분업화  프로그래밍에서 코드의 분업화와 모듈화는 프로젝트의 성공을 좌우하는 중요한 요소입니다. Frame을 활용하면 기능별로 코드를 독립적으로 관리하고 분업화할 수 있습니다. 이번 포스팅에서는 Frame 구조 설계와 분업화 방법을 소개합니다.Frame을 활용한 구조 설계의 필요성하나의 폼(Form)에 모든 기능을 구현하면 코드가 복잡해지고, 수정이나 확장이 어려워집니다. 이와 같은 문제를 해결하기 위해 Frame을 사용하면 다음과 같은 이점이 있습니다:독립적 기능 관리각 Frame이 특정 역할만 담당하여 코드가 간결해집니다.코드 가독성 향상기능별로 분리된 코드 구조로 인해 읽고 이해하기가 쉬워집니다.유지보수 용이성특정 기능을 수정할 때 해당 Frame만 변경하면 됩니다.Frame .. 2025. 1. 15.
Frame을 활용한 Image Viewer 개발 Frame을 활용한 Image Viewer 개발  이번 포스팅에서는 Frame을 활용하여 간단한 Image Viewer를 개발하는 방법을 알아보겠습니다. 기존에 복잡하게 작성된 코드를 Frame으로 분리하고, 효율적으로 관리할 수 있는 구조로 만드는 과정을 살펴봅니다. 왜 Image Viewer에 Frame을 활용해야 할까요?Image Viewer는 폴더 탐색, 파일 로딩, 이미지 표시 등의 기능을 포함한 프로그램입니다. 기존 방식으로 코드를 작성하면:모든 코드가 하나의 폼(Form)에 작성되어 복잡도가 증가합니다.기능별로 나눠지지 않아 유지보수가 어려워집니다.하지만 Frame을 활용하면:코드 분업화: 폴더 탐색, 파일 로딩, 이미지 표시 기능을 각각의 Frame으로 나눌 수 있습니다.가독성 향상: 각 .. 2025. 1. 6.
Frame을 활용한 간단한 프로그램 예제 Frame을 활용한 간단한 프로그램 예제   프로그래밍에서 간결하고 효율적인 코드 작성은 매우 중요합니다. 특히, 한 화면에 여러 기능이 필요하거나 중복 작업을 줄이고 싶을 때, Frame은 훌륭한 해결책이 될 수 있습니다. 이번 포스팅에서는 Frame을 사용한 간단한 프로그램 예제를 통해 실전 활용법을 알아보겠습니다.Frame을 사용하지 않은 경우의 문제점Frame을 사용하지 않으면 모든 기능을 하나의 폼(Form)에 구현해야 합니다. 이 경우:코드가 한 곳에 집중되어 가독성이 떨어집니다.동일한 기능을 여러 폼에서 사용해야 할 때 코드 중복이 발생합니다.유지보수 시 특정 기능만 수정하려 해도 다른 코드에 영향을 줄 가능성이 큽니다.이런 문제를 해결하기 위해 Frame을 활용하면 코드의 캡슐화와 재사용성.. 2025. 1. 5.
프로그래머라면 알아야 할 Frame 활용의 기본 개념 프로그래머라면 알아야 할 Frame 활용의 기본 개념  프로그래밍을 하다 보면 한 화면에서 다양한 기능을 그룹화해야 할 때가 많습니다. 특히, 하나의 폼(Form)에 여러 컴포넌트를 추가하게 되면 코드가 복잡해지고 유지보수가 어려워질 수 있습니다. 이런 경우, TFrame을 활용하면 보다 효율적으로 화면을 설계하고 코드를 관리할 수 있습니다.Frame이란 무엇인가요?Frame은 Delphi에서 제공하는 유용한 UI 설계 도구로, 하나의 폼을 여러 개로 나눠 작업할 수 있도록 도와줍니다. 쉽게 말해, **"재사용 가능한 미니 폼"**이라고 할 수 있습니다. Frame을 사용하면 각 기능별로 코드를 캡슐화하고 독립적으로 관리할 수 있어, 코드의 가독성과 유지보수성을 크게 향상시킬 수 있습니다.Frame을 왜.. 2025. 1. 4.
한글(2Byte)문자열 깨지지 않게 자르기 한글(2Byte)문자열 깨지지 않게 자르기    WideString 을 사용하자한글을 자를때 깨진 1Byte 문자를 WideString 변수에 넣었다가String 변수로 되받아서 Trim 처리를 하면 깨진 문자가 정리되어 이걸 활용 이 예제는 C++Builder 에서도 동일하게 적용 procedure TForm1.Button1Click(Sender: TObject);varTextString, TextTrim: String;TempWide: WideString;LenthCnt: Integer;beginTextString := Trim(Edit1.Text); //원본문자열LenthCnt := StrToIntDef(Edit2.Text,7); //문자열 자를 위치 if ( Length(TextString) > .. 2024. 7. 8.
프로그램 디버그(Debug) 메시지를 찍기 프로그램 디버그(Debug) 메시지를 찍기 프로그램 작성시 디버깅을 특정상황에서 showmessage 를 통해 하는 경우도 있지만..델파이의 result 창에서 나타나게 하는 방법은 OutputDebugString 을 이용해 문자열을 출력하는 것이다. 2024. 7. 6.
Winapi.WinSock을 이용한 WOL(Wake On Lan) 구현 WinSock을 이용한 WOL(Wake On Lan) 구현   unit Unit1; interface usesWindows, Messages, SysUtils, Variants, Classes,Graphics, Controls, Forms, Dialogs, StdCtrls, WinSock; typeTForm1 = class(TForm)Edit1: TEdit;Button1: TButton;Memo1: TMemo;procedure Button1Click(Sender: TObject);procedure FormCreate(Sender: TObject);procedure FormClose(Sender: TObject; var Action: TCloseAction);private{ Private declarati.. 2024. 7. 2.
dfm 직접 폼디자인 변경 dfm 직접 폼디자인 변경   실시간에 소켓등으로 dfm 파일을 쏴서그걸 읽어서 폼디자인 변경할 수 있는 방법인데 몇가지 제한이 있는데콤포넌트의 이벤트는 dfm 에 없어야 하고..form 전체를 dfm 으로 받아서 할수는 없고 form 에 프레임이나패널을 써서 프레임이나 패널이 dfm 의 최상위 콤퍼넌트일 때 쓸 수 있고RegisterClasses 로 클래스 등록을 모두 해줘야 하는등.. 제한이 있네요.. 간단히 예제를 만들어봐서 올립니다.폼의 일부 영역만 바꾸려고 할 때는 유용할 거 같네요.이벤트없고 콤포넌트만 있는다거나 하는 경우.. 소스는 아래와 같은데TReader 의 ReadRootComponent 메소드로 dfm 읽어들여서그 루트콤포넌트의 parent 만 정해주는 방식입니다. procedure .. 2024. 7. 1.
TMemo(메모장) 스트링(string) 입력 속도개선 TMemo(메모장) 스트링(string) 입력 속도개선  메모장에서 문자를 바꾸거나 할경우 메모장의 내용을String에 옮긴 다음 해당 작업을 하고다시 메모장으로 불러들일때 별생각없이 아래와 같이 한다. (예)iStr:= Memo1.Lines.Text;iStr:= StringReplace(iStr, 'a', 'b', []) ;Memo1.Lines.Text:= iStr; 그런데 메모장의 내용이 많울 경우(스트링의 크기가 클)에는Memo1.Lines.Text:= iStr; 에서 엄청 많은 시간을 먹는다. 개선방법 var iMemStream: TMemoryStream;iStr: string;beginiStr:= Memo1.Lines.Text;iStr:= StringReplace(iStr, 'a', 'b', [.. 2024. 6. 28.
레지스트리 ID 찾기 레지스트리 ID 찾기  레지스트리 Hkey_User 밑에 S-1-5-21 로 해당되는 ID를 얻는다. uses Registry 를 추가 function GetOwnerID: String;varReg: TRegistry;S: TStringList;S_Tmp: String;i: integer;beginResult := '';Reg := TRegistry.Create;S := TStringList.Create; tryReg.RootKey := HKEY_USERS;if Reg.OpenKeyReadOnly('') thenbeginReg.GetKeyNames(S);for I := 0 to s.Count - 1 dobeginS_Tmp := Copy(S.Strings[i], 1, 8);if S_Tmp = 'S-1-5-.. 2024. 6. 27.
밝기(bright), 대비(contrast), 감마(gamma), 색농도(Saturation) 조절 밝기(bright), 대비(contrast), 감마(gamma), 색농도(Saturation) 조절    Amount : 강도 0~255Saturation : 색농도 // contrastfunction IntToByte(i: Integer): Byte;beginif i > 255 then Result := 255elseif i elseResult := i;end; procedure Contrast(var clip: tbitmap; Amount: Integer);varp0: pbytearray;rg, gg, bg, r, g, b, x, y, m: Integer;beginfor y := 0 to clip.Height - 1 dobeginp0 := clip.scanline[y];m := 0;for x := 0.. 2024. 6. 19.