본문 바로가기

Delphi134

해당날짜 몇 주차인지 알아내기 해당날짜 몇 주차인지 알아내기 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.
델파이 추상화(abstraction) 델파이 추상화(abstraction) abstraction(추상화)라는 단어를 프로그래밍에 관한 책에서 한번쯤 들어봤을 것이다. 그런데, 대다수의 책이 이 단어의 의미를 매우 장황하고 어렵게 설명하기 때문에, 이해하기 어렵다. 추상화란 간단히 이야기하자면 다음과 같이 정의할 수 있다. 추상화(abstraction) "어떤 대상에 명칭(이름)을 부여하고, 그 대상의 성질을 파악하고 분류하려는 인간적 능력" 말이 어려운가? 달리 예를 들어 보자. "감정에는 아픔, 슬픔, 기쁨, 고통 등이 있다." 아픔, 슬픔, 기쁨, 고통은 실존하는 대상(물체)이 아니다. 그러나 우리 인간들은 이 실존하지 않는 애매한 개념에 이름을 붙이고 그것들을 분류하였다. 다시 말해서, 감정이란 대표 개념의 일부로서 아픔, 슬픔, 기쁨.. 2024. 3. 26.
FindWindowEx로 찾지못하는 원도우 핸들구하기 FindWindowEx로 찾지못하는 원도우 핸들구하기 FindWindowEx함수로 찾지못하는 윈도우 핸들이 무지많다 아래함수는 제경험상으로는 95% 이상 핸들을 찾을수있다. function SubWindowFind( ParentWnd : HWND; FindClassName : string ): HWND; var ClassName : array[0..255] of char; FindWnd : HWND; begin Result := 0; if ParentWnd = 0 then Exit; FindWnd := GetWindow( ParentWnd, GW_CHILD ); while ( FindWnd 0 ) do begin if Boolean( GetClassName( FindWnd, ClassName, 255) .. 2024. 3. 23.
실행파일 종료시 실행파일 삭제 실행파일 종료시 실행파일 삭제 procedure DeleteMe; var BatchFile:TextFile; BatchFileName:String; ProcessInfo:TProcessInformation; StartUpInfo:TStartupInfo; begin BatchFileName:=ExtractFilePath(application.exename)+'$$336699.bat'; AssignFile(BatchFile, BatchFileName); Rewrite(BatchFile); Writeln(BatchFile, ':try'); Writeln(BatchFile, 'del "' + application.exename + '"'); Writeln(BatchFile, 'if exist "' + appli.. 2024. 3. 11.
숫자에 콤마 찍어주기 숫자에 콤마 찍어주기 { ******************************************************************************** ** ** ** 숫자에 화폐단위 000,000,000~ 처럼 3단위로 콤마를 삽입시켜 준다. ** ** 999,999,999,999,999 단위 까지 가능함. 999조 ** ** ** ******************************************************************************** } Function Comma(I : Double) : String; var StrTmp : String; Cunt, J1, J2, K, L : Integer; Begin Cunt := 0; L := 3; StrT.. 2024. 3. 9.
윈도우에 폰트 설치/제거 하기 윈도우에 폰트 설치/제거 하기 // 폰트 설치 AddFontResource(PChar('XXXFont.TTF')); SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0); // 폰트 제거 RemoveFontResource(PChar('XXXFont.TTF')); SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0); 2024. 3. 5.