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
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
10.023 Beiträge
 
Delphi 12 Athens
 
#1

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

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
10.023 Beiträge
 
Delphi 12 Athens
 
#3

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

n/a Beiträge
 
#4

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

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

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

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
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.079 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Redord zu TStringlist hinzufügen

  Alt 13. Jun 2017, 07:11
Zitat:
Was willst Du denn immer mit dem Array?
Das ist die frage
Ich will es nicht.
Schlaf mal drüber und dann danach mit frischen Kräften ans Werk.

Vielleicht nochmal kurz die Grundlagen nachlesen: https://downloads.delphi-treff.de/DelphiStarter.pdf ab Seite 132.

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

n/a Beiträge
 
#9

AW: Record zu TStringlist hinzufügen

  Alt 13. Jun 2017, 07:16
Zitat:
Du musst dich nur von alten Denkmustern lösen und einfach übernehmen was DeddyH und jaenicke in den letzten paar Beiträgen gezeigt haben.
Ja, ja..
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:
  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;
Wenn man keinen Index mehr hat um die Sprites zu identifizieren ist das nicht mal gerade so dahin geworfen.

gruss

Geändert von EWeiss (13. Jun 2017 um 07:21 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 02:26 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