Kommunikation zw. Forms
-
- 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
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
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!
-
- 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
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
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
-
- 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
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!
- 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
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).
Re: Kommunikation zw. Forms
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.
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.
-
- 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
Danke euch beiden.
Ich werde schauen was davon für mich das passende ist.
LG
Chris
Ich werde schauen was davon für mich das passende ist.
LG
Chris
Früher war alles besser. Und aus Holz!
-
- 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
Spät aber doch:
Habe es mit einer CallBackprocedure gelöst.
Funktioniert 1A.
Danke noch einmal
Christian
Habe es mit einer CallBackprocedure gelöst.
Funktioniert 1A.
Danke noch einmal
Christian
Früher war alles besser. Und aus Holz!
-
- 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
Hi, kannst Du uns anhand eines Mini-Programms zeigen, wie Deine Lösung mit der CallBackProcedure aussieht?
-
- 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
Klar.
LG
Chris Edit: Wenn ich die Zuweisung der Callbackroutine in Form1.CreateForm mache kommt eine Access violation.
Deshalb der Umweg über Idle.
LG
Chris 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!
- 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
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.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.
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).
- 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
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?
Edit: Zur Sicherheit noch der Hinweis: In der lpr ist das Erzeugen der zusätzlichen Forms zu unterbinden,.
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?
Edit: Zur Sicherheit noch der Hinweis: In der lpr ist das Erzeugen der zusätzlichen Forms zu unterbinden,.
Wissen ist das einzige Gut, das sich vermehrt, wenn es geteilt wird ...