Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Grundlegende Frage zum Thema OOP (https://www.delphipraxis.net/92034-grundlegende-frage-zum-thema-oop.html)

Mussi0 13. Mai 2007 17:39


Grundlegende Frage zum Thema OOP
 
Hallo,

ich habe eine Grundlegende Frage zum Thema OOP mit Delphi!!

Ich habe 3 Klassen nennen wir sie mal Klasse A, B und C.
Klasse A soll eine Liste 5 Objekten des Typs B und C enthalten also ungefähr so:

Liste aus B und C:

|-----------------------------|
|1 Objekt von B|1 Objekt von C|
|2 Objekt von B|2 Objekt von C|
|3 Objekt von B|3 Objekt von C|
|4 Objekt von B|4 Objekt von C|
|5 Objekt von B|5 Objekt von C|
|-----------------------------|

Geht das in Delphi das ich das so machen ?
Und das ich über Klasse A dann auch Objekte in meine Liste B und C einfügen kann??

Wäre für hilfe sehr dankebar!

Gruß
Muss!0

WoTo 13. Mai 2007 17:48

Re: Grundlegende Frage zum Thema OOP
 
Hallo Muss!0

die Klasse A kann ja zwei Stringlisten vom Typ TStringList enthalten, die dann die Objekte der Klasse B unbd C enthalten.

Gruß
woto

Mussi0 13. Mai 2007 18:17

Re: Grundlegende Frage zum Thema OOP
 
Hallo,

sind StringListen nicht nur für String's da?
Aber ich brauche doch eine Liste in der ich Objekte
einfügen kann und nicht nur Strings außerdem möchte ich dann ja auch
auf diese dann z.B. so in der Art drauf zugreifen.

Delphi-Quellcode:
objKlasseA.getListe.item[0,1].SetWert(123);
gruß
Muss!0

Andreas H. 13. Mai 2007 18:23

Re: Grundlegende Frage zum Thema OOP
 
Hallo,

Du hast es doch schon selbst gesagt.

Du nimmst 2x TList und verwaltest damit deine "inneren" Objekte.

Andreas

3_of_8 13. Mai 2007 19:12

Re: Grundlegende Frage zum Thema OOP
 
Oder gleich ne TObjectList.

Ich habs noch nicht ganz verstanden: Brauchst du eine Liste für 5 Objekte, wobei ein Objekt jeweils B oder C sein kann oder brauchst zu zwei Listen, von denen eine As enthält un die andere Bs?

Im ersten Fall brauchst du nur eine TObjectList, im zweiten Fall zwei TObjectLists.

Mussi0 13. Mai 2007 19:26

Re: Grundlegende Frage zum Thema OOP
 
Hi,

vll hab ich mich ein bischen ungeschickt ausgedrückt.

Ich möchte eine Klasse haben die beliebig viele Objekte von zwei Klassen enthalten, die zwei
Klassen kommen gleich oft drin vor also z.B. hab ich eine Klasse TZelle und die besteht aus
einem Objekt von TZellenKey und einem Objekt von der Klasse TZellenWert.

Die Klasse TZelle ist n-mal als Objekt in der Klasse TFeld vorhanden.
Und genau an der Stelle dacht ich mir wäre ja eine Liste sehr sinnvoll.

Nur weiß ich nicht wie ich das Anstellen kann, da ich mich bisher nur in Java mit OOP beschäftig habe.

Gruß

Muss!0

Jelly 13. Mai 2007 20:02

Re: Grundlegende Frage zum Thema OOP
 
Verwalte deine Liste von TZelle in einer TObjectList in deiner Klasse TFeld.

Deine TZelle kann dann weiterhin jeweils eine Instanz von TZelleKey und von TZelleWert halten.

Mussi0 13. Mai 2007 23:14

Re: Grundlegende Frage zum Thema OOP
 
Hi,


ahh danke da bin ich noch nicht drauf gekommen ;-)
gut dann werde ich das mal versuchen danke danke
für die Hilfe

Gruß

Muss!0

Luckie 13. Mai 2007 23:26

Re: Grundlegende Frage zum Thema OOP
 
Guck mal hier: http://www.michael-puff.de/Developer...er_Klassen.php

Mussi0 14. Mai 2007 00:32

Re: Grundlegende Frage zum Thema OOP
 
Hi,

also ich hab das jetzt mal so gemacht troztdem habe ich mal noch nen Fehler den
ich nicht behoben bekommen habe.

Hier mal der Code:
Delphi-Quellcode:
Type
  TField = class(TObject)
    private
      FCell : TObjectList;
      function GetItem(Index: Integer): TCell;
      procedure SetItem(Index: Integer; Item: TCell);
    protected
      property InnerList : TObjectList read FCell;
    public
      constructor create();
      destructor Destroy; override;
      procedure Add(Item : TCell);
      procedure Delete(Index: Integer);
      property Items[Index: Integer]: TCell read GetItem write SetItem;
  end;

function TField.GetItem(Index : Integer) : TCell;
begin
  result := FCell.Items[Index];
end;
Bei der Funktion schlägt er mir einen Fehler und zwar das die Typen TCell und TObject nicht die kompatibel sind.

Meine Frage: Was ist falsch bzw. was muss ich am Code ändern?

Gruß

Muss!0

PS: Und vielen Dank für die Viele Hilfe hier!!!

bernau 14. Mai 2007 07:46

Re: Grundlegende Frage zum Thema OOP
 
Zitat:

Zitat von Mussi0
Delphi-Quellcode:
function TField.GetItem(Index : Integer) : TCell;
begin
  result := FCell.Items[Index];
end;


Mach ein Typecasting.


Delphi-Quellcode:
function TField.GetItem(Index : Integer) : TCell;
begin
  result := TCell(FCell.Items[Index]);
end;

Gerd

bernau 14. Mai 2007 07:51

Re: Grundlegende Frage zum Thema OOP
 
Vieleicht noch ein kleiner Schönheitstip.

Ich würde die Variable FCell umbenennen nach FCellList. FCell sugeriert eine Variable vom Type TCell. Es ist aber in Wirklichkeit eine Variable vom Typ TObjectList. Mann muss zwei mal schauen um den Code nicht misszuverstehen.


Gerd

Mussi0 14. Mai 2007 07:57

Re: Grundlegende Frage zum Thema OOP
 
Hi,

danke danke ich werde den Code wenn ich daheim bin sofort ausprobieren!!

Aber kannst du mir vielleicht noch sagen was das bedeutet ein Typcasting?
Kann ich das so verstehen das ein Typcasting ähnlich einer Typumwandlung ist?

Und das mit der FCell das werde ich dann wohl noch ändern hab da nicht wirklich drüber nachgedacht!
Aber ist glaub ich sinnvoll das FCellList zu nennen.

Gruß

Muss!0

bernau 14. Mai 2007 09:52

Re: Grundlegende Frage zum Thema OOP
 
Zitat:

Zitat von Mussi0
Aber kannst du mir vielleicht noch sagen was das bedeutet ein Typcasting?
Kann ich das so verstehen das ein Typcasting ähnlich einer Typumwandlung ist?

So ist es.

TObjectList liefert als Ergebnis ein TObject zurück. Mit dem Typecastig gibst du an, daß es sich bei dem Ergebnis nicht um ein TObjcet handelt, sondern um ein TCell.

Aber Vorsicht. Das ist die einfache Typenumwandlung. Du must dir sicher sein, daß du der Objectlist nur Objekte vom Typ TCell zugefügt hast. Ansonsten musst du vorher eine Typenüberprüfung durchführen

Delphi-Quellcode:


function TField.GetItem(Index : Integer) : TCell;
begin
  if FCell.Items[Index] is TCell then
    result := TCell(FCell.Items[Index])
  else
    result:=nil; // Oder irgend eine Fehlermeldung
end;

Gerd

Mussi0 14. Mai 2007 12:52

Re: Grundlegende Frage zum Thema OOP
 
Hi

Danke danke für deine Hilfe hat mir sehr geholfen.

Ist echt ein Tolles Forum hier mit viel Hilfe!!

Gruß

Muss!0

Mussi0 14. Mai 2007 21:47

Re: Grundlegende Frage zum Thema OOP
 
Hallo,

ich weiß nicht ob ich für mein nächstes Problem einfach einen neuen Thread eröffnen soll
oder nicht da es eigentlich noch mit meinem vorherigen Problem zu tun hat.

Und zwar hat das mit den Klassen auch alles wunderbar funktioniert nur ich habe ein Problem mit
meinem Zugriff und zwar wenn ich jetzt ein neues Objekt in die ObjectList einfüge ist dieses jetzt auch
da drin nur wenn ich das innerhalb einer Schleife tue dann funktioniert das nicht bzw. er überschreibt mir
glaub ich immer wieder den Wert in der Speicheradresse und somit kommt es dann immer dazu das zum Schluss (also
nach der Schleife) in meiner ObjectList nichts drinsteht.

Hier mal der Code:

Delphi-Quellcode:
var objField : TField;
    arrBuchStaben : array [1..9] of string;
    i,j,k : integer;
    objCell : TCell;
begin
  writeln('Programm starten mit ENTER');
  readln;
  objField := TField.create;

  for i:=1 to 9 do begin
    arrBuchStaben[i] := chr(64+i);
    writeln('Buchstabe '+IntToStr(i)+': '+arrBuchStaben[i]);
  end;

  writeln;

  for i:=1 to 9 do begin
    //neues Objekt von Cell
    objCell := TCell.create;
    //objCell den Wert 0 geben
    objCell.CellWert.Wert := 0;
    //objCell den Key geben
    objCell.CellKey.Col := arrBuchStaben[j];
    objCell.Cellkey.Row := i;
    //ausgeben was nun drin steht
    writeln('Punkt '+IntToStr(i)+': ('+objCell.CellKey.Col+'/'+IntToStr(j)+') mit Wert: '+ IntToStr(objCell.CellWert.Wert));
    //der ObjectList hinzufügen
    objField.Add(objCell);
    //objCell zerstören
    objCell.Destroy;
  end;

  writeln;
  writeln('Programm beenden mit ENTER');
  readln;
end.
Wenn das stimmt was ich oben geschrieben habe das ist das natürlich schon mal toll das ich weiß woran es liegt nur
ich weiß nicht wie ich das beheben kann!!!

Gruß

Muss!0

Mussi0 14. Mai 2007 22:03

Re: Grundlegende Frage zum Thema OOP
 
Hi,

hat sich schon erledigt hatte einen dummen Fehler dadrin hab eine Variable genutzt (j) in der nichts Stand und hab da versucht was mit zu machen.

Gruß

Muss!0

bernau 14. Mai 2007 22:04

Re: Grundlegende Frage zum Thema OOP
 
Zitat:

Zitat von Mussi0
Delphi-Quellcode:
    //der ObjectList hinzufügen
    objField.Add(objCell);
    //objCell zerstören
    objCell.Destroy;

Das Destroy darfst du hier nicht aufrufen. Du erzeugst das Objekt, Füllst es mit werten, fügst es der Objectlist zu und dann zerstörst du es.

Mit objField.Add(objCell); fügst du nur den Pointer/Zeiger des Objektes der Liste zu. es wird keine Kopie angelegt. Wenn du das Objekt aber zerstörst, dann zeigt der Pointer, den du übergeben hast in's leere.

Also solltest du den Destroy weglassen.

Damit du aber keinen Speicherleck bekommst, musst du dafür sorgen, daß die erzeugen Objekte zum "richtigen" Zeitpunkt freigiebst. Das kann dir aber auch die ObjectList abnehmen. Einfach OwnsObjects der Objectlist auf True setzen.



Gerd

Mussi0 14. Mai 2007 22:11

Re: Grundlegende Frage zum Thema OOP
 
Hi,

Danke jetzt funktioniert es richtig da hab ich vorher nicht drüber
nachgedacht gehabt hatte mir gedacht "naja...ich erzeug das muss ich natürlich wenn ich es
in der form nicht mehr nutze löschen"
Hab aber nicht über diese Referenzübergabe nachgedacht!

Gruß

Muss!0

PS: Nochmals danke wenn ich mit meinem "ersten" selbstprogrammierten Delphi 7 Objektorientierten Programm
fertig bin werde ich es mal posten.

Jelly 15. Mai 2007 06:24

Re: Grundlegende Frage zum Thema OOP
 
Beim Lesen aus der ObjectList wirst du wahrscheinlich auch noch auf Fragen stossen. TOBjectList kann beliebige Objekte aufnehmen, also ab TObject. Ein objField[0] wird dir also ein TOBject liefern, und nicht etwa ein TCell. Das musst du selbst prüfen und casten:

Delphi-Quellcode:
if objField[0] is TCell then
   objCell := objField[0] as TCell ;


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:20 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