AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Array-Eigenschaften in eigenen Komponenten? Wie?
Thema durchsuchen
Ansicht
Themen-Optionen

Array-Eigenschaften in eigenen Komponenten? Wie?

Ein Thema von mjenke · begonnen am 21. Okt 2003 · letzter Beitrag vom 22. Okt 2003
Antwort Antwort
mjenke

Registriert seit: 28. Mär 2003
Ort: Bonn
131 Beiträge
 
#1

Array-Eigenschaften in eigenen Komponenten? Wie?

  Alt 21. Okt 2003, 07:12
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:
type
  TsvListe = class (TListBox)
    protected
      FColWidths: ARRAY OF INTEGER;
      ...
    published
      property ColWidths: ARRAY OF INTEGER read FColWidths write SetColWidths
      ...
   end;
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:

Delphi-Quellcode:
public
  property ColWidths[Index: Integer]: INTEGER read getColWidths write setColWidths
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?

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!


Matthias
Matthias Jenke
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Array-Eigenschaften in eigenen Komponenten? Wie?

  Alt 21. Okt 2003, 13:59
Moin Matthias,

vereinfach könnte das so aussehen:

Delphi-Quellcode:
  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;
Interne Felder würde ich allerdings auch immer unter private legen.

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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#3

Re: Array-Eigenschaften in eigenen Komponenten? Wie?

  Alt 21. Okt 2003, 14:33
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.
  Mit Zitat antworten Zitat
mjenke

Registriert seit: 28. Mär 2003
Ort: Bonn
131 Beiträge
 
#4

Re: Array-Eigenschaften in eigenen Komponenten? Wie?

  Alt 22. Okt 2003, 07:06
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!


Matthias
Matthias Jenke
  Mit Zitat antworten Zitat
Ghostwalker

Registriert seit: 16. Jun 2003
Ort: Schönwald
1.299 Beiträge
 
Delphi 10.3 Rio
 
#5

Re: Array-Eigenschaften in eigenen Komponenten? Wie?

  Alt 22. Okt 2003, 09:09
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
Uwe
e=mc² or energy = milk * coffee²
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#6

Re: Array-Eigenschaften in eigenen Komponenten? Wie?

  Alt 22. Okt 2003, 09:13
Der beste Weg zum Lernen ist es, eine bestehende Komponente als Ansichtsexemplar zu benutzen.
Ist hier was in der Code-Library dazu?
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:04 Uhr.
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