Autor Beitrag
HenryHux
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 542
Erhaltene Danke: 33

Windows 7 Premium
Delphi XE, Eclipse
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Di 09.11.10 20:53 
Resourcen
oder
TImagelist

_________________
Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
HenryHux Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 542
Erhaltene Danke: 33

Windows 7 Premium
Delphi XE, Eclipse
BeitragVerfasst: Di 09.11.10 20:55 
Was meinst du genau mit Ressourcen?

Lg
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 542
Erhaltene Danke: 33

Windows 7 Premium
Delphi XE, Eclipse
BeitragVerfasst: 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:
ausblenden Delphi-Quelltext
1:
2:
3:
Image1.Picture.SaveToFile(Path+'image1.bmp');
//code   
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 09.11.10 21:41 
user profile iconHenryHux hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 542
Erhaltene Danke: 33

Windows 7 Premium
Delphi XE, Eclipse
BeitragVerfasst: 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Di 09.11.10 22:09 
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 09.11.10 22:20 
Und davon abgesehen benutzt du den Resourcenschutzblock falsch. Dadurch kann dann auch ein Speicherleck entstehen.
ausblenden 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;