Tworzenie Hint-ów - jak go kontrolować na ekranie

0

Witam, Napotkałem problem z którym nie mogę sobie poradzić. Mamy dwa komponenty edit i button. Chciałbym aby po kliknięciu button-a wyświetlił się hint pod editem lub w innym miejscu. Na określony czas po czym znika. I teraz niechcę używać właściwości hint juz z komponentu edit ale tworzyć nowego hinta gdzie mogę sobie deklarować długość jego wyświetlania i inne parametry.

Postanowiłem zrobić to za pomocą wątku, wiem że kod jest bardzo brzydki ale nie czas na razie na wskaźniki.

constructor TRafloHint.Create(AOwner: TComponent; PosX,PosY: Integer; Text : String);
begin
  inherited Create(False);
  FreeOnTerminate := True;
  vOwner := aOwner;
  vText := Text;
  x := PosX;
  y := PosY;
end;

procedure TRafloHint.ShowHint;
var
   r : TRect;
begin
   r.Left := X;
   r.Top := Y;
   r.Right := X + 100;
   r.Bottom := Y+20;
   h := THintWindow.Create(vOwner);   //Było nil 
   h.ParentWindow := Application.Handle;
   h.ActivateHint(r,vText);
end;

procedure TRafloHint.CloseHint;
begin
  h.ReleaseHandle;
  h.Free;       
end;

procedure TRafloHint.Execute;
begin
   Synchronize(ShowHint);
   Sleep(1000);  //Jak dlugo wyświetlany jest hint
   Synchronize(CloseHint);
end;

Hint się pojawia i znika problem w tym że nie wiem jak go zaczepić o konkretny komponent. Próbowałem ustawić h.parent ale bez rezultatu. Jak przeciągnę formę programu to hint się nie przesuwa razem z formą. Co robię źle?

Na pytanie dlaczego jest wątek odpowiadam że po wyświetleniu hinta sam nie znika dopiero po jego zwolnieniu.

0

h.ParentWindow := Edit1.Handle; ?

0
type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    procedure OnShowHint(var HintStr: String; var CanShow: Boolean; var HintInfo: THintInfo);

  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.OnShowHint := OnShowHint;
  Button1.ShowHint := true;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Edit1.Tag := 1;
end;

procedure TForm1.OnShowHint(var HintStr: String; var CanShow: Boolean; var HintInfo: THintInfo);
 Var
   P: TPoint;
begin
  if Edit1.Tag = 1 then
    with HintInfo do
    begin
      HintColor := clYellow;
      P.X := Edit1.Left;
      P.Y := Edit1.Top + Edit1.Height;
      P := ClientToScreen(P);
      HintPos.X := P.X;
      HintPos.Y := P.Y;
      HintStr := 'Hint do wyświetlenia pod Editem';
    end;
  Edit1.Tag := 0;
end; 

1 użytkowników online, w tym zalogowanych: 0, gości: 1