AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Record zu TStringlist hinzufügen
Thema durchsuchen
Ansicht
Themen-Optionen

Record zu TStringlist hinzufügen

Ein Thema von EWeiss · begonnen am 12. Jun 2017 · letzter Beitrag vom 14. Jun 2017
Antwort Antwort
EWeiss
(Gast)

n/a Beiträge
 
#1

AW: Redord zu TStringlist hinzufügen

  Alt 12. Jun 2017, 22:49
Wieder so ein Sonderfall
Nee, das ist schon immer so, wenn man einen Record als Property-Typ nutzt.

Es kann immer nur ein kompletter Record geändert werden, was auch klar, da es entweder der Getter oder der Setter benutzt wird und leider niemals Beides (außer man macht es selber) und da Records auch keine Referenzen sind, wie z.B. ein Objekt.
Aber genau das möchte ich ansonsten macht es keinen sinn.
Ich muss die einzelnen Variablen im Record verändern können.

selbst das funktioniert nicht einmal

Sprite := @SpriteList.Items[Prop.RecycleBin];

Variable erforderlich.
OK Danke denke das kann man dann getrost vergessen.

gruss

Geändert von EWeiss (12. Jun 2017 um 23:24 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.376 Beiträge
 
Delphi 12 Athens
 
#2

AW: Redord zu TStringlist hinzufügen

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

Dann doch eher die TList abbauen und veränderbare Felder als eigene Property einbauen
und intern dann jeweils

Delphi-Quellcode:
procedure SetFeldAbc(Index: Integer; Value: TAbc);
var
  Temp: T;
begin
  //InternesArray[Index].Abc := Value;
  Temp := Items[Index];
  Temp.Abc := Value;
  Items[Index] := Temp;
end;
Du willst einen Record, also mußt du auch mit den Nachteilen leben.


Alternativ kann man auch ein TArray<TDeinRecord> verwenden.
Aber die Arraymanipulation (mit Ausnahme des Copy und einer binären Suche für sortierte Arrays) sind im "älteren" Delphi noch spärlich integriert, vorallem Delete und Insert.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (13. Jun 2017 um 00:13 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#3

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.277 Beiträge
 
Delphi 10.4 Sydney
 
#4

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
 
#5

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.961 Beiträge
 
Delphi 12 Athens
 
#6

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
AppCentral
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#7

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
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 11:14 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz