![]() |
Klassen in Delphi
Liste der Anhänge anzeigen (Anzahl: 2)
Klassen in Delphi
Thema: Einführung in die objektorientierte Programmierung mit Delphi Datum: 2007-12-02 Das Tutorial wurde - im Zuge der Vereinheitlichung der Layouts meiner PDF-Dokumente - noch mal neu mit Latex geschrieben. Inhaltlich hat sich nichts geändert. Das Layout ist jetzt doppelseitig und kann so schön ausgedruckt und gebunden werden (falls das jemand machen sollte ;) ). Das Tutorial liegt als PDF vor und kann hier: ![]() 2007-12-02: Kapitel "Sichtbarkeiten" ünberarbeitet. Anhang mit Interans zum Konstruktor, Destruktor und Methodenzeigern von Andreas Hausladen. |
Re: Klassen in Delphi
Sieht gut aus(auch wenn ich noch nicht bei klassen bin), ausführlich geschrieben. Gut gemacht Luckie :thuimb: .
Ich wollte einen (in meinen augen) kleinen (schreib)-fehler bemerken Zitat:
|
Re: Klassen in Delphi
Hallo Luckie,
vielen Dank für das Tutorial. Das Beispiel auf Seite 10 kann ich nicht nachvollziehen
Delphi-Quellcode:
Hier wird nicht TRectangle.Draw sondern TFigure.Draw aufgerufen. Wenn Figure vom Type TFigure ist und als TFigure instanziert wird kann trotz Typcast nur TFigure.Draw aufgerufen werden.
...
Figure := TFigure.Create; try TRectangle(Figure).Draw('TFigure.Create / TRectangle(Figure).Draw'); // Ruft TRectangle.Draw auf finally FreeAndNil(Figure); end; ... Wenn Figure vom Type TFigure ist und als TRectangle instanziert wird sieht die Sache schon ganz anders aus.
Delphi-Quellcode:
var
Figure : TFigure; begin Figure:=TRectangle.Create; Try Figure.Draw('TFigure.Create / TRectangle(Figure).Draw'); Finally Figure.Free; end; end; |
Re: Klassen in Delphi
Delphi-Quellcode:
Kuck es dir im Demo an. Setz einen Breakpunkt auf Figure := TFigure.Create und gehe mit F7 durch und kuck welche Methode er aufruft. Bei mir springt er in die Draw Methode von TRectangle. ;) Ist ja auch logisch, sonst wäre der Cast ja Blödsinn.
Figure := TFigure.Create;
try TRectangle(Figure).Draw('TFigure.Create / TRectangle(Figure).Draw'); // Ruft TRectangle.Draw auf finally FreeAndNil(Figure); end; |
Re: Klassen in Delphi
Zitat:
...:cat:... |
Re: Klassen in Delphi
Zitat:
|
Re: Klassen in Delphi
Zitat:
Delphi-Quellcode:
und nicht
Figure := TRectangle.Create;
Delphi-Quellcode:
...:cat:...
Figure := TFigure.Create;
|
Re: Klassen in Delphi
Hallo Luckie,
ich habe nicht gesehen, dass es um statische Methoden geht. Wenn die Methoden virtual / override sind funktioniert Dein Beispiel nicht so wie beschrieben. Warum es mit statischen Methode funktioniert weiss ich nicht. Eigentlich müsste der Compiler das ablehnen. Du erzeugst eine Instanz von TFigure und sagst dem Compiler über den Cast es handelt sich um eine Instanz von TRectangle. Es handelt sich hier mehr um ein Gefühl. D.h. ich würde mich sehr unwohl bei so einer Sache fühlen. Deshalb habe ich sowas wahrscheinlich auch noch nicht gemacht (so rein intuitiv). Ich versuche es mal mit einem Beispiel:
Delphi-Quellcode:
Wobei ich das Gefühl habe, dass Dein TRectangle(Figure).Draw hier im Beispiel dem aFrm:=aObj entspricht.
var
aObj : TObject; aFrm : TForm; ... aObj:=aFrm; // Ok kein Problem aFrm:=aObj; // Compiler meckert zu recht |
Re: Klassen in Delphi
Zitat:
Ist aObj kein TForm-Nachfahre, meckert er erst wenn du versuchst eine Methode aufzurufen! |
Re: Klassen in Delphi
Nein, ich hatte mich vertan, Das war etwas unübersichtlich in dem Beispiel in dem Buch. Ich habe es schon korrigiert, auch das Demo.
|
Re: Klassen in Delphi
Liste der Anhänge anzeigen (Anzahl: 1)
Also ich habe auch ein wenig gelernt. Fakt ist aber, das nicht TRectangle.Draw aufgerufen wird, wenn das Objekt mit TFigure.Create aufgerufen wurde, sondern TFigure.Draw ;-) Ich hätte im schlimmsten Fall eine AV erwartet :mrgreen:
Anbei ein kleines Beispiel, das den obigen Umstand näher betrachtet. ...:cat:... |
Re: Klassen in Delphi
Hallo,
das hat mein Weltbild zerstört.
Delphi-Quellcode:
Das ist nicht zu fassen obwohl Show keine Methode von TFigure ist, wird durch den Cast TRectangle.Show aufgerufen.
type
TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; type TFigure = class(TObject) procedure Draw(Caption: string); end; TRectangle = class(TFigure) procedure Draw(Caption: string); procedure Show(Caption : String); end; var Form1: TForm1; implementation {$R *.dfm} procedure TFigure.Draw(Caption: string); begin Messagebox(0, 'Draw Methode von TFigure', @Caption[1], 0); end; procedure TRectangle.Draw(Caption: string); begin Messagebox(0, 'Draw Methode von TRectangle', @Caption[1], 0); end; procedure TForm1.Button1Click(Sender: TObject); var Figure: TFigure; Rectangle: TRectangle; aObj : TObject; begin ... Figure := TFigure.Create; try TRectangle(Figure).Show('TFigure.Create / TRectangle(Figure).Draw'); // Show nicht in TFigure trotzdem wird aber TRectangle.Show aufgerufen. finally FreeAndNil(Figure); end; ... end; procedure TRectangle.Show(Caption: String); begin Messagebox(0, 'Show Methode von TRectangle', @Caption[1], 0); end; end. Hat jemand dafür eine Erklärung ? |
Re: Klassen in Delphi
Die Delphi-Hilfe sagt zu statischen Methoden:
Zitat:
|
Re: Klassen in Delphi
Eine Klasse besteht soviel ich weis aus einer
Methoden-Tabelle (glaub VMT genannt) und den Daten auch als Instanze bezeichnet. Beides ist getrennt. wird nun TRectangle.Show aufgerufen geschieht das so
Delphi-Quellcode:
Die Instanze wird als erster Hidden-Parameter übergeben.
TRectangle.Show(Figure, 'TFigure.Create / TRectangle(Figure).Draw');
EDIT: Hättest du in Show auf einen Member von TRectangle zugegriffen wäre es erst zu einer AV gekommen. Member von TFigure wären ohne Probleme möglich gewesen. |
Re: Klassen in Delphi
Zitat:
|
Re: Klassen in Delphi
![]() |
Re: Klassen in Delphi
Zitat:
![]() |
Re: Klassen in Delphi
Link korregiert. Aber das wäre auch etwas freundlicher gegangen. :roll:
|
Re: Klassen in Delphi
Delphi-Quellcode:
Ich habe das Tut nicht gelesen, gebe aber Sakura absolut Recht. Dieses Beispiel ist ein absolutes Negativbeispiel wie man es auf garkeinen Fall machen sollte. Es könnte aber als Eingangs-Beispiel für die Vermeidung von harten TypCast bei Klassen dienen. Denn so wie nachfolgend wäre der TypCast OOP konform richtiger gewesen:
procedure TForm1.Button1Click(Sender: TObject);
... TRectangle(Figure).Show('TFigure.Create / TRectangle(Figure).Draw'); ...
Delphi-Quellcode:
Dieser Typcast würde dann eine Exception zu Laufzeit erzeugen, das TFigure NICHT von TRectangle abgeleitet wurde, und somit auf diesen offensichtlichen Programmierfehler hinweisen.(Figure as TRectangle).Show; Gruß Hagen |
Re: Klassen in Delphi
So, ihr habt mich überzeugt ;), in der neuen Version ist es verbessert. Link siehe erstes Posting.
|
Re: Klassen in Delphi
Zitat:
Und die Exception gibts in dem Fall hoffentlich nur wenn es sich um statische Bindung handelt, bei dynamischer bzw. virtueller Bindung erwart ich mir, dass ich da keine bekomme... Und wie wärs mit...
Delphi-Quellcode:
Da würdest schon zur Compiletime merken, wenn TRectangle nicht von TFigure abgeleitet ist.
if (Figure is TRectangle) then
TRectangle(Figure).Show; |
Re: Klassen in Delphi
Zitat:
Der "is" Operator im Zusammenhang mit der IF THEN Abfrage ist keine Typüberprüfung die zur Compiletime durch den Compiler durchgeführt wird. Die "is" und "as" Operatoren sind ausschließlich Laufzeitüberprüfungen. Gruß Hagen |
Re: Klassen in Delphi
Zitat:
:grübel: Laut Hilfe in Delphi... Zitat:
|
Re: Klassen in Delphi
Zitat:
dynamische Typprüfung, also keine statische zur Compiletime. aktuellen Laufzeittyp eines Objekts, da steht es doch Laufzeit Wenn es so wäre wie du es meinst so müsste: 1.) die if then Abfrage ja sinnloser Code sein 2.) der Compiler beim kompilieren des Programmes schon einen Fehler bringen, tut er das ? Gruß Hagen |
Re: Klassen in Delphi
Zitat:
Da steht geschrieben, dass der Compiler dies tut, da denke ich schon irgendwie, dass es eben nicht (nur) zur Laufzeit passiert. Der "If then" Konstrukt macht schon Sinn, er prüft ja nicht nur zur CompileZeit (ganz grobe Fälle ab) sondern auch zur Laufzeit. |
Re: Klassen in Delphi
Es gibt eine neue Version des PDF dieses Tutorials. Dank OpenOffice 2.0 jetzt mit Lesezeichen für die Kapitel. Alles weiter im ersten Posting:
![]() |
Re: Klassen in Delphi
[quote="GuenterS"]
Zitat:
Delphi-Quellcode:
if Firgure is TStringList then // hier meckert der Compiler weil TStringList nicht in der gesamten Vererbungshierarchie von TFigure vorkommt.
|
Re: Klassen in Delphi
Wenns auch nur ein marginaler Fehler ist, aber diese Warnung hast du wohl abgetippt und dabei das "O" von TObject kleingeschrieben:
Zitat:
Zitat:
Zitat:
|
Re: Klassen in Delphi
Danke für die Hinweise. Wenn es ein Update gibt, werde ich das (hoffentlich) berücksichtigen. Jetzt lasse ich es erstmal so.
|
Re: Klassen in Delphi
Das PDF wurde neu erzeugt. Die Seitenzahlen im Inhaltsverzeichnis sind jetzt Links und die Kapitel im Adobe Acrobate Reader werden als Bookmarks angezeigt.
Downmloadlink im ersten Beitrag. |
Re: Klassen in Delphi
schon in 1_1 hab ich mein erstes Problem:
Delphi-Quellcode:
TTemperature wird nur hier aufgerufen, aber nirgends deklariert...
procedure TForm1.btnFahrenheitClick(Sender: TObject);
var Temp: TTemperatur; begin Temp := TTemperatur.create(StrToFloat(edtTemp.Text)); try stcErgebniss.Caption := FloatToStrF(Temp.Fahrenheit, ffNumber, 8, 2); finally FreeAndNil(Temp); end; end; nun wird aber Temp.Fahrenheit aufgerufen, nur wie ist das möglich? ist TTemperatur womöglich doch irgendwo definiert, und ich seh es nicht? |
Re: Klassen in Delphi
Zeile 45 und 46:
Delphi-Quellcode:
die TTemp.pas liegt im Demoverzeichnis ;)
uses
TTemp; |
Re: Klassen in Delphi
Liste der Anhänge anzeigen (Anzahl: 1)
danke jetzt seh ichs
übrigens hat der Fehlerteufel wieder zugeschlagen: |
Re: Klassen in Delphi
Das Tutorial wurde - im Zuge der Vereinheitlichung des Layout meiner PDF-Dokumente - noch mal neu mit Latex geschrieben. Inhaltlich hat sich nichts geändert. Das Layout ist jetzt doppelseitig und kann so schön ausgedruckt und gebunden werden (falls das jemand machen sollte ;) ).
Link im ersten Posting. |
Re: Klassen in Delphi
Feines Tutorial, gut gemacht, gefällt mir ! Grüße // Martin
|
Re: Klassen in Delphi
Danke dir. :P
|
Re: Klassen in Delphi
Sieht das Security Programming Tutorial dann auch so aus?
|
Re: Klassen in Delphi
Wenn es dann irgendwann mal fertig sein sollte, ja.
|
Re: Klassen in Delphi
Zu großes Thema oder?
|
Re: Klassen in Delphi
Zu wenig Zeit. ;) Aber das gehört nicht hier her.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:18 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-2025 by Thomas Breitkreuz