AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TCollection und TCollectionItem

Ein Thema von Baeuerle · begonnen am 29. Nov 2007 · letzter Beitrag vom 30. Nov 2007
Antwort Antwort
Baeuerle

Registriert seit: 17. Mär 2005
Ort: Ettenheim
283 Beiträge
 
Delphi 2005 Professional
 
#1

TCollection und TCollectionItem

  Alt 29. Nov 2007, 15:37
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
  Mit Zitat antworten Zitat
Benutzerbild von Deep-Sea
Deep-Sea

Registriert seit: 17. Jan 2007
907 Beiträge
 
Delphi XE2 Professional
 
#2

Re: TCollection und TCollectionItem

  Alt 29. Nov 2007, 15:49
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



*feierabend mach*
Chris
Die Erfahrung ist ein strenger Schulmeister: Sie prüft uns, bevor sie uns lehrt.
  Mit Zitat antworten Zitat
Benutzerbild von ste_ett
ste_ett

Registriert seit: 10. Sep 2004
Ort: Dülmen
464 Beiträge
 
Delphi 7 Professional
 
#3

Re: TCollection und TCollectionItem

  Alt 29. Nov 2007, 16:37
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.

myList.SwitchElements(0, 1);
Stefan
"Geht nicht!" ist keine Fehlerbeschreibung und "Hab ich schon versucht!" keine Antwort!

Hey, it compiles! Ship it!
  Mit Zitat antworten Zitat
Baeuerle

Registriert seit: 17. Mär 2005
Ort: Ettenheim
283 Beiträge
 
Delphi 2005 Professional
 
#4

Re: TCollection und TCollectionItem

  Alt 30. Nov 2007, 06:54
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
  Mit Zitat antworten Zitat
Ghostwalker

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

Re: TCollection und TCollectionItem

  Alt 30. Nov 2007, 07:21
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
Uwe
e=mc² or energy = milk * coffee²
  Mit Zitat antworten Zitat
Baeuerle

Registriert seit: 17. Mär 2005
Ort: Ettenheim
283 Beiträge
 
Delphi 2005 Professional
 
#6

Re: TCollection und TCollectionItem

  Alt 30. Nov 2007, 08:29
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.
  Mit Zitat antworten Zitat
Benutzerbild von Deep-Sea
Deep-Sea

Registriert seit: 17. Jan 2007
907 Beiträge
 
Delphi XE2 Professional
 
#7

Re: TCollection und TCollectionItem

  Alt 30. Nov 2007, 08:35
Anstatt
item:=list[0]; so
Item.Assign(List[0]); ?! ...
Chris
Die Erfahrung ist ein strenger Schulmeister: Sie prüft uns, bevor sie uns lehrt.
  Mit Zitat antworten Zitat
Baeuerle

Registriert seit: 17. Mär 2005
Ort: Ettenheim
283 Beiträge
 
Delphi 2005 Professional
 
#8

Re: TCollection und TCollectionItem

  Alt 30. Nov 2007, 08:41
Vielen Dank sn alle Beteiligten es funktioniert
  Mit Zitat antworten Zitat
Benutzerbild von Deep-Sea
Deep-Sea

Registriert seit: 17. Jan 2007
907 Beiträge
 
Delphi XE2 Professional
 
#9

Re: TCollection und TCollectionItem

  Alt 30. Nov 2007, 08:45
Zitat von Baeuerle:
Vielen Dank sn alle Beteiligten es funktioniert
Denk daran, dein temporäres Item wieder frei zu geben
Chris
Die Erfahrung ist ein strenger Schulmeister: Sie prüft uns, bevor sie uns lehrt.
  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 15:08 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