본문 바로가기

Delphi Tip/+Tip62

정해진 시간에 없어지는 MessageBox 정해진 시간에 없어지는 MessageBox 정해진 시간에 없어지는 MessageBox procedure MessageBoxTimerProc(hWnd: HWND; uMsg: UINT; idEvent: UINT; Time: DWORD); stdcall; ... procedure MessageBoxTimerProc(hWnd: HWND; uMsg: UINT; idEvent: UINT; Time: DWORD); begin PostQuitMessage(0); end; function TimedMessageBox(hwndParent: HWND; ptszMessage: LPCTSTR; ptszTitle: LPCTSTR; flags: UINT; dwTimeout: DWORD): Integer; var idTimer: U.. 2023. 11. 6.
Drag and Drop(끌어서 놓기) Drag and Drop Drag and Drop(끌어서 놓기) 사용자가 마우스로 객체를 선택하여 다른 위치로 끌어서 놓는 인터랙션 기술을 의미합니다. 이를 통해 사용자는 애플리케이션 내의 요소를 직접 이동하거나 복사할 수 있습니다. 드래깅의 시작 모든 컨트롤에는 사용자가 컴퍼넌트의 드래깅을 시작했을 때 그것의 응답을 처리하는 방법을 지정하는 DragMode 프로퍼티가 있다. 만약 DragMode가 dmAutomatic 이라면 컨트롤 위에 커서를 놓고 마우스 버튼을 누르면 자동으로 드래깅이 시작된다. DragMode를 dmAutomatic로 설정하면 하면 일반적인 마우스의 작동을 방해 할 수 있기 때문에 DragMode를 디폴트값인 dmManual로 처리하는 방법을 선호하는 사람들이 많다. dmManua.. 2023. 7. 26.
델파이 암호화 델파이 암호화 데이터의 암호화는 보안의 가장 기본적인 형태이다. 그 동안 보안은 어느 군사작 전에서나 이용되는 용어로 여겨진게 사실이지만, 갈수록 시스템이 외부에 노출되 는 (특히 인터넷등의 네트워크망에서) 상황에서 데이터의 적절한 암호화는 아주 중요한 사안이 되고 있다. 여러분이 주변에서 쉽게 구할 수 있는 암호화 알고리즘들이 있고, 그것은 완벽에 가깝다. 여러분이 사용하고 있는 ID의 암호 역시 그런 알고리즘에 기반을 두고 암호화된다. 하지만, 이런 것들은 암호화에만 치중한 것으로 해독기능이 없다. 즉, 암호화 된 데이터를 다시 원본 데이터로 추출해 내는 역변환은 불가능한 것이다. 시스템의 운영자도 해당 사용자 ID의 암호를 변환해 원본 암호를 뽑아내는 것이 불가능하다. 여러분이 ID를 입력했을 때,.. 2023. 7. 13.
가변 데이터의 저장 기법 가변 데이터의 저장 기법 ​ 혹시 이런 경우에 어떻게 하시나요? ​ 우선 스트링을 10개를 저장해야 합니다. 물론 하나의 파일에 말이죠. ​ 당연히 10개의 스트링의 길이는 가변이겠죠? ​ 자.. 어떻게 하면 가변의 스트링을 파일에 저장하고 고스란히 불러올수 있을까요? 또 한가지 조건을 덧붙인다면 스트링의 갯수의 제한을 두지 않는다면... ^^. ​ 어떻게든 방법이 있겠죠? ​ 어떤방법을 동원하든지 해결을 할수 있겠지만 새로운 방법을 소개합니다. 아주 손쉽게 가변길이의 데이터를 저장하고 불러올수 있는 방법입니다. ​ ​ 첫번째 방법 1 ​ 컴포넌트를 저장하고 불러오는 기능을 약간 변형하는 것입니다. ​ 즉 우리가 저장하려는 가변의 스트링을 컴포넌트의 프로퍼티로 놓게되면 컴포넌트를 저장할때 데이터도 함께 .. 2023. 7. 10.
컨트롤의 Enter 처리 컨트롤의 Enter 처리 DBEdit등의 Enter Key 이동은 간단하다. DBGrid의 칼럼을 제외한 모든 Focus를 가질 수 있는 컴퍼넌트는 OnKeyPress 이벤트에 다음과 같이 코드를 기입하여 간단히 처리할 수 있다. EnterKey처리를 원하는 컴퍼넌트의 OnKeyPress 이벤트를 한 프로시져로 통일한다. procedure TFMain.MostOfControlKeyPress(Sender: TObject; var Key: Char); begin if Key = #13 then begin Key := #0; if Sender = DBEdit1 then // 특별한 다른 처리를 원하는 Component begin // .... end else // 나머지는 아래서 처리 SelectNext( T.. 2023. 7. 4.
프로그램 종료 막기 프로그램 종료 막기 방법 1 form의 Event 중 OnCloseQuery라는 이벤트가 있습니다. 프로그램이 종료되기 전에 일어나는 이벤트입니다. ​ 이 이밴트 procedure를 보면 ​ FormCloseQuery(Sender: TObject; var CanClose : Boolean); 1. Edit1.Text가 "사과" 종료 하고 다른 것이면 종료를 못하게 하자 ​ procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin if Edit1.Text = '사과' then CanClose := FALSE else Canclose := FALSE; end; ​ 이런식으로 코딩을 하면 됩니다. ​ ​ 방법2​ 폼의 OnCl.. 2023. 6. 29.
메모 프린터 기타 방안 #1 uses Printers; procedure TForm1.Button1Click(Sender: TObject); var ScaleX, ScaleY: Integer; RR: TRect; begin with Printer do begin BeginDoc; // The StartDoc function starts a print job. try ScaleX := GetDeviceCaps(Handle, logPixelsX) div PixelsPerInch; ScaleY := GetDeviceCaps(Handle, logPixelsY) div PixelsPerInch; // Retrieves information about the Pixels per Inch of the Printer. RR := Rec.. 2022. 6. 29.
델파이 엑셀(Excel) 수식 포함 저장하기 델파이 엑셀(Excel) 수식 포함 저장하기 uses .., ComObj; procedure TForm1.Button2Click(Sender: TObject); var ExcelObj : OleVariant; WorkBook : OleVariant; WorkSheet : OleVariant; begin ExcelObj := CreateOLEObject('Excel.Application'); ExcelObj.DisplayAlerts := False; WorkBook := ExcelObj.Workbooks.Add; //통합문서를 생성합니다. WorkSheet := WorkBook.WorkSheets[1]; //Sheet를 선택합니다. //엑셀에 데이터를 입력합니다. WorkSheet.Cells[1, 1].V.. 2022. 4. 18.
MessageBox와 MessageDlg의 차이점 MessageBox와 MessageDlg의 차이점 procedure TForm1.Button1Click(Sender: TObject); begin nID := MessageDlg('1234567', mtCustom, [mbOK, mbCancel], 0); nID := MessageBox(0, '1234567', '123455', MB_OKCANCEL); end; 이와 같은 코드가 있을 때 MessageBox는 Message창이 정상적으로 닫힌다. 하지만, MessageDlg나 ShowMessage는 Message창이 닫히질 않는다. 하물며, ModalResult도 반환도 하지 않는다. MessageBox의 모달과 MessageDlg의 모달이 차이점이 과연 멀까? procedure TForm1.Button.. 2022. 4. 15.
Windows PC보호 해결방법 전자서명 후 배포 Windows PC보호 해결방법 전자서명 후 배포 이번에 리멤버 Windows 데스크톱 버전을 개발하면서 처음으로 exe 파일로 설치 파일을 만들고 웹에 배포해 보았습니다. 이 글에서는 처음으로 설치 파일을 웹에 배포하는 과정 그리고 예상하지 못했던 난관에 대하여 설명해보려 합니다. 앱 개발을 완성하고 설치 파일까지 만들었다고 모든 것이 끝났다고 생각하시면 안됩니다. 별 생각 없이 설치 파일을 웹에 게시하고 웹페이지에서 다운을 받으면 다음과 같은 화면들을 만나게 됩니다. 만약 사용자들이 이런 메시지를 본다면 기껏 열심히 만들어 놓은 앱이 악성 프로그램 취급받게 될 것입니다. 자, 앱 개발은 끝났을 지라도 앱 배포는 이제부터 시작입니다. 이 배포에 걸리는 시간은 생각하는 것보다 오래 걸립니다. 전자 서명 .. 2022. 4. 14.
델파이 컴파일러 지시어 {$IFDEF} 델파이 컴파일러 지시어 {$IFDEF} 사용방법 { $ IfDef Symbol} ... 기호가 정의되었을 때 실행할 코드 ... { $ Else } ... 기호가 정의되지 않았을 때 실행할 코드 ... { $ EndIf } 테스트 코딩 procedure TForm1.Button1Click(Sender: TObject); var text : string; begin // Set our code into test mode {$Define TESTMODE} text := 'We are in test mode'; // Display the value of text if we are in test mode {$IfDef TESTMODE} ShowMessage('text = '+text); {$EndIf} // S.. 2022. 4. 12.
프로그램간 메세지 전송 프로그램간 메세지 전송 1. 개요 - 독립된 다른 응용 프로그램간의 메시지 교환을 통해 프로그램을 제어 해 본다. 2. 처리 방법 - Windows의 메시지인 WM_COPYDATA 를 이용한다. - 데이터 교환을 위해 CopyDataStruct 구조체를 이용한다. - SendMessage API를 이용한다. 가. 메시지를 교환 하고자 하는 델파이 프로젝트 양쪽의 유닛에 messages 를 Uses 절에 추가한다. 나. 메시지를 보내는 쪽 Unit - 메시지를 받을 응용 프로그램의 핸들을 얻는다. (FindWindow 이용) - CopyDataStruct 구조체에 보낼 정보를 채운다. - SendMessage를 이용해 받는쪽 윈도우 핸들에 WM_CopyData 메시지를 CopyDataStruct 구조체와 .. 2022. 4. 11.
윈도우 종료(재시작) 3가지 방법 윈도우 종료(재시작) 3가지 방법 Title: Shutdown Computer by 3 Solution Question: how i can shutdown computer in windows NT family? Answer: // ALI EBRAHIMI DORCHEH (ebr_ali@yahoo.com) //------------- Solution 1----------------- procedure TForm1.Button1Click(Sender: TObject); begin ExitWindowsEx(EWX_FORCE and EWX_SHUTDOWN,0); //EWX_SHUTDOWN for shutdown //EWX_REBOOT for reboot //EWX_LOGOFF for logoff end; //--.. 2022. 4. 5.
실행파일명으로 프로세스(TASK) 죽이기 실행파일명으로 프로세스(TASK) 죽이기 function KillTask(ExeFileName: string): Integer; const PROCESS_TERMINATE = $0001; var ContinueLoop: BOOL; FSnapshotHandle: THandle; FProcessEntry32: TProcessEntry32; begin Result := 0; FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); FProcessEntry32.dwSize := SizeOf(FProcessEntry32); ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32); while.. 2022. 3. 31.
레지스트리 읽고 쓰기 레지스트리 읽고 쓰기 uses Registry < 추가 var Reg :TRegistry; RString : String; Begin // 읽기 Reg := TRegistry.Create; Reg.RootKey := HKEY_LOCAL_MACHINE; // Root Reg.OpenKey(`\Software\AhnLab\V3Lite\`,True); RString := Reg.ReadString(`InstallPath`); Reg.Free; ShowMessage(RString); // 쓰기 Reg := TRegistry.Create; Reg.RootKey := HKEY_LOCAL_MACHINE; // Root Reg.OpenKey(`\Software\AhnLab\V3Lite\`,True); Reg.Write.. 2022. 3. 29.
윈도우버전별 바탕화면 경로 알아내기 윈도우버전별 바탕화면 경로 알아내기 uses ShFolder,ShlObj; function GetSystemDirectory(Dir: Integer): String; var Path: PChar; begin Result:=''; GetMem(Path, MAX_PATH); SHGetFolderPath(0, Dir, 0, 0, Path); Result:=Copy(Path, 0, Length(Path)); FreeMem(Path); end; 사용 예제 var path : String begin path := GetSystemDirectory(CSIDL_PROFILE); end; --------------------------------------------------------------------------.. 2022. 3. 28.
윈도우 화면보호기 상태확인 윈도우 화면보호기 상태확인 function IsWorkstationLocked: Boolean; var hDesktop: HDESK; begin Result := False; hDesktop := OpenDesktop('default', 0, False,DESKTOP_SWITCHDESKTOP); if hDesktop 0 then begin Result := not SwitchDesktop(hDesktop); CloseDesktop(hDesktop); end; end; 2022. 3. 25.
Delphi Tip Delphi Tip 임시 스트링 리스트 사용 임시 스트링 리스트를 사용하는 것이 어떤경우 훨씬 빠른 결과를 나타낼 수 있다. ListBox1.Clear; Ini := TIniFile.Create('win.ini'); ReadSection('Colors', ListBox1.Items); Ini.Free; 위와같이 하는 대신에 이렇게 해 보자. StrList := TStringList.Create; ListBox1.Clear; Ini := TIniFile.Create('win.ini'); ReadSection('Colors', StrList); Ini.Free; ListBox1.Items.Assign(StrList); StrList.Free 리소스로부터 비트맵 로드 MyBitmap.Handle := Load.. 2022. 3. 24.
안드로이드에서 MessagDlg 사용방법(주의 점) 안드로이드에서 MessagDlg 사용방법(주의 점) Blockin dialogs not implemented on this platform. ❑ 원인 안드로이드에서는 블로킹 대화상자를 지원하지 않습니다. 하지만 컴파일 시 오류가 나지 않기 때문에 구현 시 주의가 필요합니다. ❑ 해결방안 ACloseDialogProc 파라메터가 있는 MessageDlg 함수를 이용해야 합니다. ACloseDialogProc은 MessageDlg에서 버튼을 누른 이후의 동작을 가진 익명메소드 입니다. 아래 예제를 참고하세요. unit uMain; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.T.. 2022. 3. 11.
왕초보를 위한 아주 기본적인 Tips 왕초보를 위한 아주 기본적인 Tips 1. 데이터 저장 및 누적 내용 : 메모1에 텍스트를 추가하고 싶을때 memo1.lines.add('추가할 내용'); 그리고 데이터 누적 var i,a:integer; begin a:=a+i; end; 2. RGB Color 색상값 이용하기(레드 그린 블루) Form1.Color:=RGB($FF,$99,$CC); // 분홍색 3. 최소화 비활성화(프로퍼티에도 있음) Form1.bordericons:=form1.bordericons-[biMinimize]; 4. 라벨 글자위치 정가운데 프로퍼티에서 Alignment를 taCenter , Layout을 tiCenter으로 한다. 5. MonthCalendar에서 날짜 클릭시 그 날짜를 에디트박스에 불러온다. procedu.. 2022. 3. 7.