![]() |
OOP: Property Problem
HI,
Ich arbeite jetzt zum ersten mal richtig mit Properties. Mir ist zwar nicht ganz klar wo die Vorteile gegenüber dem direkten Ansprechen von Feldern sind, aber ich wollte das ganze mal richtig OO programmieren. So mein Problem ist das ich 2 Klassen haben, die beide eine Array haben. Die zweite Klasse hat ein Array eines records. so ungefähr siehts aus:
Delphi-Quellcode:
So und nun weiss ich nicht wirklich wie ich am besten auf diese Felder zugreife. Ich muss auf alles read und write Zugriff haben. Möchte aber nicht per
type Teins = record
name: String; ... end; type Tzwei = class myarray: array [1..10] of Teins; end; type Tdrei = class my2ndarray = array of Tzwei; end;
Delphi-Quellcode:
das ganze machen da ich dann ja immer alles verändern muss. Möchte aber gern ganz normal wie bei einem simplen record auf die Felder zugreifen. Quasi so:
property blub[index: Integer]:Tzwei read getblub write setblub;
Delphi-Quellcode:
Ich weiss das ist sehr diffus erklärt aber irgendwie bin ich sehr verwirrt und weiss nicht wie ich das lösen soll. Ich bitte um Hilfe.
var myVar: Tdrei;
begin myvar:=Tdrei.create; myvar.my2ndarray[5].myarray[6].name:='Bla'; end; schonmal danke im vorraus:) |
Re: OOP: Property Problem
Ich habe das jetzt nicht probiert, aber so wie du es hier geschrieben hast, müsste es doch gehen?!
Oder möchtest du das Lesen und Schreiben überwachen? Wenn nicht, kannst du den Code so lassen, es sind dann keine Properties, sondern Variablen. Natürlich musst du sie dann auch so verwalten (SetLength(...) usw.) |
Re: OOP: Property Problem
Hi,
du könntest das versuchen:
Delphi-Quellcode:
Du könnttest aber auch TList bzw. TObjectList statt dyn. Arrays verwenden, ist vllt. einfacher.
TEinsArray = array[1..10] of TEins;
// ... type TZwei = class private FEins: TEinsArray; public property MyArray: TEinsArray read FEins {write FEins}; // ggf. ist schreibzugriff erforderlich end; mfG mirage228 |
Re: OOP: Property Problem
ahh gut dann war das ein Verständnis Problem auf meiner Seite. Danke für die Tipps :)
|
Re: OOP: Property Problem
also ich hab das jetzt genau so gelöst. Aber wenn ich dann auf eine Eigenschaft, egal ob read oder write zugreifen will bekomme ich folgenden Fehler:
Zitat:
edit: bin mal die einzelanweisungen durchgegangen. Es muss daran liegen. Ich mache folgendes: label.caption:=instanz.myArray[0].name; und genau dabei hängt er sich auf :( |
Re: OOP: Property Problem
Bist du sicher das du jede einzelne klasse auch mit create kreierst? (da du ja ein array von einer klasse hast)
|
Re: OOP: Property Problem
oh man. weisst du wielange ich dadran jetzt gesessen habe. Ich danke dir :cheers:
|
Re: OOP: Property Problem
Du lagst mit der Array Property schon fast richtig. ;)
Dein Problem werden wohl die Records sein. (Oder die Tatsache, dass du das erste Array nicht mit Instanzen füllst) Ein Record wird ja kopiert wenn du ihn zuweist. Somit ist das Ergebnis des Getters eine KOPIE des Records, den du ausgeben willst. Änderst du jetzt ein Feld des Records landet es NICHT in dem Record, den du vorher ausgespuckt hast. Nehme statt den Records Klassen und es sollte prima klappen. Außerdem solltest du die Arrays ersetzen. Weder Records noch Arrays haben viel mit OO Programierung zu tun. ;) Ein Array-like Ersatz für ein Array wäre TList (verwendet das Array intern). Wobei ich in 90% aller Fälle zu einer richtigen Liste greifen würde. (Dazu sollte es in der DP auch genug Beispiele geben. ;) ) |
Re: OOP: Property Problem
ich hab bis jetzt erst einmal mit einer TObjectList gearbeitet, und das war schon komfortabel. Aber wo liegt jetzt der Unterschiede zu einer"richtigen" Liste?
Würd mich über ein paar mehr Infos sehr freuen :) |
Re: OOP: Property Problem
Kein Problem.
Übnrigens um mal darauf: Zitat:
Es gibt Felder die über Properties nur gelesen werden sollten. Sagen wir mal Du hast eine ClientSocket Komponente geschrieben die das flag "FConnected"(Boolean) hat. Wenn du hier keine Property benutzt, könnten Klassen die von dieser Klasse erben (sofern FConnected im protected-Bereich ist), diese variable beschreiben. Da FConnected aber in der Hauptklasse bei Verbindung/Trennung beschrieben wird, hat eine Nachfolger-Klasse daran nichtsmehr zu ändern. D.h sie sollte nur mit read gelesen werden. Das war jetzt nur ein Beispiel, aber es gibt noch andere dafür :] |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:36 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