Forum: Programmieren allgemein
Delphi
by jaenicke,
14. Jun 2017
Wer hat denn geschrieben, dass du in dem Destroy eines einzelnen (!) TSprite auf die Liste aller (!) Sprites zugreifen sollst? Ich hatte doch schon geschrieben wie es aussehen muss:
Forum: Programmieren allgemein
Delphi
by jaenicke,
14. Jun 2017
Du kannst den Destruktor doch jederzeit hinzufügen: TSprite = class
CtrlName: WideString;
CtrlIndex: Integer;
Left: Single;
Top: Single;
Width: Integer;
Height: Integer;
Scale: Single;
Opacity: Byte;
ShellTo: string;
Forum: Programmieren allgemein
Delphi
by jaenicke,
14. Jun 2017
Genau, sauberer wäre aber, wenn sich ein TSprite selbst darum kümmern würde. Sprich statt: for X := 0 to Sprites.Count - 1 do
begin
if Sprites.h_Bitmap <> 0 then
begin
DeleteObject(Sprites.h_Bitmap);
Sprites.h_Bitmap := 0;
end;
end;
Sprites.Free;So:type
TSprite = class
Forum: Programmieren allgemein
Delphi
by jaenicke,
14. Jun 2017
Befinden diese sich ebenfalls in der Klasse? Dann kannst du einfach den Destruktor überschreiben und das dort machen. Dann musst du dich nicht darum kümmern, dass das vorher passiert. Der wird dann automatisch aufgerufen, wenn die Liste das Objekt freigibt.
Forum: Programmieren allgemein
Delphi
by jaenicke,
13. Jun 2017
Es ist ein indexbasierter Zugriff. Ob auf ein Array oder eine Liste kann man an der Zeile nicht unterscheiden.
Im Falle einer Liste läuft das ganze auf eine Index-Property mit einer Getter-Methode, die das Element zurückliefert.
Sinnvoll ist aus Performancegründen natürlich eher ohne die vielen Indexzugriffe zu arbeiten und das aktuelle Element in eine Variable zu packen:
var
Sprites:...
Forum: Programmieren allgemein
Delphi
by jaenicke,
13. Jun 2017
Ich sehe da nur, dass da ein High(Sprite) ersetzt werden muss durch Sprite.Count - 1 wie im Beispiel und es muss noch das einzelne Sprite (Für die Liste wäre nebenbei Sprites im Plural sinnvoller, dann müsste ich das nicht betonen) erzeugt werden:// statt Setlength(Sprite, Count + 1);
Sprite.Add(TSprite.Create);
Sprite.Top := Bottom;
...
Forum: Programmieren allgemein
Delphi
by jaenicke,
13. Jun 2017
type
TSprite = class
CtrlName: WideString;
CtrlIndex: Integer;
...
end;
var
Sprite: TObjectList<TSprite>;
Forum: Programmieren allgemein
Delphi
by jaenicke,
13. Jun 2017
if Assigned(Sprite) then
begin
if Sprite.Count - 1 > ID_MAIN then
begin
for K := ID_FIRST to Sprite.Count - 1 do
begin
if Sprite.h_Bitmap <> 0 then
begin
DeleteObject(Sprite.h_Bitmap);
Sprite.h_Bitmap := 0;
Forum: Programmieren allgemein
Delphi
by jaenicke,
13. Jun 2017
Beides, TSprite als Klasse und TList<TSprite>. Das hatte hoika auch so gemeint.
Du kannst die TList genauso ansprechen wie ein Array, sprich mit Liste und intern wird auch ein Array verwendet. Aber du musst dich eben nicht um die entsprechenden Arrayoperationen kümmern, wenn du Einträge hinzufügst, löschst, usw.
Du kannst natürlich auch TList<PSprite> mit deinem Record benutzen, aber musst...
Forum: Programmieren allgemein
Delphi
by jaenicke,
13. Jun 2017
Genau das ist der Vorteil einer Klasse. Da kannst du einfach TSprite als Typ für die Liste nehmen und es ist trotzdem ein Pointer.var
Sprite: TSprite;
begin
Sprite := TSprite.Create;
Sprite.IconPath := ExtractFilePath(ParamStr(0)) + 'UserIcon\48x48\' + sUseThumb;
IconPath := SpriteIconPath;
Sprite.h_Bitmap := CreateIcon.CreateCustomIcon(IconPath, Width, Height, 0);
...
Forum: Programmieren allgemein
Delphi
by jaenicke,
12. Jun 2017
Was enthalten denn die Strings, die in die Stringliste sollen? Willst du darüber die Sprites finden?
Dann könntest du synchron zur Stringlist noch eine TList<TSprite> verwenden und immer am gleichen Index den String in der Stringliste und dein Sprite in der TList<TSprite> haben.