Autor |
Beitrag |
HenryHux
      
Beiträge: 542
Erhaltene Danke: 33
Windows 7 Premium
Delphi XE, Eclipse
|
Verfasst: Di 09.11.10 20:46
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
      
Beiträge: 1248
Erhaltene Danke: 187
XP - Server 2008R2
D2 - Delphi XE
|
Verfasst: Di 09.11.10 20:53
Resourcen
oder
TImagelist
_________________ Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
|
|
HenryHux 
      
Beiträge: 542
Erhaltene Danke: 33
Windows 7 Premium
Delphi XE, Eclipse
|
Verfasst: Di 09.11.10 20:55
Was meinst du genau mit Ressourcen?
Lg
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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:
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
      
Beiträge: 1248
Erhaltene Danke: 187
XP - Server 2008R2
D2 - Delphi XE
|
Verfasst: 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.
_________________ Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
|
|
Gausi
      
Beiträge: 8548
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: 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.
_________________ We are, we were and will not be.
|
|
HenryHux 
      
Beiträge: 542
Erhaltene Danke: 33
Windows 7 Premium
Delphi XE, Eclipse
|
Verfasst: 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
Kann ich ausschließen, dass es an diesem Speichern und Laden in Images von der HD liegt?
Lg
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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
      
Beiträge: 1248
Erhaltene Danke: 187
XP - Server 2008R2
D2 - Delphi XE
|
Verfasst: 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.
_________________ Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
|
|
HenryHux 
      
Beiträge: 542
Erhaltene Danke: 33
Windows 7 Premium
Delphi XE, Eclipse
|
Verfasst: 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?
Lg
Henry
|
|
bummi
      
Beiträge: 1248
Erhaltene Danke: 187
XP - Server 2008R2
D2 - Delphi XE
|
Verfasst: 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; |
_________________ Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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; |
|
|