Autor Beitrag
Niels_
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 117



BeitragVerfasst: Mo 07.02.05 19:03 
Ich habe ein Popupmenu und möchte nun herausfinden, ob der Benutzer überhaupt einen Eintrag ausgewählt hat oder ob das Popupmenu noch offen ist.
Ich kann zwar jedes Item abfragen, aber das bringt ja nichts, da ich immernoch nicht weiß, ob das Popupmenu noch visible ist oder nicht. Nur weil er auf kein Item geklickt hat, heißt das ja nicht, dass es nicht mehr offen ist (könnte aber durch Klick irgendwo anders auf die Form).
Würde dann etweder per Timer abfragen, ob das Popupmenu noch visible ist, oder (besser natürlich) abfangen können, wenn das Popupmenu geschlossen wird, ohne dass eine Auswahl getroffen wurde

Leider gibt es kein
ausblenden Delphi-Quelltext
1:
if popupmenu.visible then...					

oder
ausblenden Delphi-Quelltext
1:
if popupmenu.clickedout then					


Hat jemand Ideen??
Thx
Sprint
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 849



BeitragVerfasst: Mo 07.02.05 19:17 
Windows sendet dazu die Nachricht WM_EXITMENULOOP. Bei TMainMenu kannst du die ohne weiters abfangen, weil dort die Nachricht an
die Form geschickt wird. Bei TPopupMenu's musst du das Fensterhandle von TPopupList subclassen. Das kannst du zum Beispiel so machen...
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
type
  TForm1 = class(TForm)
  ...
  private
    { Private-Deklarationen }
    OldPopupListWndProc: TFNWndProc;
    NewPopupListWndProc: TFNWndProc;
    procedure PopupListWndProc(var Message: TMessage);
  ...
  end;

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
{--------------------------------------------------------------------------------------------------}

procedure TForm1.FormCreate(Sender: TObject);
begin
  NewPopupListWndProc := MakeObjectInstance(PopupListWndProc);
  OldPopupListWndProc := TFNWndProc(GetWindowLong(PopupList.Window, GWL_WNDPROC));
  SetWindowLong(PopupList.Window, GWL_WNDPROC, Longint(NewPopupListWndProc));
end;

{--------------------------------------------------------------------------------------------------}

procedure TForm1.FormDestroy(Sender: TObject);
begin
  SetWindowLong(PopupList.Window, GWL_WNDPROC, Longint(OldPopupListWndProc));
end;

{--------------------------------------------------------------------------------------------------}

procedure TForm1.PopupListWndProc(var Message: TMessage);
begin
  with Message do
  begin
    case Msg of
      WM_ENTERMENULOOP:; // PopupMenu wird geöffnet
      WM_EXITMENULOOP:;  // PopupMenu wird geschlossen
    end;
    Result := DefWindowProc(PopupList.Window, Msg, WParam, LParam);
  end;
end;

{--------------------------------------------------------------------------------------------------}


Das ist aber eine Notlösung. Ich glaube bei Torry gibt es auf Popup Menus mit einem OnClose Event.

_________________
Ciao, Sprint.
retnyg
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2754

SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
BeitragVerfasst: Mo 07.02.05 19:22 
oder einfach beim auswählen eines eintrags immer einen boolean (zb Usercliked) auf true setzen. an dem siehste dann im source obs angeklickt wurde.
Niels_ Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 117



BeitragVerfasst: Mo 07.02.05 19:30 
@ retnyg

Das hab ich auch geschrieben, nur möchte ich in einem Timer (der synchron läuft) abfragen, ob das Popupmenu offen ist oder nicht. Da hilft mir das nicht weiter, danke trotzdem.

@ Sprint
Scheint zu funzen! Aber wieso ist das nur eine Notlösung?

:shock: Ich nehme zurück, dass es geht mit der Windowsabfrage... Ähm. Nun gehen die Clicks auf das Popupmenu nicht mehr! :roll:

:oops:

Und bei Torry finde ich nur eine compo für Delphi5, wobei ich D7 haben... Ist leider eine installationsfile, soll heißen dass ich die unit/kompo garnicht sehen kann... So ein schitt!

Jemand Lösungsvorschläge?!

Moderiert von user profile iconraziel: Beiträge zusammengefasst
Moderiert von user profile iconraziel: Erneut Beiträge zusammengefasst. Der "Moderiert von ..." Hinweis ist doch wirklich nicht zu übersehen!


Ups! Sorry Raziel! Hatte direkt hintereinander reingeschrieben
Hab bei Torry doch das entsprechende gefunden...
Danke für eure hilfe!
Sprint
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 849



BeitragVerfasst: Mo 07.02.05 23:43 
Niels_ hat folgendes geschrieben:
Ich nehme zurück, dass es geht mit der Windowsabfrage... Ähm. Nun gehen die Clicks auf das Popupmenu nicht mehr!

Falsche WinAPI Funktion benutzt. Muss natürlich CallWindowProc sein und nicht DefWindowProc.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
type
  TForm1 = class(TForm)
  ...
  private
    { Private-Deklarationen }
    OldPopupListWndProc: TFNWndProc;
    NewPopupListWndProc: TFNWndProc;
    procedure PopupListWndProc(var Message: TMessage);
  ...
  end;

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
{--------------------------------------------------------------------------------------------------}

procedure TForm1.FormCreate(Sender: TObject);
begin
  NewPopupListWndProc := MakeObjectInstance(PopupListWndProc);
  OldPopupListWndProc := TFNWndProc(GetWindowLong(PopupList.Window, GWL_WNDPROC));
  SetWindowLong(PopupList.Window, GWL_WNDPROC, Longint(NewPopupListWndProc));
end;

{--------------------------------------------------------------------------------------------------}

procedure TForm1.FormDestroy(Sender: TObject);
begin
  SetWindowLong(PopupList.Window, GWL_WNDPROC, Longint(OldPopupListWndProc));
  FreeObjectInstance(NewPopupListWndProc);
end;

{--------------------------------------------------------------------------------------------------}

procedure TForm1.PopupListWndProc(var Message: TMessage);
begin
  with Message do
  begin
    case Msg of
      WM_ENTERMENULOOP:; // PopupMenu wird geöffnet
      WM_EXITMENULOOP:;  // PopupMenu wird geschlossen
    end;
    Result := CallWindowProc(OldPopupListWndProc, PopupList.Window, Msg, WParam, LParam);
  end;
end;

{--------------------------------------------------------------------------------------------------}

_________________
Ciao, Sprint.
Niels_ Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 117



BeitragVerfasst: Di 08.02.05 18:34 
@ Sprint
GEIL! Einfach nur GEIL! Vielen Dank! Weil die andere Komponente von Torry war lizenziert. Kam immer so ein toller infoschirm, dass man sich doch bitte registrieren sollte (für schlappe 24doller!!!)... So ist das jetzt absolut geil, many thx!