AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Klasse soll Setup Form bekommen --> überkreuzende Bezüge
Thema durchsuchen
Ansicht
Themen-Optionen

Klasse soll Setup Form bekommen --> überkreuzende Bezüge

Ein Thema von changlee · begonnen am 31. Okt 2009 · letzter Beitrag vom 1. Nov 2009
Antwort Antwort
Seite 1 von 2  1 2      
changlee
(Gast)

n/a Beiträge
 
#1

Klasse soll Setup Form bekommen --> überkreuzende Bezüge

  Alt 31. Okt 2009, 21:13
Hallo,

ich habe eine Klasse, zu der ich ein Setup Form erstellen möchte.
Das Setup Form soll in eine eigene Unit, damit es die Klassenunit nicht zu unübersichtlich macht.

Das ganze soll etwa so aussehen:

Delphi-Quellcode:

uses SetupForm;


TMyRecord = record
  a,b,c: string;
  list = array of string;
end;

TMyList = array of TMyRecord;

TMyClass = class(TObject)
  fVar1 : bolean;
  fVar2 : integer;
  fList : TMyList;
  fSetupForm: TSetupForm;
  private
    constructor Create;
    destruktor Destroy; override;
    // weitere Methoden und Eigenschaften...
  public
    procedure Setup;
    // weitere Methoden und Eigenschaften...
end;

implementation

procedure TMyClass.Setup;
begin
  fSetupForm := TSetupForm.Create;
  fSetupForm.Show;
end;
Dem Setup-Form würde ich gern eine Kopie der aufrufenden TMyClass Instanz mitgeben, damit dort alle Änderungen eingetragen werden können. Wenn dann das Setup Form mit OK geschlossen wird, möchte ich die Daten aus der Kopie übernehmen, ansonsten verwerfen.
Das Problem ist nur, dass ich keine Kopie mitgeben kann. Denn sowie ich im Public Bereich (oder sonst wo) des Formulars ein entsprechendes Feld einfüge, muss die TMyClass Unit in die uses Liste der Setup-Unit aufgenommen werden. Dann bekomme ich jedoch einen Fehler wegen überkreuzender Unit-Bezüge.
Es ginge höchstens mit einem uses im Implementation Teil der Setup Unit. Dann müsste ich mit einer globalen Instanzkopie arbeiten, was ich unbedingt vermeiden möchte.

Habe hier im Forum auch schon gelesen, dass man in solch einem Fall besser mit Eventhandlern arbeiten sollte. Das Setup Fromular sollte die Datenstruktur also gar nicht kennen. Wenn ich das mache, blase ich die Klassenunit aber so stark auf, dass ich letztendlich doch alles in eine Unit hätte packen können.

Kann mir jemand einen Tip geben, wie ich mein PRoblem lösen kann?

Viele Grüße,
Stefan.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#2

Re: Klasse soll Setup Form bekommen --> überkreuzende Bez

  Alt 31. Okt 2009, 21:38
tja, dann bleiben dir nur 2 Möglichkeiten

- entweder sortierst du die Definitionen so um, daß bei einer Unit die Einbindung in den Implementationsteil kann

- oder du legst dir eine weitere Unit an, wo die Definitionen reinwandern und bindest diese überall ein,
dann kann ebenfalls bei einer Unit die Einbindung der Anderen in die Implementation rutschen.


Problem ist, daß im Interface deklarierte Units vor der "Aufrufenden" compiliert werden
und wenn sich beide Units dort gegenseitig aufrufen, dann soll jeweils die Andere vorher abgearbeitet werden, was ja wohl nicht geht (Einer muß der Erste sein).
$2B or not $2B
  Mit Zitat antworten Zitat
changlee
(Gast)

n/a Beiträge
 
#3

Re: Klasse soll Setup Form bekommen --> überkreuzende Bez

  Alt 31. Okt 2009, 23:08
Mir ist gerade noch eine andere Möglichkeit eingefallen. Möglicherweise eine nicht besonders saubere Lösung aber es funktioniert scheinbar. Den Typ Pointer kannte ich so eigentlich noch nicht. Habs einfach mal so hingeschrieben und compiliert. Der Compiler meldet keinen Fehler und erste Tests führen zu keinen Problemen.

Delphi-Quellcode:

TMyClass = class(TObject)
  fVar1 : bolean;
  fVar2 : integer;
  fList : TMyList;
  fSetupForm: Pointer; // TSetupForm; <--- duch den Typ Pointer kann muss die Setup Unit nicht mehr in der uses Liste stehen.
  private
    constructor Create;
    destruktor Destroy; override;
    // weitere Methoden und Eigenschaften...
  public
    procedure Setup;
    // weitere Methoden und Eigenschaften...
end;

implementation

uses SetupForm;

procedure TMyClass.Setup;
begin
  fSetupForm := TSetupForm.Create;
  TSetupForm(fSetupForm).Show;
