본문 바로가기

Delphi Tip219

델파이 컴포넌트(Component) 마무리 델파이 컴포넌트(Component) 마무리 RAD의 특징이 바로 프로퍼티 '+' 표시가 붙은 프로퍼티 만들기 이번에는 프로퍼티의 이름앞에 '+'가 붙어서 내용이 전개되는 것을 어떻게 처리하는지 보도록 합시다. ① 집합형..(set) 우선 폼에 있는 BorderIcons를 보세요.. 이녀석도 이름앞에 '+'가 있죠? 두번클릭하면 내용이 전개가 되면서 이름앞에 '-'로 바뀌지요. 앗.. 그런데 이녀석은 Font등에서 보던 녀석과는 약간 다른 특성이 있네요. 내용들이 모두 Boolean형으로 되어있지요? 그럼.. 이녀석의 헬프를 보도록 합시다. type TBorderIcon = (biSystemMenu, biMinimize, biMaximize, biHelp); TBorderIcons = set of TBor.. 2023. 7. 25.
델파이 컴포넌트(Component) 7편 델파이 컴포넌트(Component) 7편 오브젝트 인스펙터(Object Inspector) 프로퍼티 탭을 보시면 어떤 녀석은 그냥 edit으로 되어 있구 어떤 녀석은 ComboBox로, 또 어떤녀석은 이름앞에 '+'가 붙어서 내용을 전개해서 볼수 있도록 되어 있음을 볼수 있을겁니다. 또, 특별한 경우 '...'버튼을 눌러서 대화상자를 호출해서 프로퍼티를 조작하는 경우도 있죠.. 그밖에 프로퍼티에 대해서 자세히 알아보도록 합시다. 우선 Edit로 나타나는 경우에는 어떤값을 입력할수 있었나요? Name, Caption, Hint등의 경우 문자를 입력할수 있게 됩니다. Left, Right, Tag등의 경우 숫자만을 입력할수 있게 되죠.. 거꾸로 생각하면 오브젝트 인스펙터에 Edit으로 나타나게 하려면 프로퍼.. 2023. 7. 24.
델파이 컴포넌트(Component) 6편 델파이 컴포넌트(Component) 6편 프로퍼티(Property) 델파이는 참으로 재미있는 방법으로 클래스를 지원합니다. 그 중 하나가 바로 프로퍼티라는 녀석이죠. OOP의 몇가지 대표적인 특징중에 캡슐화(정보은닉)이라는 것이 있죠? OOP에서는 클래스 내부에서 다루는 데이터는 밖으로 드러나지 않아야 된다는 것이죠 내부에서 다루는 변수는 직접 조작할수가 없고, 함수를 통해서만이 값을 참조하고 바꿀수 있게 되어있습니다. 예를 들면 클래스 내부에서 쓰이는 변수중에 'fMyAge'라는 것이 있다구 합시다. 전형적인 C++언어에서는 fMyAge라는 녀석을 private안에 숨겨둘 것입니다. 그리고 다음과 같은 함수로 fMyAge를 조작할수 있도록 하겠죠. C++에서의 변수접근법 i := GetMyAge(); .. 2023. 7. 21.
델파이 컴포넌트(Component) 5편 델파이 컴포넌트(Component) 5편 이번에는 이벤트 핸들러에 들어가는 매개변수의 형(type)과 갯수를 마음대로 바꿔서 사용할수 있도록 해봅시다. 우선 TNotifyEvent의 정의부터 보도록 합시다. type TNotifyEvent = procedure (Sender: TObject) of object; 위의 형식에다가 그대로 대입만 해주면 되겠지요? 참, 참고로 '... of object'를 보도록 하죠. 지금까지 함수포인터 얘기를 자주 했지요? 그런데 'of object'는 왜 붙어야 할까요? 결론부터 얘기하자면 'of object'를 덧붙임으로서 TNotifyEvent는 객체(object)의 함수포인터가 됩니다. 즉 일반 함수포인터의 선언시에는 'of object'가 빠지게 됩니다. 그럼 우.. 2023. 7. 20.
델파이 컴포넌트(Component) 4편 델파이 컴포넌트(Component) 이벤트 추가 우선 이벤트를 받아오는 함수에 대해서 알아야 할 것입니다. WM_MOUSEMOVE이벤트가 발생할때 반응하는 함수를 만들어 보도록 합시다. 우선 윈도우 메시지를 처리하는 함수를 다음은 Controls.pas의 함수의 선언입니다. procedure WMMouseMove(var Message: TWMMouseMove); message WM_MOUSEMOVE; 지금까지 보아오던 함수와는 조금 다르죠? 뒤에 있는 'message WM_MOUSEMOVE'는 'WM_MOUSEMOVE'이벤트를 받아서 처리를 하겠다는 의미일테구요. 매개변수로 들어간 Message는 처리할 메시지의 값이 들어가겠지요? 그럼 이 함수의 실체를 보도록 합시다 procedure TControl... 2023. 7. 19.
델파이 컴포넌트(Component) 3편 델파이 컴포넌트(Component) 3편 속성 우선 우리의 버튼에 특성을 주어 봅시다. 가장 눈에 잘띄는 속성은 Caption일 겁니다. constructor TMyButton.Create( AOwner : TComponent ); begin inherited Create(AOwner); // 생성시에 할일... Caption := '눌러봐!'; Font.Name := 'fixedsys'; Font.Size := 9; Width := 200; Height := 150; end; 이상과 같이 Create함수를 바꿔보고 컴포넌트를 다시 컴파일 합시다. 컴포넌트의 컴파일은 패키지에서 'Compile'버튼을 누르면 됩니다. 패키지는 기본적으로 'Dclusr30.dpk'를 사용하게 되는데 'Component'메뉴.. 2023. 7. 18.
델파이 컴포넌트(Component) 2편 델파이 컴포넌트(Component) 2편 생성(Create)과 해제(Destroy) 솔직해 컴포넌트는 이 두가지만 잘 해주면 거의 끝난것이라고 할수 있습니다. 많은 분들이 이 두가지를 잘못해서 컴포넌트와의 싸움에서 쓴잔을 마시고 계신줄 알고 있습니다. 가령 폼위에 컴포를 올려놓기는 했는데 삭제하려면 엑세스가 바이얼레이션한다는 보기싫은 메시지를 토해놓는다던지, 델파이가 종료가 안된다던지, 혹은 아주 보기 드믈게 윈도우가 다운된다던지 하는 일의 대부분은 Create와 Destroy를 잘못해서 생기는 일입니다. 하지만 절대 어려운 일이 아닙을 미리 밝혀드립니다. 먼저 강좌에서 만든 'MyButton.pas'를 봅시다. 많이 보던 코드들이 나와 있죠? 처음 보는 함수가 하나 만들어져 있음을 볼수 있습니다. 바로.. 2023. 7. 17.
델파이 컴포넌트(Component) 1편 델파이 컴포넌트(Component) 1편 델파이에서의 컴포넌트(Component)는 재사용 가능한 UI 요소를 나타내는 객체입니다. 컴포넌트는 시각적인 디자인 요소와 그에 대한 동작 및 속성을 포함할 수 있으며, 델파이 애플리케이션 개발에서 중요한 역할을 합니다. 델파이의 컴포넌트는 시각적인 요소를 담당하는 시각 컴포넌트(Visual Component)와 비시각적인 요소를 담당하는 비시각 컴포넌트(Non-Visual Component)로 구분할 수 있습니다. 시각 컴포넌트(Visual Component) 시각 컴포넌트는 사용자 인터페이스(UI)의 일부를 구성하는 요소로, 폼(Form) 위에 배치되어 시각적으로 표현됩니다. 버튼, 레이블, 리스트 박스, 텍스트 상자 등과 같은 UI 컨트롤들이 시각 컴포넌트.. 2023. 7. 14.
델파이 암호화 델파이 암호화 데이터의 암호화는 보안의 가장 기본적인 형태이다. 그 동안 보안은 어느 군사작 전에서나 이용되는 용어로 여겨진게 사실이지만, 갈수록 시스템이 외부에 노출되 는 (특히 인터넷등의 네트워크망에서) 상황에서 데이터의 적절한 암호화는 아주 중요한 사안이 되고 있다. 여러분이 주변에서 쉽게 구할 수 있는 암호화 알고리즘들이 있고, 그것은 완벽에 가깝다. 여러분이 사용하고 있는 ID의 암호 역시 그런 알고리즘에 기반을 두고 암호화된다. 하지만, 이런 것들은 암호화에만 치중한 것으로 해독기능이 없다. 즉, 암호화 된 데이터를 다시 원본 데이터로 추출해 내는 역변환은 불가능한 것이다. 시스템의 운영자도 해당 사용자 ID의 암호를 변환해 원본 암호를 뽑아내는 것이 불가능하다. 여러분이 ID를 입력했을 때,.. 2023. 7. 13.
가상키 코드(Virtual Keys) 가상키 코드(Virtual Keys) OnKeyDown등에서 이용되는 Key값은 VK_* 형태를 지니는 상수로 정의되어 있다. 이 상수들 중 특정 키 값들을 몰라 해메는 경우가 있어 정리해 본다. 자판의 'A'에서 'Z'까지의 키보드는 VK_A부터 VK_Z까지로 구성되고, 자판의 '0'에서 '9'까 지의 값은 VK_0에서 VK_9와 같다. 이 값들은 문자의 ASCII값과 동일하다. 그 외 나머지 값은 아래와 같다. 이중 VK_Copy등 이용되지 않는 키 값(즉, 키보드로 누 를 수 없는 값)도 있다. 상수의 이름이 그대로 자판의 이름을 나타내므로 별도의 설명은 붙이지 않았다. VK_LButton = $01; VK_RButton = $02; VK_Cancel = $03; VK_MButton = $04; V.. 2023. 7. 11.
가변 데이터의 저장 기법 가변 데이터의 저장 기법 ​ 혹시 이런 경우에 어떻게 하시나요? ​ 우선 스트링을 10개를 저장해야 합니다. 물론 하나의 파일에 말이죠. ​ 당연히 10개의 스트링의 길이는 가변이겠죠? ​ 자.. 어떻게 하면 가변의 스트링을 파일에 저장하고 고스란히 불러올수 있을까요? 또 한가지 조건을 덧붙인다면 스트링의 갯수의 제한을 두지 않는다면... ^^. ​ 어떻게든 방법이 있겠죠? ​ 어떤방법을 동원하든지 해결을 할수 있겠지만 새로운 방법을 소개합니다. 아주 손쉽게 가변길이의 데이터를 저장하고 불러올수 있는 방법입니다. ​ ​ 첫번째 방법 1 ​ 컴포넌트를 저장하고 불러오는 기능을 약간 변형하는 것입니다. ​ 즉 우리가 저장하려는 가변의 스트링을 컴포넌트의 프로퍼티로 놓게되면 컴포넌트를 저장할때 데이터도 함께 .. 2023. 7. 10.
웹 브라우져 URL주소 실행 ​ 웹 브라우져 URL주소 실행 ​ ​ 첫번째 방법 ​ Windows API 함수 중 하나인 ShellExecute 함수를 이용합니다. ​ 예제 ​ uses ShellAPI; ​ procedure OpenWebPage(const URL: string); begin ShellExecute(0, 'open', PChar(URL), nil, nil, SW_SHOWNORMAL); end; ​ procedure TForm1.Button1Click(Sender: TObject); begin OpenWebPage('사이트 주소') end; ​ ​ ​ ​ 두번째 방법 ​ 제가 예전에 프로그램에서 특정 url 로 이동할때 shellexecute 를 사용했을텐데요. 더 간단한 방법이 있습니다. 볼랜드 사이트서 본겁니다. un.. 2023. 7. 6.
프로그램간의 메모리공유 프로그램간의 메모리공유 파일 매핑(File Mapping)은 파일을 메모리에 매핑하여 여러 프로세스 간에 해당 메모리를 공유할 수 있도록 해주는 기술입니다. 파일 매핑을 사용하면 여러 프로세스가 동일한 데이터를 읽고 쓸 수 있으며, 이를 통해 프로그램 간 효율적인 통신 및 데이터 공유가 가능해집니다. 개념은 물리적인 주소공간을 예약하고 각 주소공간에서 그 물리적 주소의 논리적인 주소를 얻는것 입니다. 그리고 그 논리적 주소에 자료를 쓰고 읽는 것이지요. 예제1 물리적 주소를 예약하는 방법 hMap := CreateFileMapping ( $FFFFFFFF, nil, PAGE_READWRITE, 0, 1024, stMapNa me ); stMapName은 고유한 공유할 열쇠의 문자열입니다. const st.. 2023. 7. 5.
컨트롤의 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.
DLL만들기와 사용방법 DLL만들기와 사용방법 DLL를 만들기가 어렵다고 생각하시는 분이 있는데 그렇지 않습니다. DLL에 관한 이해는 다른분들도 많이 올려 놓으신것 같아서 여기서는 작성방법과 사용법에 대해서만 올려드립니다. 설명에서 FILE / NEW 라고 쓰여 있으면 FILE에 들어가서 NEW를 선택하라는 뜻입니다. DLL 만들기 0, DELPHI 실행 1, FILE / NEW / DLL 2, FILE / NEW FORM 또는 NEW DATA MODULE ( UNIT1.PAS나 FORM이 설정된다. ) 3, unit1.pas내에 implementation이라는 구절 아래에 다음과 같이 타이핑한다. function min(i,j:integer):integer; var p:integer; begin if i>j then p:=.. 2023. 6. 28.
DLL(Dynamic-link library)란 (5) DLL(Dynamic-link library)란 (4) 델파이에서의 DLL 작성은 그것을 이용하기 만큼이나 쉽다. 일반적인 코딩 스타일 을 그대로 유지하면 되기 때문이다. 하나의 차이점이라면 프로젝트 파일에서 program 대신 library를 기입하는 것이다. 그에 더해 exports절만 살짝 넣어주면 된다. 물론 우리가 일반적으로 사용하는 VCL하의 프로젝트 구조와는 약간 차이가 있지만, 콘솔(커맨드라인) 프로그램을 작성하는 경우 이런 형태가 일반적이다. 아래 형태의 프로젝트 내용이 이상하게 보이는 사람은 그냥 '정통 스타일의 파스 칼 구조'라고 보면 된다. 물론 반드시 '특정 구조로 작성하라'라는 규칙은 없다. library MinMax; // program 대신 library를 기입한다. func.. 2023. 6. 27.
DLL(Dynamic-link library)란 (4) DLL(Dynamic-link library)란 (4) DLL의 procedure나 function을 어디에서 import할 것인가? 물론, 그것을 사용하 는 unit 내에서 import할 수도 있다. 하지만 대부분의 경우, 개별 unit을 구성하고 그곳에 한 DLL내의 procedure나 function을 import하기 위한 코드를 모두 몰 아넣는 것이 일반적이다. 이렇게 DLL의 import를 목적으로 구성된 unit이 Import Unit이다. import unit의 좋은 예는 '{DELPHI}\Source\RTL\Win' 내의 unit들이다. 이것들은 모두 Windows API를 지원하기 위해 각 DLL별로 만들어진 모든 unit 의 소스가 있다. 이 unit들, 특히 Windows.pas를 자.. 2023. 6. 26.
DLL(Dynamic-link library)란 (3) DLL(Dynamic-link library)란 (3) 윈도우즈가 실행파일을 구동시키는 과정을 살펴보자. 이것은 Windows 95나 Windows NT등의 WIN32에 국한되는 설명이다. *.EXE 형태의 프로그램이 로딩된다면 우선 커널 프로세스 하나가 생성되어 작동한다. 커널 프로세서의 주 역할은 메모리 영역을 구성하는 것이다. 커널 프로세스가 억세스할 수 있는 메모리 범위 는 32bit 범위, 즉 4기가 바이트에 이른다. 다음으로 커널파일매핑 프로세스가 생성되어 작동한다. 이 프로세스는 실행파일을 하드디스크등의 저장소로부터 커널 프로세스의 메모리 영역으로 복사한다. 이 과정을 통해 실행파일은 실제의 어드레스로 매핑된다. 다음으로 프로그램이 DLL을 이용하고 있다면 이 DLL을 찾아 시스템을 뒤진다... 2023. 6. 23.
DLL(Dynamic-link library)란 (2) DLL(Dynamic-link library)란 (2) DLL은 Dynamic-link library의 약자로 한마디로 표현하자면 동적으로 연결되는 램상주 라이브러리이다. Windows 환경하의 프로그래밍에서 DLL은 단순한 라이브 러리 이상의 의미를 가진다. 우리가 작성한 어플리케이션은 DLL의 징검다리를 뛰 어다닌다. Windows의 많은 부분이 DLL로 구성된 탓이다. Windows의 커널, 그래픽 인터페이스, 디바이스 드라이버등은 모두 DLL로 구성되어 있다. 실제로 Windows 하의 프로그래밍 환경에서 DLL과 완전히 별개인 어플리케이션은 존재할 수 없다. 우리가 Windows API가 DLL을 호출하는 것은 당연한 것이라 치고, VCL 역시 DLL 위에서 구성된 것이다. 심지어 DLL이 깨어.. 2023. 6. 22.