본문 바로가기

Delphi/프로시저-함수56

GetTickCount를 사용한 경과 시간 측정 GetTickCount를 사용한 경과 시간 측정 델파이의 GetTickCount 함수는 시스템이 부팅된 이후 흐른 시간을 밀리초 단위로 반환합니다. 이를 이용하면 간단한 시간 측정 기능을 구현할 수 있어 성능 테스트나 시간 제한 로직 작성에 활용할 수 있습니다. uses Windows, SysUtils; procedure MeasureElapsedTime; var StartTick, EndTick: Cardinal; begin StartTick := GetTickCount; Sleep(1500); // 일부러 지연 (1.5초) EndTick := GetTickCount; ShowMessage('경과 시간: ' + IntToStr(EndTick - StartTick) + 'ms'.. 2025. 5. 20.
Assigned 함수로 객체나 포인터의 nil 여부 확인하기 Assigned 함수로 객체나 포인터의 nil 여부 확인하기 델파이에서 포인터나 객체가 유효한지, 즉 nil이 아닌지를 확인할 때는 Assigned 함수를 사용하는 것이 가장 안전하고 명확합니다. 직접 비교하는 방식보다 의도를 드러내고 코드 가독성을 높일 수 있습니다. procedure CheckObject; var MyList: TStringList; begin MyList := nil; if not Assigned(MyList) then ShowMessage('리스트가 생성되지 않았습니다.'); MyList := TStringList.Create; try if Assigned(MyList) then ShowMessage('리스트가 생성되어 있습니다.').. 2025. 5. 14.
Application.Terminate로 안전하게 프로그램 종료하기 Application.Terminate로 안전하게 프로그램 종료하기 델파이 애플리케이션을 종료할 때는 Application.Terminate를 사용하는 것이 가장 안전한 방법입니다. 이는 현재 실행 중인 메시지 루프를 종료하고 메인 폼을 닫으면서 애플리케이션을 정리된 방식으로 종료시켜 줍니다. procedure TForm1.Button1Click(Sender: TObject); begin if MessageDlg('프로그램을 종료하시겠습니까?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then Application.Terminate; end; Application.Terminate는 비정상 강제 종료가 아닌 정리된 종료 처리 방식 종료 전에 확인 메시지.. 2025. 5. 8.
InterlockedIncrement로 안전한 정수 증가 처리하기 InterlockedIncrement로 안전한 정수 증가 처리하기 멀티스레드 환경에서 동일한 변수를 동시에 증가시키면 경합 조건(Race Condition)이 발생할 수 있습니다. 델파이의 InterlockedIncrement 함수는 원자적(Atomic)으로 정수 값을 증가시켜 스레드 충돌을 방지합니다. uses System.SyncObjs, System.Classes, System.SysUtils; var Counter: Integer = 0; procedure IncrementInThread; begin TThread.CreateAnonymousThread(procedure var I: Integer; begin for I := 1 to 1000 do .. 2025. 5. 7.
Copy 함수를 사용한 문자열 일부 추출 Copy 함수를 사용한 문자열 일부 추출 델파이에서 문자열의 일부분을 추출할 때 Copy 함수를 사용하면 매우 쉽고 빠르게 원하는 부분을 잘라낼 수 있습니다. 텍스트 처리, 데이터 분석, 포맷 변환 등 다양한 상황에서 유용하게 활용됩니다. uses System.SysUtils; procedure CopyExample; var OriginalText, ExtractedText: string; begin OriginalText := 'Welcome to Delphi World!'; ExtractedText := Copy(OriginalText, 12, 6); // 12번째 문자부터 6글자 추출 ShowMessage('추출된 텍스트: ' + ExtractedText); end; Copy.. 2025. 4. 28.
IfThen을 사용한 간결한 조건 처리 IfThen을 사용한 간결한 조건 처리 델파이의 IfThen 함수는 짧고 간결하게 조건에 따라 값을 선택할 수 있게 해주는 함수입니다. 전통적인 if..then..else 구문보다 한 줄로 표현할 수 있어 코드가 훨씬 깔끔해집니다. uses System.StrUtils; procedure IfThenExample; var UserLevel: Integer; ResultText: string; begin UserLevel := 2; ResultText := IfThen(UserLevel = 1, '관리자', '일반 사용자'); ShowMessage('사용자 권한: ' + ResultText); end; IfThen(조건, 참일 때 값, 거짓일 때 값) 형식 문자열 뿐 아니라 .. 2025. 4. 25.
IncludeTrailingPathDelimiter로 경로 끝에 슬래시 추가하기 IncludeTrailingPathDelimiter로 경로 끝에 슬래시 추가하기 파일 또는 폴더 경로를 조합할 때 슬래시(\) 누락으로 인해 문제가 생기는 경우가 많습니다. 델파이의 IncludeTrailingPathDelimiter 함수는 경로 끝에 슬래시가 없으면 자동으로 추가해줘 경로 연결 시 안전하게 사용할 수 있습니다. uses System.SysUtils; procedure JoinFolderPath; var BasePath, FullPath: string; begin BasePath := 'C:\MyApp\Data'; FullPath := IncludeTrailingPathDelimiter(BasePath) + 'Backup.txt'; ShowMessage('전체 경로.. 2025. 4. 18.
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.
해당날짜 몇 주차인지 알아내기 해당날짜 몇 주차인지 알아내기 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.
숫자 정수 반올림(어셈블러 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.
주민등록번호 성인인증 주민등록번호 성인인증   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.
한글 자음 모음 분리 한글 자음 모음 분리    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.
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.
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.
Delphi Open ToolsAPI (3) Delphi Open ToolsAPI 모듈의 정의 모듈을 쉽게 표현하자면 대표 파일을 가진 편집 단위라고 보면 된다. 프로젝트 그룹, 프로젝트, 유닛, 폼유닛등이 모두 모듈이다. 하나 혹은 그 이상의 파일이 하나의 모듈을 구성한다. 폼이 있는 유닛이 대표적인 경우인데 예를들어 Unit1.pas는 Unit1.dfm와 함께 두개의 파일로 구성되어 있으며 대표파일은 Unit1.pas다. 프로젝트나 프로젝트 그룹등도 하나의 모듈로 취급된다. 모듈을 찾거나 여는 등의 작업은 파일명을 통해 이루어지는데 이를 대표파일이로 정의하자 (이를 지칭할만한 뚜렷한 이름이생각나지 않는다) . 대표파일로는 *.pas, *.bpg, *.dpr,*.dpk가 있다. 델파이에 프로젝트 그룹과 프로젝트가 로드된 상태에서 모듈의 파일명을 .. 2023. 12. 26.
Delphi Open ToolsAPI (2) Delphi Open ToolsAPI Delphi Open ToolsAPI 메뉴의 OnClick등의 이벤트는 오브젝트의 메쏘드를 필요로 한다. 따라서 무작정 빈 유닛을 기준으로 삼아 작성하기 보다는 DataModule을 기반으로 하는 것이 좋다. 혹은 자신이 아예 새로운 오브젝트 클래스를 작성할 생각이라면 그렇게 해도 좋다. 여하간 이벤트가 필요하거나 혹은 컴퍼넌트가 필요한 경우 메인모듈은 오브젝트를 기반으로 작성하는 것이 좋다. 필자가 제시하는 방법은 DataModule이 메인 모듈이 되고 기타 옵션적용등을 위해 필요한 폼은 메인모듈에서 생성해서 보여주는 것이다. 될 수 있으면 Form을 메인모듈로 잡지 않는 것이 좋다. DataMoudle 보다 리소스를 더 많이 잡아먹을 것이기 때문이다. 다음의 사항.. 2023. 12. 19.