Autor Beitrag
Terra
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 307

Windows 7 Ultimate
Delphi® XE3
BeitragVerfasst: Mo 30.05.05 12:18 
Servuz zusammen,

hab da ein mehr oder weniger schwerwiegendes Problem.
Nach langer Suche im Internet bin ich auf ein Tut. gestoßen das beschreibt, wie man Bilder in eine DLL Datei reinstopfen und die dann im Hauptprogramm auslesen kann. Ok, genau so gemacht und traraaa... nüx!
Delphi hat zwar eine DLL datei erstellt aber diese ist 80kb groß. Allein ein bild ist über 7MB. Entweder ist es eine fantastische komprimierung oder ich habe das ganze Prinziep falsch verstanden.
Es sollen halt mehrere Bilder in eine einzigen Datei implementiert werden und später vom Hauptprogramm einzeln ausgelesen werden. Dachte, ich wäre auf dem richtigen weg aber anscheinend doch nicht.

Finde jetzt dummerweise auch nicht den Link zum Tut. aber es ging darum mittels einer *.rc datei in der die Bilder-datei-namen drinnstehen dieses mit {$R 'xxx.res' 'xxx.rc'} zu verknüpfen... naja, irgendwie so auf jeden fall.

Gibt es denn evtl eine andere, vielleicht sogar bessere möglichkeit? .. Ich komme leider nicht drumm herum eine über 7MB große Bilddatei zu laden und mehrere kleine. Ist halt so. :-)
Die Bilder sollten in eine externe Datei liegen da die sich im laufe der Zeit ändern könnten und durch ein einfaches Update ersetzt werden sollen.

Für Hilfen wäre ich sehr dankbar.

Oh, ich vergaß .. benutze Delphi 2005 ohne .NET

MfG. Terra
CenBells
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1547

Win 7
Delphi XE5 Pro
BeitragVerfasst: Mo 30.05.05 12:38 
hi,

ich habe das bei mir in einer anwendung genau so gemacht.

Die Dll stellt eine methode zum laden der ressource zur verfügung und enthält alle ressourcen.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
//dll
library lib_images;


{$R 'lib_Images.res' 'lib_Images.rc'}

uses
  ResImages in 'ResImages.pas';

{$R *.res}

exports
  loadImage;   

begin
end.

hier die methode loadimage aus der unit ResImages

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
unit ResImages;

interface

uses
  Windows, Graphics, Classes;

procedure loadImage(const AImg: TGraphic; const AImgName: String); stdcall;

implementation

procedure loadImage(const AImg: TGraphic; const AImgName: String);
var
  RS: TResourceStream;
begin
  RS := TResourceStream.Create( HInstance, AImgName, RT_RCDATA );
  try
    RS.Position := 0;
    AImg.LoadFromStream( RS );
  finally
    RS.Free;
  end;
end;

end.

Ich verwende neuerdings ein TGraphic, weil ich dann Ressourcen von unterschiedlichem Typ (Ico, BMP) laden kann.

Die Rc Datei sieht wie folgt aus
ausblenden Delphi-Quelltext
1:
2:
BMPRefresh        RCDATA "..\Bitmaps\refresh.bmp"
BMPLogout         RCDATA "..\Bitmaps\Log_Out_blau.bmp"



Im eigentlichen Programm rufe ich die exportierte Funktion loadImage auf und dann klappt das mit dem Nachbarn.

Beispiel
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
var
  LImg: TBitmap;
begin
  LImg := TBitmap.Create();
  try
    loadImage(LImg, 'BMPExit'); 
...


Gruß
Ken

_________________
Eine Klasse beschreibt die Struktur und das Verhalten einer Menge gleichartiger Objekte.
Terra Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 307

Windows 7 Ultimate
Delphi® XE3
BeitragVerfasst: Mo 30.05.05 13:35 
Klasse ... nur leider bekomme ich Fehler ausgespuckt.

Zitat:
[RC Fataler Fehler] data.rc(1): Unable to load RW32CORE.DLL
[Fataler Fehler] data.dpr(15): F1026 Datei nicht gefunden: 'ResImages.dcu'


meine data.rc enthält nur einen eintrag ... (MAP RCDATA "map.jpg") ... zu testzwecken :-)

Was stimmt denn da nicht? ... Ok ok .. es steht ja da was nicht stimmt nur wie behebe ich das ?

MfG. Terra
CenBells
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1547

Win 7
Delphi XE5 Pro
BeitragVerfasst: Mo 30.05.05 18:41 
bei dem ersten fehler kann ich dir leider nicht helfen. Da habe ich keine ahnung.
Der zweite fehler kommt daher, daß du keine datei mit dem angegebenen namen erstellt hast.

Gruß
Ken

_________________
Eine Klasse beschreibt die Struktur und das Verhalten einer Menge gleichartiger Objekte.
Terra Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 307

