Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Mainmenu reagiert nicht


Angel4585 - Do 10.11.05 15:57
Titel: Mainmenu reagiert nicht
Hallo zusammen

Ich hab folgendes Problem:

Ich habe zwei Formulare, auf denen jeweils ein MainMenu ist(also insgesamt 2)

Das zweite Formular wird irgendwann aus einem Thread heraus geöffnet, dass funzt alles wunderbar.
Wenn ich jetzt allerdings in dem MainMenu des Haupformulars aktiv bin und sich währenddessen das zweite Formular öffnet, ist dessen MainMenu "inaktiv", bzw. wenn ich auf die MenuItems klicke passiert nichts, nichtmal das Dropdown in dem MainMenu funzt.

Das gleiche gilt wenn ich die erste Form mit der Maus verschiebe und währenddessen die zweite Form aufgerufen wird, kann ich die zweite nicht per Maus verschieben.

Weis jemand wie ich das beheben kann?

die zweite Form wird über en ButtonClick auf der ersten Form geöffnet.

=> Synchronize(tfMain.Button.Click);

Ich habe bisher versucht :

Das MainMenu zu "Destroyen", freizugeben, mit SendMessage zu schliessen, Habe das gesamte Hauptformular Disabled, habe das Fenster über eine Prozedur in dem Thread aufgerufen anstatt über die Button.Click

aber nichts davon funktioniert

Danke schonmal


questor - Do 10.11.05 21:40

Das klingt so, als bekäme Dein zweites Formular nie den Eingabefokus.
Mir ist irgendwie auch nicht ganz klar, wie das mit Deinen Threads zusammenhängt. Denn es gibt ja nur einen einzigen GUI Thread in einer Applikation.

Kannst Du das mal genauer spezifizieren?


Angel4585 - Fr 11.11.05 09:31

Also ich habe einen Thread:


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:
33:
34:
35:
36:
37:
TMyThread = class(TThread)
 private
  FOpenTime : TDateTime;
  procedure OpenForm2;
 protected
  procedure Execute;override;
 public
  constructor Create;
 end;


constructor TMyThread.Create;
begin
 inherited Create(False);
end;

procedure TMyThread.Execute;
begin
while not Terminated do
 begin
 sleep(10);
 if Now > FOpenTime then
  Synchronize(OpenForm2);
 end;
end;

procedure TMyThread.OpenForm2;
begin
with TForm2.Create(Application) do
 begin
 try
  ShowModal;
 finally
  Free;
  end;
 end;
end;


Ist nur ein Beispiel, kann jeder ausprobieren. Kann aber Fehler enthalten, da ich das nur schnell hingekritzelt habe.

Das Ganze bewirkt eine Erinnerungsfunktion.
Auf Form1 und auf Form2 sind jeweils MainMenus.
Wenn ich jetzt eben im MainMenu von Form1 aktiv bin und währenddessen durch den Thread meine Form2 aufgerufen wird, dann ist das MainMenu auf Form 2 inaktiv.

Allerdings hängt das nicht mit dem Thread zusammen!

Wenn ich auf Form1 einen Timer habe:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TForm1.TimerTimer(Sender : TObject);
begin
if Now > FOpenTime then
 with TForm2.Create(Application) do
  begin
  try
   ShowModal;
  finally
   Free;
   end;
  end;
end;


Hier passiert genau das gleiche.

Ausserdem passiert sowas ähnliches:

Wenn ich Form1 verschiebe (Titelleiste mit Maus) und währenddessen die Form2 aufgerufen wird, dann kann ich Form zwei nicht über die TielLeiste verschieben.


Rolf_Geisler - Sa 12.11.05 20:08

Ich verstehe Deine ganze Konstruktion nicht. Create ist eigentlich ein Konstruktor, mir ist völlig unklar, wie man ihn als Argument in einer With-Anweisung verwenden kann.

Falls Du Dein Form2 schon zur Entwurfszeit im Projekt angemeldet hast, sorgt Delphi schon von allein dafür, dass Create aufgerufen wird. Der Aufruf von ShowModal an der richtigen Stelle sollte ausreichen. Dann ist wahrscheinlich auch das MainMenu des Formulars ansprechbar.

Rolf


Angel4585 - Mo 14.11.05 15:41

@ Rolf

Du beziehst dich auf das hier:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
with TForm2.Create(Application) do  
  begin  
  try  
   ShowModal;  
  finally  
   Free;  
   end;  
  end;


Damit erzeuge ich das Formular zur Laufzeit und gebe es wieder frei wenn es geschlossen wurde.
D.h. die Variable Form2 existiert bei mir nicht. nur der Typ TForm2. Aber das spielt keine Rolle. Es funktioniert in beiden Fällen nicht.


Angel4585 - Di 15.11.05 14:28

und immernoch niemand dem ne sinnvolle Lösung einfällt. Hab das jetzt schon in drei Foren gepostet aber bislang noch ohne Erfolg. Ich warte noch das da so ein Freak vorbeikommt und mir die Lösung hinknallt.