Delphi-PRAXiS
Seite 1 von 5  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Forward in Klassen funktioniert nicht (https://www.delphipraxis.net/183178-forward-klassen-funktioniert-nicht.html)

ATS3788 18. Dez 2014 05:59

Forward in Klassen funktioniert nicht
 
Hallo ich mache da wohl einen Denkfehler und komme nicht drauf
Delphi-Quellcode:
type
  // Define the classes in this Unit at the very start for clarity
  TForm1 = Class;         // This is a forward class definition


  TFruit = Class(TObject) // This is an actual class definition :
    // Internal class field definitions - only accessible in this unit
     private
       t       : TForm1; // Warum ist die variable ungültig !
       isRound : Boolean;
       length  : single;
       width   : single;
       diameter : single;
    // Fields and methods only accessible by this class and descendants
    procedure SetForm(const Value : TForm1);
     protected
    // Externally accessible fields and methods
     public

      // 2 constructors - one for round fruit, the other long fruit
       constructor Create(diameter : single);              overload;
       constructor Create(length : single; width : single); overload;
    // Externally accessible and inspectable fields and methods
     published
      // Note that properties must use different names to local defs
       property round : Boolean
         read  isRound;
       property len  : single
         read  length;
       property wide : single
         read  width;
       property diam : single
         read  diameter;
  end;                   // End of the TFruit class definition

  // The actual TForm1 class is now defined
   TForm1 = Class(TForm)
    Button1: TButton;
    Button2: TButton;
     procedure FormCreate(Sender: TObject);
     procedure ShowFruit(fruit : TFruit);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
   private
    // No local data
    f : TFruit;
   public
    // Uses just the TForm ancestor class public definitions
   end;

 var
   Form1: TForm1;

 implementation

 {$R *.dfm}

// Create a round fruit object
 constructor TFruit.Create(diameter: single);
 begin
  // Indicate that we have a round fruit, and set its size
   isRound      := true;
   self.diameter := diameter;
 end;

// Create a long fruit object
 constructor TFruit.Create(length, width: single);
 begin
  // Indicate that we have a long fruit, and set its size
   isRound    := false;
   self.length := length;
   self.width := width;
 end;


 procedure TFruit.SetForm(const Value : TForm1);
 var
 f1 : TForm1;
 begin
   t := nil; // Nicht mal das geht
   f1 := Value; // Das würde gehen
   t := Value; // und das ist der Grund für den Eintrag
 end;


// Form object - action taken when the form is created
 procedure TForm1.Button1Click(Sender: TObject);
begin
FormCreate(Sender);
end;

procedure TForm1.Button2Click(Sender: TObject);
 var
 Fruit : TFruit;
begin
 Fruit := TFruit.Create(23);

  ShowFruit(Fruit);
end;

procedure TForm1.FormCreate(Sender: TObject);
 var
   apple, banana : TFruit;
 begin
 f.SetForm(self);

  // Let us create our fruit objects
   apple := TFruit.Create(3.5);
   banana := TFruit.Create(7.0, 1.75);

  // Show details about our fruits
   ShowFruit(apple);
   ShowFruit(banana);
 end;

// Show what the characteristics of our fruit are
 procedure TForm1.ShowFruit(fruit: TFruit);
 begin
   if fruit.round
   then ShowMessage('We have a round fruit, with diam = '+
                    FloatToStr(fruit.diam))
   else
   begin
     ShowMessage('We have a long fruit');
     ShowMessage('   it has length = '+FloatToStr(fruit.len));
     ShowMessage('   it has width = '+FloatToStr(fruit.wide));
   end;
 end;

 end.
http://www.delphibasics.co.uk/RTL.asp?Name=Class
Ich habe das Beispiel ein wenig abgeändert
Meine Frage wie kann ich dem Object TFruit
mitteilen das TForm1 Object mitteilen.

Dejan Vu 18. Dez 2014 07:02

AW: Forward in Klassen funktioniert nicht
 
Welche Meldung kommt?
Das Feld 't' wird nicht verwendet (dem Wert wird nur etwas zugewiesen), vielleicht meckert dein Delphi darüber...

bcvs 18. Dez 2014 07:04

AW: Forward in Klassen funktioniert nicht
 
Dein Ansatz ist schon richtig, Du musst nur das Object f erst erzeugen, bevor du darauf zugreifst:

Delphi-Quellcode:
f:=TFruit.Create(0);
f.SetForm(self);
Und du musst dafür sorgen, dass f irgendwo wieder freigegeben wird, am Besten im OnDestroy.

bernau 18. Dez 2014 08:49

AW: Forward in Klassen funktioniert nicht
 
Warum muss TFruit eigendlich etwas von TForm1 wissen? Du greifst in TFruit in keiner Procedure auf TForm1 zu.

OK. Quellcode ggf. nicht komplett. Ich rate mal. Wenn du auf der Form irgend etwas von TFruit anzeigen möchtest, dann konnte die Form das selber übernehmen. Du brauchst nur ein TNotify-Event anlegen. Damit kann TFruit dem TForm1 mitteilen, daß was geändert wurde und Form1 zeichnet selber.

P.S.: Ich will nicht etwas gegen Forwarding sagen. Verwende ich selber sehr oft. Kommt aber auf die Situation an.

DeddyH 18. Dez 2014 09:15

AW: Forward in Klassen funktioniert nicht
 
Das sehe ich ähnlich. Für mich hat Klassenforwarding ein Geschmäckle, denn es wird meist dazu benutzt, Klassen untereinander bekannt zu machen. Das ist zwar nicht in jedem Fall immer einfach zu umgehen, elegant ist das IMO allerdings nicht.

BadenPower 18. Dez 2014 09:44

AW: Forward in Klassen funktioniert nicht
 
Zitat:

Zitat von DeddyH (Beitrag 1283849)
Für mich hat Klassenforwarding ein Geschmäckle, denn es wird meist dazu benutzt, Klassen untereinander bekannt zu machen.

Dann darfst Du aber nicht programmieren, denn die halbe VCL kann nur durch voherige Bekanntmachung weiterer Klassen funktionieren.:lol:


Class-Forwarding heisst ja nur, "Hallo mich gibt es".

DeddyH 18. Dez 2014 10:12

AW: Forward in Klassen funktioniert nicht
 
Nur weil im letzten Jahrtausend etwas in der VCL gemacht wurde, heißt das ja noch nicht, dass das auch gut ist.

BadenPower 18. Dez 2014 10:30

AW: Forward in Klassen funktioniert nicht
 
Zitat:

Zitat von DeddyH (Beitrag 1283866)
Nur weil im letzten Jahrtausend etwas in der VCL gemacht wurde, heißt das ja noch nicht, dass das auch gut ist.

Eine gute Lösung ist aber immer dann eine gute Lösung, wenn es keine andere Lösung gibt.

Oder wie würdest Du sonst Abhängigkeiten untereinander bekanntmachen?
Jetzt nicht speziell für Delphi, sondern auch gerne ganz allgemein.

DeddyH 18. Dez 2014 10:38

AW: Forward in Klassen funktioniert nicht
 
Zitat:

Zitat von BadenPower (Beitrag 1283874)
Abhängigkeiten untereinander

Genau das ist doch der Knackpunkt. Hier würde ich mich bereits fragen, ob das wirklich sein muss oder nicht doch auch anders geht.

BadenPower 18. Dez 2014 11:02

AW: Forward in Klassen funktioniert nicht
 
Zitat:

Zitat von DeddyH (Beitrag 1283879)
Zitat:

Zitat von BadenPower (Beitrag 1283874)
Abhängigkeiten untereinander

Genau das ist doch der Knackpunkt. Hier würde ich mich bereits fragen, ob das wirklich sein muss oder nicht doch auch anders geht.

Ja das muss sein.

Selbst das Leben besteht nur, weil es solche Abhänigkeiten kennt.

Da gibt es die Klassen "Sperma", "Eizelle" und "Mensch". Die Klasse "Mensch" sogar in den Unterklassen "Männlich" und "Weiblich".

"Mensch" muss entwerder "Sperma" oder "Eizelle" kennen. "Eizelle" muss "Sperma" kennen und umgekehrt, sonst wissen die gar nicht, dass sie zusammenfinden müssen. Haben sie sich gefunden, dann müssen sie aber wiederum die Klasse "Mensch" kennen, den sie zusammen daraus entwickeln wollen.

Ich will jetzt erst gar nicht auf die Proceduren der Unterklassen "Männlich" und "Weiblich" eingehen, welche es "Sperma" und "Eizelle" ermöglichen sich zu treffen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:02 Uhr.
Seite 1 von 5  1 23     Letzte »    

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