Autor Beitrag
opfer.der.genauigkeit
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 754
Erhaltene Danke: 1



BeitragVerfasst: Mi 21.12.05 13:17 
Hi,

in einer MDI-Applikation habe ich den Fall, dass der User unter bestimmten Bedingungen ein Feld bzw. den Text des Feldes von FormularA nach FormularB automatisch übertragen bekommt.
Der genaue Ablauf sähe wie folgt aus:

1. FormA wird geöffnet (MDI-Child).
2. FormB wird auch geöffnet (Kein MDI, immer im Vordergrund bis es geschloßen wird).
3. Benutzer klickt in FormA, in ein Editfeld. FormA hat somit den Focus.
4. In FormB soll sich ein Label mit dem Text aus FormA füllen.

Was ich suche ist eine geeignete Variante, da dieses "Feature" sich quer die Applikation ziehen kann (oh man..).

Ich hatte erst überlegt, ob ich das ganze Eventgesteuert mache und sozusagen über Vererbungshirachien ein entsprechendes OnClick-Event einbaue. Allerdings stößt das an seine Grenzen schon allein in dem Moment, da ich für ein Formular kein Event erhalte, wenn ein Button geklickt wird. Sonst hätte ich das Event in das MDI-Hauptformular eingebaut und einfach geschaut, welches Window sich grade am Cursor befindet.
Wenn ich ein Event einbauen könnte, welches von jeder Komponente separat aufgerufen werden würde wäre das fast optimal, allerdings bedarf das viel Arbeit wie ich vermute und außerdem befürchte ich, wäre das ein Overhead an Aufrufen.

a) Ein weiterer Ansatz wäre ein Mouse-Hook mit MouseProc.
b) Ein anderer wäre ein Thread, der per GetMessage und Einschränkung durch WM_LBUTTONDOWN
die Nachrichten abfängt.

Für beide Varianten gilt natürlich, dass sie nur laufen, sobald FormB aktiv ist.

Hat noch jemand Ideen für geschmeidigere Lösungen?

Danke für's lesen... und evtl. auch für die Hilfe. ;)

P.S.: Eine andere Variante wäre ja noch das ganze so zu steuern, dass FormA FormB bescheid gibt oder den Wert übermittelt. Allerdings wäre so'ne Lösung Käse (IMHO). Zudem besteht ja das Problem, dass sich dieses "Featuere" durch die ganze Applikation ziehen kann und dann müßte ich für jedes Modul die Übermittlung einbauen.

_________________
Stellen Sie sich bitte Zirkusmusik vor.
opfer.der.genauigkeit Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 754
Erhaltene Danke: 1



BeitragVerfasst: Mi 21.12.05 14:09 
Keine Ideen?
Dann werd ich wohl Variante a) und b) ausprobieren müssen um dann festzustellen, dass es ne schönere Lösung gibt. :nut:

_________________
Stellen Sie sich bitte Zirkusmusik vor.
Lannes
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: Mi 21.12.05 15:22 
Hallo,

könnte sein das Dir Screen.OnActiveControlChange weiterhilft.
Auch einen Buttonklick kannst Du dadurch Applikationsweit mitbekommen.

Ein einfaches Beispiel:
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:
//...
  public
  procedure MeldeActivControlForm(Sender: TObject);
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

uses Unit2;

{$R *.DFM}

procedure TForm1.MeldeActivControlForm(Sender: TObject);
begin
  Form1.Caption:= Screen.ActiveControl.Name+' auf '
                  +Screen.ActiveControl.Owner.Name;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
  Form2.Show;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Screen.OnActiveControlChange := MeldeActivControlForm;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  Screen.OnActiveControlChange := nil;
end;

_________________
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
Limster
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 72


Delphi 5 & 7 Enterprise
BeitragVerfasst: Mi 21.12.05 15:31 
Titel: So
Hi!

Wie wärs so:

Du machst einen "Manager" bei dem sich jedes Formular anmeldet, welche über texteingaben
informiert werden möchte..also einfach eine liste..
wobei du bei den FormCreates Liste.Add(self) und bei den FormDestroys Liste.Remove(self) aufrufst..

in einer Utils.Pas oder sonst wo unter Const "WM_EDITTEXTCHANGED = WM_USER + 1"; eintragen


und dann bei den Edit1 usw im OnChange:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
for i:= 0 to (Liste.Count - 1) do begin
  SendMessage(TForm(Liste.Items[i]).handle, WM_EDITTEXTCHANGED, Edit1.handle, 0)
  //oder Postmessage, dann wird nicht auf das empfangen der Nachrichten gewartet
  //jedoch kann das Edit1.Handle dann probleme machen, wenn es vl. dann nicht mehr exisitiert wenn die nachricht ankommt
end;


und in den Forms eben auf WM_EditTextChanged reagieren..
das handle auf die geänderte edit kriegst du ja mit.. und damit kannst du alles anstellen

so wäre das im schnellen erklärt der schönste weg.. also mit messages und managern

ich hoffe dir weitergeholfen zu haben..

grüsse,
Limbo

Moderiert von user profile iconraziel: Delphi-Tags hinzugefügt.
opfer.der.genauigkeit Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 754
Erhaltene Danke: 1



BeitragVerfasst: Mi 21.12.05 16:16 
Hi,

danke für die interessanten Antworten..

Die Idee mit Screen.OnActiveControlChange funktioniert auf Anhieb.
Danke.

Das mit dem Formularmanager gefällt mir nicht so gut, allerdings gefällt mir die Idee mit der eigenen Message gut.
Ebenfalls danke.

In der Zwischenzeit habe ich meine Varianten umgesetzt.
Hook: einmal MouseProc, einmal WindowProc (beide varianten gehen)
Thread: GetMessage...

Letzteres ist allerdings nicht wirklich praktikabel.

Ich laß mir das alles mal durch den Kopf gehen und werde die praktikabelste Lösung übernehmen. Thx erst mal.

_________________
Stellen Sie sich bitte Zirkusmusik vor.