AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Record zu TStringlist hinzufügen

Record zu TStringlist hinzufügen

Ein Thema von EWeiss · begonnen am 12. Jun 2017 · letzter Beitrag vom 14. Jun 2017
Antwort Antwort
Seite 3 von 10     123 45     Letzte » 
EWeiss
(Gast)

n/a Beiträge
 
#21

AW: Redord zu TStringlist hinzufügen

  Alt 13. Jun 2017, 00:13
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

Geändert von EWeiss (13. Jun 2017 um 02:54 Uhr)
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#22

AW: Redord zu TStringlist hinzufügen

  Alt 13. Jun 2017, 05:40
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
Heiko
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#23

AW: Redord zu TStringlist hinzufügen

  Alt 13. Jun 2017, 05:55
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
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.323 Beiträge
 
Delphi 11 Alexandria
 
#24

AW: Redord zu TStringlist hinzufügen

  Alt 13. Jun 2017, 06:02
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;
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#25

AW: Redord zu TStringlist hinzufügen

  Alt 13. Jun 2017, 06:07
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 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

Geändert von EWeiss (13. Jun 2017 um 06:12 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.323 Beiträge
 
Delphi 11 Alexandria
 
#26

AW: Redord zu TStringlist hinzufügen

  Alt 13. Jun 2017, 06:21
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.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#27

AW: Redord zu TStringlist hinzufügen

  Alt 13. Jun 2017, 06:22
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.
Sprite : Array of TList<TSprite>; oder
Sprite : Array of class(TObjectList); jetzt ist es so.
Sprite : TArray<TSprite>;

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

gruss

Geändert von EWeiss (13. Jun 2017 um 06:28 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.535 Beiträge
 
Delphi 11 Alexandria
 
#28

AW: Redord zu TStringlist hinzufügen

  Alt 13. Jun 2017, 06:38
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
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#29

AW: Redord zu TStringlist hinzufügen

  Alt 13. Jun 2017, 06:46
Zitat:
Was willst Du denn immer mit dem Array?
Das ist die frage
Ich will es nicht.

gruss
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.535 Beiträge
 
Delphi 11 Alexandria
 
#30

AW: Record zu TStringlist hinzufügen

  Alt 13. Jun 2017, 07:06
Du brauchst es ja auch nicht
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 09:40 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