컴포넌트 제작시에 ComponentEditor, PropertyEditor 를 만들어 주게되면 런타임 패키지(Editor 를 제외한 순수 컴포넌트 모음), 디자인 패키지(Editor 모음) 로 나눠 주어야한다. 그렇지 않으면 Proxies.dcu(Delphi), Proxies.obj(C++Builder) 를 달라고 떼쓴다.
그런데 대충 연습 코딩중인데 열심히 해놓고 확인하려할 때 저 에러를 만나면 귀찮아진다. 그래서 Proxies 유닛을 포함시켜다 놓고 해버렸다. Delphi 7 의 경우 Proxies.pas 를 포함시키면 된다. 이걸 C++Builder 에 포함시켰더니 끝끝내 Proxies.obj 를 달라길래 cpp 로 변환해 놨다.
도움말 참고 시 VCL 만 쓰기 때문에 선택 창이 매번 떠 귀찮다. 예전에 위의 팁으로 도움말을 제거했었는데 다시 해보려니 안된다. (되면 이 글은 무시) Delphi 7, C++Builder 6 이라서 그런가... Delphi 는 버젼이 다르다 쳐도 C++Builder 는 6 버젼으로 예전에 바꿨던 기억이 있다.
어쨌든 적용이 안되서 헤매다가 그냥 간단하게 해결봤다. d7clx.hlp(Delphi 7), blx2clx.hlp(C++Builder 6) 파일을 Help 폴더에서 다른 곳으로 옮겼다. 아예 쓰지 않을 계획이면 지워도 무방할 것이다.
메세지 구분자는 정수형의 상수이다. 1024($0400) 이하의 영역은 위도우에서 사용되는 영역이다. 그래서 WM_USER 를 정의해 놓고 1 이상의 값을 더해 새로 정의해 사용하게 된다. const WM_USER = $0400;
그러나 이 경우에도 VCL 컨트롤의 메세지와 중복되는 경우가 있는데 다음이 이에 해당한다. { Edit Control Notification Codes } const EN_ERRSPACE = $0500; EN_MAXTEXT = $0501; EN_HSCROLL = $0601; EN_VSCROLL = $0602;
사용되는 컨트롤을 파악하여 중복되는 메세지를 잘 피해야 할 것이다.
이 외에 WM_APP 를 이용하는 방법도 있지만, 이 또한 여러 Third-Party 컴포넌트와 섞이거나 내 것을 남이 쓰게 만들 경우 충돌 무결을 보장할 수 없다. const WM_APP = $8000;
RegisterWindowMessage 함수를 사용하면 문자열을 통해 프로그램에서 자동으로 윈도우 메세지를 등록해주면 더 깔끔할 듯 싶다. Delphi> function RegisterWindowMessage(lpString: PChar): UINT; stdcall;
Exam> var WM_TEST: UINT; begin WM_TEST := RegisterWindowMessage('Test Message'); end;
RegisterWindowMessage RegisterWindowMessage 함수는 시스템이 유일함을 보증하는 새로운 윈도우 메세지를 정의한다. 반환 된 메세지 값은 SendMessage 또는 PostMessage 함수를 호출하는 데 사용된다.
UINT RegisterWindowMessage( LPCTSTR lpString // 메세지 문자열의 주소 );
매개변수 lpString : 등록 될 메세지를 나타내틑 NULL 종료 문자열 포인터.
반환값 메세지 등록 성공시, 반환 값은 0xC000 부터 0xFFFF 사이의 메세지 확인자다. 실패 시, 반환 값은 0 이다.
설명 RegisterWindowMessage 함수는 전형적으로 두 협력 어플리케이션 간의 대화용 메세지 등록에 사용된다. 두개의 다른 어플리케이션에서 같은 메세지 문자열로 등록을 한다면, 어플리케이션은 같은 메세지 값을 반환한다. 메세지는 윈도우 세션이 종료될 때 까지 등록된 채로 남아있다. RegisterWindowMessage 는 둘 이상의 어플리케이션 간에 같은 메세지로 처리해야 할 경우에만 사용한다. 윈도우 클래스 간의 전용 메세지 전송에서 어플리케이션은 WM_USER 부터 0x7FFF 범위의 아무 정수 값이나 사용할 수 있다. (이 영역의 메세지들은 윈도우 클래스 전용이다, 어플리케이션 용이 아니다. 예를 들어, 미리 정의된 BUTTON, EDIT, LISTBOX, COMBOBOX 같은 컨트롤 클래스는 이 범위의 값을 사용할 것 이다.)
주의사항 소수점 단위는 처리가 안되며, 속도도 Math 라이브러리의 Power 와 비슷하거나 조금 느리므로 참고용으로만 사용하길 추천
원리이해 A * B = 0에 A 를 B 번 더한 것 = A 에 A를 B - 1 번 더한 것 A ** B = 1에 A 를 B 번 곱한 것 = A에 A 를 B - 1 번 곱한 것
Integer 형을 이용한 구현 코드
> 이중 for 문 사용 function Pow(B, P: Integer): Integer; var I: Integer; J: Integer; Default: Integer; begin Result := 1; if P = 0 then Exit;
for I := 1 to P do begin Default := Result; for J := 2 to B do Result := Result + Default; end; end;
> 1중 for 문으로 수정 같은 알고리즘에 루프 변수만 1개를 사용함. function Pow(Base, Power: Integer): Integer; var I: Integer; Def: Integer; begin Result := 1; if Power = 0 then Exit;
Result := Base; Dec(Base); for I := 0 to (Base * (Power - 1)) - 1 do begin if I mod Base = 0 then Def := Result; Result := Result + Def; end; end;
> Power 값이 음수인 경우도 계산 function Pow(Base, Power: Integer): Extended; function PowPos(Base, Power: Integer): Integer; var I: Integer; Def: Integer; begin Result := Base; Dec(Base); Def := 0; for I := 0 to (Base * (Power - 1)) - 1 do begin if I mod Base = 0 then Def := Result; Inc(Result, Def); end; end; begin if Power > 0 then Result := PowPos(Base, Power) else if Power < 0 then Result := 1 / PowPos(Base, Power * -1) else Result := 1; end;
function ValidHumanID(Input: String): Boolean; var I: Integer; Temp: Integer; begin if Length(Input) <> 13 then raise EInOutError.Create('Invalid argument length');
Temp := 0; for I := 1 downto 12 do Inc(Temp, ((Ord(Input[i]) - 48) * ((I - 1) mod 8) + 2)); Result := ((Ord(Input[13]) - 48) = (11 - (Temp mod 11)) mod 10); end;
디버깅 중 변수 정보 등 무언가를 알기위해 메세지를 출력할 경우가 있다. 어느 작업에나 필요하기 마련이다. DDK 의 경우에는 DbgPrint 함수와 이의 매크로 함수인 KdPrint 의 역할이다.
CodeGear 도구인 C++Builder, Delphi 의 경우 편한 환경에서 사용하기 위하여 GExpert 를 설치하는 경우가 대부분이다. 이 GExpert 안에는 디버그 메세지를 출력하는 유닛이 포함되어있다. (따로 디버깅용 유닛을 설치해서 사용하는 어리석음은 피하자.)
1. 유닛 포함 방법 C++Builder #include "DbugIntf.hpp"
Delphi uses DbugIntf;
2. 실행 방법 C++Builder #ifdef _DEBUG if (FindWindow(L"TfmDebug", NULL) == NULL) StartDebugWin(); #endif
Delphi if FindWindow('TfmDebug', nil) = nil then StartDebugWin;
3. 디버그 메세지 출력 이 부분은 유닛을 참고하라. 숫자출력, 메소드 시작/종료, 문자, 날짜/시간 출력 등등 다양한 함수가 있다.