Delphi-PRAXiS
Seite 3 von 10     123 45     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Record zu TStringlist hinzufügen (https://www.delphipraxis.net/193030-record-zu-tstringlist-hinzufuegen.html)

EWeiss 13. Jun 2017 00:13

AW: Redord zu TStringlist hinzufügen
 
Zitat:

Zitat von himitsu (Beitrag 1374340)
Selbst wenn es funktionieren würde, würde es dich nicht helfen, denn das "Result" ist eine Kopie des Inhalts.

Man kann der TList<> ein neues Items-Property verpassen, welches einen Pointer raus gibt, der auf das Items im internen Record zeigt.
Ist natürlich nicht standardmäßig eingebaut, da es ein Sonderfall und außerdem "unsicher" ist.

Ok Danke!
Ich versuche es mal mit dem Vorschlag von SneakyBagels und erstelle eine Classe für den Kram.

EDIT:
Hat sich erledigt zu viel Aufwand und bringt keinerlei Verbesserung.

gruss

hoika 13. Jun 2017 05:40

AW: Redord zu TStringlist hinzufügen
 
Hallo,
nicht immer gleich den Compiler ins Korn werfen.

Zitat:

Hat sich erledigt zu viel Aufwand und bringt keinerlei Verbesserung.
Delphi-Quellcode:
type
  TSprite = packed record

type
  TSprite = class

type
  TSpriteListe = class(TObjectList)
  TSpriteListe = TList<TSprite>
Nun noch das Erzeugen vorm Add nicht vergessen

EWeiss 13. Jun 2017 05:55

AW: Redord zu TStringlist hinzufügen
 
Zitat:

Zitat von hoika (Beitrag 1374345)
Hallo,
nicht immer gleich den Compiler ins Korn werfen.

Zitat:

Hat sich erledigt zu viel Aufwand und bringt keinerlei Verbesserung.
Delphi-Quellcode:
type
  TSprite = packed record

type
  TSprite = class

type
  TSpriteListe = class(TObjectList)
  TSpriteListe = TList<TSprite>
Nun noch das Erzeugen vorm Add nicht vergessen

Ohh.. So geht das ?
Dachte müsste meinen Record als Classe auslegen.

OK werde das nochmal versuchen.
Heute Nacht habe ich erst mal das kopieren der Icons in den Temp Ordner entfernt.
Diese werden jetzt direkt erstellt und anschließend sofort wieder frei gegeben.

Warum ich das so machen will mit der Liste.
Ich möchte kein Array mehr verwenden sondern die Sprites auf diese weise ansprechen ob das so geht da bin ich mir noch nicht so sicher.

Im Moment ist es so.
Delphi-Quellcode:
    Sprite[Prop.RecycleBin].IconPath := ExtractFilePath(ParamStr(0)) + 'UserIcon\48x48\' + sUseThumb;
    IconPath := Sprite[Prop.RecycleBin].IconPath;
    Sprite[Prop.RecycleBin].h_Bitmap := CreateIcon.CreateCustomIcon(IconPath, Width, Height, 0);
    Sprite[Prop.RecycleBin].Width := Width;
    Sprite[Prop.RecycleBin].Height := Height;
    Sprite[Prop.RecycleBin].ShellTo := 'explorer.exe';
    Sprite[Prop.RecycleBin].CmdLine := '/N;::{645FF040-5081-101B-9F08-00AA002F954E}';
    Sprite[Prop.RecycleBin].ShowCmd := SW_SHOW;
Das will ich dann so ändern.
Delphi-Quellcode:
var
  Sprite : PSprite;
begin
    Sprite.IconPath := ExtractFilePath(ParamStr(0)) + 'UserIcon\48x48\' + sUseThumb;
    IconPath := SpriteIconPath;
    Sprite.h_Bitmap := CreateIcon.CreateCustomIcon(IconPath, Width, Height, 0);
    Sprite.Width := Width;
    Sprite.Height := Height;
    Sprite.ShellTo := 'explorer.exe';
    Sprite.CmdLine := '/N;::{645FF040-5081-101B-9F08-00AA002F954E}';
    Sprite.ShowCmd := SW_SHOW;
end;
Vorausgesetzt ich bekomme das mit der Liste hin und es bringt mir einen Vorteil.
Irgendwo muss ich ja dann auch wissen welches Icon gerade in Verwendung bzw. zugewiesen wird.

gruss

jaenicke 13. Jun 2017 06:02

AW: Redord zu TStringlist hinzufügen
 
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.
Delphi-Quellcode:
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);
  Sprite.Width := Width;
  Sprite.Height := Height;
  Sprite.ShellTo := 'explorer.exe';
  Sprite.CmdLine := '/N;::{645FF040-5081-101B-9F08-00AA002F954E}';
  Sprite.ShowCmd := SW_SHOW;

  Liste.Add(Sprite);
end;

EWeiss 13. Jun 2017 06:07

AW: Redord zu TStringlist hinzufügen
 
Zitat:

Zitat von jaenicke (Beitrag 1374347)
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.
Delphi-Quellcode:
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);
  Sprite.Width := Width;
  Sprite.Height := Height;
  Sprite.ShellTo := 'explorer.exe';
  Sprite.CmdLine := '/N;::{645FF040-5081-101B-9F08-00AA002F954E}';
  Sprite.ShowCmd := SW_SHOW;

  Liste.Add(Sprite);
end;

Hmm hatte eigentlich vor es so zu machen wie hoika es beschrieben hatte.

Delphi-Quellcode:
type
   TSprite = packed record

type
   TSprite = class

type
   TSpriteListe = class(TObjectList)
   TSpriteListe = TList<TSprite>
Den Record möchte ich nicht verändern und extra eine Classe anlegen da habe ich meinen Pointer PSprite.
Delphi-Quellcode:
  TSprite = packed Record
    CtrlName: WideString;
    CtrlIndex: Integer;
    Left: Single;
    Top: Single;
    Width: Integer;
    Height: Integer;
    Scale: Single;
    Opacity: Byte;
    ShellTo: string;
    IconPath: WideString;
    WorkDir: WideString;
    UseLabel: string;
    CmdLine: WideString;
    ShowCmd: longint;
    h_Bitmap: HBitmap;
    Visible: Bool;
  end;
  PSprite = ^TSprite;
Bin mir noch nicht sicher ob mir das Vorteile bringt.
Auch bei einer TList muss ich unter umständen mit einem Array Arbeiten dann wäre es das gleiche wie vorher.
Hmmm :stupid: Iregendwie bin ich mir nicht sicher wie er das meint..
Entweder oder?

class oder TList<TSprite> ?
Habe ich beides schon versucht bringt nicht wirklich was.

gruss

jaenicke 13. Jun 2017 06:21

AW: Redord zu TStringlist hinzufügen
 
Zitat:

Zitat von EWeiss (Beitrag 1374349)
Auch bei einer TList muss ich unter umständen mit einem Array Arbeiten dann wäre es das gleiche wie vorher.
[...]
class oder TList<TSprite> ?
Habe ich beides schon versucht bringt nicht wirklich was.

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[i] 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 dann wie bei einer Klasse den Speicher vorher reservieren und hinterher freigeben. Du hast aber den Nachteil, dass es passieren kann, dass der ganze Record kopiert wird, wenn du irgendwo nicht nur mit dem Pointer arbeiten kannst. Eine Klasse ist immer ein Pointer, da kann nicht mehr als der Pointer automatisch kopiert werden.

Einfacher ist es aber eine TObjectList<TSprite> zu benutzen, TSprite als Klasse zu implementieren (sprich einfach oben packed record durch class ersetzen) und TSprite vor dem Hinzufügen wie ich im Quelltext gezeigt habe zu erzeugen. Wenn du dann den Eintrag aus der Liste löschst, wird dein TSprite auch automatisch freigegeben, darum musst du dich nicht kümmern.

EWeiss 13. Jun 2017 06:22

AW: Redord zu TStringlist hinzufügen
 
Delphi-Quellcode:
Sprite := TSprite.Create;


Bringt mir nichts auch wenn ich jetzt den Record als Classe auslege.
Denn dann müsste ich auch hier ein Array anlegen dann kann ich es direkt so belassen wie es ist.

Ich habe ja nicht nur ein Sprite das können 100 sein.

Dann würde das ganze so aussehen.
Delphi-Quellcode:
Sprite : Array of TList<TSprite>;
oder
Delphi-Quellcode:
Sprite : Array of class(TObjectList);
jetzt ist es so.
Delphi-Quellcode:
Sprite : TArray<TSprite>;


bringt nicht wirklich was.
Oder aber ich bin einfach zu dumm dafür :)

gruss

DeddyH 13. Jun 2017 06:38

AW: Redord zu TStringlist hinzufügen
 
Was willst Du denn immer mit dem Array?
Delphi-Quellcode:
uses System.Generics.Collections;

...

var
  SpriteList: TObjectList<TSprite>;
  Sprite: TSprite;
begin
  Sprite := TSprite.Create;
  Sprite.Width := 42;
  //Weitere Eigenschaften setzen
  Sprites.Add(Sprite);

  //Weitere Sprites erzeugen und der Liste nach obigem Muster hinzufügen
  ...

  //Liste durchlaufen
  for Sprite in Sprites do

  //oder
  for i := 0 to Sprites.Count - 1 do

EWeiss 13. Jun 2017 06:46

AW: Redord zu TStringlist hinzufügen
 
Zitat:

Was willst Du denn immer mit dem Array?
Das ist die frage ;)
Ich will es nicht.

gruss

DeddyH 13. Jun 2017 07:06

AW: Record zu TStringlist hinzufügen
 
Du brauchst es ja auch nicht ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:16 Uhr.
Seite 3 von 10     123 45     Letzte »    

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