Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Objekt-Instanz durchreichen (https://www.delphipraxis.net/92616-objekt-instanz-durchreichen.html)

Luckie 23. Mai 2007 11:38


Objekt-Instanz durchreichen
 
Situation: Zwei Formulare, Hauptformular und Unterformular, und eine Klasse K in einer Unit.

Im Hauptformular wird eine Instanz K der Klasse TK aus der Unit erzeugt und verwendet. Diese Instanz der Klasse soll jetzt auch im Unterformular benutzt werden. Das Anzeigen des Unterformulares soll allerdings von der Klasse TK geregelt werden. Das heißt, im Hauptformular wird die Methode K.Show(???) aufgerufen, die dann das Unterformular aufruft, in dem dann das Objekt K mit seinen Daten usw. zur Verfügung steht.

Im Moment stehe ich etwas auf dem Schlauch, wie man das regeln könnte. Meine bisherigen Versuche:
Code im Unterformular:
Delphi-Quellcode:
var
  FotoBook: TFotoBook;

class procedure TfrmPreview.Show(fb: TFotoBook);
begin
  FotoBook := fb;
  with TfrmPreview.Create(nil) do
  begin
    ShowModal;
  end;
end;

procedure TfrmPreview.FormCreate(Sender: TObject);
begin
  FotoBook.PageParent := frmPreview;
  FotoBook.Display(0); // AV!!!
end;
Code in der Klasse:
Delphi-Quellcode:
procedure TFotoBook.ShowPreview(FotoBook: TFotoBook);
begin
  TfrmPreview.Show(FotoBook);
end;
Code im Hauptformular:
Delphi-Quellcode:
procedure TfrmMain.Button3Click(Sender: TObject);
begin
  FotoBook.ShowPreview(FotoBook);
end;
Ich bekomme aber an markierter Stelle im Code eine AV. Hinweis: Die Unit mit der Klasse heißt Fotobook.pas.

chaosben 23. Mai 2007 12:31

Re: Objekt-Instanz durchreichen
 
Ich würde den Constructor des Formulars selber schreiben und da das Objekt K übergeben.

Delphi-Quellcode:
procedure TK.Show();
begin
  with TUnterForm.Create(Self) do
    ShowModal;
end;

Luckie 23. Mai 2007 13:07

Re: Objekt-Instanz durchreichen
 
Hm, da sist es auch nicht. Wen ich das so mache:
Delphi-Quellcode:
procedure TfrmMain.Button3Click(Sender: TObject);
begin
  FotoBook.ShowPreview(FotoBook);
end;
Delphi-Quellcode:
procedure TFotoBook.ShowPreview(FotoBook: TFotoBook);
begin
  with TfrmPreview.Create(nil, FotoBook) do
    ShowModal;
end;
Delphi-Quellcode:
constructor TfrmPreview.Create(AOwner: TComponent; FotoBook: TFotoBook);
begin
  inherited Create(AOwner);
  FFotoBook := FotoBook;
end;

procedure TfrmPreview.FormShow(Sender: TObject);
begin
  FFotoBook.PageParent := frmPreview;
  FFotoBook.Display(0);
end;
Dann kommt bei FFotoBook nur eine leere Klasse an. Die Klasse TFotoBook ihrerseits wiederum beimhaltet auch wieder Objekte und die sind alle nil. Irgendwie bekomme ich das Objekt nicht durchgereicht.

WoTo 23. Mai 2007 13:19

Re: Objekt-Instanz durchreichen
 
Hallo Luckie,
vielleicht mußt du das Objekt FotoBook als Referenz übergeben:

Delphi-Quellcode:
procedure TfrmMain.Button3Click(Sender: TObject);
begin
  FotoBook.ShowPreview(FotoBook);
end;
Delphi-Quellcode:
procedure TFotoBook.ShowPreview(var FotoBook: TFotoBook);
begin
  with TfrmPreview.Create(nil, FotoBook) do
    ShowModal;
end;
Delphi-Quellcode:
constructor TfrmPreview.Create(AOwner: TComponent; var FotoBook: TFotoBook);
begin
  inherited Create(AOwner);
  FFotoBook := FotoBook;
end;

procedure TfrmPreview.FormShow(Sender: TObject);
begin
  FFotoBook.PageParent := frmPreview;
  FFotoBook.Display(0);
end;
Gruß
Woto

Luckie 23. Mai 2007 13:23

Re: Objekt-Instanz durchreichen
 
Objekte werden doch automatisch als Referenz übnergeben. Nichst destotrotz habe ich es mal ausprobiert: Hilft nicht. :(

Die Klasse TFotoBook ist übrigens abgeleitet von TObject. Müsste ich sie in meinem Fall von TPersistent ableiten?

chaosben 23. Mai 2007 13:36

Re: Objekt-Instanz durchreichen
 
nein ... nicht
Delphi-Quellcode:
TfrmPreview.Create(nil, FotoBook)
sondern
Delphi-Quellcode:
TfrmPreview.Create(nil, Self)
denn wer verspricht mir denn das die Variable FotoBook Assigned ist? :)

Wenn dann noch nil ankommt, geb ich bei den nächsten Delphitagen ein Runde. :)

Luckie 23. Mai 2007 13:47

Re: Objekt-Instanz durchreichen
 
Aber ich habe doch eine Instanz dieser Klasse im Hauptformular erzeugt und dort damit gearbeitet, mit Daten gefüllt. Und diese Instanz brauche ich jetzt mit den Daten in einem Unterformular, wobei das Erzeugen und Anzeigen die Klasse / Objekt selber übernehmen soll. Wen ich dort jetzt Self angebe, ist das dann die im Hauptformular erzeugte Instanz?

Eventuell liegt mein Fehler auch wo anders:
Delphi-Quellcode:
procedure TfrmPreview.FormShow(Sender: TObject);
begin
  ShowMessage(FFotoBook.PageParent.Name);
  FFotoBook.PageParent := frmPreview;
  FFotoBook.Display(0);
end;
frmPreview ist im OnShow, laut Debugger, noch nil. Warum das?

Die ShowMessage gibt mir den richtigen Namen des vorherigen PageParents aus, da scheint also alles anzukommen.

Hmpf, im OnPaint ist es auch noch nil. :wall:

Neutral General 23. Mai 2007 14:06

Re: Objekt-Instanz durchreichen
 
Hi,

Also entweder steht ihr alle aufm Schlauch oder ich kapier nix...
TFotobook ist doch ne Klassse oder nicht?

Dann is das kein Wunder das es ne AV gibt wenn es nie ein FotoBook := TFotoBook.Create(..) gab oder? o.O
Es wird Fotobook ja auch sonst keine Instanz zugewiesen...

:gruebel:

Gruß
Neutral General

Luckie 23. Mai 2007 14:09

Re: Objekt-Instanz durchreichen
 
Es muss nicht frmPreview, sondern Self heissen bei der Parent-Zuweisung. :roll:

Geht alles wunderbar, wie gewünscht. :firejump:

chaosben 24. Mai 2007 07:07

Re: Objekt-Instanz durchreichen
 
Zitat:

Zitat von Luckie
Es muss nicht frmPreview, sondern Self heissen

:thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:05 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