본문 바로가기

Delphi Tip243

Frame을 활용한 Image Viewer 개발 Frame을 활용한 Image Viewer 개발  이번 포스팅에서는 Frame을 활용하여 간단한 Image Viewer를 개발하는 방법을 알아보겠습니다. 기존에 복잡하게 작성된 코드를 Frame으로 분리하고, 효율적으로 관리할 수 있는 구조로 만드는 과정을 살펴봅니다. 왜 Image Viewer에 Frame을 활용해야 할까요?Image Viewer는 폴더 탐색, 파일 로딩, 이미지 표시 등의 기능을 포함한 프로그램입니다. 기존 방식으로 코드를 작성하면:모든 코드가 하나의 폼(Form)에 작성되어 복잡도가 증가합니다.기능별로 나눠지지 않아 유지보수가 어려워집니다.하지만 Frame을 활용하면:코드 분업화: 폴더 탐색, 파일 로딩, 이미지 표시 기능을 각각의 Frame으로 나눌 수 있습니다.가독성 향상: 각 .. 2025. 1. 6.
Frame을 활용한 간단한 프로그램 예제 Frame을 활용한 간단한 프로그램 예제   프로그래밍에서 간결하고 효율적인 코드 작성은 매우 중요합니다. 특히, 한 화면에 여러 기능이 필요하거나 중복 작업을 줄이고 싶을 때, Frame은 훌륭한 해결책이 될 수 있습니다. 이번 포스팅에서는 Frame을 사용한 간단한 프로그램 예제를 통해 실전 활용법을 알아보겠습니다.Frame을 사용하지 않은 경우의 문제점Frame을 사용하지 않으면 모든 기능을 하나의 폼(Form)에 구현해야 합니다. 이 경우:코드가 한 곳에 집중되어 가독성이 떨어집니다.동일한 기능을 여러 폼에서 사용해야 할 때 코드 중복이 발생합니다.유지보수 시 특정 기능만 수정하려 해도 다른 코드에 영향을 줄 가능성이 큽니다.이런 문제를 해결하기 위해 Frame을 활용하면 코드의 캡슐화와 재사용성.. 2025. 1. 5.
프로그래머라면 알아야 할 Frame 활용의 기본 개념 프로그래머라면 알아야 할 Frame 활용의 기본 개념  프로그래밍을 하다 보면 한 화면에서 다양한 기능을 그룹화해야 할 때가 많습니다. 특히, 하나의 폼(Form)에 여러 컴포넌트를 추가하게 되면 코드가 복잡해지고 유지보수가 어려워질 수 있습니다. 이런 경우, TFrame을 활용하면 보다 효율적으로 화면을 설계하고 코드를 관리할 수 있습니다.Frame이란 무엇인가요?Frame은 Delphi에서 제공하는 유용한 UI 설계 도구로, 하나의 폼을 여러 개로 나눠 작업할 수 있도록 도와줍니다. 쉽게 말해, **"재사용 가능한 미니 폼"**이라고 할 수 있습니다. Frame을 사용하면 각 기능별로 코드를 캡슐화하고 독립적으로 관리할 수 있어, 코드의 가독성과 유지보수성을 크게 향상시킬 수 있습니다.Frame을 왜.. 2025. 1. 4.
한글(2Byte)문자열 깨지지 않게 자르기 한글(2Byte)문자열 깨지지 않게 자르기    WideString 을 사용하자한글을 자를때 깨진 1Byte 문자를 WideString 변수에 넣었다가String 변수로 되받아서 Trim 처리를 하면 깨진 문자가 정리되어 이걸 활용 이 예제는 C++Builder 에서도 동일하게 적용 procedure TForm1.Button1Click(Sender: TObject);varTextString, TextTrim: String;TempWide: WideString;LenthCnt: Integer;beginTextString := Trim(Edit1.Text); //원본문자열LenthCnt := StrToIntDef(Edit2.Text,7); //문자열 자를 위치 if ( Length(TextString) > .. 2024. 7. 8.
프로그램 디버그(Debug) 메시지를 찍기 프로그램 디버그(Debug) 메시지를 찍기 프로그램 작성시 디버깅을 특정상황에서 showmessage 를 통해 하는 경우도 있지만..델파이의 result 창에서 나타나게 하는 방법은 OutputDebugString 을 이용해 문자열을 출력하는 것이다. 2024. 7. 6.
Winapi.WinSock을 이용한 WOL(Wake On Lan) 구현 WinSock을 이용한 WOL(Wake On Lan) 구현   unit Unit1; interface usesWindows, Messages, SysUtils, Variants, Classes,Graphics, Controls, Forms, Dialogs, StdCtrls, WinSock; typeTForm1 = class(TForm)Edit1: TEdit;Button1: TButton;Memo1: TMemo;procedure Button1Click(Sender: TObject);procedure FormCreate(Sender: TObject);procedure FormClose(Sender: TObject; var Action: TCloseAction);private{ Private declarati.. 2024. 7. 2.
dfm 직접 폼디자인 변경 dfm 직접 폼디자인 변경   실시간에 소켓등으로 dfm 파일을 쏴서그걸 읽어서 폼디자인 변경할 수 있는 방법인데 몇가지 제한이 있는데콤포넌트의 이벤트는 dfm 에 없어야 하고..form 전체를 dfm 으로 받아서 할수는 없고 form 에 프레임이나패널을 써서 프레임이나 패널이 dfm 의 최상위 콤퍼넌트일 때 쓸 수 있고RegisterClasses 로 클래스 등록을 모두 해줘야 하는등.. 제한이 있네요.. 간단히 예제를 만들어봐서 올립니다.폼의 일부 영역만 바꾸려고 할 때는 유용할 거 같네요.이벤트없고 콤포넌트만 있는다거나 하는 경우.. 소스는 아래와 같은데TReader 의 ReadRootComponent 메소드로 dfm 읽어들여서그 루트콤포넌트의 parent 만 정해주는 방식입니다. procedure .. 2024. 7. 1.
TMemo(메모장) 스트링(string) 입력 속도개선 TMemo(메모장) 스트링(string) 입력 속도개선  메모장에서 문자를 바꾸거나 할경우 메모장의 내용을String에 옮긴 다음 해당 작업을 하고다시 메모장으로 불러들일때 별생각없이 아래와 같이 한다. (예)iStr:= Memo1.Lines.Text;iStr:= StringReplace(iStr, 'a', 'b', []) ;Memo1.Lines.Text:= iStr; 그런데 메모장의 내용이 많울 경우(스트링의 크기가 클)에는Memo1.Lines.Text:= iStr; 에서 엄청 많은 시간을 먹는다. 개선방법 var iMemStream: TMemoryStream;iStr: string;beginiStr:= Memo1.Lines.Text;iStr:= StringReplace(iStr, 'a', 'b', [.. 2024. 6. 28.
레지스트리 ID 찾기 레지스트리 ID 찾기  레지스트리 Hkey_User 밑에 S-1-5-21 로 해당되는 ID를 얻는다. uses Registry 를 추가 function GetOwnerID: String;varReg: TRegistry;S: TStringList;S_Tmp: String;i: integer;beginResult := '';Reg := TRegistry.Create;S := TStringList.Create; tryReg.RootKey := HKEY_USERS;if Reg.OpenKeyReadOnly('') thenbeginReg.GetKeyNames(S);for I := 0 to s.Count - 1 dobeginS_Tmp := Copy(S.Strings[i], 1, 8);if S_Tmp = 'S-1-5-.. 2024. 6. 27.
밝기(bright), 대비(contrast), 감마(gamma), 색농도(Saturation) 조절 밝기(bright), 대비(contrast), 감마(gamma), 색농도(Saturation) 조절    Amount : 강도 0~255Saturation : 색농도 // contrastfunction IntToByte(i: Integer): Byte;beginif i > 255 then Result := 255elseif i elseResult := i;end; procedure Contrast(var clip: tbitmap; Amount: Integer);varp0: pbytearray;rg, gg, bg, r, g, b, x, y, m: Integer;beginfor y := 0 to clip.Height - 1 dobeginp0 := clip.scanline[y];m := 0;for x := 0.. 2024. 6. 19.
이미지의 밝기 / 선명도 조절하기 이미지의 밝기( brightness) / 선명도(definition) 조절하기     uses Math; procedure TForm1.FormCreate(Sender: TObject);beginSrcImg.Picture.Bitmap.PixelFormat:=pf32bit;DstImg.Picture.Bitmap.PixelFormat:=pf32bit;end; procedure TForm1.ScrollBar_BrightChange(Sender: TObject);typeTColor32 = recordB, G, R, A: Byte;end;TColor32Array = array[Byte]of TColor32;PColor32Array = ^TColor32Array;varW, H, iPixel: Integer;SrcP.. 2024. 6. 18.
폼 미러링 (Form Mirroring) 폼 미러링 (Form Mirroring)  폼의 OnActivate 이벤트핸들러에 다음 코드를 추가한다 SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or $400000); 2024. 6. 17.
데이터베이스(Database)에 실행파일 저장 데이터베이스(Database)에 실행파일 저장   CREATE TABLE ADCESER -(AD_PRNM VARCHAR(15) NOT NULL, --프로그램이름AD_MODT VARCHAR(25) NOT NULL, --프로그램수정날짜-2007-07-01 오전 10:20AD_PROG BLOB SUB_TYPE 0 SEGMENT SIZE 10240, --프로그램저장필드10메가PRIMARY KEY (AD_PRNM)) 쿼리 저장 소스TmpStream := TmemoryStream.Create;TmpStream.LoadFromFile('C:\Package\Program\'+prnm+'.exe');TmpStream.Position := 0; with DataMd.SQLmedia dobeginclose;sql.clear.. 2024. 6. 14.
델파이 2진수 변환(Binaryconversion) 델파이 2진수 변환(Binaryconversion)    두번째 인자가 비워져 있거나,2진수를 표현하는 자릿수에 못 미치면 2진수로 표현될 수 있는최소 길이로 표현되고 두번째 인자가 2진수 자릿수보다 크면 앞에 0이 붙어 나온다. function IntToBin(const Value: Cardinal; Digits: Integer = 0): string;vari, d: Integer;beginfor d := 1 to 32 do  if (1 shl d) > Value then break;  if Digits > d then d := Digits;  SetLength(Result, d);  for i := 0 to d-1 do if (1 shl i) and Value = 0 then  Result[d-i] .. 2024. 6. 13.
프로그램 종료 시 모든 폼 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.
메모리 누수(memory leak) 체크 메모리 누수(memory leak) 체크    System.ReportMemoryLeaksOnShutdown:= True;  프로그램 종료시 리포트 출력  program Test; {$R *.res} beginSystem.ReportMemoryLeaksOnShutdown:= True; //메모리리포트 활성화 Application.Initialize;Application.MainFormOnTaskbar := True;Application.CreateForm(TMain, Main);Application.Run;end. 2024. 6. 9.
데이터셋 북마크 DataSet Bookmark 데이터셋 북마크 DataSet Bookmark   TBookMarker = class(TInterfacedObject)privateFBookMark: TBookMark;FDataSet: TDataSet;protectedconstructor Create(ADataSet: TDataSet);dynamic; destructor Destroy; override;publicclass function BookMark(ADataSet: TDataSet): IInterface;end; implementation class function TBookMarker.BookMark(ADataSet: TDataSet): IInterface;beginResult:= TBookMarker.Create(ADataSet);end; c.. 2024. 6. 7.
메세지 다이어그램(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.
TImage에 색상바 그리기 TImage에 색상바 그리기       unit Unit1; interface usesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, ExtCtrls, StdCtrls; typeTMain = class(TForm)HueImg: TImage;ColImg: TImage;Label1: TLabel;FGColorPanel: TPanel;BGColorPanel: TPanel;procedure FormCreate(Sender: TObject);procedure FormResize(Sender: TObject);procedure HueImgMouseDown(Sender: TObject; Button: TMouseBut.. 2024. 6. 3.
바코드프린터 출력 참고 바코드프린터 출력    procedure TForm1.Button4Click(Sender: TObject); var s, Str, data: String; begin data := Edit1.Text; S:=''; s:= Chr($1B)+ Chr($61)+Chr($1); // ' 정렬 0:왼쪽 1:중앙 2:오른쪽 S:= S + chr($1D) + chr($21)+ chr($1); //글자크기 S:= S + '영수증'+ chr($0D)+ chr($0A)+chr($0D)+ chr($0A); //원하글자와 제어코드를 계속해서 추가합니다.. ComPort1.WriteStr(s); S := ''; S:= S + chr($1D)+chr($21)+chr($0); //글자크기 처음으로돌리기 s:= S + Chr($1B.. 2024. 6. 2.