본문 바로가기

Delphi142

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.
TStringStream을 활용한 문자열과 스트림 간 변환 TStringStream을 활용한 문자열과 스트림 간 변환 TStringStream은 문자열을 스트림처럼 다룰 수 있게 해주는 클래스입니다.  주로 파일, 네트워크, JSON 처리 등에서 문자열을 스트림 형태로  넘겨야 할 때 유용하게 사용 uses   System.Classes, System.SysUtils; procedure UseStringStream; var   Str: string;   Stream: TStringStream; begin   Str := '이 문자열은 스트림으로 변환됩니다.';   Stream := TStringStream.Create(Str, TEncoding.UTF8);   try     // 스트림 데이터를 다시 문자열로 가져오기     Stream.Position := 0.. 2025. 4. 1.
RTTI를 이용한 런타임 속성 정보 접근 RTTI를 이용한 런타임 속성 정보 접근  델파이의 RTTI(Run-Time Type Information)를 활용하면  클래스나 객체의 속성, 메서드, 타입 정보 등을  런타임 중에 확인하고 동적으로 접근할 수 있습니다.  이를 통해 설정 자동화, JSON 직렬화, ORM 등의 고급 기능을 구현할 수 있습니다. uses   System.Rtti, System.TypInfo, System.SysUtils; type   TPerson = class   private     FName: string;     FAge: Integer;   published     property Name: string read FName write FName;     property Age: Integer read FAge .. 2025. 3. 31.
Record Helper를 사용한 레코드 기능 확장 Record Helper를 사용한 레코드 기능 확장  Delphi의 Record Helper 기능을 활용하면  기존 레코드 타입에 메서드나 프로퍼티를 추가할 수 있어,  객체지향 방식의 코드처럼 레코드를 활용할 수 있습니다.  특히 수학, 날짜, 좌표 등 간단한 구조체 데이터에  기능을 부여할 때 유용합니다. type   TPoint = record     X, Y: Integer;   end;   TPointHelper = record helper for TPoint     function ToString: string;     function DistanceTo(const AOther: TPoint): Double;   end; { TPointHelper } function TPointHelper.T.. 2025. 3. 26.
Format 함수를 활용한 문자열 포맷팅 Format 함수를 활용한 문자열 포맷팅 Format 함수는 문자열 안에 값을 삽입할 때 매우 유용합니다.  숫자, 문자열, 날짜 등을 원하는 형식으로 손쉽게 조합할 수 있어  가독성과 유지보수성이 좋아집니다 uses   System.SysUtils; procedure ShowFormattedMessage; var   UserName: string;   Age: Integer;   Msg: string; begin   UserName := '김델파이';   Age := 35;   Msg := Format('이름: %s, 나이: %d세', [UserName, Age]);   ShowMessage(Msg); end; %s, %d, %f 등 포맷 태그를 사용해 다양한 타입의 데이터를 삽입할 수 있습니다. [값.. 2025. 3. 25.
익명 메서드(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.
상속이란? 상속이란  상속은 객체지향 프로그래밍(OOP)의 꽃이라 불릴 만큼 중요한 개념입니다.여러 클래스가 공통적으로 가지는 요소를 상위 클래스(부모 클래스) 에 정의한 후, 이를 하위 클래스(자식 클래스) 가 물려받아 재사용하는 방식입니다. ✅ 주요 특징코드 중복 방지: 동일한 기능을 여러 클래스에서 반복적으로 구현할 필요 없음.유지보수 용이: 부모 클래스의 변경 사항이 하위 클래스에도 자동 반영됨.확장성 강화: 상속받은 클래스를 기반으로 새로운 기능을 쉽게 추가 가능. 🔹 클래스의 정규화 (Normalization)객체지향 설계에서 중복 요소를 제거하는 과정입니다. 📌 예제❌ 정규화 전: 각 관리자 클래스가 중복된 로그인() 메소드를 개별적으로 구현✅ 정규화 후: 관리자추상클래스에서 로그인()을 정의하고,.. 2025. 2. 10.
해당날짜 몇 주차인지 알아내기 해당날짜 몇 주차인지 알아내기 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.
간단한 상속(succession) / 인터페이스(interface) 상속(succession)  인터페이스(interface)   델파이에서는 클래스 다중상속이 안되기 때문에보통 인터페이스 다중상속을 많이 사용한다. 원래 클래스 상속에서 기본적으로 배우는게 공통되는 기능을상위클래스의 메소드로 만들고 하위클래스에서그 메소드를 오버라이드 해서 구현하는 것인데 이런것이 인터페이스로도가능한 것이므로 둘을 비교해서 간단하게 살펴보자. 예를들어 Animal 클래스가 있고 cat 클래스가 상속을 하든인터페이스를 상속하든 bark 라는 '야옹이라고 짖는' 메소드를 구현하는 예제이다. type{ interface }IAnimalIntf = interface(IUnknown)procedure bark;end; TCat = class(TInterfacedObject, IAnimalIntf).. 2024. 6. 20.
델파이 프로시저/함수를 스레드(Thread)로 실행 델파이 프로시저/함수를 스레드(Thread)로 실행   unit Unit1; interface usesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; typeTForm1 = class(TForm)Button1: TButton;Button2: TButton;procedure Button1Click(Sender: TObject);procedure Button2Click(Sender: TObject);private{ Private declarations }public{ Public declarations }procedure TestFunc(Sender: TObject);end; //-----.. 2024. 6. 12.
인터페이스에 오브젝트 얻기 인터페이스에 오브젝트 얻기  function GetImplementingObject(const I: IInterface): TObject;constAddByte = $04244483;AddLong = $04244481;typePAdjustSelfThunk = ^TAdjustSelfThunk;TAdjustSelfThunk = packed recordcase AddInstruction: longint ofAddByte : (AdjustmentByte: shortint);AddLong : (AdjustmentLong: longint);end; PInterfaceMT = ^TInterfaceMT; TInterfaceMT = packed recordQueryInterfaceThunk: PAdjustSelfThun.. 2024. 5. 30.
숫자 정수 반올림(어셈블러 Assembler) 숫자 정수 반올림(어셈블러 Assembler)   function xRoundInteger(pData, pDec: Integer): Integer;{ xRoundInteger(126,10) = 130 }asmMov ECX,EDXCdqIDiv ECXShl EDX,1Cmp EDX,ECXJb @Skip2Or EAX,EAXJs @Skip1Inc EAXJmp @Skip2@Skip1:Dec EAX@Skip2:IMul ECXend; function xTruncInteger(pData, pDec: Integer): Integer;{ xTruncInteger(354,100) = 300 }asmMov ECX,EDXCdqIDiv ECXIMul ECXend; 2024. 5. 28.
델파이의 String 변수 팁 델파이의 String 변수 팁      내부적으로는 포인터이면서 외견상으로는 숫자와 같은 일반 변수처럼 작동한다. 따라서 string변수는 자유롭게 포인터형태로 타입캐스팅이 가능하며포인터 조작이 가능하다. vars1: string;p: pointer;begins1 := 'Hello world'; p := pointer(s1);Move(p^, xxx^, Length(s1));end;  다른 특징은 델파이의 스트링변수를 복사할때 나타난다. vars1 : string;s2: stringbegins1 := 'Hello world';s2 := s1;Memo1.Lines.Add(inttostr(integer(Pointer(s1))) + ','+ inttostr(integer(Pointer(s2)))); 메모에서 확.. 2024. 5. 24.
주민등록번호 성인인증 주민등록번호 성인인증   function IsUserAudult(jumin : string):boolean;varjuminleng, lastnum : integer;yy, mm, dd : string;nyy, nmm, ndd : integer;iyy, imm, idd : integer;ryy, rmm : integer;isAudult : boolean;begin result := false; nyy := strtoint(Formatdatetime('YYYY', now));nmm := strtoint(Formatdatetime('MM', now));ndd := strtoint(Formatdatetime('DD', now)); juminleng := length(jumin); if juminleng exit.. 2024. 5. 14.
첫번째 영문을 대문자 변경 첫번째 영문을 대문자 변경  function TitleCase(const str: string): string;varnewword: boolean; i: integer;c: char;beginnewword := true;result := Lowercase(str); for i := 1 to Length(result) dobeginc := result[i];if c in ['a'..'z'] thenbeginif newword thenbeginresult[i] := UpCase(c);newword := false;end;endelseif not (c in ['0'..'9']) thennewword := true;end;end; 2024. 5. 13.
for TCollectionItem for TCollectionItem  for 컬렉션아이템 in 컬렉션 do begin....end;  사용법예시varItem : TCollectionItem; beginfor Item in TCollection do beginItem.Name... 등으로 해당 컬렉션 아이템으로 작업end;end; 위와 같이 주로 컬렉션 작업때 유용하지만..배열에서도 사용할 수가 있다고 되어 있네요. 예를 들면varI : Integer;IArray1: array[0..9] of Integer = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10);beginfor I in IArray1 dobegin// Do something with I...end;end; 이와 같이..이 같이 for ... in 문장을 지원하는 클.. 2024. 5. 11.
한글 자음 모음 분리 한글 자음 모음 분리    constHanBase = $AC00; //유니코드 3.0 에서의 시작 한글영역HanLast = $D7AF; //유니코드 3.0 에서의 마지막 한글영역ChoSungStr:WideString = 'ㄱㄲㄴㄷㄸㄹㅁㅂㅃㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎ';JungSungStr:WideString = 'ㅏㅐㅑㅒㅓㅔㅕㅖㅗㅘㅙㅚㅛㅜㅝㅞㅟㅠㅡㅢㅣ';JongSungStr:WideString = ' ㄱㄲㄳㄴㄵㄶㄷㄹㄺㄻㄼㄽㄾㄿㅀㅁㅂㅄㅅㅆㅇㅈㅊㅋㅌㅍㅎ'; function JamoSplit(const Han: WideChar):WideString;varUniCode: Integer;ChoSung, JungSung, JongSung: Integer;beginResult := '';for UniCode := 1 to L.. 2024. 5. 10.
ShortString, LongString, WideString 정적배열, 동적배열 ShortString, LongString, WideString 정적배열, 동적배열   짧은 문자열 타입 (ShortString)  var Str : ShortString; 총길이는 255이고Str[0]에 문자열의 길이가 담겨져 있고 다음 인덱스 부터는 문자가 들어간다여기서 한가지 지시어를 소개 시켜드리자면 Absolute 이다varStr : ShortString;StrLen : Byte Absolute Str 이렇게 하면 StrLen은 Str의 시작주소가 같게 된다. 긴 문자열 타입(Long Stirng)  오프셋 내용-8 32비트 참조 카운트 -4 바이트 단위의 길이 0..길이-1 문자열길이 Null 문자Str := 'Edit1'이라고 넣고 -8 부터 -1까지의 주소의 값이 20005000..32비트.. 2024. 5. 6.