Supportnet / Forum / Anwendungen(Java,C++...)
Delphi 5 - MDI-Problem wm_MDIActivate
Frage
Hallo,
habe kleines MDI-Problem - Delhi5.
Eine MDI-Anwendung hat 3 Kindfenster geöffnet.
Wird die Anwendung geschlossen so soll in jedes
Kindfenster ein Text eingefügt werden.
Funktioniert aber nur bei einem Kindfenster.
for I := 0 to MainForm.MDIChildCount -1 do
begin
MainForm.MDIChildren[I].BringToFront;
if MainForm.MDIChildren[I].Active then
RichEdit1.Lines.Text := RichEdit1.Lines.Text + UserName;
end;
Funktioniert nicht. MainForm.MDIChildren[I].Active wird nicht true.
Wie kann ich das mit einer API-Routine true schalten.
Ich bitte um Hilfe.
Gruss Frantek
E-Mail: Frantek@t-online.de
Antwort 1 von Frantek
Hallo,
scheint wohl ein grosses Problem zu sein
ein beliebiges Kindfenster einer MDI-Anwendung aktiv zu schalten, per Source.
Mit einem Mausklick in das Kindfenster wird es ja auch aktiv. Dann muss es doch auch per Programm gehen, aber wie?
Hat keiner einen Tipp?
Gruss Frantek
scheint wohl ein grosses Problem zu sein
ein beliebiges Kindfenster einer MDI-Anwendung aktiv zu schalten, per Source.
Mit einem Mausklick in das Kindfenster wird es ja auch aktiv. Dann muss es doch auch per Programm gehen, aber wie?
Hat keiner einen Tipp?
Gruss Frantek
Antwort 2 von drago
So wie ich das sehe fragst du nur ab welches Fenster aktiv ist.
Wenn man ein Fenster mit der Maus anklickt bekommt das jeweilige Fenster den FOCUS.
Das gleiche geht auch mit source.
Du mußt einem Fenster die BOTSCHAFT SENDEN das es den Focus erhält.
Wie es in C geht, weiß ich, aber in Delphi muß ich selbst noch nachschauen.
Ich melde mich wieder.Bis dahin hoffe ich, hast du wenigstens ein "Denkanstoss"....
Wenn man ein Fenster mit der Maus anklickt bekommt das jeweilige Fenster den FOCUS.
Das gleiche geht auch mit source.
Du mußt einem Fenster die BOTSCHAFT SENDEN das es den Focus erhält.
Wie es in C geht, weiß ich, aber in Delphi muß ich selbst noch nachschauen.
Ich melde mich wieder.Bis dahin hoffe ich, hast du wenigstens ein "Denkanstoss"....
Antwort 3 von Frantek
Hallo,
danke für die Antwort.
Das habe ich mit Sendmessage auch schon probiert (wm_MDIActivate).
Bekomme das Kindfenster aber nur deaktiviert und nicht AKTIVIERT.
Poste mir doch mal den korrekten C-Code, wenn möglich.
Gruss Frantek
danke für die Antwort.
Das habe ich mit Sendmessage auch schon probiert (wm_MDIActivate).
Bekomme das Kindfenster aber nur deaktiviert und nicht AKTIVIERT.
Poste mir doch mal den korrekten C-Code, wenn möglich.
Gruss Frantek
Antwort 4 von Frantek
Hallo, an alle die es interessiert. Ich habe das Problem gelöst.
Man kann den Source sicher noch optimieren! Aber so geht es jedenfalls.
Mit einer API-Routine.
Mit freundlichem Gruß
Frantek
Hello, it is interested in this one to all of them. I have solved the problem.
One still can optimize the Source! But it goes at all events so.
With an API routine.
Yours sincerely
Frantek
(* Die Lösung: The solution: ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ *)
procedure TMDIChild.WMMdiActivate(var Param : TWMMdiActivate);
{procedure WMMdiActivate(var Param : TWMMdiActivate); message WM_MDIACTIVATE;}
begin
inherited;
MasterHandle := 0;
if Param.ActiveWnd = Handle then
begin
MasterHandle := Param.ActiveWnd;
if ChildTestBol then
RichEdit1.Lines.Text := Hallo Frantek ;
{MessageBeep(0);}
end;
end;
procedure TMDIChild.Test01Click(Sender: TObject);
var I : Integer;
MDIChildrenHandle : Array[0..50] of HWND;
wParam, lParam, MainHandle,
SetMDIChildrenActiveHwndFalse,
SetMDIChildrenActiveHwndTrue : HWND;
Procedure UpdateMDIChildren;
begin
{MainForm.MDIChildren[0].BringToFront;}
{MainForm.MDIChildren[0].Show;}
MainForm.MDIChildren[0].Update;
MainForm.MDIChildren[0].SetFocus;
end;
Procedure UpdateChildWindowsSendKeys;
begin
if MainForm.MDIChildren[0].Active then
begin
UpdateMDIChildren;
if SendKeys1.AppActivate(MainForm.Caption) then
begin
UpdateMDIChildren;
SendKeys1.SendKeys(Hello
+ IntToStr(MainForm.MDIChildren[0].Handle)
+
+ IntToStr(MasterHandle)
+
+ MDIChildCaption
+ , true);
UpdateMDIChildren;
end;
end;
end;
begin {Test01Click}
FillChar(MDIChildrenHandle, SizeOf(MDIChildrenHandle),0);
for I := 0 to MainForm.MDIChildCount -1 do
MDIChildrenHandle[I] := MainForm.MDIChildren[I].Handle;
MDIChildrenHandle[I] := MainForm.MDIChildren[0].Handle;
for I := 0 to MainForm.MDIChildCount -1 do
begin
if MainForm.MDIChildren[0].Active then
begin
SetMDIChildrenActiveHwndFalse := MDIChildrenHandle[I];
SetMDIChildrenActiveHwndTrue := MDIChildrenHandle[I+1];
wParam := SetMDIChildrenActiveHwndTrue;
lParam := 0;
SendMessage(SetMDIChildrenActiveHwndFalse, WM_MDIACTIVATE, wParam, lParam);
ChildTestBol := True;
SendMessage(SetMDIChildrenActiveHwndTrue, WM_MDIACTIVATE, wParam, wParam);
ChildTestBol := false;
if MainForm.MDIChildren[0].Active then
begin
MainFormClassName := MainForm.ClassName;
MDIChildFormClassName := MainForm.MDIChild.ClassName;
MDIChildCaption := MainForm.MDIChildren[0].Caption;
UpdateChildWindowsSendKeys;
end;
end;
end;
end;
(* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ *)
Man kann den Source sicher noch optimieren! Aber so geht es jedenfalls.
Mit einer API-Routine.
Mit freundlichem Gruß
Frantek
Hello, it is interested in this one to all of them. I have solved the problem.
One still can optimize the Source! But it goes at all events so.
With an API routine.
Yours sincerely
Frantek
(* Die Lösung: The solution: ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ *)
procedure TMDIChild.WMMdiActivate(var Param : TWMMdiActivate);
{procedure WMMdiActivate(var Param : TWMMdiActivate); message WM_MDIACTIVATE;}
begin
inherited;
MasterHandle := 0;
if Param.ActiveWnd = Handle then
begin
MasterHandle := Param.ActiveWnd;
if ChildTestBol then
RichEdit1.Lines.Text := Hallo Frantek ;
{MessageBeep(0);}
end;
end;
procedure TMDIChild.Test01Click(Sender: TObject);
var I : Integer;
MDIChildrenHandle : Array[0..50] of HWND;
wParam, lParam, MainHandle,
SetMDIChildrenActiveHwndFalse,
SetMDIChildrenActiveHwndTrue : HWND;
Procedure UpdateMDIChildren;
begin
{MainForm.MDIChildren[0].BringToFront;}
{MainForm.MDIChildren[0].Show;}
MainForm.MDIChildren[0].Update;
MainForm.MDIChildren[0].SetFocus;
end;
Procedure UpdateChildWindowsSendKeys;
begin
if MainForm.MDIChildren[0].Active then
begin
UpdateMDIChildren;
if SendKeys1.AppActivate(MainForm.Caption) then
begin
UpdateMDIChildren;
SendKeys1.SendKeys(Hello
+ IntToStr(MainForm.MDIChildren[0].Handle)
+
+ IntToStr(MasterHandle)
+
+ MDIChildCaption
+ , true);
UpdateMDIChildren;
end;
end;
end;
begin {Test01Click}
FillChar(MDIChildrenHandle, SizeOf(MDIChildrenHandle),0);
for I := 0 to MainForm.MDIChildCount -1 do
MDIChildrenHandle[I] := MainForm.MDIChildren[I].Handle;
MDIChildrenHandle[I] := MainForm.MDIChildren[0].Handle;
for I := 0 to MainForm.MDIChildCount -1 do
begin
if MainForm.MDIChildren[0].Active then
begin
SetMDIChildrenActiveHwndFalse := MDIChildrenHandle[I];
SetMDIChildrenActiveHwndTrue := MDIChildrenHandle[I+1];
wParam := SetMDIChildrenActiveHwndTrue;
lParam := 0;
SendMessage(SetMDIChildrenActiveHwndFalse, WM_MDIACTIVATE, wParam, lParam);
ChildTestBol := True;
SendMessage(SetMDIChildrenActiveHwndTrue, WM_MDIACTIVATE, wParam, wParam);
ChildTestBol := false;
if MainForm.MDIChildren[0].Active then
begin
MainFormClassName := MainForm.ClassName;
MDIChildFormClassName := MainForm.MDIChild.ClassName;
MDIChildCaption := MainForm.MDIChildren[0].Caption;
UpdateChildWindowsSendKeys;
end;
end;
end;
end;
(* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ *)

