AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

2 Formulare verbinden geht nicht :(

Ein Thema von blubber443 · begonnen am 20. Mär 2013 · letzter Beitrag vom 21. Mär 2013
Antwort Antwort
Perlsau
(Gast)

n/a Beiträge
 
#1

AW: 2 Formulare verbinden geht nicht :(

  Alt 20. Mär 2013, 21:29
Moin, ich hab 2 Formulare in meinem Projekt mein hauptformular (form1 in unit1) und das 2. (form2 in unit2)
wenn ich von form1 auf form2 zugreife geht das
wenn ich jedoch danach von form2 auf form1 zugreifen will geht das nicht[]
Du kannst auch eine dritte Unit (ohne Form, z.B. UnitFormZugriff) erstellen, die Zugriff auf beide Form-Units hat. Diese dritte Unit bindest du dann in beiden Form-Units in den Uses-Abschnitt unterhalb des Implementation-Abschnitts ein. Ebenso bindest du in der UnitFormZugriff die beiden Form-Units in den Uses-Abschnitt unterhalb des Implementation-Abschnitts ein.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.216 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: 2 Formulare verbinden geht nicht :(

  Alt 21. Mär 2013, 07:17
Lustigerweise meldet zumindest mein XE2-Ent bei solchen Geschichten ein "Voller Arbeitsspeicher" bei [STRG]+[F9] und "zirkuläre Referenz" bei [F9] - Oder umgekehrt
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#3

AW: 2 Formulare verbinden geht nicht :(

  Alt 21. Mär 2013, 09:11
Lustigerweise meldet zumindest mein XE2-Ent bei solchen Geschichten ein "Voller Arbeitsspeicher" bei [STRG]+[F9] und "zirkuläre Referenz" bei [F9] - Oder umgekehrt
Diese Meldung erscheint nur, wenn du die Units in Interface-Uses einträgst. Du sollst sie aber unter Implementation eintragen:

Delphi-Quellcode:
{ ****************************************************************************************************************
  *** ZUGRIFF AUF UNITMAIN für EINSTELLUNGEN ETC.                                                              ***
  **************************************************************************************************************** }

unit Main_Zugriff;

INTERFACE

USES
  Vcl.Forms, System.Classes, System.SysUtils, JvRichEdit, JvDBRichEdit, Vcl.DbGrids;

TYPE
  TMain_Zugriff = CLASS

  PRIVATE

  PUBLIC
    Spalten_Filmtitel : Integer;

    CONSTRUCTOR Create();
    DESTRUCTOR Destroy; override;

    PROCEDURE Set_FormMain(Const Links, Oben, Breit, Hoch : Integer; Const Maximiert : Boolean);
    PROCEDURE Get_FormMain(Var Links, Oben, Breit, Hoch : Integer; Var Maximiert : Boolean);
    PROCEDURE StatusBarAktuell;
    PROCEDURE LaenderEinlesen;
    PROCEDURE LaenderAnzeigen;
    PROCEDURE Set_Spalte_FilmTitel(Const Spalte,Breite : Integer);
    FUNCTION Get_Spalte_FilmTitel(Const Spalte : Integer) : Integer;

  END;

IMPLEMENTATION

USES
    UnitMain, UnitData; // Hier eintragen

{+-+- PUBLIC METHODEN -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-}

{ ****************************************************************************************************************
  *** CREATE                                                                                                  ***
  **************************************************************************************************************** }

constructor TMain_Zugriff.Create;
begin
     Spalten_Filmtitel := FormMain.DBGrid_Filmtitel.Columns.Count;
end;

{ ****************************************************************************************************************
  *** DESTROY                                                                                                  ***
  **************************************************************************************************************** }

destructor TMain_Zugriff.Destroy;
begin

  inherited;
end;

...
Ich habe hier eine Klasse entwickelt, die Zugriff auf Komponenten der Klasse TFormMain (Hauptformular) ermöglicht, und zwar von jeder anderen Unit oder Form aus, die diese Klasse referenziert. Da gab's noch nie irgend einen Fehler, den ich nicht selbst verbockt hatte. Du kannst auch zwei Forms direkt verbinden, indem du den Unit-Namen der einen Form unter Implementation (nicht unter Interface!) in die Uses-Klausel einträgst. Ich hab z.B. manchmal im Hauptformular das Datenmodul referenziert und im Datenmodul das Hauptformular, immer jedoch unterhalb von Implementation. Das ist ganz wichtig!
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.667 Beiträge
 
Delphi 12 Athens
 
#4

AW: 2 Formulare verbinden geht nicht :(

  Alt 21. Mär 2013, 09:17
Eigentlich sollte man es aber vermeiden, dass 2 Klassen sich gegenseitig kennen müssen. Dasselbe gilt für Fomulare (sind ja schließlich auch nur Klassen). Wenn ein Formular eine Schnittstelle (etwa in Form einer Property) anbietet, kann ein anderes darüber auf das Formular zugreifen und ggf. vice versa. Dafür ist es dann aber nicht mehr notwendig, dass das Fomular mit der Schnittstelle das andere kennt.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#5

AW: 2 Formulare verbinden geht nicht :(

  Alt 21. Mär 2013, 09:29
Eigentlich sollte man es aber vermeiden, dass 2 Klassen sich gegenseitig kennen müssen. Dasselbe gilt für Fomulare (sind ja schließlich auch nur Klassen). Wenn ein Formular eine Schnittstelle (etwa in Form einer Property) anbietet, kann ein anderes darüber auf das Formular zugreifen und ggf. vice versa. Dafür ist es dann aber nicht mehr notwendig, dass das Fomular mit der Schnittstelle das andere kennt.
Richtig. Doch im einen Fall benötigte ich gewisse Manipulationen der Properties nicht vom Mainform aus, sondern auch von anderen Forms bzw. Units. Bestes Beispiel, das mir gerade einfällt: Im AfterScroll-Ereignis etlicher Datasets, die im Datenmodul liegen, sollen bestimmte Anzeigen auf dem Mainform aktualisiert werden, so z.B. die aktuelle Record-Nummer oder eine ComboBox. Ich hatte z.B. eine Zeit lang das Problem, daß ich in DBLookUpCombos keine korrekte Darstellung von Strings, die in der Firebird-DB als UFT8 codiert waren, erreichen konnte. Das lag an den veralteten Datenbank-Komponenten. Da mußte ich auf ComboBoxen ausweichen, und deren ItemIndex mußte nach jedem Scroll der Haupttabelle aktualisiert werden. Wie sollte ich das sonst lösen als durch einen Eintrag von UnitMain in das Implementation-Uses von UnitData (Datenmodul)? Schwierigkeiten hat das zumindest gar keine gemacht, um nicht zu sagen, es hat wunderbar funktioniert.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.667 Beiträge
 
Delphi 12 Athens
 
#6

AW: 2 Formulare verbinden geht nicht :(

  Alt 21. Mär 2013, 09:40
Das könnte man z.B. über das Observer-Pattern lösen, indem sich die Comboboxen als Observer des Datasets registrieren, dabei kommt dann eine Art "Data-Binding für Arme" heraus. Ist ein wenig aufwändiger, aber letzten Endes sauberer.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
mentaltec

Registriert seit: 28. Sep 2012
60 Beiträge
 
#7

AW: 2 Formulare verbinden geht nicht :(

  Alt 21. Mär 2013, 09:43
Hi,

meistens schick ich dem MainForm (Notify)-Messages, wenn so was gebraucht wird; die entsprechenden Datenstrukturen sollten eh nicht im MAinform deklariert werden

oder aber man übergibt dem Subform die Adresse einer Callbackfkt - das iss aber auch nur was für Puristen

mfg
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.667 Beiträge
 
Delphi 12 Athens
 
#8

AW: 2 Formulare verbinden geht nicht :(

  Alt 21. Mär 2013, 09:45
Statt Messages könnte man auch Events verwenden.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:55 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz