Autor Beitrag
Gorthaur
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19

WinXP SP2
Delphi7
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19

WinXP SP2
Delphi7
BeitragVerfasst: Di 15.01.08 16:42 
Hat denn keiner Ahnung?
Dunkel
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 682

Mac OS X Snow Leopard
Xcode 3.1
BeitragVerfasst: 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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19

WinXP SP2
Delphi7
BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Di 15.01.08 19:58 
Hm, in dem Zusammenhang habe ich "dynamisch" noch nie gehört, gemeint ist wohl "zur Laufzeit":

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19

WinXP SP2
Delphi7
BeitragVerfasst: 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.

ausblenden volle Höhe Delphi-Quelltext
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
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  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.


ausblenden 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

{ TMyRectangle }

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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 765
Erhaltene Danke: 130



BeitragVerfasst: Di 15.01.08 21:37 
user profile iconGorthaur 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Di 15.01.08 21:42 
user profile iconub60 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 :zwinker:

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Gorthaur Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19

WinXP SP2
Delphi7
BeitragVerfasst: Di 15.01.08 21:59 
user profile iconub60 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 682

Mac OS X Snow Leopard
Xcode 3.1
BeitragVerfasst: Di 15.01.08 22:16 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
var  
  myRect : TMyRectangle;  // Objektvariablendeklaration
begin  
  myRect := TMyRectangle.Create; // und hier erstellst Du das Objekt, bzw. eine Instanz des Objekts 

{ ... }
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19

WinXP SP2
Delphi7
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 682

Mac OS X Snow Leopard
Xcode 3.1
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Mi 16.01.08 09:19 
user profile iconDunkel 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 :cry: , dann wird er 'entfernt' :twisted: (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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19

WinXP SP2
Delphi7
BeitragVerfasst: 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! :zustimm:
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. :D

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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 682

Mac OS X Snow Leopard
Xcode 3.1
BeitragVerfasst: Mi 16.01.08 18:59 
user profile iconGorthaur hat folgendes geschrieben:

Nur was genau ist jetzt myRect?

Ist myRect eine Instanz von TMyRectangle?

Öhm, nicht direkt.

user profile iconGorthaur 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?


user profile iconGorthaur 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 76

Win 2000, Win XP Pro
Delphi 7 Architect
BeitragVerfasst: Mi 16.01.08 21:25 
user profile iconDunkel 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mi 16.01.08 23:15 
user profile iconDunkel hat folgendes geschrieben:
user profile iconGorthaur 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 765
Erhaltene Danke: 130



BeitragVerfasst: Do 17.01.08 22:16 
Schöne Erklärung. Bei dieser Sache:
user profile icondelfiphan 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