![]() |
Array-Eigenschaften in eigenen Komponenten? Wie?
Guten Morgen, alle miteinander!
Ich habe da ein kleines Problem, was Array-Eigenschaften innerhalb einer eigenen Komponente angeht, bei dem ich aus der Delphi-Hilfe nicht schlau werde (stehe vielleicht nur auf dem Schlauch). Vielleicht könnt Ihr mir helfen. Hier das Problem: Ich habe eine Komponente, die ich TsvListe nenne, die von der standardmässigen TListBox abgeleitet ist. Ich möchte den Inhalt der Liste in mehreren Spalten anzeigen, was auch gut funktioniert. Irgendwo hier aus dem Forum habe ich mir mal einen OnDrawItem-Routine herausgesucht, mit der ich genau das realisieren kann. Allerdings brauche ich dafür die Breiten der einzelnen Spalten, und genau die möchte ich in einem eigenen Feld dieser Klasse ablegen und als Eigenschaft zur Entwurfszeit setzen können. Mit anderen Worten, was ich brauche ist eigentlich folgendes:
Delphi-Quellcode:
Grundsätzlich zumindest einmal. Aus der Delphi-Hilfe habe ich entnommen, dass ich das so nicht realisieren kann, sondern nur über indizierte Properties, die dann wohl irgendwie folgendermassen eingebaut werden:
type
TsvListe = class (TListBox) protected FColWidths: ARRAY OF INTEGER; ... published property ColWidths: ARRAY OF INTEGER read FColWidths write SetColWidths ... end;
Delphi-Quellcode:
Aber daraus werde ich nicht so wirklich schlau. Zumindest habe ich es nicht hinbekommen, dass es auch nur irgendwie funktioniert hat. Vor allem: wie spreche ich das Array FColWidths innerhalb der Methoden getColWidths und setColWidths an? Wie stelle ich sicher, dass der übergebene Index innerhalb der Grenzen des Arrays liegt? Wie kann ich das Array dynamisch anpassen, oder muss ich ein Array fester Grösse vorgeben?
public
property ColWidths[Index: Integer]: INTEGER read getColWidths write setColWidths Wie Ihr seht hat mich dieses Thema ein wenig verwirrt, und ich stehe im Augenblick wie der sprichwörtliche "Ox vorm Berg". Zusammendfassend gesagt: Wie erstelle ich eine Array-Eigenschaft (Integer), die ich zur Entwurfszeit mit Werten füllen kann? Wäre klasse, wenn Ihr mir helfen könntet! :-D Matthias |
Re: Array-Eigenschaften in eigenen Komponenten? Wie?
Moin Matthias,
vereinfach könnte das so aussehen:
Delphi-Quellcode:
Interne Felder würde ich allerdings auch immer unter private legen.
TsvListe = class (TListBox)
private function getColWidths(Index: Integer): INTEGER; procedure setColWidths(Index: Integer; const Value: INTEGER); protected FColWidths: array of integer; // ... public // ... property ColWidths[Index: Integer]: INTEGER read getColWidths write setColWidths; end; implementation {$R *.DFM} { TsvListe } function TsvListe.getColWidths(Index: Integer): INTEGER; begin Result := FColWidths[Index]; end; procedure TsvListe.setColWidths(Index: Integer; const Value: INTEGER); begin FColWidths[Index] := Value; end; Ob Du nun ein statisches oder dynamisches array verwendest hängt davon ab, was Du brauchst. Bei einem dynamischen array musst Du halt selber die Grösse verwalten, am Besten auch einen Index, der auf das nächste zu nutzende Element zeigt. Ein dynamisches array sollte möglichst so gross initialisiert werden, wie man es braucht, und nur falls man sich doch verschätzt hat muss man es vergrössern. Deshalb ein Index, da man in diesem Falle nicht mit high(array) arbeiten kann. Beim Vergrössern werden die Inhalte von dynamischen arrays i.d.R. in den neuen Speicherbereich umkopiert, und das gilt es zu vermeiden. Wenn Du mindestens eine Pro Version hast kannst Du übrigens einfach mit dem Cursor in die Propertyzeile gehen, und STRG-SHIFT-C drücken, damit die Klasse automatisch vervollständigt wird. |
Re: Array-Eigenschaften in eigenen Komponenten? Wie?
Nachdem Chistian alles wichtige erklaert hat noch ein paar Ergaenzungen.
In die Get- und Set-Funktionen gehoeren noch ein paar Tests auf die Grenzen rein. Immer schoen vorsichtig sein. Der interessanteste Teil einer Array-Property ist der Index. Da auf zwei Funktionen abgebildet wird, kann der Typ der Indexvariable beliebig sein. Ein String als Index? Warum nicht. Damit kann man dann Dinge wie assoziative Arrrays implementieren. Willst du eine mehrdimensionale Property, dann einfach merhrere Indices implementieren. Die Get- bzw-Set-Funktion bekommt entsprechend mehr Parameter. |
Re: Array-Eigenschaften in eigenen Komponenten? Wie?
Hallo, Christian!
Erstmal vielen Dank für die ausführliche Antwort. Ich habe mich gestern noch hingesetzt und versucht, sie nachzuvollziehen. Hat so auch geklappt - allerdings hat es mein Hauptproblem noch nicht gelöst. Nach wie vor versuche ich ja, die Array-Eigenschaft zur Entwurfszeit mit Werten zu füllen - will sagen: über den Objektinspektor. Dies gelingt aber nur mit published-Properties. Eine Array-Eigenschaft kann ich aber nur in den public-Zweig packen. Bin ich mit meinen Wünschen jetzt einfach völlig auf dem falschen Dampfer? Oder muss ich einen Eigenschaften-Editor schreiben, mit dem ich die Array-Eigenschaft mit Werten fülle? Wie kann ich dieses Ziel erreichen, dieses Array der Spalteneigenschaften im Objektinspektor anzusprechen? Vielen Dank schonmal für die Antwort! :-D Matthias |
Re: Array-Eigenschaften in eigenen Komponenten? Wie?
Um das ganze zur Design-Time im Objektinspektor verfügbar zu machen wirst du wohl oder Übel einen Eigenschaftseditor bauen müssen.
Für Hilfe dazu such mal nach dem Stichwort OpenToolsApi :) |
Re: Array-Eigenschaften in eigenen Komponenten? Wie?
Der beste Weg zum Lernen ist es, eine bestehende Komponente als Ansichtsexemplar zu benutzen.
Ist hier was in der Code-Library dazu? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:10 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