![]() |
TCollection und TCollectionItem
Hallo,
ich habe eine Collection un der CollectionItems gespeichert werden. Die Collection soll sortiert sein. Beim tauschen zweier Elemente kommt allerdings eine Fehlermeldung.
Delphi-Quellcode:
Warum dieser Fehler??
type
TItem = class(TCollectionItem) private FVar: String; public property Var: String read FVar write FVar; end; TMyList = class(TCollection) private function GetItem(index: Integer): TItem; procedure SetItem(index: Integer; Value: TItem); public property Items[index: Integer]: TItem read GetItem write SetItem;default; end; procedure TMyList.SetItem(index: Integer; const Value: TItem); begin inherited SetItem(index,Value); end; function TMyList.GetItem(index: Integer): TItem; begin Result:=inherited GetItem(index) as TItem; end; // Anwendung var buffer: TItem; buffer:=myList[0]; myList[0]:=myList[1] // FEHLER: TItem kann nicht zu TItem zugewiesen werden???? Danke Baeuerle |
Re: TCollection und TCollectionItem
Woran der Fehler liegt kann ich dir jetzt nicht sagen, aber:
Falls das BubbleSort ist denk daran, dass das ein extrem langsamer Sortieralgo. ist. Wenn es mehr als eine Hand voll Items sind, steig auf einen anderen um :-D *feierabend mach* |
Re: TCollection und TCollectionItem
Delphi-Quellcode:
verweisst nicht auf die Originalinstanz der Klasse, sondern auf eine Kopie.
MyList[0]
Deine Listklasse braucht noch eine Methode, um Elemente zu tauschen. :) z.B.
Delphi-Quellcode:
myList.SwitchElements(0, 1);
|
Re: TCollection und TCollectionItem
Hallo,
danke für die Antworten, ich habe allerdings noch zwei Fragen. 1) Bei anderen Objekten z.b. TStringList kann ich doch auch einen Eintrag direkt mit TStringlist[i]:='Test' setzen, warum geht das bei einer Collection nicht? 2) Ich habe entdeckt, dass bei TCollectionItem eine Eigenschaft Index vorhanden ist, mit der man direkt die Position eines vorhandenen Eintrages geändert werden kann. Sollte ich dann einfach den Index ändern um die Objekte zu tauschen? Thx Baeuerle |
Re: TCollection und TCollectionItem
Das ist ganz einfach:
Die Standard-Methode in TCollectionItem für das Zuweisen ist die Assign-Methode. Da du selbige nicht überschrieben hast, wird die Standardmethode aufgerufen und diese wirft den Fehler aus, da sie nicht weiß, was sie machen soll. Beispiel:
Delphi-Quellcode:
Dann sollte es funktionieren :)
type
TItem = class(TCollectionItem) private FVar: String; public procedure Assign(pt:TPersistent);override; property Var: String read FVar write FVar; end; : : procedure TItem.Assign(pt:TPersistent);override; begin if (pt is TItem) then begin fvar := TItem(pt).var; end else inherited assign(pt); end; |
Re: TCollection und TCollectionItem
Soweit ganz richtig jedoch verliere ich den Wert!!
BSP:
Delphi-Quellcode:
Warum bzw. wie kann ich dies vermeiden?item: TMyItem; list: TMyCollection; item:=list[0]; list[0]:=list[1]; // IN DIESEM MOMENT WIRD AUCH ITEM ÜBERSCHRIEBEN !!!! -> das soll nicht sein!!!! list[1]:=item; Assign wurde eingebunden. |
Re: TCollection und TCollectionItem
Anstatt
Delphi-Quellcode:
so
item:=list[0];
Delphi-Quellcode:
?! ...
Item.Assign(List[0]);
|
Re: TCollection und TCollectionItem
Vielen Dank sn alle Beteiligten es funktioniert :P
|
Re: TCollection und TCollectionItem
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:22 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