Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi OOP: Property Problem (https://www.delphipraxis.net/43890-oop-property-problem.html)

Antigo 10. Apr 2005 11:57


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:
type Teins = record
  name: String;
  ...
end;

type Tzwei = class
  myarray: array [1..10] of Teins;
end;

type Tdrei = class
  my2ndarray = array of Tzwei;
end;
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
Delphi-Quellcode:
property blub[index: Integer]:Tzwei read getblub write setblub;
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:
Delphi-Quellcode:
var myVar: Tdrei;

begin
  myvar:=Tdrei.create;
  myvar.my2ndarray[5].myarray[6].name:='Bla';
end;
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.


schonmal danke im vorraus:)

F.W. 10. Apr 2005 12:08

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.)

mirage228 10. Apr 2005 12:11

Re: OOP: Property Problem
 
Hi,

du könntest das versuchen:
Delphi-Quellcode:
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;
Du könnttest aber auch TList bzw. TObjectList statt dyn. Arrays verwenden, ist vllt. einfacher.

mfG
mirage228

Antigo 10. Apr 2005 12:18

Re: OOP: Property Problem
 
ahh gut dann war das ein Verständnis Problem auf meiner Seite. Danke für die Tipps :)

Antigo 10. Apr 2005 16:45

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:

---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt Project2.exe ist eine Exception der Klasse EAccessViolation aufgetreten. Meldung: 'Zugriffsverletzung bei Adresse 0045A343 in Modul 'Project2.exe'. Lesen von Adresse 00000004'. Prozess wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen.
---------------------------
OK Hilfe
---------------------------
fällt einem da zufällig etwas ein. Ich hab absolut keine Ahnung mehr. :(

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 :(

Pseudemys Nelsoni 10. Apr 2005 16:53

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)

Antigo 10. Apr 2005 16:56

Re: OOP: Property Problem
 
oh man. weisst du wielange ich dadran jetzt gesessen habe. Ich danke dir :cheers:

Robert_G 10. Apr 2005 16:56

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. ;) )

Antigo 10. Apr 2005 17:02

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 :)

Pseudemys Nelsoni 10. Apr 2005 17:03

Re: OOP: Property Problem
 
Kein Problem.

Übnrigens um mal darauf:

Zitat:

Mir ist zwar nicht ganz klar wo die Vorteile gegenüber dem direkten Ansprechen von Feldern sind
zurückzukommen:

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 18:57 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz