| Autor |
Beitrag |
Gorthaur
      
Beiträge: 19
WinXP SP2
Delphi7
|
Verfasst: Mo 14.01.08 18:22
Moin!
Könnte mir hier vielleicht jemand erklären, wo der Unterschied zwischen einer dynamischen Instanz und einer normalen Instaz liegt?
Schonmal Vielen Dank!
|
|
Gorthaur 
      
Beiträge: 19
WinXP SP2
Delphi7
|
Verfasst: Di 15.01.08 16:42
|
|
Dunkel
      
Beiträge: 682
Mac OS X Snow Leopard
Xcode 3.1
|
Verfasst: Di 15.01.08 18:15
Öhm, wie bitte? Was ist eine dynamische Instanz? In welchem Zusammenhang hast Du denn das gehört/gelesen?
Du meinst aber nicht sowas:
Delphi-Quelltext 1:
| MeineObjekte: array of TMeinObjekt; |
oder?
_________________ Ich streite einsam mich mit dieser Oberflächenwelt
Gutes sei ein löblich Brot von dem ich zehre - bis zum Tod [Das Ich - Im Ich]
|
|
Gorthaur 
      
Beiträge: 19
WinXP SP2
Delphi7
|
Verfasst: Di 15.01.08 19:54
Keine Ahnung, ich bereite mich gerade auf eine Prüfung vor und habe da eine Aufgabe bei der ich Daten aus einem Textdokument einlesen und verarbeiten soll. Unter anderen steht in der Aufgabenstellung:
"Zum Einlesen der Textdatei verwenden sie eine dynamische Instanz von TStringList und laden die Datei mit der Methode LoadFromFile von StringList."
Wie aus meiner Fragestellung wahrscheinlich hervorgeht, bin ich noch nicht besonders versiert im Umgang mit Delphi; besonders den Klassenbegriff mit seinen Instanzen/Objekten hab ich noch nicht begriffen.
Daher bin ich für jede Hilfe Dankbar...
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Di 15.01.08 19:58
Hm, in dem Zusammenhang habe ich "dynamisch" noch nie gehört, gemeint ist wohl "zur Laufzeit":
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| var myList : TStringList; begin myList := TStringList.Create; try myList.LoadFromFile('e:\foo.txt'); finally myList.Free; end; end; |
Vielleicht hilft Dir ja mein Crashkurs zum Verständnis:
www.christian-stelzm...tierteprogrammierung (alte Version)
www.christian-stelzm...oaded/#_Toc180058871 (neue Version, noch nicht ganz fertig)
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Gorthaur 
      
Beiträge: 19
WinXP SP2
Delphi7
|
Verfasst: Di 15.01.08 21:09
Vielen Dank!
Das hat mir schon sehr geholfen!
Ich habe mit Hilfe deines Crashkurses eine Klasse erstellt und das Ganze funktioniert auch, allerdings sind mir die Begriffe noch immer nicht ganz Klar.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44:
| unit MyProgram;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, MyClasses;
type TForm1 = class(TForm) edHeight: TEdit; edWidth: TEdit; Label1: TLabel; Label2: TLabel; btArea: TButton; procedure btAreaClick(Sender: TObject); private public end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.btAreaClick(Sender: TObject); var myRect : TMyRectangle; begin myRect := TMyRectangle.Create;
myRect.Width := StrToInt(edWidth.Text); myRect.Height := StrToInt(edHeight.Text);
ShowMessage('Die Fläche beträgt: ' + FloatToStr(myRect.GetArea));
myRect.Free; end;
end. |
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| unit MyClasses;
interface type TMyRectangle = class public Width : Integer; Height: Integer; function GetArea : Single; end;
implementation
function TMyRectangle.GetArea: Single; begin result := Width * Height; end;
end. |
Also die Klasse ist : TMyRectangle soviel hab' ich begriffen.
Aber was genau sind nun in meinem kleinen Programm die Instanzen, Objekte, Methoden und Felder?
|
|
ub60
      
Beiträge: 765
Erhaltene Danke: 130
|
Verfasst: Di 15.01.08 21:37
Gorthaur hat folgendes geschrieben: |
Also die Klasse ist : TMyRectangle soviel hab' ich begriffen.
Aber was genau sind nun in meinem kleinen Programm die Instanzen, Objekte, Methoden und Felder? |
- myRect ist eine Objektvariable, die in der Variablendeklaration noch auf kein Objekt/ auf keinen Speicher zeigt.
- Nach Aufruf der Methode Create wird ein Objekt der Klasse erzeugt, man sagt auch Instanz dazu.
- Prozeduren und Funktionen einer Klasse heißen auch Methoden.
- Attribute werden im Englischen auch als Field-Variable bezeichnet. In Deinem Fall wären dies Width und Height.
Allerdings sollten Attribute nicht public sein. Schau mal nach bei Geheimnisprinzip oder Datenkapselung.
ub60
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Di 15.01.08 21:42
ub60 hat folgendes geschrieben: | | Allerdings sollten Attribute nicht public sein. Schau mal nach bei Geheimnisprinzip oder Datenkapselung. |
Das kommt im Crashkurs weiter unten, man will den Lernenden ja nicht auf einmal mit allem überschütten 
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Gorthaur 
      
Beiträge: 19
WinXP SP2
Delphi7
|
Verfasst: Di 15.01.08 21:59
ub60 hat folgendes geschrieben: |
- myRect ist eine Objektvariable, die in der Variablendeklaration noch auf kein Objekt/ auf keinen Speicher zeigt.
- Nach Aufruf der Methode Create wird ein Objekt der Klasse erzeugt, man sagt auch Instanz dazu.
- Prozeduren und Funktionen einer Klasse heißen auch Methoden.
- Attribute werden im Englischen auch als Field-Variable bezeichnet. In Deinem Fall wären dies Width und Height.
|
Also sind die Felder in meinem Programm Width und Height.
Die einzige Methode wäre dann die Funktion in der Unit MyClasses: 'TMyRectangle.GetArea: Single;'
Soweit richtig?
Aber was wären dann in meinem Programm die Instanzen bzw. Objekte?
|
|
Dunkel
      
Beiträge: 682
Mac OS X Snow Leopard
Xcode 3.1
|
Verfasst: Di 15.01.08 22:16
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| var myRect : TMyRectangle; begin myRect := TMyRectangle.Create;
end; |
_________________ Ich streite einsam mich mit dieser Oberflächenwelt
Gutes sei ein löblich Brot von dem ich zehre - bis zum Tod [Das Ich - Im Ich]
|
|
Gorthaur 
      
Beiträge: 19
WinXP SP2
Delphi7
|
Verfasst: Di 15.01.08 22:26
Entschuldigt wenn ich so doofe Fragen stelle aber ich muss das jetzt endlich richtig begreifen (und ich glaube ich stehe kurz davor)...
myRect ist also die Instanz und eine Objektvariable?
Also Instanz = Objektvariable?
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Di 15.01.08 22:43
Hmm.. Die Instanz ist das Objekt selbst, die 'Variable' speichert ja nur einen Verweis, wo im Speicher sich diese Instanz befindet.
Du bist eine Instanz der Klasse 'Mensch', der Zettel mit der Aufschrift 'Gorthaur sitzt auf dem Stuhl' ist die Objektvariable. Aber den Zettel kann ich säubern und neu beschreiben.
Eine Instanz ist eindeutig. Du bist nicht austauschbar. Instanzen und Objekte sind in etwa vergleichbar, wobei eine Instanz immer ein konkretes (ein bestimmtes) Objekt bezeichnet, während 'Objekt' (wie im 1.Teil des Satzes) allgemein irgendwelche Instanzen bezeichnet.
Nochmal: 'Mensch' ist die Klasse, Dein Freundeskreis sind Objekte, aber jedes einzelne Objekt ist eine Instanz.
_________________ Na denn, dann. Bis dann, denn.
|
|
Dunkel
      
Beiträge: 682
Mac OS X Snow Leopard
Xcode 3.1
|
Verfasst: Mi 16.01.08 00:56
Mal ein wenig klarer ausgedrückt (nichts gegen "Du bist eine Instanz von TMensch", aber mich verwirrt sowas eher als das es beim Verstehen hilft):
myRect ist ein typisierter Container in dem Du einen Zeiger auf eine Instanz eines Objekts/einer Klasse speichern kannst. Mit myRect := TMyRectangle.Create; erstellst Du dann eine Instanz des Objekts/der Klasse TMyRectangle, wobei der Container mit einem Zeiger auf das erstellte Objekt gefüllt wird. Mit myRect.Irgendwas; kannst Du dann auf die Klassen-Methoden und -Attribute des Objekts zugreifen.
Wenn Du (fälschlicher Weise) nochmal mit myRect := TMyRectangle.Create; eine neue Instanz des Objekts erstellst, wird einfach der Zeiger im Container myRect überschrieben, die vorherige Instanz befindet sich aber trotzdem noch im Speicher. Du hast aber keine Möglichkeit mehr auf die alte Instanz zuzugreifen. Das ist ein typischer Fall sich ganz fiese Speicherlöcher einzuhandeln, da Du keine Möglichkeit mehr hast das im Speicher befindliche Objekt mit myRect.Free;, oder besser FreeAndNil(myRect); wieder frei zu geben.
Warum FreeAndNil(myRect); besser ist als ein simples freigeben mit myRect.Free? Wie der Name der Procedure schon erahnen lässt, gibt FreeAndNil das Objekt nicht nur wieder frei, es setzt die Objektvariable auch auf NIL. Das erspart manchmal so manchen Ärger, da man sich so manch langwierige Fehlersuche und Debugging erspart.
Dummer Weise kann man manchmal, wenn der Speicherbereich des freigegebenen Objekts noch nicht anderweitig verwendet wurde, auch noch auf ein freigegebenes Objekt zugreifen. Dein Quelltext funktioniert dann wochenlang problemlos, dann änderst Du eine winzige Kleinigkeit, welche augenscheinlich nicht mit dem eigentlichen Problem in Verbindung gebracht wird, und es enstehen auf einmal "unerklärliche" AVs und sonstige kuriose Merkwürdigkeiten beim Zugreifen auf das schon freigegebene Objekt (oder schlimmer: bei Dir funktioniert die Echse problemlos, bei anderen Nutzern des Programms nicht). Mit einem NIL-Objekt-Zeiger kann sowas nicht passieren, dann zeigt Dir der Debugger (normalerweise) direkt die Fehlerhafte Zeile des Codes.
OOP ist am Anfang nicht leicht zu verstehen, keine Frage. Nichts desto trotz kommt die Erleuchtung mit dem Benutzen der Konstrukte, und mit dem Fragen , wenn man mal etwas nicht verstehen sollte. Also: fragen kostet nichts, und es gibt auch keine dummen Fragen!
_________________ Ich streite einsam mich mit dieser Oberflächenwelt
Gutes sei ein löblich Brot von dem ich zehre - bis zum Tod [Das Ich - Im Ich]
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Mi 16.01.08 09:19
Dunkel hat folgendes geschrieben: | | Mal ein wenig klarer ausgedrückt (nichts gegen "Du bist eine Instanz von TMensch", aber mich verwirrt sowas eher als das es beim Verstehen hilft) |
Ich verstehe Dinge eher, wenn ich sie in meinem gewohnten Umfeld anwenden kann.
FreeAndNil kann man auch sehr gut mit der Metapher 'Mensch' und Zettel erklären. Wir erinnern uns:
Gorthaur ist die Instanz und die Objektvariable der Zettel. Wenn Gorthaur nun nicht mehr benötigt wird  , dann wird er 'entfernt'  (Gut, er steht auf und geht weg). Dies entspricht dem 'Free(vGorthaur)'. Nun sollte man aber den Zettel auch säubern, damit eben nicht mehr draufsteht ' Gorthaur sitzt auf dem Stuhl', weil er ja das gerade nicht mehr tut.
Aber gut, der eine so, der andere so.
_________________ Na denn, dann. Bis dann, denn.
|
|
Gorthaur 
      
Beiträge: 19
WinXP SP2
Delphi7
|
Verfasst: Mi 16.01.08 18:49
Also ich fand beide Erklärungen recht anschaulich und ich möchte mich noch einmal bei allen bedanken die sich hier so engagieren und sich bemühen Leuten wie mir zu helfen. Man findet es wirklich selten, dass Menschen ihr Wissen so bereitwillig und geduldig weitergeben - Wirklich klasse, weiter so!
Dank euch bin ich heute schon wesentlich weiter, als ich es gestern noch war, auch wenn ich noch nicht behaupten kann wirklich alles verstanden zu haben.
Das habe ich soweit begriffen:
Ich habe eine Klasse erstellt mit dem Namen TMyRectangle.
TMyRectangle enthält zwei Felder (width & height) und eine Methode (die Funktion GetArea).
Nur was genau ist jetzt myRect?
Ist myRect eine Instanz von TMyRectangle?
Oder ist myRect eine Objektvariable mit deren Hilfe eine Instanz erzeugt wird und wenn dem so ist, wie heißt dann die Instanz, oder hat die keinen Namen und ist quasi nur rein ideell?
Und dann noch eine rein praktische Frage:
Warum ist die Methode GetArea vom Typ single wenn die beiden einzigen Felder integer sind? Sollte GetArea dann nicht auch vom Typ ingeger sein?
|
|
Dunkel
      
Beiträge: 682
Mac OS X Snow Leopard
Xcode 3.1
|
Verfasst: Mi 16.01.08 18:59
Gorthaur hat folgendes geschrieben: |
Nur was genau ist jetzt myRect?
Ist myRect eine Instanz von TMyRectangle?
|
Öhm, nicht direkt.
Gorthaur hat folgendes geschrieben: |
Oder ist myRect eine Objektvariable mit deren Hilfe eine Instanz erzeugt wird und wenn dem so ist, wie heißt dann die Instanz, oder hat die keinen Namen und ist quasi nur rein ideell?
|
Richtig, myRect ist nur eine Variable in der ein Zeiger auf die eigentliche Instanz gespeichert wird.
Warum sollte eine Instanz einen Namen haben?
Gorthaur hat folgendes geschrieben: | | Warum ist die Methode GetArea vom Typ single wenn die beiden einzigen Felder integer sind? Sollte GetArea dann nicht auch vom Typ ingeger sein? |
Das musst Du den Programmierer der Klasse fragen. Der Rückgabewert könnte ohne weiters vom Typ Integer, Word, DWord oder ähnliches sein. Irgendwas wird er sich dabei gedacht haben, oder auch nicht. Man weiss es nicht.
_________________ Ich streite einsam mich mit dieser Oberflächenwelt
Gutes sei ein löblich Brot von dem ich zehre - bis zum Tod [Das Ich - Im Ich]
|
|
Zorro
      
Beiträge: 76
Win 2000, Win XP Pro
Delphi 7 Architect
|
Verfasst: Mi 16.01.08 21:25
Dunkel hat folgendes geschrieben: | | OOP ist am Anfang nicht leicht zu verstehen, keine Frage. |
Stimmt, und daher noch ein Tipp aus eigener Erfahrung an Gorthaur bzw alle OOP-Grübelnden:
Eine der besten Erklärungen des objektorientierten Programmierens schafften die Borländer selber:
Versuch mal, ob du irgendwo (Wühlkiste, Antiquariat, Flohmarkt usw) ein Handbuch zu einer der letzen TurboPascal Versionen für DOS (!) auftreiben kannst - Version 6 oder 7, da gabs schon OOP. Hat mich damals regelrecht "erleuchtet".
Greetz
Zorro
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Mi 16.01.08 23:15
Dunkel hat folgendes geschrieben: | Gorthaur hat folgendes geschrieben: | | Warum ist die Methode GetArea vom Typ single wenn die beiden einzigen Felder integer sind? Sollte GetArea dann nicht auch vom Typ ingeger sein? |
Das musst Du den Programmierer der Klasse fragen. Der Rückgabewert könnte ohne weiters vom Typ Integer, Word, DWord oder ähnliches sein. Irgendwas wird er sich dabei gedacht haben, oder auch nicht. Man weiss es nicht. |
Im Laufe des Crashkurses wird noch eine abstrakte Basisklasse TGeomForm eingeführt. Für einen Kreis z.B. brauchst Du dann einen Single, damit die Fläche korrekt zurück gegeben werden kann.
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
delfiphan
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: Do 17.01.08 18:23
Eine dynamische Instanz ist eine normale Instanz. Der Speicher, der für eine Instanz benötigt wird, wird dynamisch (im dynamischen oder sog. Heap) alloziert. In anderen Programmiersprachen ist es möglich, Objekte auf dem Stack (als lokale Variablen) zu allozieren, dies geht in Delphi bei Records, aber nicht mit Klassen. Etwas anderes gibt's in Delphi nicht.
Klasse = Beschreibung, "Bauplan" eines Objekts. Ist etwas Abstraktes. Namen von Klassen fangen meistens mit T an, z.B. TForm.
Objektreferenz/Objektpointer/Objektvariable = Enthält die Adresse im Speicher zum Objekt. Ist immer genau 4 Bytes gross (bei 32-bit Systemarchitektur). z.B. bei Form1: TForm1 ist Form1 die Objektreferenz. Beliebig viele Objektreferenzen können auf ein Objekt zeigen.
Objekt = Instanz einer Klasse. Enthält u.A. Daten, die das Objekt speichert. I.A. nur über eine Objektvariable ansprechbar. Werden alle Objektvariablen die auf ein Objekt zeigen, gelöscht, dann ist das Objekt "verloren". Das Objekt verbraucht zwar immer noch Speicher, aber es ist (auf normale Wege) nicht mehr möglich, auf das Objekt zuzugreifen oder zu löschen. Das Objekt selbst hat von sich aus keinen Namen. Für den PC ist ein Objekt (vereinfacht gesprochen) nur ein Speicherbereich mit ein paar Metadaten (z.B. um welche Klasse es sich bei diesem Speicherbereich handelt).
|
|
ub60
      
Beiträge: 765
Erhaltene Danke: 130
|
Verfasst: Do 17.01.08 22:16
Schöne Erklärung. Bei dieser Sache:
delfiphan hat folgendes geschrieben: | | Für den PC ist ein Objekt (vereinfacht gesprochen) nur ein Speicherbereich mit ein paar Metadaten (z.B. um welche Klasse es sich bei diesem Speicherbereich handelt). |
weiß ich aber nicht genau, ob Du da recht hast. Meiner Meinung werden in einem Objekt zwar z. B. die Attributwerte gespeichert, aber nicht die Art der Klasse, zu der das Objekt gehört.
ub60
|
|