Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Alternative zu TImage
HenryHux - Di 09.11.10 20:46
Titel: Alternative zu TImage
Hi, ich bin in einem Programm viel mit Bildern am arbeiten, die alle in TImages gelagert werden.
Jetzt schon von ein paar Leuten gehört, dass ich solche Sachen nicht in visible components auslagern soll.
Was gibts denn für ne alternative zu TImage, die vlt schneller arbeitet?
Wie gesagt, muss nicht sichtbar sein.
Lg
Henry
bummi - Di 09.11.10 20:53
Resourcen
oder
TImagelist
HenryHux - Di 09.11.10 20:55
Was meinst du genau mit Ressourcen?
Lg
jaenicke - Di 09.11.10 21:03
Resourcen sind die Teile der Exe, in denen Daten mitgeliefert werden, die die Exe braucht. Zum Beispiel das Icon der Exe und die Bilder der Buttons usw.
Wie sowas aussieht, siehst du in meinem Periodensystem:
http://www.delphi-forum.de/viewtopic.php?p=557541
Dort lese ich die kleinen Bilder aus der Exe dynamisch wieder ein und zeige alles in einer einzigen PaintBox an.
bummi - Di 09.11.10 21:04
Du nimmst beispielsweise den XN-Resource-Editor, speicherst nach einfügen deiner Bilder als XXX.res ab, bindest die Datei z.B. ind Deinem Mainform per
{$ XXX.res} ein.
Beispiel für eine Anwendung in Code:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure TMainform.I_OverviewMouseEnter(Sender: TObject); begin TImage(Sender).Picture := nil; TImage(Sender).Picture.Bitmap.LoadFromResourceName(HInstance, 'BTN_OVERVIEW_H'); end;
procedure TMainform.I_OverviewMouseLeave(Sender: TObject); begin TImage(Sender).Picture := nil; TImage(Sender).Picture.Bitmap.LoadFromResourceName(HInstance, 'BTN_OVERVIEW'); end; |
Du kannst Resourcen (jpeg,wav etc..) auch per Resourcecompiler BRCC32 einbinden, Du findes Beispiele hier im Forum.
Gausi - Di 09.11.10 21:08
Oder, wenn die Datenmenge wirklich größer wird, und man die Exe nicht auf 100MB aufblähen möchte: Die Bilder einfach als *.bmp-Dateien (alternativ jpg oder png) speichern und vom Programm aus daraus laden.
HenryHux - Di 09.11.10 21:10
Ok, danke, denke das kann ich gut benutzen =)
Lg
Edit:
Zitat: |
Verfasst: Di 09.11.10 20:08
Oder, wenn die Datenmenge wirklich größer wird, und man die Exe nicht auf 100MB aufblähen möchte: Die Bilder einfach als *.bmp-Dateien (alternativ jpg oder png) speichern und vom Programm aus daraus laden. |
Mache ich zum Teil auch, dachte, dass wäre ein Punkt dafür dass mein Programm immer weiter wächst, obwohl es nach FastMM4 nicht leaked.
Sieht so aus bei mir:
Delphi-Quelltext
1: 2: 3:
| Image1.Picture.SaveToFile(Path+'image1.bmp'); image2.picture.loadfromfile(Path+'image2.bmp'); |
Wie gesagt, bin immoment auf der Suche nach dem mysteriösen Aufblähen meines Programmes :D
Kann ich ausschließen, dass es an diesem Speichern und Laden in Images von der HD liegt?
Lg
jaenicke - Di 09.11.10 21:41
HenryHux hat folgendes geschrieben : |
Mache ich zum Teil auch, dachte, dass wäre ein Punkt dafür dass mein Programm immer weiter wächst, obwohl es nach FastMM4 nicht leaked. |
Dass das Programm nicht sofort den Speicher wieder im Task Manager wieder verliert, heißt nicht direkt, dass du ein Memory Leak hast.
Der Delphi Speichermanager gibt den Speicher nicht direkt ab, sondern behält den. Es könnte ja sein, dass kurz danach wieder welcher gebraucht wird. ;-)
bummi - Di 09.11.10 21:41
Wenn Dein Programm zur Laufzeit "wächst" weil MB-weise Bitmaps lädst (brauchst), dann helfen Dir Resourcen nicht weiter. Gegf. das was Du nicht brauchst zwischendurch freigeben (FreeAndNil oder auch Image1.Picture.Bitmap := nil) und Komprimierte Formate wie JPEG verwenden.
HenryHux - Di 09.11.10 22:02
Ich hätte ja kein Problem damit, wenn es um 20kb wachsen würde oder wieviel auch immer, wenns wieder "abschwillt".
Aber nach 2h hat sich die Größe dann von 2 auf 3 mb vergrößert, is dann doch ein wenig viel.
Gebe alles immer wieder frei entweder mit FreeAndNil oder nur mit nil, denke bei TImage gehts nur damit, wenn mans anders macht, gibts ne Zugriffsverletzung, wenn man das Image ein zweites Mal laden will.
Habe hier mal einen Schuldigen gefunden:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| procedure TMain.BitBtn1Click(Sender: TObject); var DeskCanvas: TCanvas; i : integer; begin for i:=0 to 1000 do begin try DeskCanvas := TCanvas.Create; DeskCanvas.Handle := GetDC(0); finally FreeAndNil(deskcanvas); end; end; end; |
Innerhalb von einer Sekunde springt das Progg von 1.4 MB auf 2...
Jemand ne Idee wieso, oder besser noch ne Lösung? :D
Lg
Henry
bummi - Di 09.11.10 22:09
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| begin for i:=0 to 1000 do begin try DeskCanvas := TCanvas.Create; DeskCanvas.Handle := GetDC(0); ReleaseDC(0,DeskCanvas.Handle); finally FreeAndNil(deskcanvas); end; end; end; |
jaenicke - Di 09.11.10 22:20
Und davon abgesehen benutzt du den Resourcenschutzblock falsch. Dadurch kann dann auch ein Speicherleck entstehen.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| begin for i := 0 to 1000 do begin DeskCanvas := TCanvas.Create; try DeskCanvas.Handle := GetDC(0); try ... finally ReleaseDC(0, DeskCanvas.Handle); end; finally FreeAndNil(DeskCanvas); end; end; end; |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!