본문 바로가기

델파이485

Screen.Cursors를 이용한 마우스 커서 변경 Screen.Cursors를 이용한 마우스 커서 변경  사용자에게 작업 진행 중임을 시각적으로 알려주고 싶을 때  마우스 커서를 바꾸는 것이 좋은 방법입니다.  Screen.Cursors를 사용하면 특정 작업 중에는 '모래시계', 완료 후에는 기본 커서로 되돌리는 등 UX 향상에 도움이 됩니다. uses   Vcl.Forms, Vcl.Controls, Vcl.Dialogs; procedure LongRunningTask; begin   Screen.Cursor := crHourGlass;  // 모래시계 커서 표시   try     Sleep(3000);  // 3초간 작업     ShowMessage('작업 완료!');   finally     Screen.Cursor := crDefault;  // .. 2025. 4. 12.
ForceDirectories로 중첩된 폴더 자동 생성하기 ForceDirectories로 중첩된 폴더 자동 생성하기파일을 저장할 때 필요한 폴더가 없으면 오류가 발생할 수 있습니다.  이때 ForceDirectories 함수를 사용하면 다단계 폴더도  한 번에 생성할 수 있어 매우 유용합니다.  특히 백업 폴더나 사용자 디렉토리를 미리 생성해야 할 때 좋습니다. uses   System.SysUtils; procedure CreateFolderStructure; var   FolderPath: string; begin   FolderPath := 'C:\MyApp\Data\Backup\2025\04\11';   if ForceDirectories(FolderPath) then     ShowMessage('폴더가 성공적으로 생성되었습니다!')   else   .. 2025. 4. 11.
TThread.Queue를 활용한 안전한 UI 업데이트 TThread.Queue를 활용한 안전한 UI 업데이트델파이에서 스레드 작업을 할 때  직접 UI 컴포넌트에 접근하면 오류가 발생할 수 있습니다.  이때 TThread.Queue를 사용하면 UI 스레드에서 안전하게  코드를 실행할 수 있습니다.  백그라운드 작업 중 UI에 메시지를 띄우거나  데이터를 갱신할 때 매우 유용합니다. uses   System.Classes, Vcl.Dialogs; procedure StartBackgroundTask; begin   TThread.CreateAnonymousThread(procedure   begin     Sleep(3000); // 3초간 작업 수행     TThread.Queue(nil, procedure     begin       ShowMessage.. 2025. 4. 10.
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.
TFormatSettings를 사용한 지역화된 숫자/날짜 포맷 처리 TFormatSettings를 사용한 지역화된 숫자/날짜 포맷 처리 델파이에서 숫자나 날짜 형식을 지역 설정에 따라  다르게 출력해야 할 경우 TFormatSettings를 사용하면 유용합니다.  특히 다국어 지원이나 사용자 맞춤 포맷이 필요할 때 매우 효과적입니다. uses   System.SysUtils; procedure ShowLocalizedDateAndNumber; var   FS: TFormatSettings;   FormattedDate, FormattedNumber: string; begin   FS := TFormatSettings.Create('fr-FR');  // 프랑스 지역 설정   FormattedDate := FormatDateTime('dd mmmm yyyy', Date, .. 2025. 4. 7.
Interface를 활용한 의존성 주입 구조 만들기 Interface를 활용한 의존성 주입 구조 만들기 Interface를 사용하면 클래스 구현에 의존하지 않고 코드를 작성할 수 있어,  유지보수성과 확장성이 높아집니다.  델파이에서는 인터페이스 기반 설계를 통해 DI(Dependency Injection) 패턴을 쉽게  구현할 수 있습니다. type   IPrinter = interface     ['{3B770F50-22DA-4E69-8F28-56FA4E09B307}']     procedure Print;   end;   TConsolePrinter = class(TInterfacedObject, IPrinter)     procedure Print;   end;   TService = class   private     FPrinter: IPrin.. 2025. 4. 4.
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.
익명 메서드(Anonymous Method) 활용하기 익명 메서드(Anonymous Method) 활용하기 익명 메서드는 이름 없이 즉석에서 정의할 수 있는 함수 또는 프로시저입니다.콜백 함수나 이벤트 핸들링을 단순화하는 데 유용합니다. uses   System.SysUtils; procedure ExecuteWithCallback(Callback: TProc); begin   ShowMessage('작업을 시작합니다...');   Callback;  // 전달된 익명 메서드 실행   ShowMessage('작업이 완료되었습니다!'); end; procedure Test; begin   ExecuteWithCallback(procedure   begin     ShowMessage('중간 작업 진행 중...');   end); end;  포인트:TProc .. 2025. 3. 20.
[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.
상속이란? 상속이란  상속은 객체지향 프로그래밍(OOP)의 꽃이라 불릴 만큼 중요한 개념입니다.여러 클래스가 공통적으로 가지는 요소를 상위 클래스(부모 클래스) 에 정의한 후, 이를 하위 클래스(자식 클래스) 가 물려받아 재사용하는 방식입니다. ✅ 주요 특징코드 중복 방지: 동일한 기능을 여러 클래스에서 반복적으로 구현할 필요 없음.유지보수 용이: 부모 클래스의 변경 사항이 하위 클래스에도 자동 반영됨.확장성 강화: 상속받은 클래스를 기반으로 새로운 기능을 쉽게 추가 가능. 🔹 클래스의 정규화 (Normalization)객체지향 설계에서 중복 요소를 제거하는 과정입니다. 📌 예제❌ 정규화 전: 각 관리자 클래스가 중복된 로그인() 메소드를 개별적으로 구현✅ 정규화 후: 관리자추상클래스에서 로그인()을 정의하고,.. 2025. 2. 10.
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.
한글(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.
해당날짜 몇 주차인지 알아내기 해당날짜 몇 주차인지 알아내기 uses System.DateUtils function myGetWeekNo(paToday:TDateTime):Word;varvWeekNo : word;vDTstart : TDate;beginvDTstart := EncodeDate( YearOf(paToday), MonthOf(paToday), 01 );vWeekNo := WeekOfTheYear(paToday) - WeekOfTheYear(vDTstart) +1;if Not (vWeekNo IN [1..6]) then //12월 31일이 월요일인경우 리턴값이 65xxx를 예방하기 위함vWeekNo := 6;Result := vWeekNo;end; 2024. 7. 5.
델파이 포인터 사용 팁 델파이 포인터 사용 팁 ShellApi 를 이용할때 윈도우에서 사용하는 언어인'C' 와 델파이의 'Pascal'의 포인터 다루는 방법이 달라많은 혼동(나만?)을 일으킨다. 특히나 파스칼에서는 포인터방법이여러가지가 있어 햇갈리기 아주 좋다. 그래서 한번 정리하여 보았다.예제는 폴더를 찾아 지정하는SHBrowseForFolder 를 이용하는 것으로 하였다. 1. 버퍼를 이용하는 방법var Buffer: array[0..255] of char; beginpszDisplayName:= @Buffer; .......MessageBox(handle, Buffer, '', MB_OK); end; 2. pChar 를 이용하는 방법 : 'C' 와 유사var Buffer: pChar;beginGetMem(Buffer, 2.. 2024. 7. 4.
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.