Autor Beitrag
FloFri
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 97



BeitragVerfasst: Mo 11.08.03 18:09 
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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: 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
ausblenden Delphi-Quelltext
1:
childform1.variable					

darauf zugreifen
MSCH
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 97



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 66

MS Win 7 Pro, WinXP Pro
D3 Pro, TurboDelhi, Kylix 3 Pro
BeitragVerfasst: 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:

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

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



BeitragVerfasst: Di 12.08.03 06:13 
Danke für deine Hilfe, jedoch kann ich

ausblenden Delphi-Quelltext
1:
uses Hauptform;					


nicht benutzen, da die Child-Windows als Packages eingebunden werden und daher das Hauptformular zur erstellzeit nicht kennen.
MSCH
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: Di 12.08.03 17:59 
ich versuchs mal mit Messages:

also erstes eine uses, in der nur die Message-IDs deklariert werden:

ausblenden 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

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

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



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 97



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: Mo 29.09.03 11:01 
übergeb das Handle des Parent an die Childs via create und speicher es dort im private Bereich ab.

ausblenden 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

_________________
ist das politisch, wenn ich linksdrehenden Joghurt haben möchte?
FloFri Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 97



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: 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

_________________
ist das politisch, wenn ich linksdrehenden Joghurt haben möchte?