Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi 2 Formulare verbinden geht nicht :( (https://www.delphipraxis.net/173851-2-formulare-verbinden-geht-nicht.html)

blubber443 20. Mär 2013 19:12

Delphi-Version: XE2

2 Formulare verbinden geht nicht :(
 
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
Delphi-Quellcode:
//Form 1

uses Unit2;

...

procedure sag_hallo();
begin
  Form2.Visible:=true;
  Form2.Label1.Caption:='Hallo';
end;
end.
wenn ich jedoch danach von form2 auf form1 zugreifen will geht das nicht
Delphi-Quellcode:
//Form 2

uses Unit1;

...

procedure sag_hallo();
begin
  Form1.Visible:=true;
  Form1.Label1.Caption:='Hallo';
end;
end.
als fehler kommt nicht genügend arbeitsspeicher, ich hatte den fehler schon öfters
und es kam IMMER wenn ich versuchte 2 formulare zu verknüpfen also mit dem
einem aufs jeweils andre zuzugreifen
mich intressiert ob man das irgendwie anders machen kann oder ob ich irgendwo noch was
schreiben muss

danke schonma im voraus :)

PS: das beispiel ist natürlich völliger schwachsinn
und dient nur zum verständnis des problems

SirTwist 20. Mär 2013 19:18

AW: 2 Formulare verbinden geht nicht :(
 
Hallo,

dein Beispiel hilft leider wenig, weil Du nichts dazu sagst, wann und durch was diese beiden Funktionen aufgerufen werden.

Zu wenig Arbeitsspeicher interpretiert meine Glaskugel als einen vollen Stack, ausgelöst durch eine nie endende Rekursion.

Grüße

blubber443 20. Mär 2013 19:22

AW: 2 Formulare verbinden geht nicht :(
 
ich hab schon verschiedenes ausprobiert und auch auf andre weisen versucht auf die jeweils andre form zuzugreifen, der fehler wird aber schon angezeigt sobald ich die unit1 bei form2 erst einbinde, das heißt selbst wenn ich nix von form1 will aber nur die unit einbinde geht es nicht

blubber443 20. Mär 2013 19:26

AW: 2 Formulare verbinden geht nicht :(
 
als fehler steht zirkuläre unit-referenz falls ihr damit was anfangen könnt

blubber443 20. Mär 2013 19:28

AW: 2 Formulare verbinden geht nicht :(
 
ach wartet da gibs was im forum, ich nehme mal an das thema ist geschlossen

Aviator 20. Mär 2013 20:07

AW: 2 Formulare verbinden geht nicht :(
 
Hi,

der Fehler zirkuläre Unit Referenz erscheint nur dann, wenn du bei Unit 2 die Unit 1 an der falschen Stelle einbindest.

So sollte es funktionieren:


Bei Unit 1:
Delphi-Quellcode:
unit Unit1;

interface

uses
  Unit2

implementation

end.

Bei Unit 2:

Delphi-Quellcode:
unit Unit2;

interface

uses
  Windows, ...

implementation

uses
  Unit1;

end.

Perlsau 20. Mär 2013 21:29

AW: 2 Formulare verbinden geht nicht :(
 
Zitat:

Zitat von blubber443 (Beitrag 1208123)
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.

Der schöne Günther 21. Mär 2013 07:17

AW: 2 Formulare verbinden geht nicht :(
 
Lustigerweise meldet zumindest mein XE2-Ent bei solchen Geschichten ein "Voller Arbeitsspeicher" bei [STRG]+[F9] und "zirkuläre Referenz" bei [F9] - Oder umgekehrt :)

Perlsau 21. Mär 2013 09:11

AW: 2 Formulare verbinden geht nicht :(
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1208145)
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!

DeddyH 21. Mär 2013 09:17

AW: 2 Formulare verbinden geht nicht :(
 
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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:16 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz