본문 바로가기

Delphi Tip/+Tip62

프로그램 디버그(Debug) 메시지를 찍기 프로그램 디버그(Debug) 메시지를 찍기 프로그램 작성시 디버깅을 특정상황에서 showmessage 를 통해 하는 경우도 있지만..델파이의 result 창에서 나타나게 하는 방법은 OutputDebugString 을 이용해 문자열을 출력하는 것이다. 2024. 7. 6.
dfm 직접 폼디자인 변경 dfm 직접 폼디자인 변경   실시간에 소켓등으로 dfm 파일을 쏴서그걸 읽어서 폼디자인 변경할 수 있는 방법인데 몇가지 제한이 있는데콤포넌트의 이벤트는 dfm 에 없어야 하고..form 전체를 dfm 으로 받아서 할수는 없고 form 에 프레임이나패널을 써서 프레임이나 패널이 dfm 의 최상위 콤퍼넌트일 때 쓸 수 있고RegisterClasses 로 클래스 등록을 모두 해줘야 하는등.. 제한이 있네요.. 간단히 예제를 만들어봐서 올립니다.폼의 일부 영역만 바꾸려고 할 때는 유용할 거 같네요.이벤트없고 콤포넌트만 있는다거나 하는 경우.. 소스는 아래와 같은데TReader 의 ReadRootComponent 메소드로 dfm 읽어들여서그 루트콤포넌트의 parent 만 정해주는 방식입니다. procedure .. 2024. 7. 1.
폼 미러링 (Form Mirroring) 폼 미러링 (Form Mirroring)  폼의 OnActivate 이벤트핸들러에 다음 코드를 추가한다 SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or $400000); 2024. 6. 17.
프로그램 종료 시 모든 폼 OnClose 이벤트 발생시키기 프로그램 종료 시 모든 폼 OnClose 이벤트 발생시키기   보통 프로그램을 작성할 때에 Form의 OnClose 이벤트에서관련 자원을 해제하는 코드를 넣는다. 그런데 Form의 OnClose 이벤트가 발생하지 않는 경우가 있다. 그래서 프로그램이 종료할 때 가끔 Access Violation Error가 나는 경우가 있다. 다음과 같은 코드를 삽입하면 프로그램이 종료될 때관련 폼의 모든 OnClose 이벤트를 발생시킨다. program Project1; usesForms,Unit1 in 'Unit1.pas' {Form1},Unit2 in 'Unit2.pas' {Form2},Unit3 in 'Unit3.pas' {Form3}; {$R *.RES} procedure CloseAllForm;vari: In.. 2024. 6. 11.
메세지 다이어그램(Message Dialog) 체크박스(CheckBox) 추가 메세지 다이어그램(Message Dialog) 체크박스(CheckBox) 추가     procedure TForm1.Button1Click(Sender: TObject);varAMsgDialog: TForm; function GetCheckValue(ADialog: TForm; const AName: String): boolean;vari: integer;beginfor i:=0 to ADialog.ControlCount-1 dobeginif ( ADialog.Controls[i].Name = AName ) and ( ADialog.Controls[i] is TCheckBox ) thenbeginResult := (ADialog.Controls[i] as TCheckBox).Checked;break;en.. 2024. 6. 6.
키보드 키입력 막기 - 화면 캡처 방지(Blocking Screen Capture) 키보드 키입력 막기 - 화면 캡처 방지(Blocking Screen Capture)     unit Unit1; interface usesWinapi.Windows, Winapi.Messages, System.SysUtils,System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms,Vcl.Dialogs, Vcl.StdCtrls, ClipBrd; typeTForm1 = class(TForm)Button1: TButton;procedure FormCreate(Sender: TObject);private{ Private declarations }procedure ApplicationIdle(Sender: TObject; var Done: B.. 2024. 5. 29.
ShowModal,DialogBox,ShowMessage 등 떠 있을 때 폼 Disable 막기 ShowModal,DialogBox,ShowMessage 등 떠 있을 때 폼 Disable 막기   typeTForm1 = class(TForm) ...Timer1: TTimer;procedure Timer1Timer(Sender: TObject)privateprocedure WMEnable(var Msg: TMessage); message WM_ENABLE;end; implementation procedure TForm1.Timer1Timer(Sender: TObject);beginTimer1.Enabled:= False;EnableWindow(Handle, True);end; procedure TForm1.WMEnable(var Msg: TMessage);beginif Msg.wParam = 0 th.. 2024. 5. 21.
폼에 그림자 넣기 폼에 그림자 넣기       델파이 힌트(THintWindow)를 보니 그림자가 생기길래소스를 쫓아가다보니 윈도우클래스 스타일에 CS_DROPSHADOW 라는게 있는걸 알았습니다.그걸 폼에 적용해보니 되더군여.... unit Unit1; interface usesWindows, Messages, SysUtils, Classes, Graphics, Controls, Forms, StdCtrls; typeTForm1 = class(TForm)Button1: TButton;procedure Button1Click(Sender: TObject);privateprotectedprocedure CreateParams(var Params: TCreateParams); override;publicend; varForm.. 2024. 4. 25.
폼을 점점 투명하게 나타나게 하기 폼을 점점 투명하게 나타나게 하기 procedure TForm1.Button1Click(Sender: TObject); var objFrm: TForm2; begin objFrm := TForm2.Create(self); AnimateWindow(objFrm.Handle, 500, AW_BLEND); objFrm.Show; end; 2024. 4. 19.
델파이 줄바꿈 방법 델파이 줄바꿈 방법 showmessage('Line1'^M^J'Line2'^M^J'Line3'); showmessage('Line1'#13#10'Line2'#13#10'Line3'); 위 메시지 박스는 동일한 결과를 출력한다. 2024. 3. 25.
델파이에서 화면에 자석효과 주는 법 델파이에서 화면에 자석효과 주는 법 화면구석에 폼을 끌어다가 구석가까이가면 자석처럼 붙는효과를 주기 위한 방법이다. ScreenSnap SnapBuffer 폼의 속성중 위에 두가지 속성을 이용하면 가능하다. ScreenSnap : 자석효과를 사용할지 여부 결정 SnapBuffer : 픽셀 값을 지정 (화면의 가장자리와 몇 픽셀 거리에 가면 붙을 것) 이 효과는 '디스플레이 등록정보'의 '효과' 탭에서 ' 마우스를 끄는 동안 창 내용 표시'가 설정되어 있어야 된다. 이게 꺼져 있을 경우 (이동중에 폼의 위치가 선으로 표시되는 상태)에도 작동은 잘 합니다만, 바로바로 적용되지는 않고, 폼 드래그를 마친 뒤에 효과가 나타난다. 2024. 3. 18.
하위폼 종료 감지 하위폼 종료 감지 하위폼의 종료시 메인폼에서 정보 감지하는방법 하위폼의 종료시 메인폼에서 정보 감지하는방법(Notification) 컴포넌트인(폼)경우 자신이 owner로 생성한 컴포넌트의 참조카운팅하는 메카니즘을 가지고 있는것 같은데 뒤져보면 Notificaton, FreeNotification 있는데 Notification을 오버라이딩하여 사용했다 type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); //하위폼 생성버튼 //.하위폼은 OnClose이벤트에서 action:=cafree하며 자기소멸시키며나옴 procedure Notification(Acomponent:Tcomponent;operation:.. 2024. 3. 4.
폼 Border 없이 사이즈 변경 폼 Border 없이 사이즈 변경 폼이 Border 를 갖고 있지 않을 때 마우스가 경계에 오면 커서가 바뀌면서 ReSize 가 되게 하는 방법입니다. WM_NCHITTEST 를 가로채서 거기에서 마우스 좌표를 폼좌표계로 변환후 마우스 위치에 따라 메시지의 result 를 HTTOP, HTLEFT 등으로 바꿔주기만 하면 됩니다. 폼의 BorderStyle 를 bsNone 로 해서 경계를 없애준 뒤에 하면 됩니다. unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton;.. 2024. 2. 1.
디버깅용 콘솔창 띄우기 디버깅용 콘솔창 띄우기 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); private { Private declarations } ConHwnd: THANDLE; public { Public declarations }.. 2024. 1. 12.
마우스커서가 폼(Form)안에 있는지 여부 마우스커서가 폼(Form)안에 있는지 여부 //API함수 이용 (핸들을 잡아 마우스가 사각형안에 있는지 체크) unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs; type TForm1 = class(TForm) procedure FormDeactivate(Sender: TObject); procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); private { Private declarations } public { Public declarations } end; var Form1: TForm1; .. 2024. 1. 8.
프로그램에서 DOS 명령어 처리 프로그램에서 DOS 명령어 처리 1. 콘솔창(DOS창) 창 안띄우기 2. 끝날때까지 기다리기(실행이 끝난것을 감지하기) 3. 출력되는 내용을 화일로 저장하기 procedure TForm1.Button1Click(Sender: TObject); var msg: string; begin // 1.Dos 명령 일괄처리 파일에서 명령어를 불러오고() if not RunDosCmd('cmd c:\out.txt', Msg, true) then ShowMessage(msg) else ShowMsg(Msg); // 2.현재 도스 명령어를 실행하고, 결과를 파일로 저장('C/\out.txt) if not RunDosCmd('Dir/w >c:\out.txt', Msg, true) then ShowMessage(msg) e.. 2023. 12. 29.
델파이 디버깅용 콘솔창 만들기 델파이 디버깅용 콘솔창 만들기 폼이 실행되면서 콘솔창을 한개 만든뒤, 폼위에 있는 마우스 좌표를 콘솔창에 실시간으로 출력하는 예이다 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); private { Private de.. 2023. 12. 11.
델파이 메세지다이어로그(MessageDialog) 원하는 키 받기 델파이 메세지다이어로그(MessageDialog) 원하는 키 받기 . . . private { Private declarations } protected public { Public declarations } Procedure HelpBoKeyPress(Sender : TObject; var Key : Char); end; var Form1: TForm1; LegalKeys : String; procedure TForm1.Button1Click(Sender: TObject); Var S : String; Begin LegalKeys := 'ABC123'; S := '원하는 항목을 선택하세요!'#13#13'' + ' A 키눌러라'#13'' + ' B.키눌러라'#13'' + ' C.키눌러라'#13'' + '.. 2023. 11. 30.
메인 메뉴에 팝업메뉴 달기 메인 메뉴에 팝업메뉴 달기 unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Menus; type TForm1 = class(TForm) MainMenu1: TMainMenu; PopupMenu1: TPopupMenu; N11: TMenuItem; N21: TMenuItem; N31: TMenuItem; N41: TMenuItem; N123121: TMenuItem; N122221: TMenuItem; N44441: TMenuItem; N33331: TMenuI.. 2023. 11. 28.
델파이 툴 메뉴 생성 (현재 프로젝트 경로 열기) 델파이 툴 메뉴 생성 델파이 메뉴 Tools -> Configure Tools 메뉴 클릭 ​ Add 버튼 클릭 ​ Tilte : 현재 프로젝트 경로 열기 Program : Explorer.exe Parameters : $PATH($EXENAME),/e OK 클릭​ 결과 메뉴가 생성된걸 알수있다. 클릭하면 해당 프로젝트 경로로 탐색기가 열린다 . ​ 소스코드 에디터에 활성화되어있는 파일(Unit)명은 $EDNAME 이다 (다른 에디터로 유닛을 열때 좋겠..) 파일명만 전달할려면 $NAMEONLY(파일명) 2023. 11. 22.