Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi array-Properties (https://www.delphipraxis.net/8512-array-properties.html)

nailor 6. Sep 2003 15:32


array-Properties
 
Delphi-Quellcode:
//aus der Hilfe:

...

type

  TStringArray = class
  public
    property Strings[Index: Integer]: string ...; default;
    ...
  end;

If a class has a default property, you can access that property with the abbreviation object[index], which is equivalent to object.property[index]. For example, given the declaration above, StringArray.Strings[7] can be abbreviated to StringArray[7]. A class can have only one default property. Changing or hiding the default property in descendant classes may lead to unexpected behavior, since the compiler always determines an object’s default property statically.

...
jetzt sollte ich doch eigentlich irgendwie auf die strings in meinem array zugreifen können. d.h. sie auslesen, sie schreiben, und auch die Länge des arrays, in dem sie drinstehen ändern. Nur Teil 1 und Teil 2 kann ich nicht testen, weil Teil 3 (Länge des arrays, in dem sie drinstehen ändern) nicht klappt.

Christian Seehase 6. Sep 2003 15:37

Re: array-Properties
 
Moin Nailor,

i.d.R., z.B. bei TStringList, kannst Du die Grösse des Arrays nur durch das Hinzufügen und Löschen von Einträgen ändern, aber nicht direkt.

Wie machst Du das denn?

[EDIT]
Und was hat der Auszug aus der Hilfe mit Deinem Problem zu tun?
[/EDIT]

murphy 6. Sep 2003 15:41

Re: array-Properties
 
du hast da was falsch verstanden: array-properties haben mit arrays nur die zugriffssyntax per [] gemeinsam, sowas wie Memo1.Lines[3].
dennoch sind es properties, und du brauchst funktionen, um darauf zuzugreifen, und denen wird der index mit übergeben.
wenn du die länge ändern willst, dann musst du das über eine zweite property tun. oder, viel besser, du setzt die länge in der set-prozedur der array-property:
Code:
procedure SetValue(const Index: Integer; const Value: string);
begin
  if High(FValues) < Index then
    SetLength(FValues, Index+1);
  FValues[Index] := Value;
end;
lies dir in der hilfe unbedingt auch den oberen teil durch. dort sind beispielzugriffsmethoden beschrieben.

nailor 6. Sep 2003 16:37

Re: array-Properties
 
Ich glaube ich habe da was ganz grundlegendes falsch verstanden:

Delphi-Quellcode:
type

  TStringArray = class
  public
    property Strings[Index: Integer]: string ...; default;
    ...
  end;
ist hierbei "Strings" schon eine Variable, oder muss ich erst noch eine Variable machen, die ich in einer passenden function/procedure mit der property verknüpfe.

--> dennoch sind es properties, und du brauchst funktionen, um darauf zuzugreifen, und denen wird der index mit übergeben.

Ich bin doch grade dabei, diese zu schreiben!

murphy 6. Sep 2003 17:58

Re: array-Properties
 
ok, vielleicht geht's besser mit codebeispielen ohne "..." an den wichtigen stellen:
Code:
interface
  TSimpleStringList = class
  private
    FList: array of string;
  protected
    function Get(Index: Integer): string;
    procedure Put(Index: Integer; const S: string);
  public
    property Strings[Index: Integer]: string read Get write Put; default;
  end;

implementation

function TSimpleStringList.Get(Index: Integer): string;
begin
  if (Index < 0) or (Index > High(FList)) then Error;
  Result := FList[Index];
end;

procedure TSimpleStringList.Put(Index: Integer; const S: string);
begin
  if (Index < 0) or (Index > High(FList)) then Error;
  FList[Index] := S;
end;
gekürzt, ohne override etc.
so ungefähr sehen TStrings und TStringList aus.

nailor 6. Sep 2003 18:25

Re: array-Properties
 
So hab ich es dann auch gemacht. Ich dachte halt am Anfang, dass Delphi so schlau wäre, und zb bei deinem Code automatisch eine Variable "Strings: array of string" gemacht hätte. Tut es aber nicht, und ist vielleicht von dem "Verwirrfaktor für doppelte Bezeichnungen" her auch besser.

Trotzdem Vielen Dank, denn wenigstens klappts jetzt!

murphy 6. Sep 2003 22:26

Re: array-Properties
 
Zitat:

Zitat von Nailor
Ich dachte halt am Anfang, dass Delphi so schlau wäre, und zb bei deinem Code automatisch eine Variable "Strings: array of string" gemacht hätte.

du meinst, dass du eine property benennst, default dahinter schreibst und die klassenergänzung den rest macht? mmh...da haben die entwickler sich wohl gegen "künstliche intelligenz" entschieden, weil es hier einfach zu viele mögliche varianten gibt. ich benutze die automatische codeerzeugung fast nie, die makros (STRG+J) sind wesentlich nützlicher.

Zitat:

Trotzdem Vielen Dank, denn wenigstens klappts jetzt!
schön :D was wird es eigentlich?

nailor 6. Sep 2003 22:36

Re: array-Properties
 
Was zum Suchen (siehe auch meine Fragen von wegen fehlerhafter Rekursion). Wollte es eigentlich von TStrings ableiten, oder TStringList ableiten. TStrings ist eigentlich nicht viel mehr als array of string, von dem ich die Sourcen nicht habe (Personal Edition) -> lohnt sich nicht, zumal da noch abstract-Methoden drin sind, usw. TStringList kann so viel, das ich mir gedacht habe: Das kann viel, das ist bestimmt nicht schnell. Außerdem machen wir jetzt in der Schule grade Objektorientierung, da kann es nicht schaden, wenn ich mich auch mal damit beschäftige.

Christian Seehase 7. Sep 2003 00:09

Re: array-Properties
 
Moin Nailor,

Zitat:

Zitat von Nailor
-> lohnt sich nicht, zumal da noch abstract-Methoden drin sind,

und das ist der Fall, da es als Basisklasse für weitere Ableitungen dienen soll. Du musst halt in einer abgeleiteten Klasse die abstrakten Methoden implementieren. Auch Borland hat das unterschiedlich gemacht. In den Lines (abgeleitet von TStrings) eines Memos oder RichEdit werden z.B. keine Objekte gespeichert, in ListBox.Items schon, obwohl beide über AddObject verfügen.

Zitat:

Zitat von Nailor
Außerdem machen wir jetzt in der Schule grade Objektorientierung, da kann es nicht schaden, wenn ich mich auch mal damit beschäftige.

Da hast Du wohl recht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:17 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