본문 바로가기

Delphi179

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.
HEX 코드를 TColor 값으로 변환하여 반환 HEX 코드를 TColor 값으로 변환하여 반환     HexToTColor(), TColorToHex() HEX 코드를 TColor 값으로 변환하여 반환한다 function HexToTColor(RGBCode: String): TColor;varhex: Int64;Color: TColor;iRGBCode: STring;begintryiRGBCode := copy(RGBCode,5,2)+copy(RGBCode,3,2)+copy(RGBCode,1,2);hex := StrToInt64('$00'+iRGBCode);excepton Exception dobeginhex := $00000000;MessageDlg('올바르지 않은 색상값입니다.', mtError, [mbOK], 0);end;end;Color := .. 2024. 4. 29.
델파이 코드구역(REGION) 사용방법 델파이 코드구역(REGION) 사용방법 {$REGION 'MyRegion'} procedure MyRegion1; begin end; procedure MyRegion2; begin end; {$ENDREGION} 2024. 4. 12.
상속(inheritance)과 연결(association) 상속(inheritance)과 연결(association) 객체지향에서 상속은 매우 막강한 개념이지만, 상속으로 모든 문제를 풀려하면 더 꼬이는 경우가 많이 발생한다. 상속의 가장 큰 단점은 클래스 관계를 복잡하게 만든다는 것이다. 여러 단계의 상속은, 이해하기도 힘들 뿐더러 수정도 쉽지 않다. 상속은 All or Nothing 개념이다. 이말인즉, 상속은 상위 클래스의 모든 기능을 하위 클래스로 전이 한다는 것이다. 이 때문에, 상위 클래스의 기능 중에서 어떤 기능을 제거하거나 추가하려면, 그 상위 클래스로 부터 상속받은 새로운 클래스를 만들고 그 기능을 override해야 한다는 문제점이 있다. 이 과정이 반복되면 쪼잔한 기능 때문에 수많은 클래스 계층 구조가 생기므로, 객체지향 고수들은 다른 방법을.. 2024. 4. 8.