AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Forward in Klassen funktioniert nicht

Forward in Klassen funktioniert nicht

Ein Thema von ATS3788 · begonnen am 18. Dez 2014 · letzter Beitrag vom 20. Dez 2014
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von ATS3788
ATS3788

Registriert seit: 18. Mär 2004
Ort: Kriftel
646 Beiträge
 
Delphi XE Starter
 
#1

Forward in Klassen funktioniert nicht

  Alt 18. Dez 2014, 06:59
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.
Martin MIchael
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#2

AW: Forward in Klassen funktioniert nicht

  Alt 18. Dez 2014, 08:02
Welche Meldung kommt?
Das Feld 't' wird nicht verwendet (dem Wert wird nur etwas zugewiesen), vielleicht meckert dein Delphi darüber...
  Mit Zitat antworten Zitat
bcvs

Registriert seit: 16. Jun 2011
722 Beiträge
 
Delphi 12 Athens
 
#3

AW: Forward in Klassen funktioniert nicht

  Alt 18. Dez 2014, 08:04
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.
  Mit Zitat antworten Zitat
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.305 Beiträge
 
Delphi 12 Athens
 
#4

AW: Forward in Klassen funktioniert nicht

  Alt 18. Dez 2014, 09:49
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.
Gerd
Kölner Delphi Usergroup: http://wiki.delphitreff.de
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.656 Beiträge
 
Delphi 12 Athens
 
#5

AW: Forward in Klassen funktioniert nicht

  Alt 18. Dez 2014, 10:15
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
BadenPower

Registriert seit: 17. Jun 2009
616 Beiträge
 
#6

AW: Forward in Klassen funktioniert nicht

  Alt 18. Dez 2014, 10:44
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.


Class-Forwarding heisst ja nur, "Hallo mich gibt es".
Programmieren ist die Kunst aus Nullen und Einsen etwas sinnvollen zu gestalten.
Der bessere Künstler ist allerdings der Anwender, denn dieser findet Fehler, welche sich der Programmierer nicht vorstellen konnte.

Geändert von BadenPower (18. Dez 2014 um 10:48 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.656 Beiträge
 
Delphi 12 Athens
 
#7

AW: Forward in Klassen funktioniert nicht

  Alt 18. Dez 2014, 11:12
Nur weil im letzten Jahrtausend etwas in der VCL gemacht wurde, heißt das ja noch nicht, dass das auch gut ist.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Forward in Klassen funktioniert nicht

  Alt 18. Dez 2014, 12:54
t : TForm1; // Warum ist die variable ungültig !
Welche Meldung kommt?
Wenn es meistens egal ist, was das für eine Form ist, dann kann man für Variable und Setter natürlich auch einfach TForm verweden.

Man könnte natürlich auch die Form als Owner übergeben und dann über den Owner auf die Form casten.


Ansonsten enthalte ich mich erstmal allen Spekulationen und warte auf die Antwort zur Frage.
Was heißt "ungültig"?
Und gibt es noch weitere Fehlermeldungen? (vonwegen Folgefehler usw.)
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von ATS3788
ATS3788

Registriert seit: 18. Mär 2004
Ort: Kriftel
646 Beiträge
 
Delphi XE Starter
 
#9

AW: Forward in Klassen funktioniert nicht

  Alt 18. Dez 2014, 13:41
Huch so viele schon

Delphi-Quellcode:

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;
Also wenn // t := nil;
dann kann ich das Object mit Value an f1 übergeben
nur t in private deklariert das geht gar nicht dann gibt es eine EAccessViolation Schutzverletzung.
Ob das elegant ist, ist erst mal egal.
Es geht ja auch darum mal was anderes zu probieren und zu lernen.
Ich habe die Komponente comport411f
eine tolle Freeware Komponente wo das funktioniert und ich verstehe nicht warum
das hier nicht funktioniert.
Martin MIchael
  Mit Zitat antworten Zitat
bcvs

Registriert seit: 16. Jun 2011
722 Beiträge
 
Delphi 12 Athens
 
#10

AW: Forward in Klassen funktioniert nicht

  Alt 18. Dez 2014, 14:53
Hast du meinen Hinweis von #3 mal ausprobiert?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 02:13 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz