Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Daten zwischen MDI Childs austauschen
FloFri - Mo 11.08.03 18:09
Titel: Daten zwischen MDI Childs austauschen
Hi!
Ich wollte mal fragen, ob es möglich ist, Daten zwischen zwei MDI-Child windows auszutauschen, ohne externe speichermedien, wie textdateien oder registry zu benutzen?
So nach dem Motto, das eine Child schreibt etwas in eine Variable, das andere liest sie wieder aus.
UGrohne - Mo 11.08.03 18:34
Du musst die Variablen einfach in de Unit im public-Bereich deklarieren, dann kannst Du vom anderen Child über
darauf zugreifen
MSCH - Mo 11.08.03 18:47
brrrr,
dat is aba nich die feine englische art.
Man(n) nehme keine als public deklarieren Variablen sondern wenn schon, properties. Beispiele gibts zuhauf in der Delphi-Hilfe.
Woher soll denn deine Form wissen, dass die Variable XYZ einfach mal so von "ausserhalb" geändert wurde?
Noch ein Tip: ich realisiere sowas via Messages. Message ans Parent und der verteilt die innerhalb seiner MDI-Childs.
grez
msch
FloFri - Mo 11.08.03 19:03
@MSCH hast du eventuel ein tut oder so über messages, da ich die version von UGrohne nicht benutzen kann, da die Cilds sich gegenseitig nicht direkt kennen, sondern ich nur über die parent-anwendung gehen kann.
UGrohne - Mo 11.08.03 22:15
| MSCH hat folgendes geschrieben: |
| dat is aba nich die feine englische art. |
Reicht aber IMHO für die meisten Anwendungen, vor allem bei Anfängern.
oPPi - Di 12.08.03 02:11
hy,
was willst du den genau an die entsprechenden childs weitergeben? wenn du z.b. text aus einem edit feld ins andere übertragen willst kannste das folgendermaßen machen:
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:
| unit Hauptform;
interface
uses ...
type ...
private public end;
var Frm_Haupt: TFrm_Haupt;
implementation
uses Frageform; {$R *.dfm}
...
procedure TFrm_Haupt.Btn_FrageClick(Sender: TObject); begin Frm_Frage := Tfrm_Frage.Create(self); Frm_Frage.WindowState := wsNormal; Frm_Frage.Show; end; |
Wenn das MDI-Child dann angezeigt wird kannst du über die ensprechende Schaltfläche Daten ans Hauptformular schicken:
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:
| unit Frageform; interface
uses ...
type ...
private public end;
var Frm_Frage: TFrm_Frage;
implementation
uses Hauptform; {$R *.dfm}
...
procedure TFrm_Frage.btn_YesClick(Sender: TObject); begin Frm_Haupt.txt_Search.Text := 'Hallo'; end; |
Ich hoffe ich hab dir weiterhelfen können ... :roll:
Gruß
oPPi
FloFri - Di 12.08.03 06:13
Danke für deine Hilfe, jedoch kann ich
nicht benutzen, da die Child-Windows als Packages eingebunden werden und daher das Hauptformular zur erstellzeit nicht kennen.
MSCH - Di 12.08.03 17:59
ich versuchs mal mit Messages:
also erstes eine uses, in der nur die Message-IDs deklariert werden:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| unit defines;
interface const wm_SendeIrgentwas = wm_user + 1; wm_SendeNochwas = wm_user + 2; implementation end. |
Dein Hauptprogramm
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| uses defines,...;
type MyForm = Class(TForm) ... public procedure WMSendeIrgentwas(var Msg:TMessage);Message wm_SendeIrgentwas; .... end;
procedure MyForm.WMSendeIrgentwas(var Msg:TMessage); var I:Integer; begin for I:= 0 to MDIChildCount-1 do PostMessage(MDIChildren[I].Handle,Msg.Msg,Msg.wParam,Msg.lParam); end; |
dein Client:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| uses Defines,...; type MyClientForm = Class(TForm) ... public procedure WMSendeIrgentwas(var Msg:TMessage);Message wm_SendeIrgentwas;
procedure MyClientForm.WMSendeIrgentwas(var Msg:TMessage); begin end; |
Das ist das ganze Geheimniss.
Wenn der Parent nicht die Message an alle verteilen soll, so kannst du da immer noch IF() Schleifen uä. einbauen.
z.b.
if MDIChildren[i] is TAdressWindow then....
grez
msch
FloFri - Di 12.08.03 20:09
und wie kann ich ein child eine msg an das hauptprog schicken lassen, ohne die hauptunit in die childunit einzubauen?
MSCH - Mi 13.08.03 18:18
schau was ich geschrieben habe. Die Einzige Unit welche Beide verwenden ist "defines", dort wo die Messages definiert werden.
grez
msch
FloFri - Mo 29.09.03 09:34
Sorry, das ich dieses alte Thema nochmal hochhole, aber ich habe da ein Problem:
Konnte das mit den Messages jetzt mal testen, stehe aber vor folgendem Problem: Wie komme ich an den HWND vom Parent? Bei parent.handle bekomme ich einen Fehler.
Ich hoffe mir kann da jemand Helfen.
MfG
FloFri
MSCH - Mo 29.09.03 11:01
übergeb das Handle des Parent an die Childs via create und speicher es dort im private Bereich ab.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| type TChildForm= TForm private ParentHandle:Hwnd; public constructor Create(AOwner:TComponent;AHandle:Hwnd);reintroduce; end;
constructor TChildForm.Create; begin inherited Create(Aowner); ParentHandle:= AHandle; end;
... PostMessage(ParentHAndle,....) ... |
grez
msch
FloFri - Mo 29.09.03 11:32
Das geht leider auch nicht, da die Childs ja erst zur laufzeit eingebunden werden und das Parent daher zur erstellzeit nicht weis, das der constructor abgeändert wurde.
MSCH - Mo 29.09.03 17:24
:?: :?: :?: hä?
natürlich weiss die Parent über seine MDI-Childs bescheid. Du bindest doch die Unit (TMDIChilds) ein. Wie rufst du denn sonst die MDI-Childs auf?
grez
msch
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!