[Delphi] Użycie ControlAtPos zamiast GetClassName.

0

Witam. Poniższy kod działa, ale ja chciałbym zamiast GetClassName użyć ControlAtPos i sprawdzać
komponenty po ClassType, a nie po zwróconej nazwie w. Jak prawidłowo użyć ControlAtPos aby
otrzymać ClassType, a nie wyjątek AV, jak do tej pory albo nic. Poniżej wklejam kod obu moich prób.
Zresztą pierwszy kod po drobnej przeróbce znalazłem właśnie googlując, na tym forum.

var
  P : TPoint;
  Window : HWND;
  Str : string;
begin
  GetCursorPos(P);
  Window := WindowFromPoint(P);
  Setlength(Str, 128);
  GetClassName(Window, Pchar(Str), 128);
  Str := Copy(Str, 0, Pos(#0, Str) -1);
  if (Str = 'TListView')
  or (Str = 'TEdit')
  or (Str = 'TBitBtn')
  or (Str = 'TComboBox')
  then
    begin
    StatusBar.SimpleText := ''
    end
    else
    begin
    StatusBar.SimpleText := Application.Hint;
    end;
end;

I to działa ok, bo wyświetla Hinty dla pozycji Menu w StatusBarze, a dla pozostałych komponentów w "dymkach".
Ale próbowałem też tak i nic się nie pokazuje po najechaniu na ListView. Jak dawałem z Parent. to miałem AV,
a jak robię tak jak poniżej to nie pokazuje się w ogóle Message po najechaniu na ListViewa. Proesę o pomoc.

var
  P : TPoint;
  AControl : TControl;
begin
  GetCursorPos(P);
  AControl := ControlAtPos(P, True);
  if AControl <> nil then
    begin
     if AControl.ClassType = TListView then
        ShowMessage('Wybrałeś ListView');
    end;
end;
0

A może
if AControl is TListView then

0

Niestety też nie reaguje. Ma ktoś może jeszcze jakiś pomysł?

0
procedure TForm1.Timer1Timer(Sender: TObject);
var c : TControl;
    p : TPoint;
begin
GetCursorPos(p);
p := ScreenToClient(p);
c := ControlAtPos(p, False, True, True);
If Assigned(c) then
  StatusBar1.SimpleText := c.ClassName
else
  StatusBar1.SimpleText := ''
end;
0

Dzięki. Brakowało mi z tego wynika konwersji funkcją ScreenToClient położenia myszki oraz ostatniego
parametru w funkcji ControlAtPos ustawionego na True. Post jest w google, więc innym się przyda :)
Jednak w moim programie muszę użyć pierwszej medtody jaką podałem w moim pierwszym postcie,
aby wyświetlić za każdym razem podpowiedzi dotyczące pozycji menu. Inaczej nie działa poprawnie.

0

No to podpowiedzi do pozycji menu można zrobić prościej. W zasadzie ich nie trzeba robić : ) no może przesadzam. Zależy które masz Delphi, i czy przypadkiem nie zarezerwowałeś właściwości Hint do czegoś innego niż Hint ;)

Otóż u mnie (BDS2006) wystarczy wrzucić na formę StatusBar oraz TMainMenu. Dodać pozycje do menu i przypisać im hinty. We właściwościach StatusBara ustawiasz AutoHint na True - i to cała praca.

Pamiętam, że żeby uzyskać to samo w D4 było parę linijek więcej (coś chyba z Application.OnHint).

0

Używam Delphi 7 i w nim elementy Menu (MenuItem) nie mają właśności AutoHint; Ale dzięki za info.

0

Czytaj uważnie. AutoHint może mieć StatusBar.

0

A no tak faktycznie, źle zrozumiałem, ale do pokazywania hintów dla pozycji menu na Statusbarze, a w
przypadku pozostałych komponentów w "dymkach" muszę użyć sposobu jaki podałem tu na początku.

0

!!! WRONG !!! to działa dla wszystkich komponentów z właściwością Hint.

0

Dla wizualnych działa z tego co sprawdziłem, ale nie spieram się. Mi taka metoda akurat w moim
programie odpowiada. Dla wizualnych komponentów na formatce ma pokazywac Hint w "dymku",
a pozostałe (w przypadku mojego programu - pozycje Menu) pokazuje w StatusBarze - mam tak:

var
  P : TPoint;
  Window : HWND;
  Str : string;
begin
  GetCursorPos(P);
  Window := WindowFromPoint(P);
  Setlength(Str, 128);
  GetClassName(Window, Pchar(Str), 128);
  Str := Copy(Str, 0, Pos(#0, Str) -1);
  if (Str = TListView.ClassName)
  or (Str = TEdit.ClassName)
  or (Str = TBitBtn.ClassName)
  or (Str = TComboBox.ClassName) then
    begin
    StatusBar.SimpleText := ''
    end
    else
    begin
    StatusBar.SimpleText := Application.Hint;
    end;
end;

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