Autor Beitrag
Angel4585
Hält's aus hier
Beiträge: 7


Delphi 2005 Prof.
BeitragVerfasst: Do 10.11.05 15:57 
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
Hält's aus hier
Beiträge: 6

XP, WIN 2000
C++ Builder
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 7


Delphi 2005 Prof.
BeitragVerfasst: Fr 11.11.05 09:31 
Also ich habe einen Thread:

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:
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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 16

WIN XP
D7 Prof
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 7


Delphi 2005 Prof.
BeitragVerfasst: Mo 14.11.05 15:41 
@ Rolf

Du beziehst dich auf das hier:
ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 7


Delphi 2005 Prof.
BeitragVerfasst: 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.