Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi TCollection und TCollectionItem (https://www.delphipraxis.net/104224-tcollection-und-tcollectionitem.html)

Baeuerle 29. Nov 2007 14:37


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:
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????
Warum dieser Fehler??

Danke Baeuerle

Deep-Sea 29. Nov 2007 14:49

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*

ste_ett 29. Nov 2007 15:37

Re: TCollection und TCollectionItem
 
Delphi-Quellcode:
MyList[0]
verweisst nicht auf die Originalinstanz der Klasse, sondern auf eine Kopie.
Deine Listklasse braucht noch eine Methode, um Elemente zu tauschen. :)

z.B.

Delphi-Quellcode:
myList.SwitchElements(0, 1);

Baeuerle 30. Nov 2007 05:54

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

Ghostwalker 30. Nov 2007 06:21

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:
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;
Dann sollte es funktionieren :)

Baeuerle 30. Nov 2007 07:29

Re: TCollection und TCollectionItem
 
Soweit ganz richtig jedoch verliere ich den Wert!!

BSP:
Delphi-Quellcode:

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;
Warum bzw. wie kann ich dies vermeiden?

Assign wurde eingebunden.

Deep-Sea 30. Nov 2007 07:35

Re: TCollection und TCollectionItem
 
Anstatt
Delphi-Quellcode:
item:=list[0];
so
Delphi-Quellcode:
Item.Assign(List[0]);
?! ...

Baeuerle 30. Nov 2007 07:41

Re: TCollection und TCollectionItem
 
Vielen Dank sn alle Beteiligten es funktioniert :P

Deep-Sea 30. Nov 2007 07:45

Re: TCollection und TCollectionItem
 
Zitat:

Zitat von Baeuerle
Vielen Dank sn alle Beteiligten es funktioniert :P

Denk daran, dein temporäres Item wieder frei zu geben :wink:


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