![]() |
Re: Grundlegende Frage zum Thema OOP
Zitat:
Mach ein Typecasting.
Delphi-Quellcode:
function TField.GetItem(Index : Integer) : TCell;
begin result := TCell(FCell.Items[Index]); end; Gerd |
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 |
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 |
Re: Grundlegende Frage zum Thema OOP
Zitat:
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 |
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 |
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:
Wenn das stimmt was ich oben geschrieben habe das ist das natürlich schon mal toll das ich weiß woran es liegt nur
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. ich weiß nicht wie ich das beheben kann!!! Gruß Muss!0 |
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 |
Re: Grundlegende Frage zum Thema OOP
Zitat:
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 |
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. |
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 13:33 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