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

Delphi-Quelltext
1:
childform1.variable                    

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
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Frm_Haupt: TFrm_Haupt;


implementation

uses Frageform; //Bindet die Unit Frageform ans Hauptformular

{$R *.dfm}

...

//Erstellen des MDI-Child Frageform zur laufzeit
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
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Frm_Frage: TFrm_Frage;

implementation

uses Hauptform; //Bindet die Unit Hauptform ans Frageformular

{$R *.dfm}

...

procedure TFrm_Frage.btn_YesClick(Sender: TObject);
begin
  Frm_Haupt.txt_Search.Text := 'Hallo';  //Übergibt den Text 'Hallo' an das Edit txt_Search im Hauptformular
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


Delphi-Quelltext
1:
uses Hauptform;                    


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;
  // und so weiter
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);
// verteilt die Message an alle Clients
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
  // tue irgentwas
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