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, 23:11
Nee, aber Zeiger auf Records ginge
oder Records in Dataobjekten.

Oder seit D2009 eine generische TList<Record> bzw. vermutlich eher ein TDictionary<String,Record>
funktioniert nicht wirklich.
geht jetzt.
SpriteList: TList<TSprite>;   SpriteList := TList<TSprite>.Create();

Allerdings meldet er nun das der linken Seite nichts zugewiesen werden kann.
SpriteList.Items[K].Left := ..
Wieder so ein Sonderfall

gruss

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

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

AW: Redord zu TStringlist hinzufügen

  Alt 12. Jun 2017, 23:44
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.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#3

AW: Redord zu TStringlist hinzufügen

  Alt 12. Jun 2017, 23: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 (13. Jun 2017 um 00:24 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Redord zu TStringlist hinzufügen

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

n/a Beiträge
 
#5

AW: Redord zu TStringlist hinzufügen

  Alt 13. Jun 2017, 01: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 03:54 Uhr)
  Mit Zitat antworten Zitat
hoika

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

AW: Redord zu TStringlist hinzufügen

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

AW: Redord zu TStringlist hinzufügen

  Alt 13. Jun 2017, 06: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
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 05:44 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 by Thomas Breitkreuz