Windows 7 Ultimate
Delphi® XE3
BeitragVerfasst: Mo 30.05.05 19:08 
Problem beim 2. ist... ich habe dein Code "ResImage" in eine neue unit bei mir in delphi gepackt. Also "Neu -> Unit ...". Den Source reinkopiert und abgespeichert .. schön, hab jetzt eine PAS datei nur nirgens kann ich die compilieren. Sprich, ich bekomme keine *.dcu datei. :-(

Der erste Fehler ist im zusammenhang mit der *.rc datei und dem Bild das ich angegeben habe. Aber kein Plan was der von mir will. Delphi ist normal installiert und läuft.

Terra
Terra Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 307

Windows 7 Ultimate
Delphi® XE3
BeitragVerfasst: Di 31.05.05 13:43 
So, ich habe es jetzt mal anders gemacht. Da son nettes Progrämmchen gefunden namens "ResAdmin". Hat wunderschön geklappt da nen Bild reinzustopfen und aus der Res-Datei ne DLL zu erzeugen. Ja, so langsam kapier ich es! ^^

Ok, schön und gut. Habe da meine "data.dll" und möchte diese natürlich auch auslesen. Dank eines Tutorials wie das geht sollte es ja dann auch nicht schwer sein.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TForm1.LoadPicture(Sender: TObject);
var
  h :HINST;
  r :TResourceStream;
  j :TJpegImage;
  i :integer;
begin
  h := LoadLibrary('data.dll');
  if h <> 0 then
  begin
    r := TResourceStream.Create(h, MAP_1, 'Jpeg');
    j := TJpegImage.Create;
      try
....


MAP_1 ist gleichzeitig der Bezeichner in der DLL Datei für das Bild. Allerdingst bekomm ich hier bei dem Code eine Fehlermeldung:
"[Fehler] test.pas(100): E2003 Undefinierter Bezeichner: 'MAP_1'"

Als was muss denn MAP_1 laufen? leider stand dazu nichts weiter im Tut.

Terra


*EDIT*

Problem gelöst. War ein String. Man sollte doch öffters die Delphi-Hilfe in Anspruch nehmen ^^
Terra Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 307

Windows 7 Ultimate
Delphi® XE3
BeitragVerfasst: Di 31.05.05 15:12 
Jetzt werd ich langsam stinkig. OK, nochmal den ganzen quelltext der procedur.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
procedure TForm1.LoadPicture(Sender: TObject);
var
  h :HINST;
  r :TResourceStream;
  j :TJpegImage;
  i :integer;
  MAP_1 :string;
begin
  h := LoadLibrary('data.dll');
  if h <> 0 then
  begin
    r := TResourceStream.Create(h, MAP_1, 'Jpeg');
    j := TJpegImage.Create;
      try
        j.LoadFromStream(r);
        Image1.Picture.Bitmap.Assign(j);
      finally
        j.Free;
        r.Free;
      end;
  end;
  FreeLibrary(h);
end;

Beim Compilieren bekomme ich keine Fehlermeldung mehr. Rufe ich allerdingst diese Prozedur auf kommt der Fehler: "Resource nicht gefunden". Soll mit dem "r := TResourceStream.Create(h, MAP_1, 'Jpeg');" zusammenhängen. Alle dateien befinden sich im selben Ordner. Auch wenn ich bei "h := LoadLibrary('data.dll');" den kompletten Pfad eingebe passiert das gleiche. HIIILLLFFFEEE !!!!

MfG. Terra
StefanH
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1144

Win XP
D5 Standard, D7 Pers, D2005 Pers
BeitragVerfasst: Di 31.05.05 15:59 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
procedure TForm1.LoadPicture(Sender: TObject);
var
  h :HINST;
  r :TResourceStream;
  j :TJpegImage;
  i :integer;
begin
  h := LoadLibrary('data.dll');
  if h <> 0 then
  begin
    r := TResourceStream.Create(h, 'MAP_1''Jpeg');
    j := TJpegImage.Create;
      try
        j.LoadFromStream(r);
        Image1.Picture.Bitmap.Assign(j);
      finally
        j.Free;
        r.Free;
      end;
  end;
  FreeLibrary(h);
end;


imho müsste das so gehn, also indem du den Namen als string übergibst und nicht eine leere string-variable ;)

_________________
"Als es noch keine Computer gab, war das Programmieren noch relativ einfach."(Edsger W. Dijkstra)
"Ich bin nicht von Sinnen, sondern ich rede wahre und vernünftige Worte." (Paulus)
Terra Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 307

Windows 7 Ultimate
Delphi® XE3
BeitragVerfasst: Di 31.05.05 17:09 
Jou cool .. funktioniert jetzt alles.

Vielen Dank !!!!

Terra