Uchwyt okna na którym leży kontrolka w innym oknie

0

Cześć,

mam problem, ponieważ od pewnego czasu działała u mnie pewna funkcja, która zwracała mi rodzica okna na którym leży kontrolka innego okna np. TEdit:

function TfrmMenu.GetWindowClass(pt: TPoint): string;
var
  Wind, Target: HWND;
  i: Integer;
  ClassName: array[0..256] of Char;
begin
  Wind := WindowFromPoint(pt);
  Target := Wind;

  // jadę w pętli (ze 40 razy zakładając, że np button nie będzie miał pod sobą 40 innych komponentów
  // na których został położony
  for I := 0 to 40 -1 do 
  begin
    Target := GetParent(Wind);
    GetClassName(Target, @ClassName, 257); // tylko dla podglądu w debugerze
    if Target = 0 then
      break;
    Wind := Target;
  end;

  GetClassName(Wind, @ClassName, 257);
  Result := Copy(StringReplace(string(Trim(ClassName)), '#0', '', [rfReplaceAll]), 1, 120);
end;

Co się okazało...
Funkcja działała dobrze do czasu, gdy szukałem parenta komponentu innego okna:

Założenie:

  1. TfrmMenu -> Panel -> Panel1 -> Panel2 -> Groupbox -> Button (Pokaż TfrmOkno)
  2. TfrmOkno -> Panel -> Groupbox -> Edit

Gdy korzystam z pętli podstawiając pod PT współrzędne Edit z okna TfrmOkno to pętla w pewnym momencie pokazuje na parenta TfrmOkno, ale leci dalej aż do TfrmMenu.

W jaki sposób można pobrać parenta okna kontrolki na której leży?
Zaznaczę iż nie wiem ile parentów znajduje się pod wybraną przeze mnie kontrolką.

2

Spróbuj zmienić na

  for I := 0 to 40 -1 do
  begin
    Target := GetParent(Wind);
    GetClassName(Target, @ClassName, 257); // tylko dla podglądu w debugerze
    if Target = 0 then
      break;
    Wind:= Target;
    if GetWindowLong(Target, GWL_STYLE) and WS_CHILD <> WS_CHILD then
      break;
  end;

EDIT// Tak poza tym ciekawe dlaczego stosujesz tu pętlę for zamiast while o którą aż się prosi w tym wypadku.

0

Działa elegancko, wielkie dzięki!

kAzek napisał(a):

EDIT// Tak poza tym ciekawe dlaczego stosujesz tu pętlę for zamiast while o którą aż się prosi w tym wypadku.

  while GetWindowLong(Target, GWL_STYLE) and WS_CHILD = WS_CHILD do
  begin
    Target := GetParent(Wind);
    GetClassName(Target, @ClassName, 257);
    if Target = 0 then
      break;
    Wind := Target;
  end;

Masz rację, aż się prosiło, czemu ja tego nie widziałem :)

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