Announcement

Collapse
No announcement yet.

Probleme mit dynamischem Array in einer Klasse

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Probleme mit dynamischem Array in einer Klasse

    Hi!

    Ich habe möchte eine Klasse schreiben, in der ein dynamisches Array vorkommt, das einige andere Komponenten enthält. Außerdem sollen in der Klasse einige Funktionen vorkommen, um den Inhalt des Arrays zu verändern.

    Hier ein Beispiel:
    Die Klasse soll einen Kartenstapel darstellen, der in einem dynamischen Array die Karten enthält (TKarte ist woanders im Code definiert). Zusätzlich soll es noch eine Funktion geben (Add), mit der man eine Karte auf den Stapel legen kann.
    Leider funktioniert das Ganze aber nicht:
    <PRE>
    type
    TKartenstapel = class(TPanel)
    private
    FKarten: array of TKarte;
    function GetKarten(Index: Integer): TKarte;
    procedure SetKarten(Index: Integer; const Value: TKarte);
    published
    procedure Add(Karte: TKarte);
    public
    property Karten[Index: Integer]: TKarte read GetKarten write SetKarten; default;
    end;
    </PRE>
    ...
    <PRE>
    function TKartenstapel.GetKarten(Index: Integer): TKarte;
    begin
    result := FKarten[Index];
    end;

    procedure TKartenstapel.SetKarten(Index: Integer; const Value: TKarte);
    begin
    FKarten[Index] := Value;
    end;

    procedure TKartenstapel.Add(Karte: TKarte);
    begin
    SetLength(FKarten, Length(FKarten)+1);
    FKarten[Length(FKarten)-1] := Karte;
    end;
    </PRE>

    Sobald ich die Funktion Add benutze (oder eine andere Funktion, die das Array irgendwie verändern soll), kommt sofort die Fehlermeldung, dass eine EAccessViolation aufgetreten ist.

    Wie kann ich dieses Problem lösen bzw. wo liegt der Fehler?

    Danke schon mal im Voraus!!!!!!

    mfg Devask

  • #2
    Hi,<P>
    als erstes fällt mir auf, dass Add als published(!) deklariert ist. Geht das wirklich? Eigentlich dürfen nur properties als published deklariert werden, um in DFM's gespeichert zu werden.<BR>
    Die Zugriffsverletzung kommt deswegen, dass FKarten als ein offenes Array deklariert ist und intern als Zeiger verwaltet wird. Der Speicher für offene Arrays wird aber nicht automatisch reserviert. Ich würde ein andere Lösung vorschlagen:<BR>
    - Du verwendest FKarten als TList. oder <BR>
    - Du verwendest TCollection und TCollectionItem. Dazu musst du TKarte von TCollectionItem und TKartenstapel von TCollection ableiten. Beispiele, wie man das macht, gibt's genug in diesem Forum bzw. im VCL-Sourcecode.<BR>
    Pete

    Comment


    • #3
      Deine Logik ist ein bischen falsch. GetKarten sollte pruefen ob der Index ueberhaupt existiert. SetKarten sollte entfallen, da Add bereits Karten addiert. Add ist prinzipiell richtig, aber es muss Value statt Karte heissen.<br>
      published bedeutet das die Property oder Methode ins RTTI aufgenommen wird

      Comment


      • #4
        Hi,<P>
        Entschuldigung. Ich war wohl ein bisschen durcheinander. Trotzdem bin ich der Meinung, dass der Fehler daran liegt, dass FKarten nicht initialisiert wird. Man sollte vielleicht in Create von TKartenstapel FKarten so initialisieren:
        <PRE>
        constructor TKartenstapel.Create(AOwner : TComponent);
        begin
        inherited Create(AOwner);
        SetLength(FKarten,0);
        end;
        </PRE><P>
        Pete

        Comment

        Working...
        X