찾다 보니.. 둥근 힌트 박스를 만들기라는 예제가 있던데..
움.. 예제를 그대로.. 옮겨 적었거든여?..
근데.. 에러가.. 나는군요..
거기에 적힌대루.. 컨트롤들을..
먼저.. 옮긴 다음..
힌트 내용을 true로.. 고친 다음..
옮겨 적었는데...
자꾸.. expected ':' but' = 'found 라는 에러가 나더군요..
어디가 잘못 됐는지 모르겠어요..
혹시.. 하는 방법이 잘못 되었는지..
소스를 올립니다..
좀.. 알려 주십시오..
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Grids, DBGrids;
type
TRoundRecHintWindow = class(THintWindow)
TForm1 = class(TForm) --> 이 부분 소스에서 추가
DBGrid1: TDBGrid;
procedure FormActivate(Sender: TObject);
private
FRegion: THandle;
procedure FreeCurrentRegion;
{ Private declarations }
public
destructor Destroy; override;
procedure ActivateHint(Rect: TRect; const AHint: string); override;
procedure Paint; override;
procedure CreateParams(var Params: TCreateParams); override;
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormActivate(Sender: TObject); --> 이부분 소스에서 추가
begin
dbgrid1.hint:='바보'+#13+'akfd';
end;
procedure TRoundRecHintWindow.ActivateHint(Rect: TRect;
const AHint: string);
{ 컨드롤 위에 마우스 포인터가 놓여 있어서 힌트가 활성화되면 이 메소드가 }
{ 호출된다. }
begin
with Rect do
Right := Right + Canvas.TextWidth('WWWW'); // 약간의 여백을 추가
BoundsRect := Rect;
FreeCurrentRegion; // 현제 설정되어 있는 영역을 제거한다.
with BoundsRect do // 힌트 윈도우를 표시할 둥근 사각형 영역을 생성한다.
FRegion := CreateRoundRectRgn(0, 0, Width, Height, Width, Height);
if FRegion <> 0 then
SetWindowRgn(Handle, FRegion, True); // 새로운 윈도우 영역을 설정
inherited;
end;
procedure TRoundRecHintWindow.CreateParams(var Params: TCreateParams);
{ 윈도우를 생성할 때 Win32가 원도우 테두리를 만들지 못하게 한다. }
begin
inherited;
Params.Style := Params.Style and not ws_Border; // 테두리를 제거한다.
end;
destructor TRoundRecHintWindow.Destroy;
begin
FreeCurrentRegion; // 사용자 설정 영역을 제거
inherited;
end;
procedure TRoundRecHintWindow.FreeCurrentRegion;
{ 다른 API 객체와 마찬가지로 영역(region) 객체 역시 사용한 다음에는 반드시 }
{ 해제시켜야 한다. 그러나 아직 파괴되지 않은 윈도우에 설정되어 있는 영역을 }
{ 제거하면 안된다. 따라서, 이 메소드는 영역 객체를 제거하기 전에 윈도우 영역을 }
{ 0으로 설정한다. }
begin
if FRegion <> 0 then // 영역이 아직 활성화되어 있다면
begin
SetWindowRgn(Handle, 0, True); // 윈도우 영역을 0으로 설정하고
DeleteObject(FRegion); // 영역을 제거한 후
FRegion := 0; // 필드에 0을 할당
end;
end;
procedure TRoundRecHintWindow.Paint;
{ WM_PAINT의 처리 메소드. 여기서 힌트 윈도우를 그린다. }
{ inherited 메소드를 호출하면 제대로 그려지지 안는다. }
var
R: TRect;
begin
R := ClientRect; // 클라이언트 영역의 크기와 위치를 얻는다.
Inc(R.Left, 1); // 왼쪽으로 약간 이동.
Canvas.Font.Color := clInfoText; // 폰트 색상 설정
// 둥근 사각형 영역의 중앙에 텍스트를 그린다.
DrawText(Canvas.Handle, PChar(Caption), Length(Caption), R,
DT_NOPREFIX or DT_WORDBREAK or DT_CENTER or DT_VCENTER);
end;
{ **********************************************************}
var
OldHintWindowClass: THintWindowClass;
function SetNewHintClass(NewClass: THintWindowClass): THintWindowClass;
var
DoShowHint: Boolean;
begin
Result := HintWindowClass; // 리턴값은 예전의 힌트 윈도우
DoShowHint := Application.ShowHint;
if DoShowHint then
Application.ShowHint := False; // 예전의 힌트 윈도우 파괴
HintWindowClass := NewClass; // 새로운 힌트 윈도우 할당
if DoShowHint then
Application.ShowHint := True; // 새로운 힌트 윈도우 생성
end;
initialization
OldHintWindowClass := SetNewHintClass(TRoundRecHintWindow);
finalization
SetNewHintClass(OldHintWindowClass);
end.
워낙 초보라.. 따라 할려구 해두.. 잘 이해가 안가는군요..
좀 가르쳐 주십시오..
답변 기다리겠습니다..
좋은 하루~
소스를 제대로 안 옮겼군요...
type
TRoundRecHintWindow = class(THintWindow)
// 여기에 메소드들이 빠져있습니다.
// procedure ActivateHint(Rect: TRect; const AHint: string);
// 위와 같은 메소드들이요...
end;
^^ 항상 즐코하세요.
정진아 wrote:
> 찾다 보니.. 둥근 힌트 박스를 만들기라는 예제가 있던데..
> 움.. 예제를 그대로.. 옮겨 적었거든여?..
> 근데.. 에러가.. 나는군요..
> 거기에 적힌대루.. 컨트롤들을..
> 먼저.. 옮긴 다음..
> 힌트 내용을 true로.. 고친 다음..
> 옮겨 적었는데...
> 자꾸.. expected ':' but' = 'found 라는 에러가 나더군요..
> 어디가 잘못 됐는지 모르겠어요..
> 혹시.. 하는 방법이 잘못 되었는지..
> 소스를 올립니다..
> 좀.. 알려 주십시오..
> unit Unit1;
>
> interface
>
> uses
> Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
> Grids, DBGrids;
>
> type
> TRoundRecHintWindow = class(THintWindow)
>
>
> TForm1 = class(TForm) --> 이 부분 소스에서 추가
> DBGrid1: TDBGrid;
> procedure FormActivate(Sender: TObject);
>
>
> private
> FRegion: THandle;
> procedure FreeCurrentRegion;
> { Private declarations }
> public
> destructor Destroy; override;
> procedure ActivateHint(Rect: TRect; const AHint: string); override;
> procedure Paint; override;
> procedure CreateParams(var Params: TCreateParams); override;
> { Public declarations }
> end;
>
> var
> Form1: TForm1;
>
> implementation
>
> {$R *.DFM}
>
> procedure TForm1.FormActivate(Sender: TObject); --> 이부분 소스에서 추가
> begin
> dbgrid1.hint:='바보'+#13+'akfd';
> end;
>
> procedure TRoundRecHintWindow.ActivateHint(Rect: TRect;
> const AHint: string);
> { 컨드롤 위에 마우스 포인터가 놓여 있어서 힌트가 활성화되면 이 메소드가 }
> { 호출된다. }
> begin
> with Rect do
> Right := Right + Canvas.TextWidth('WWWW'); // 약간의 여백을 추가
> BoundsRect := Rect;
> FreeCurrentRegion; // 현제 설정되어 있는 영역을 제거한다.
> with BoundsRect do // 힌트 윈도우를 표시할 둥근 사각형 영역을 생성한다.
> FRegion := CreateRoundRectRgn(0, 0, Width, Height, Width, Height);
> if FRegion <> 0 then
> SetWindowRgn(Handle, FRegion, True); // 새로운 윈도우 영역을 설정
>
> inherited;
> end;
>
> procedure TRoundRecHintWindow.CreateParams(var Params: TCreateParams);
> { 윈도우를 생성할 때 Win32가 원도우 테두리를 만들지 못하게 한다. }
> begin
> inherited;
>
> Params.Style := Params.Style and not ws_Border; // 테두리를 제거한다.
> end;
>
> destructor TRoundRecHintWindow.Destroy;
> begin
> FreeCurrentRegion; // 사용자 설정 영역을 제거
>
> inherited;
> end;
>
> procedure TRoundRecHintWindow.FreeCurrentRegion;
> { 다른 API 객체와 마찬가지로 영역(region) 객체 역시 사용한 다음에는 반드시 }
> { 해제시켜야 한다. 그러나 아직 파괴되지 않은 윈도우에 설정되어 있는 영역을 }
> { 제거하면 안된다. 따라서, 이 메소드는 영역 객체를 제거하기 전에 윈도우 영역을 }
> { 0으로 설정한다. }
> begin
> if FRegion <> 0 then // 영역이 아직 활성화되어 있다면
> begin
> SetWindowRgn(Handle, 0, True); // 윈도우 영역을 0으로 설정하고
> DeleteObject(FRegion); // 영역을 제거한 후
> FRegion := 0; // 필드에 0을 할당
> end;
> end;
>
> procedure TRoundRecHintWindow.Paint;
> { WM_PAINT의 처리 메소드. 여기서 힌트 윈도우를 그린다. }
> { inherited 메소드를 호출하면 제대로 그려지지 안는다. }
> var
> R: TRect;
> begin
> R := ClientRect; // 클라이언트 영역의 크기와 위치를 얻는다.
> Inc(R.Left, 1); // 왼쪽으로 약간 이동.
> Canvas.Font.Color := clInfoText; // 폰트 색상 설정
> // 둥근 사각형 영역의 중앙에 텍스트를 그린다.
> DrawText(Canvas.Handle, PChar(Caption), Length(Caption), R,
> DT_NOPREFIX or DT_WORDBREAK or DT_CENTER or DT_VCENTER);
> end;
>
> { **********************************************************}
>
> var
> OldHintWindowClass: THintWindowClass;
>
> function SetNewHintClass(NewClass: THintWindowClass): THintWindowClass;
> var
> DoShowHint: Boolean;
> begin
> Result := HintWindowClass; // 리턴값은 예전의 힌트 윈도우
> DoShowHint := Application.ShowHint;
> if DoShowHint then
> Application.ShowHint := False; // 예전의 힌트 윈도우 파괴
> HintWindowClass := NewClass; // 새로운 힌트 윈도우 할당
> if DoShowHint then
> Application.ShowHint := True; // 새로운 힌트 윈도우 생성
> end;
>
> initialization
> OldHintWindowClass := SetNewHintClass(TRoundRecHintWindow);
>
> finalization
> SetNewHintClass(OldHintWindowClass);
> end.
>
>
> 워낙 초보라.. 따라 할려구 해두.. 잘 이해가 안가는군요..
> 좀 가르쳐 주십시오..
> 답변 기다리겠습니다..
> 좋은 하루~
>