Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Bilder in einer Liste (https://www.delphipraxis.net/55101-bilder-einer-liste.html)

tobi1701 16. Okt 2005 20:25


Bilder in einer Liste
 
hallo,

ich bin gerade dabei eine kleine datenbank für mich zu erstellen, ich habe eine lange pause in der programmierung hinter mir und nutze das auch, um wieder "reinzukommen".

so, ich habe folgendes problem. ich habe ein record erstellt (der datenbankeintrag), der text und bilder enthalten soll.

Delphi-Quellcode:
type
  pGameEntry = ^BasicGameEntry;
  BasicGameEntry = record
   Name,Genre,Rompath,Manualpath,System,Publisher: string;
   Description: TMemo;
   Rating,Published: byte;
   Picture: Array[1..4] of TPicture;
  end;


public
    GameEntry: pGameEntry;
    GameList: tList;

so. ich habe mir jetzt einen dialog erstellt, in dem ich die daten eintragen kann und bei klick auf "ok" werden sie der liste hinzugefügt.
das problem ist aber, dass die einträge ja nur pointer sind, also gar keine daten enthalten.
in dem dialog wähle ich bilder aus, die ich ja nicht so hinzufügen kann:
Delphi-Quellcode:
  new(Form1.GameEntry);
  Form1.GameEntry^.Name:=Edit1.Text;
  Form1.GameEntry^.Genre:=ComboBox1.Text;
  Form1.GameEntry^.System:=ComboBox2.Text;
  Form1.GameEntry^.Picture[1]:=Image1.Picture;
  Form1.GameEntry^.Picture[2]:=Image2.Picture;
  Form1.GameList.Add(Form1.GameEntry);
denn sobald sich das Image im dialog ändert, ändert sich natürlich auch das bild im eintrag der liste, da es ja nur ein zeiger darauf ist (merkwürdigerweise allerdings nicht der text, obwohl das ja auch ein pointer ist).

meine konkrete frage ist jetzt endlich: wie kann ich das realisieren?
wenn ich eine TImageList nehme, habe ich ja das problem mit der sortiereung. wenn ich meine liste nach namen, genre, oder jahr sortiere, ändert sich ja die reihenfolge der einträge (oder wenn ich einen eintrag entferne...). nicht aber die reihenfolge der einträge in der ImageList.

kann mir da bitte jemand helfen?

danke, tobias.

ps: ich benutze delphi 6.0 personal

[edit=Admin]Code in Delphi-Tags gesetzt. Künftig bitte selber machen, danke. ;-) Mfg, Daniel[/edit]

Niko 16. Okt 2005 21:51

Re: Bilder in einer Liste
 
Hi,

willkommen in der Delphi-Praxis! :hi:

Dein Problem kannst du lösen, indem du die Grafik beim Speichern kopierst:
Delphi-Quellcode:
Form1.GameEntry^.Picture[1] := TPicture.Create;
Form1.GameEntry^.Picture[1].Assign(Image1.Picture);
Zitat:

Zitat von tobi1701
merkwürdigerweise allerdings nicht der text, obwohl das ja auch ein pointer ist

Strings werden in Delphi als Werttypen behandelt und somit bei einer Zuweisung kopiert.

Im Übrigen ist mir noch aufgefallen, dass du für Description ein TMemo verwendest. Hier wäre TStrings wohl günstiger.

tobi1701 16. Okt 2005 22:22

Re: Bilder in einer Liste
 
super, dankeschön. das werde ich gleich mal ausprobieren.
den tip mit tStrings werde ich auch gleich verwenden, ich habe vor 5 oder 6 jahren zuletzt programmiert und erinnere mich nur sehr langsam wieder an die ganzen sachen. das tMemo hatte ich da wohl reingetan, da ich ein Memo im dialog verwendet habe...

ist denn der ansatz soweit ok, oder gibt es auch hier noch eine bessere lösung?
wie man vielleicht leicht erkennen kann, will ich eine datenbank für mich schreiben, um spielereviews für mich zu verwalten. es gibt zwar viele datenbanken, aber ich möchte eine haben, die nur einträge und informationen enthält, die für mich auch interessant sind.

eine letzte frage noch (ohne das ich mich damit jetzt selbst schon beschäftigt habe):
wie speicher ich denn am besten diese liste?

ich bräuchte sowas wie List.SaveToFile(name:string);
aber das muss ich ja wohl per hand erstellen, also alle items der liste einzeln in eine datei schreiben.
was wäredenn da die beste lösung?

Niko 16. Okt 2005 23:04

Re: Bilder in einer Liste
 
Zitat:

Zitat von tobi1701
ist denn der ansatz soweit ok, oder gibt es auch hier noch eine bessere lösung?

Wenn die Datenbank nicht allzu groß werden soll ist der Ansatz in Ordnung. Alternativ könnte man natürlich auch eine "richtige" Datenbank wie Paradox oder Access verwenden, was sich aber kaum lohnt, wenn die Datenstrukturen einfach sind. Der Programmieraufwand hängt hier stark von der verwendeten Delphi-Variante ab (ab Professional aufwärts wird's einfacher).

Zum Speichern deiner Liste wäre wohl XML das Beste. Wenn du dich darin einarbeiten willst, gibt's hier ein gutes Tutorial. Das Speichern von Bildern in XML ist nicht ganz so einfach, aber da könntest du alternativ auch nur den Pfad in die XML-Datei aufnehmen.

Noch ein Tipp: Wenn du dir sicher bist, dass alle deine Bilder Bitmaps sind (und keine Vektorgrafiken), kannst du in deinem Record gleich Verweise auf TBitmap statt auf TPicture speichern und damit ein bisschen overhead einsparen.

tobi1701 16. Okt 2005 23:56

Re: Bilder in einer Liste
 
mit xml kenne ich mich absolut überhaupt nicht aus, genau genommen weiss ich auch gar nicht was das ist. ich wusste noch nicht einmal, dass das in delphi "drin" ist.

kann ich denn nicht eine schleife beginnen und jedes item der liste einzeln in einen stream speichern?
.Item[i].Name.SaveToStream
.Item[i].Genre.SaveToStream
usw.?

edit: und access und andere datenbankprogramme kommen für mich aus zwei gründen nicht in frage:
1. will ich meine eigene (kleine) datenbank haben, die ich auch selbst layouten möchte. ausserdem sollen da noch weitere funktionenrein, als die hier genannte liste.
2. will ich mal wieder was mit delphi machen, denn schliesslich ist es nicht nur eine übung, sondern macht mir auch noch spass. manchmal zumindest ;)

Niko 17. Okt 2005 17:04

Re: Bilder in einer Liste
 
Zitat:

Zitat von tobi1701
kann ich denn nicht eine schleife beginnen und jedes item der liste einzeln in einen stream speichern?

Das geht auch. Du musst aber darauf achten, dass die gespeicherten Texte jeweils die gleiche Länge haben müssen oder die Länge entsprechend mitspeichern (dazu gibt's hier im Forum Beispiele), da du sonst beim Auslesen das Ende nicht mehr findest. Inwieweit TBitmap.LoadFromStream in der Lage ist, die größe des Bildes selbst zu erkennen weiß ich nicht. Aber das kann man ja einfach ausprobieren.

Zitat:

Zitat von tobi1701
und access und andere datenbankprogramme kommen für mich aus zwei gründen nicht in frage

War vielleicht ein bisschen unklar ausgedrückt: Ich meine nicht mit den Datenbankprogrammen zu arbeiten, sondern mit Delphi die Daten in einer entsprechenden Datenbank abzulegen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:44 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