AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Zyklusproblem ( Circular reference ) [solved]
Thema durchsuchen
Ansicht
Themen-Optionen

Zyklusproblem ( Circular reference ) [solved]

Ein Thema von DGS · begonnen am 22. Apr 2007 · letzter Beitrag vom 24. Apr 2007
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#11

Re: Zyklusproblem ( Circular reference )

  Alt 23. Apr 2007, 17:54
Hallo,

ich würd das eher so machen, dass entweder du der INI-Unit deine TForm-Instanz übergibt und die macht dann was damit. Viel besser wärs aber - imo - dass die form auf die ini-unit zugreift, die ini/settings-klasse erstellt und sich dann selbst manipuliert.

Ich weiß nicht, warum das bis jetzt noch niemand erwähnt hat, aber wenn zwei Units aufeinander zugreifen müssen, hast du meistens irgendwo einen Designfehler bzw. "unsauberes" Design.
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
DGS

Registriert seit: 10. Jul 2004
65 Beiträge
 
Delphi 6 Enterprise
 
#12

Re: Zyklusproblem ( Circular reference )

  Alt 23. Apr 2007, 18:00
Hi!

Zitat von DGL-luke:
Viel besser wärs aber - imo - dass die form auf die ini-unit zugreift, die ini/settings-klasse erstellt und sich dann selbst manipuliert.
Aber dadurch würe die INI-Unit Sinnlos.
Wenn man tIniFiles einbindet, kommt man mit einer Funktion pro Lesevorgang aus.
Also kann man dann gleich alles in der HauptUnit behalten. Das führt aber dazu, dass die HauptUnit ( die, mit der Form) sehr stark anwächst.

Dass Zyklen ein Anzeichen für Designfehler ist, hab ich gelesen. Deshalb bin ich auch nach der Suche einer guten Alternative, um den Code effektiv auf mehrere Units aufzuteilen, besonders um die HauptUnit zu entlasten und halt gleichzeitig die Zyklen zu vermeiden. Hab gehofft, dass beides geht. Scheint mir aber eher so, dass man ohne kompromiss nicht weiterkommt.

trotzdem Danke für die Hilfe
Vorschläge für sinnvolle Signatur bitter per PN
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#13

Re: Zyklusproblem ( Circular reference )

  Alt 23. Apr 2007, 18:05
dann halt so:

Delphi-Quellcode:
procedure LoadCommonFormSettings(Form: TForm; Filename: string);
begin
...
end;
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
DGS

Registriert seit: 10. Jul 2004
65 Beiträge
 
Delphi 6 Enterprise
 
#14

Re: Zyklusproblem ( Circular reference )

  Alt 23. Apr 2007, 18:14
Also entweder übergebe ich dabei einen record von anderen Komponenten ( zB Checkobox, Labels ) oder ich lande wieder beim Zyklus.


Unit1 braucht die HelpUnit bei den Uses, um die Funktion aufzurufen.

Hier hat man die Wahl, ob man die Form1 sozusagen kopiert, und die Objekte auf der Form1 einzeln übergibt, oder sich entscheidet es sauberer zu gestallten und die Form1 übergibt. Ich hätte Form1 bevorzugt, weil so weniger redundante Angaben kommen. Aufwand wäre höher, um da eine neue Komponente zu ergänzen.
Vorschläge für sinnvolle Signatur bitter per PN
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#15

Re: Zyklusproblem ( Circular reference )

  Alt 23. Apr 2007, 18:19
Wenn du Funktionen aufrufst, dann brauchst du die unit nur in der implementation, da man Funktionen nur in der implementation aufrufen kannst.
Units brauchst du nur im interface-Teil in der uses, wenn du im Interface in einer anderen Unit deklarierte Typen verwendest. Für Funktionen nicht.
Es würde die Beantwortung deiner Fragen erheblich vereinfachen, wenn du dich etwas deutlicher ausdrücken würdest.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
DGS

Registriert seit: 10. Jul 2004
65 Beiträge
 
Delphi 6 Enterprise
 
#16

Re: Zyklusproblem ( Circular reference )

  Alt 23. Apr 2007, 18:40
Also eigentlich hab ich da weitestgehend keine Fragen. Dein letzter Hinweis (@Apollonius) hat mich eigentlich schon auf die gewünschte Lösung gebracht.

Mir geht es jetzt darum, ob ein "Zyklus", der durch implementation entschärft wurde, als unschönes Design zählt. Oder spricht man vom Designfehler, wenn der Zyklus rein auf der Interface Ebene stattfindet?

und wegen dem vorherigem Beitrag:
In der LoadCommonFormSettings(Form: TForm; Filename: string) müsste ich ein (Form as tForm1) machen müssen. Dann brauch ich unter uses (implementation) die Unit1.
Oder ich übergebe da alle Komponenten, die verändert werden können. Dann hätte ich aber viele Parameter und wäre dadurch fehleranfällig.


So, ich füg mal beim Titel ein [solved] hinzu.
gelöst als:

Delphi-Quellcode:
unit SubUnit;

interface

type
  tMyHelp = class
  private

  public
    constructor Create;
    procedure Einlesen(ini : TIniFile);
  end;

