Kommunikation zw. Forms

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
AlterMann
Beiträge: 238
Registriert: So 13. Dez 2009, 09:43
OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
CPU-Target: x86 64Bit
Wohnort: Niederösterreich

Kommunikation zw. Forms

Beitrag von AlterMann »

Guten Abend

Ich Zeige des öfteren Daten in einer Form (z.B. als Label in einer ScrollBox) an, und wenn man z.B. auf die Produktnummer in der Form klickt, wird das Produkt im Hauptfenster geöffnet.

Dazu binde ich die Hauptform im uses (implementation) ein und verwende

LabelXXX.OnClick :=@Form1.OpenProdukt;

Nun habe ich aber einige Forms, die ich in verschiedenen Programmen verwende.
Wenn ich da Form1 einbinde komme ich in Teufels Küche.

Wie löst ihr so etwas elegant?
Woran denke ich gerade nicht?

LG
Chris
Früher war alles besser. Und aus Holz!

djdhg
Beiträge: 18
Registriert: Mo 8. Apr 2013, 17:12
OS, Lazarus, FPC: Win11, Debian 12.5, Lazarus: 2.2.6, FPC: 3.2.2
CPU-Target: 64Bit

Re: Kommunikation zw. Forms

Beitrag von djdhg »

Hallo Chris.

Wie wäre es damit, den Namen der Form zu ändern?
Im Object Inspector unter dem Eintrag "Name".

Oder verstehe ich dich nicht richtig?

Lg

AlterMann
Beiträge: 238
Registriert: So 13. Dez 2009, 09:43
OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
CPU-Target: x86 64Bit
Wohnort: Niederösterreich

Re: Kommunikation zw. Forms

Beitrag von AlterMann »

djdhg hat geschrieben: Di 30. Jul 2024, 20:06
Oder verstehe ich dich nicht richtig?
Ich fürchte.
Ich habe die Hauptform (Form1) im Programm Machdiesu.pas
Und die Form AnzeigeForm in anzeigeformu.pas

Wenn ich jetzt in anzeigeformu.pas die unit Machdiesu.pas im Implementatinsteil einbinde kann ich auf Funktionen von Form1 zugreifen.

Wenn ich aber (irgendwann) ein Programm Machjenes.pas schreibe und anzeigeformu.pas auch dafür verwenden will, fangen die Probleme an ...
Früher war alles besser. Und aus Holz!

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6564
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Kommunikation zw. Forms

Beitrag von af0815 »

ich arbeite immer mit callbacks zum Elternform und das kann die Message dann an das richtige Form (oder bei mir auch Frame) weitergeben. Dadurch erreiche ich eine Kapselung und vemeide Abhãngigkeiten der Forms (oder Frames).
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

ArchChem
Beiträge: 103
Registriert: Mo 11. Jul 2022, 10:41

Re: Kommunikation zw. Forms

Beitrag von ArchChem »

Hallo,

ich löse das tatsächlich mit Interfaces. Ich erstelle ein Interface, was genau die Funktionen beschreibt, die auf der Empfängerseite notwendig sind. Dann wird die Empfängerform davon vererbt und implementiert die Funktionen entsprechend.

Die Senderform enthält zur Kompilierzeit nur eine zusätzliche Variabel vom Typ TInterface. Zur Laufzeit wird dann vor dem ersten Show die Empfängerform der entsprechenden Interface-Variable zugewiesen.

AlterMann
Beiträge: 238
Registriert: So 13. Dez 2009, 09:43
OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
CPU-Target: x86 64Bit
Wohnort: Niederösterreich

Re: Kommunikation zw. Forms

Beitrag von AlterMann »

Danke euch beiden.
Ich werde schauen was davon für mich das passende ist.

LG
Chris
Früher war alles besser. Und aus Holz!

AlterMann
Beiträge: 238
Registriert: So 13. Dez 2009, 09:43
OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
CPU-Target: x86 64Bit
Wohnort: Niederösterreich

Re: Kommunikation zw. Forms

Beitrag von AlterMann »

Spät aber doch:

Habe es mit einer CallBackprocedure gelöst.
Funktioniert 1A.

Danke noch einmal
Christian
Früher war alles besser. Und aus Holz!

kirchfritz
Beiträge: 214
Registriert: Mo 3. Jan 2011, 13:34
OS, Lazarus, FPC: Win11 (L 3.0 FPC 3.2.2)
CPU-Target: 64Bit
Wohnort: Nürnberg

Re: Kommunikation zw. Forms

Beitrag von kirchfritz »

Hi, kannst Du uns anhand eines Mini-Programms zeigen, wie Deine Lösung mit der CallBackProcedure aussieht?

AlterMann
Beiträge: 238
Registriert: So 13. Dez 2009, 09:43
OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
CPU-Target: x86 64Bit
Wohnort: Niederösterreich

Re: Kommunikation zw. Forms

Beitrag von AlterMann »

Klar.
LG
Chris
CallBack.zip
(139.58 KiB) 112-mal heruntergeladen
Edit: Wenn ich die Zuweisung der Callbackroutine in Form1.CreateForm mache kommt eine Access violation.
Deshalb der Umweg über Idle.
Früher war alles besser. Und aus Holz!

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6564
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Kommunikation zw. Forms

Beitrag von af0815 »

AlterMann hat geschrieben: Fr 29. Nov 2024, 15:08 Edit: Wenn ich die Zuweisung der Callbackroutine in Form1.CreateForm mache kommt eine Access violation.
Deshalb der Umweg über Idle.
Wenn du den Callback in FormCreate zuweist, ist das zweite Formular noch nicht initialisiert, weiler erst NACH dem Createn des Form1 in der Projektedatei erstellt wird. Deswegen musst du den Weg über Idle nehmen.

Vorschlag: Du erzeugst die Form2 selbst und hast damit genau Kontrolle über alles. Dazu aber das automatische erstellen vom Form2 bitte zu deaktivieren. Geht auch wunderbar mit Frames etc.

Code: Alles auswählen

unit callback1;

{$mode objfpc}{$H+}

interface

uses
 Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, callback2;

type

 { TForm1 }

 TForm1 = class(TForm)
  Button1: TButton;
  Label1: TLabel;
  procedure FormCreate(Sender: TObject);
  procedure FormDestroy(Sender: TObject);
  procedure LabelAendern(s:string);
  procedure Button1Click(Sender: TObject);
 private
  Form2: TForm2;
 public

 end;

var
 Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin
  Form2:= TForm2.create(nil);
  Form2.CallBack:=@LabelAendern;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  Form2.CallBack:= nil;
  FreeAndNil(Form2);
end;

procedure TForm1.LabelAendern(s:string);
begin
  Label1.Caption:=s;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Form2.ShowModal;
end;

end.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
Niesi
Lazarusforum e. V.
Beiträge: 518
Registriert: So 26. Jun 2016, 19:44
OS, Lazarus, FPC: Linux Mint Cinnamon, Laz 3.7 Fpc 3.2.3 und Laz 3.0 Fpc

Re: Kommunikation zw. Forms

Beitrag von Niesi »

Das ist tatsächlich sehr interessant. Ich bevorzuge auch den Vorschlag von Andreas, die weiteren Forms selbst zu erzeugen.

Weiß wer, wo ich dazu mehr Informationen finde? Das Wiki ist da etwas "dürftig", und auch hier

https://www.freepascal.org/daily/doc/ref/refse17.html

ist das nicht so richtig für Beginners zu diesem Thema gemacht.

Hier mal ein kleines Beispiel von mir, falls Beginnende das mal ausprobieren wollen - mit zwei Forms, die zum MainForm senden können.

Die Sender müssen nicht modal sein.

Interessant ist auch das Verhalten des SecondForm: Habe ich hinter dem Text keinen Zeilenumbruch, dann wird der Text gesendet. Mit einem Zeilenumbruch wird der Text ebenfalls gesendet, bei zwei Zeilenümbrüchen dann eine Leerzeile. Ist das ein Effekt davon, dass ich immer nur die letzte Zeile senden lasse?


Auswahl_001.png
Auswahl_001.png (47.75 KiB) 802 mal betrachtet
FormCommunication-01.7z
(183.94 KiB) 95-mal heruntergeladen

Edit: Zur Sicherheit noch der Hinweis: In der lpr ist das Erzeugen der zusätzlichen Forms zu unterbinden,.


Auswahl_002.png
Auswahl_002.png (52.88 KiB) 798 mal betrachtet
Wissen ist das einzige Gut, das sich vermehrt, wenn es geteilt wird ...

Antworten