![]() |
Record zu TStringlist hinzufügen
Ich möchte meinen Record zu einer StringListe hinzufügen.
Delphi-Quellcode:
Ich muss aber in der Lage sein aus dieser Liste zum Beispiel auf das h_Bitmap zuzugreifen.
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; Oder würdet ihr etwas anderes verwenden ? Ich möchte von dem Array TSprite weg und alles über eine Liste regeln. gruss |
AW: Redord zu TStringlist hinzufügen
StringListen haben doch das Object-Property oder nicht? Da kann man doch Daten ablegen.
|
AW: Redord zu TStringlist hinzufügen
Records sind keine Objekte, daher kannst Du diese nicht in einer StringList speichern. Records werden immer im Ganzen kopiert, nicht nur deren Pointer.
...:cat:... |
AW: Redord zu TStringlist hinzufügen
Was sagt mir das jetzt das es nicht funktioniert?
Wie könnte ich denn so was über eine eigene Liste verwirklichen wenn es nicht geht. Hier ist ein ähnliches Beispiel. ![]() NUR! Wie komme ich dann an die einzelnen Objekte des Record in der Liste. gruss |
AW: Redord zu TStringlist hinzufügen
Zitat:
Delphi-Quellcode:
dann kannst du den Pointer in die StringListe hauen.
= class
Wenn du den Zugriff über den Index nicht brauchst, dann verwende ein TObjectDictionary. Habe vor Kurzem auch erst umgestellt. |
AW: Redord zu TStringlist hinzufügen
Zitat:
Und wenn ich den Record jetzt in eine Class auslagern soll.. dann ist mir das zu viel Arbeit;) es gibt unter C++ eine möglichkeit in der WinNT.h
Code:
gruss
#define CONTAINING_RECORD(address, type, field) ((type *)( \
(PCHAR)(address) - \ (ULONG_PTR)(&((type *)0)->field))) |
AW: Redord zu TStringlist hinzufügen
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. |
AW: Redord zu TStringlist hinzufügen
Zitat:
Ich möchte den Record in die Liste packen und daraus die Variablen des Records auslesen können. So wie ich das verstanden habe geht es wohl nicht. gruss |
AW: Redord zu TStringlist hinzufügen
Zitat:
|
AW: Redord zu TStringlist hinzufügen
Zitat:
gruss |
AW: Redord zu TStringlist hinzufügen
Wenn kein ARC in Sicht ist,
dann Pointere doch einfach bissl rum. |
AW: Redord zu TStringlist hinzufügen
Zitat:
Gruß K-H |
AW: Redord zu TStringlist hinzufügen
Dann gehts nicht.
|
AW: Redord zu TStringlist hinzufügen
Was geht nicht?
Gruß K-H |
AW: Redord zu TStringlist hinzufügen
Record in Stringliste ablegen.
|
AW: Redord zu TStringlist hinzufügen
Nee, aber Zeiger auf Records ginge
oder Records in Dataobjekten. Oder seit D2009 eine generische TList<Record> bzw. vermutlich eher ein TDictionary<String,Record> |
AW: Redord zu TStringlist hinzufügen
Zitat:
geht jetzt.
Delphi-Quellcode:
SpriteList: TList<TSprite>;
Delphi-Quellcode:
SpriteList := TList<TSprite>.Create();
Allerdings meldet er nun das der linken Seite nichts zugewiesen werden kann.
Delphi-Quellcode:
SpriteList.Items[K].Left := ..
Wieder so ein Sonderfall ;) gruss |
AW: Redord zu TStringlist hinzufügen
Zitat:
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. :zwinker: |
AW: Redord zu TStringlist hinzufügen
Zitat:
Ich muss die einzelnen Variablen im Record verändern können. selbst das funktioniert nicht einmal
Delphi-Quellcode:
Sprite := @SpriteList.Items[Prop.RecycleBin];
Variable erforderlich. OK Danke denke das kann man dann getrost vergessen. gruss |
AW: Redord zu TStringlist hinzufügen
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:
Du willst einen Record, also mußt du auch mit den Nachteilen leben.
procedure SetFeldAbc(Index: Integer; Value: TAbc);
var Temp: T; begin //InternesArray[Index].Abc := Value; Temp := Items[Index]; Temp.Abc := Value; Items[Index] := Temp; end; 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. |
AW: Redord zu TStringlist hinzufügen
Zitat:
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 |
AW: Redord zu TStringlist hinzufügen
Hallo,
nicht immer gleich den Compiler ins Korn werfen. Zitat:
Delphi-Quellcode:
Nun noch das Erzeugen vorm Add nicht vergessen
type
TSprite = packed record type TSprite = class type TSpriteListe = class(TObjectList) TSpriteListe = TList<TSprite> |
AW: Redord zu TStringlist hinzufügen
Zitat:
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:
Das will ich dann so ändern.
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;
Delphi-Quellcode:
Vorausgesetzt ich bekomme das mit der Liste hin und es bringt mir einen Vorteil.
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; Irgendwo muss ich ja dann auch wissen welches Icon gerade in Verwendung bzw. zugewiesen wird. gruss |
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; |
AW: Redord zu TStringlist hinzufügen
Zitat:
Delphi-Quellcode:
Den Record möchte ich nicht verändern und extra eine Classe anlegen da habe ich meinen Pointer PSprite.
type
TSprite = packed record type TSprite = class type TSpriteListe = class(TObjectList) TSpriteListe = TList<TSprite>
Delphi-Quellcode:
Bin mir noch nicht sicher ob mir das Vorteile bringt.
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; 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 |
AW: Redord zu TStringlist hinzufügen
Zitat:
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. |
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:
oder
Sprite : Array of TList<TSprite>;
Delphi-Quellcode:
jetzt ist es so.
Sprite : Array of class(TObjectList);
Delphi-Quellcode:
Sprite : TArray<TSprite>;
bringt nicht wirklich was. Oder aber ich bin einfach zu dumm dafür :) gruss |
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 |
AW: Redord zu TStringlist hinzufügen
Zitat:
Ich will es nicht. gruss |
AW: Record zu TStringlist hinzufügen
Du brauchst es ja auch nicht ;)
|
AW: Redord zu TStringlist hinzufügen
Zitat:
Vielleicht nochmal kurz die Grundlagen nachlesen: ![]() Alle wesentlichen und richtigen Lösungen wurden dir hier schon genannt. Du musst dich nur von alten Denkmustern lösen und einfach übernehmen was DeddyH und jaenicke in den letzten paar Beiträgen gezeigt haben. |
AW: Record zu TStringlist hinzufügen
Zitat:
Wenn man nicht davor sitzt ist alles einfach. ganz kleines Beispiel. (Das ist noch eins der einfachsten Dinge) Dann setz mir das mal um auf der Basis wie hier angegeben. Ohne Array wohlbemerkt.
Delphi-Quellcode:
Wenn man keinen Index mehr hat um die Sprites zu identifizieren ist das nicht mal gerade so dahin geworfen.
if Assigned(Sprite) then
begin if High(Sprite) > ID_MAIN then begin for K := ID_FIRST to High(Sprite) do begin if Sprite[K].h_Bitmap <> 0 then begin DeleteObject(Sprite[K].h_Bitmap); Sprite[K].h_Bitmap := 0; ZeroMemory(@Sprite[K], SizeOf(TSprite)); end; end; end; end; gruss |
AW: Record zu TStringlist hinzufügen
Delphi-Quellcode:
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[K].h_Bitmap <> 0 then begin DeleteObject(Sprite[K].h_Bitmap); Sprite[K].h_Bitmap := 0; ZeroMemory(@Sprite[K], SizeOf(TSprite)); end; end; end; end; |
AW: Record zu TStringlist hinzufügen
Sprite hat kein Count.
Das habe ich alles schon durch. Dann noch ein anderes nichts machen nur schauen. Wie gesagt das ist nicht mal so eben gemacht. Ich glaube lasse es lieber sein. :) gruss |
AW: Record zu TStringlist hinzufügen
Delphi-Quellcode:
type
TSprite = class CtrlName: WideString; CtrlIndex: Integer; ... end; var Sprite: TObjectList<TSprite>; |
AW: Record zu TStringlist hinzufügen
Zitat:
Siehe Beitrag über den deinen. gruss |
AW: Record zu TStringlist hinzufügen
Wieso nicht? Ich sehe da auf Anhieb nichts in Deinem Code, das unbedingt Records und Arrays brauchen würde.
|
AW: Record zu TStringlist hinzufügen
Zitat:
Delphi-Quellcode:
ersetzt werden muss durch
High(Sprite)
Delphi-Quellcode:
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:
Sprite.Count - 1
Delphi-Quellcode:
// statt Setlength(Sprite, Count + 1);
Sprite.Add(TSprite.Create); Sprite[Count].Top := Bottom; ... |
AW: Record zu TStringlist hinzufügen
Zitat:
Found, Count, FlagFound, Prop.RecycleBin ?
Delphi-Quellcode:
Sprite[Count].Top := Bottom;
Das ist ein Array oder? Und das wollte ich nicht! (Dann kann ich es auch so belassen wie es ist) Somit hat sich das erledigt. Danke für eure Teilnahme! gruss |
AW: Record zu TStringlist hinzufügen
Nochmal ganz langsam: wie spricht man ein Array-Element an?
Delphi-Quellcode:
Und ein Listenelement?
Array[Index]
Delphi-Quellcode:
Mal abgesehen von Low() und High() müsste am Zugriff auf die Elemente doch nichts ändern. Sry, ich verstehe Deine Einwände nicht.
List[Index]
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:37 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