implementation

uses
  Unit1;

constructor tMyHelp.Create(image : tMyImage);
begin
  inherited Create;
end;

procedure tMyHelp.Einlesen(ini : TIniFiles);
begin
  Form1.checkbox1.checked := ini.readBool('A','B', true);
  // Form1 ist Variable in Unit1. Die wird durch uses "importiert"
end;
Das reicht mir jedenfalls erstmal und ich komm wieder gut weiter
Hatte das mit der Variable "Form1" vergessen gehabt.
Vorschläge für sinnvolle Signatur bitter per PN
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#17

Re: Zyklusproblem ( Circular reference )

  Alt 23. Apr 2007, 20:42
Zitat von DGS:
Und glaub, ich weis jetzt, was du meintest. In der Unit1. wird ja eine globale Variable Form1 deklariert.
*auf Kopf klatsch*
Dann reicht ja Unit1 in implementation aus und greif auf diese Variable zu.
Darf ich nochmal nachschlagen, damit's wenigstens bischen weh tut

Hast du nicht in deinem ersten Beitrag was von OO Programmierung geschrieben
Dann solltest du aber wissen, dass man nicht unbedingt auf Instanzen direkt zugreifen soll. Was, wenn du plötzlich 2 Forms vom Typ TForm1 offen hast. Zugegeben, das ist in dem Beispiel eher unwahrscheinlich. Aber TForm1 könnte ja auch eine andere Klasse sein, von der du unterschiedliche Instanzen erzeugst.
In Unit2 (bzw. in TForm2 oder was auch immer) willst du auf Eigenschaften und Methoden von TForm1 zugreifen. Also übergib gefälligst eine Instanz von TForm1 im Konstruktor von TForm2.
Ich hoff, du verstehst was ich schreibe.

Und um deinem zirkulärem Problem aus dem Weg zu gehen, deklariere den constructor von TForm2 so:

Delphi-Quellcode:
unit SubUnit;

interface

uses
  forms;

type
  tHelp = class
  private
    fvater : tForm;
  public
    constructor Create(vater : TForm)
  end;

implementation
uses unit1 ;

constructor tHelp.Create(vater : TForm);
begin
  assert ( vater is TForm, 'Parameter Vater con tHel.Create muss vom Type TForm1 sein.') ;
  inherited Create;

  fVater := vater;

  // irgendwas mit fVater machen
  with fVater as TForm1 do begin
  // ...
  end ;
end;

end.
  Mit Zitat antworten Zitat
DGS

Registriert seit: 10. Jul 2004
65 Beiträge
 
Delphi 6 Enterprise
 
#18

Re: Zyklusproblem ( Circular reference )

  Alt 23. Apr 2007, 20:51
Zitat von Jelly:
Darf ich nochmal nachschlagen, damit's wenigstens bischen weh tut
Ja, bitte

Hab jetzt den Code angeschaut und ... ja, so würde das auch funktionieren. Mir wird da nur etwas unwohl, wenn ich ständig (vater as tForm1) benutzen muss.

Aber es ist das, was ich von anfang an eigentlich erreichen wollte: Einen echten Verweis auf meine aufrufende Form1.

Wenn man aber den vater nicht im interface sondern in implementation abspeichert, kann man es auch als tForm1 abspeichern, richtig?

Zitat von Jelly:
Hast du nicht in deinem ersten Beitrag was von OO Programmierung geschrieben
Vorher war das Programm streng prozedural aufgebaut. Keine Objekte.
Die neue Version hat dadurch nen >positive unendlichkeit< grösseren OO Anteil.
Auch wird nie vollstänige OOP angewandt. Einzig Gewichtung wird geändert.
Vorschläge für sinnvolle Signatur bitter per PN
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#19

Re: Zyklusproblem ( Circular reference )

  Alt 23. Apr 2007, 22:19
Zitat von DGS:
Wenn man aber den vater nicht im interface sondern in implementation abspeichert, kann man es auch als tForm1 abspeichern, richtig?
Möööp. Dann liegt die Variable aber nicht mehr in deiner THelp Klasse, und du kannst somit keine 2 THelp Instanzen erzeugen. Folglich gehört vater in die Klassendefinition rein.
  Mit Zitat antworten Zitat
DGS

Registriert seit: 10. Jul 2004
65 Beiträge
 
Delphi 6 Enterprise
 
#20

Re: Zyklusproblem ( Circular reference ) [solved]

  Alt 24. Apr 2007, 16:06
stimmt.

Bin halt noch ned so gut Vertraut mit dem Thema OOProgrammierung.
Aber: Jeder muss mal klein anfangen

Die Frage ist, ob man von anfang an es lieber "richtig" macht, oder ob man sich auf ein Kompromiss einlässt und sich auf das beschränkt, was nötig ist. In meinem Fall brauch ich zB der Form1 nur eine einzige Instanz. Demnach würde mir die Variable Form1 aus der Unit1 vollkommen ausreichen.

Werde mir jedenfalls dein Beispiel noch abspeichern und für später aufheben
Vorschläge für sinnvolle Signatur bitter per PN
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 18:57 Uhr.
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