Q&A

  • 둥근 힌트박스 만들기
찾다 보니.. 둥근 힌트 박스를 만들기라는 예제가 있던데..

움.. 예제를 그대로.. 옮겨 적었거든여?..

근데.. 에러가.. 나는군요..

거기에 적힌대루.. 컨트롤들을..

먼저.. 옮긴 다음..

힌트 내용을 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.





워낙 초보라.. 따라 할려구 해두.. 잘 이해가 안가는군요..

좀 가르쳐 주십시오..

답변 기다리겠습니다..

좋은 하루~



1  COMMENTS
  • Profile
    최용일 2000.09.20 00:46
    안녕하세요. 최용일입니다.



    소스를 제대로 안 옮겼군요...



    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.

    >

    >

    > 워낙 초보라.. 따라 할려구 해두.. 잘 이해가 안가는군요..

    > 좀 가르쳐 주십시오..

    > 답변 기다리겠습니다..

    > 좋은 하루~

    >

    • 조헌철
    • 2000.09.19 20:17
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 돌머리
      2000.09.19 20:30
      메일 클라이언트를 짜본적이 있는데.. 오래되서 생각이 나질 않네요..^^ 그래도 몇자 적어보겠습니다. ...
    • 조헌철
      2000.09.19 20:36
      제가 초보라서 어떻게 손을 써야될지 바쁘시지 않으시면 방법 좀 부탁합니다.
    • 2000.09.19 20:02
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 문석래
    • 2000.09.19 19:29
    • 2 COMMENTS
    • /
    • 0 LIKES
    • parkisu
      2000.09.20 10:33
      문석래 wrote: > 정말 힘들 군요.. > 이 사이트에있는 모든 방법을 다 동원해서 해봤지만. 접속이 안돼네...
    • linuxwiz
      2000.09.19 23:23
      문석래 wrote: > 정말 힘들 군요.. > 이 사이트에있는 모든 방법을 다 동원해서 해봤지만. 접속이 안돼네...
    • 돌머리
      2000.09.19 20:10
      안녕하세요 김동원입니다... 당연히 안될수 밖에 없네요.. 현재 Query1을 Select문으로 Open한 상태에...
    • 델파이초보
      2000.09.19 22:16
      김동원님 정말 감사드립니다... 이것때문에 얼마나 고생했는지 모릅니다... 다시 한번 감사드리고요.....
    • linuxwiz
      2000.09.19 23:10
      델파이초보 wrote: > > 김동원님 정말 감사드립니다... > 이것때문에 얼마나 고생했는지 모릅니다... ...
    • DelChobo
      2000.09.19 23:08
      델파이초보 wrote: > > 김동원님 정말 감사드립니다... > 이것때문에 얼마나 고생했는지 모릅니다... ...
    • 강인규
      2000.09.19 21:41
      허접스러운 코딩입니다. //델파이의 color를 html의 color값으로.... function Tform1.ColorToHcolor(c...
    • 돌머리
      2000.09.19 21:13
      안녕하세요 김동원입니다. 제가 HTML을 해보지 않아서 어떤의미인지는 모르나 굳이 자리수를 맞추려고 한...
    • 돌머리
      2000.09.19 19:11
      안녕하세요.. 김동원입니다. ExtractFileName 는 파일명만을 리턴하는 함수입니다. 예를들어.. "C:Pic...
    • 돌머리
      2000.09.19 19:30
      안녕하세요 김동원입니다. 필터 적용과 해제 부분이 빠져 있어서 그런것 같네요. 간단한 예로 Tabl...
    • 마그넷
      2000.09.19 20:18
      감사함다..동원님.. 우선 ...그건 해결한거 같거든여..저쩍 옛날 Q&A를 뒤지다가.. receive_tabl...
    • 돌머리
      2000.09.19 23:57
      마그넷님 이상없습니다. Filter는 단지 원래 데이터는 놔두고 걸러서 보여주는 함수입니다. 마그넷 w...
    • 돌머리
      2000.09.19 20:12
      돌머리 wrote: > 안녕하세요 김동원입니다. > > 필터 적용과 해제 부분이 빠져 있어서 그런것 같네요. ...
    • 정진아
    • 2000.09.19 13:37
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2000.09.20 00:46
      안녕하세요. 최용일입니다. 소스를 제대로 안 옮겼군요... type TRoundRecHintWindow = class(TH...
    • 안병래
    • 2000.09.19 10:21
    • 1 COMMENTS
    • /
    • 0 LIKES
    • [델파이]
      2000.09.19 10:59
      밑에 방법을 사용해보십시요. 강제종료.. ExitWindowsEx(EWM_FORCE,0); 안병래 wrote: > 안녕하세...
    • 최용일
      2000.09.20 00:50
      넵~ 실행파일에 바루 포함됩니다... [델파이] wrote: > 이미지 리스트박스에 이미지 2개를 넣어
    • Cha
    • 2000.09.19 07:43
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 왕초보
    • 2000.09.19 18:27
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 포커스
      2000.09.19 06:36
      왕초보 wrote: > 하나의 프로젝트에 여러개의 폼들을 추가해서 쓰고 있따가 컴퓨터가 따운되서 다시 부팅...
    • 디비로
    • 2000.09.19 05:56
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 허춘
      2000.09.19 07:28
      디비로 wrote: > 테이블의 필드명에는 공백을 넣을수 있습니다. > 그런데 코딩할때 그 필드명을 어떻게 ...
    • 돌머리
      2000.09.19 08:03
      허춘 wrote: > 디비로 wrote: > > 테이블의 필드명에는 공백을 넣을수 있습니다. > > 그런데 코딩할때 ...
    • 왕스팀
    • 2000.09.19 05:04
    • 4 COMMENTS
    • /
    • 0 LIKES
    • 타락천사
      2000.09.20 01:10
      안녕하세여..타락임다..^^ 제가 가튼 내용을 델파이 강의실에 올렸습니다.. 찾아보세여..ㅠㅠ 즐...
    • young
      2000.09.19 18:35
      왕스팀 wrote: > 옛날 COBOL로 생성된 TEXT DATA들을 > > 이미 만들어진 파라독스 TABLE에 입력해야 ...
    • 허춘
      2000.09.19 07:32
      왕스팀 wrote: > 옛날 COBOL로 생성된 TEXT DATA들을 > 이미 만들어진 파라독스 TABLE에 입력해야 합니...
    • 돌머리
      2000.09.19 06:05
      왕스팀 wrote: > 옛날 COBOL로 생성된 TEXT DATA들을 > > 이미 만들어진 파라독스 TABLE에 입력해야 ...
    • 컴돌이
    • 2000.09.19 05:19
    • 1 COMMENTS
    • /
    • 0 LIKES
    • kylix
      2000.09.19 05:07
      for I := 0 to X do for J := 0 to Y do if 어쩌구저쩌구 = True then Break; ...