end;

Ist gegen diese Vorgehensweise etwas einzuwenden?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#4

Re: Klasse soll Setup Form bekommen --> überkreuzende Bez

  Alt 31. Okt 2009, 23:25
Nimm statt Pointer dann eher TObject ... ist verständlicher und kommt auf's Selbe raus.
Selbst wenn man keinen Vorfahren angibt, nimmt Delphi automatisch TObjekt als Vorfahre ... da dieses Vorfahre aller Objekte/Klassen ist, kann man ihm auch alles zuweisen.


und Objekte sind halt Records mit Pointer drauf
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#5

Re: Klasse soll Setup Form bekommen --> überkreuzende Bez

  Alt 31. Okt 2009, 23:26
Warum nicht so:
Delphi-Quellcode:
procedure TMyClass.Setup;
var f:TSetupForm;
begin
  f := TSetupForm.Create(nil);
  try
    f.MyObject := self;
    f.ShowModal;
  finally
    f.Free;
  end;
end;
ShowModal scheint mir für einen Setup-Dialog das Richtige zu sein.
Damit braucht man auch die Referenz auf das Formular nicht dauerhaft im Objekt speichern.
fork me on Github
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#6

Re: Klasse soll Setup Form bekommen --> überkreuzende Bez

  Alt 31. Okt 2009, 23:28
Interfaces lösen das Problem der Kreuzbezüge (Crossreference), wobei hier u.U. auch Design Flaw vorliegt.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#7

Re: Klasse soll Setup Form bekommen --> überkreuzende Bez

  Alt 31. Okt 2009, 23:29
man kann auch ganz böse sein
Delphi-Quellcode:
procedure TMyClass.Setup;
begin
  with TSetupForm.Create(self) do
    try
      MyObject := self;
      ShowModal;
    finally
      Free;
    end;
end;
$2B or not $2B
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#8

Re: Klasse soll Setup Form bekommen --> überkreuzende Bez

  Alt 31. Okt 2009, 23:37
Zitat von himitsu:
man kann auch ganz böse sein
Einsperren.
Sofort.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
changlee
(Gast)

n/a Beiträge
 
#9

Re: Klasse soll Setup Form bekommen --> überkreuzende Bez

  Alt 31. Okt 2009, 23:55
Zitat von himitsu:
Nimm statt Pointer dann eher TObject ... ist verständlicher und kommt auf's Selbe raus.
Ok, habe ich jetzt gemacht. Funktioniert auch immer noch genause.





Zitat von sx2008:
ShowModal scheint mir für einen Setup-Dialog das Richtige zu sein.
Damit braucht man auch die Referenz auf das Formular nicht dauerhaft im Objekt speichern.
Ja, im Prinzip sieht das so erstmal besser aus (so hatte ich es auch anfangs gemacht).
Das löst zwar mein hier beschriebenes Problem, ich möchte den Setup Dialog aber nicht modal anzeigen lassen.
Für den Benutzer wäre es weniger komfortabel.

@alzaimir: Interfaces kenne ich noch nicht. Ich werd mal nachsehen, was es damit auf sich hat.


Ich verstehe aber nicht, was an himitsus code "böse" sein soll.... (ist doch alles ok so, oder übersehe ich was?)
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#10

Re: Klasse soll Setup Form bekommen --> überkreuzende Bez

  Alt 1. Nov 2009, 07:54
[OT]
Zitat von changlee:
Ich verstehe aber nicht, was an himitsus code "böse" sein soll.... (ist doch alles ok so, oder übersehe ich was?)
Das 'With'-Schlüsselwort ist verpönt, auch wenn es Schreibarbeit spart.
Delphi-Quellcode:
procedure TMyClass.Setup;
begin
  with TSetupForm.Create(self) do
    try
      MyObject := self;
      ShowModal;
    finally
      Free;
    end;
end;
Hier stellen sich zwei Fragen;
1. Welches 'ShowModal' wird aufgerufen, das von 'TMyClass' (wenn des diese Methode hätte), oder die der anonymen Instanz von TSetupForm?
2. Welches 'Free' wird aufgerufen?

Das erschließt sich dem Betrachter nicht. Es ist zwar irgendwie klar, aber führt zu Mißverständnissen und schwer zu findenden Fehlern (wenn z.B. Deine TSetupForm gar keine Methode ,'ShowModal' hätte, z.B. weil die etwas anders heißt), dafür aber TMyClass.

Zugegeben, in diesem konkreten Beispiel ist der Code gar nicht böse, aber als Regel gilt: "'With' ist böse". Es spricht nichts dagegen, mit 'With' zu arbeiten, aber da muss man dann genau wissen, was man tut.
[/OT]
Aber der Thread hier dreht sich nicht um dieses, sondern um ein anderes Thema.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 07:43 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