Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Bild über Ressource-Dll laden (https://www.delphipraxis.net/14156-bild-ueber-ressource-dll-laden.html)

cheatzs 3. Jan 2004 15:21


Bild über Ressource-Dll laden
 
Hi Leute,
hab mir mal das Beispiel aus der Code-Library angeschaut. Dann hab ich das auf Bitmaps umgeschrieben, da ich Bitmaps benötige, und keine Jpegs. Dann sieht das bei mir so aus

Delphi-Quellcode:
 var
       h :HINST;
       r :TResourceStream;
       b : Tbitmap;
begin
 h := LoadLibrary('bitmaps.dll');
  if h <> 0 then
   begin
    r := TResourceStream.Create(h,'Bild1',RT_BITMAP);
    b := Tbitmap.Create;
     try
      b.LoadFromStream(r);
      Image1.Picture.Bitmap := b;
     finally
      b.Free;
      r.Free;
     end;
   end
Meine Ressource-Datei ist nach dem selben Schema wie im Beispiel:
Delphi-Quellcode:
BILD1 RT_BITMAP "images\logobig.bmp"
Wenn ich das dann ausführe kommt immer der Fehler "Ressource Bild1 not found"
Ich hab schon versucht die Namen umzuändern. Groß- und Kleinschreibung variiert.

Immer der selbe Fehler.
An was könnte das noch liegen?
(hab Delphi 7)

sakura 3. Jan 2004 15:46

Re: Bild über Ressource-Dll laden
 
Erste Korrektur ist in Deiner RC-Datei (das "RT_" muss weg!):
Code:
BILD1 BITMAP "images\logobig.bmp"
Sicher stellen, daß diese Datei neu kompiliert wird, das macht Delphi standardmäßig NICHT von allein.

Zweite Korrektur:
Delphi-Quellcode:
var
  h :HINST;
begin
  h := LoadLibrary('bitmaps.dll');
  if h <> 0 then
  try
    Image1.Picture.Bitmap.LoadFromResourceName(h, 'BILD1');
  finally
    FreeLibrary(h);
  end
HINWEIS: Groß- und Kleinschreibung sind wichtig.

...:cat:...

cheatzs 3. Jan 2004 15:52

Re: Bild über Ressource-Dll laden
 
Hi
also das Groß und Kleinschreibung wichtig ist weiß ich,
aber so wies erst im Beispiel ist gehts imemr noch net.
Hab jetzt noch ein bissel anderes gemacht, ohne den TRessourcestream. Da gehts.

Danke trotzdem!

sakura 3. Jan 2004 16:01

Re: Bild über Ressource-Dll laden
 
Dein erstes Beispiel wird unter keinen Umständen funktionieren, da die Daten im BITMAP Format anders hinterlegt werden. Möchtest Du Deine Methode nutzen, dann musst Du wie folgend vorgehen.

Code:
BILD1 RCDATA "images\logobig.bmp"
Delphi-Quellcode:
var
  h :HINST;
begin
  h := LoadLibrary('bitmaps.dll');
  if h <> 0 then
  try
    r := TResourceStream.Create(h, 'BILD1', RT_RCDATA);
    b := Tbitmap.Create;
    try
      b.LoadFromStream(r);
      Image1.Picture.Bitmap := b;
    finally
      b.Free;
      r.Free;
    end;
  finally
    FreeLibrary(h);
  end
...:cat:...

Luckie 10. Jan 2007 12:42

Re: Bild über Ressource-Dll laden
 
Warum muss ein Bitmap als RCDATA Ressource hinterlegt werden und nicht als BITMAP Ressource?

Folgendes Problem:
Ressourcedatei
Code:
1 BITMAP Gipsy.bmp
Delphicode
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  rs: TResourceStream;
begin
  rs := TResourceStream.CreateFromID(HInstance, 1, RT_BITMAP);
  try
    Image1.Picture.Bitmap.LoadFromStream(rs);
  finally
    FreeAndNil(rs);
  end;
end;
das liefert mir eine Zugriffsverletzung beim Erzeugen des Ressourcen Streams.

Nennen ich den Typ BMP und und gebe als Ressourcentyp 'BMP' an, funktioniert es.

taktaky 9. Okt 2007 01:48

Re: Bild über Ressource-Dll laden
 
Zitat:

Zitat von Luckie
Warum muss ein Bitmap als RCDATA Ressource hinterlegt werden und nicht als BITMAP Ressource?

Folgendes Problem:
Ressourcedatei
Code:
1 BITMAP Gipsy.bmp
Delphicode
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  rs: TResourceStream;
begin
  rs := TResourceStream.CreateFromID(HInstance, 1, RT_BITMAP);
  try
    Image1.Picture.Bitmap.LoadFromStream(rs);
  finally
    FreeAndNil(rs);
  end;
end;
das liefert mir eine Zugriffsverletzung beim Erzeugen des Ressourcen Streams.

Nennen ich den Typ BMP und und gebe als Ressourcentyp 'BMP' an, funktioniert es.

Wie ich sehe, du holst damit das Bild von RessourceStream und nicht von DLL



<>

Lossy eX 9. Okt 2007 07:59

Re: Bild über Ressource-Dll laden
 
Das Problem liegt darin, dass der Typ Bitmap in wirklichkeit ein Spezialtyp ist. Eigentlich sogar eine Zahl. Und wenn du damit ein Bitmap ablegst, dann wird stumpf der erste Header des BMPs weggelassen. Wenn du es dann versuchst mittels Stream zu laden will das TBitmap unbedingt den Header haben. Ergo Fehler. Im Bitmap.LoadFromResoure wird der Header aber nicht benötigt.

Der Typ BMP ist nur ein Name/Text und die sind vollkommen frei wählbar. Aber es handelt sich dabei eben nicht um spezielle Typen. Eigentlich sobald man aus einem Stream laden will ist der Typ egal es darf nur nicht Bitmap sein. ;)

[edit] "Groß- und Kleinschreibung sind wichtig." Das kann ich so auch nicht ganz unterschreiben. Eigentlich ist NUR Großschreibung Trumpf. Es gibt verschiedene Programme mit denen es auch möglich ist Resourcen mit Bleinbuchstaben zu erzeugen. Allerdings war es mir nicht vergönnt diese dann Laden zu können. Erst als ich sie in Groß umgewandelt hatte ging es. Ohne sonst Änderungen durchzuführen.

geskill 1. Dez 2007 19:28

Re: Bild über Ressource-Dll laden
 
Hallo Leute,
ich wollte das Thema hier noch mal kurz aufgreifen um vllt. anderen leuten die das gleiche Problem haben das ganze mal etwas klarer zu machen...

Ich behandle allerdings nur das Laden von BMP Dateien, den Rest kann ich leider auch nicht :-( (wäre nett wenn mir einer animierte Gif erklären kann) Aber kommen ich zum Punkt.

1.
Ihr benötigt eine .dll (DATEI -> NEU -> WEITERE -> DLL-EXPERTE)
Die speichert Ihr erst einmal. Am besten in einem neuen Ordner.
Dann löscht Ihr alles überflüssige aus dem Projekt.

Das sieht dann ungefähr so aus (Die *.dll).
Delphi-Quellcode:
   library NAME;

   {$R *.res} 
   {$R 'BILDER.res' 'BILDER.rc'}
    begin
    end.
2.
Okay jetzt müssen wir eine *.rc Datei erstellen, es geht zwar mit delphi aber das ist mit dem Text-Editor schneller
In die Datei schreibt ihr dann dass: Ich finde es am besten wenn man mit 1 anfängt ist am übersichtlichsten, BITMAP ist
klar, und "SplashScreen.bmp" ist dann der BILDNAME, die Bitmap Datei muss unbedigt mit der neuen Textdatei ein den oben
genannten Neuen Ordner.

Delphi-Quellcode:
   1 BITMAP "SplashScreen.bmp"
So die Textdatei abspeichern und um umbennenen (BILDER.rc) etc.!

3.
Jetzt müsst ihr euch wieder delphi vornehmen und die *.dll compilieren.
Wenn ihr jetzt in der Projektverwaltung nachschaut könnt ihr auch die neue *.rc sehen,
wenn nicht delphi mal neustarten, damit auch alles compiliert wird!
Ihr solltet auch mal schauen ob nach dem Compilieren eine *.res und *.drc Datei erzeugt wurde!
Das Projekt könnt ihr jetzt schließen.

4.
Nun erstellt ihr bzw. ladet euer Programm wo ihr die Bilddatei aus der dll laden wollt.
hier braucht ihr nur sehr wennig code ...

Delphi-Quellcode:
VAR LibHandle: HINST; Bitmap: TBitmap;
BEGIN
  // So als erstes muss angegeben werden wo sich eure dll befindet, ich arbeite immer mit "ExtractFilePath"
  // es ist einfach sicherer!
  LibHandle:=Loadlibrary(PChar(ExtractFilePath(ParamStr(0))+'NAME.dll'));
  IF LibHandle <> 0 THEN BEGIN
   Bitmap:=TBitMap.Create;
       TRY
         //So jetzt wird das Bild geladen, und zwar das erste, solltet ihr das schön durchnummeriert
         //haben dann ist es jetzt sehr einfach zu wissen welche Nummer ihr am ende eintragen müsst
         Bitmap.LoadFromResourceID(LibHandle, 1);
         //So jetzt muss das Bild nur noch angezeigt werden. Achtung bei mir kam immer ein fehler wenn
         //ich "FormX.Image1" benutzt habe also einfach so...
         Image1.Canvas.Draw(0,0,Bitmap);
        FINALLY
         Bitmap.Free;
        END;
  FreeLibrary(LibHandle);
  END ELSE
    RaiseLastOSError();
end;
Ich hoffe jetzt, dass es doch verständlich war und es dem ein oder anderen doch hilft :-)
Weil ich finde es doch besser die Dateien nicht alle in *.exe zu packen, die wird dann
einfach immer größer und, wenn man ein Updater im Programm hat muss der bei einem 0,5 MB
großen Bild bei jedem Update das laden, auch wenn sich das Bild nicht ändert...
MFG geskill

ZelltoD 16. Jul 2008 16:10

Re: Bild über Ressource-Dll laden
 
Hey gskill...
Ich kann mir nicht helfen .. ich hab jetzt sogar mal deinen Code fast 1 zu 1 abgeschrieben, aber ich bekomme beim Kompilieren immer folgenden Fehler:

http://zelltod.ze.ohost.de/backstage/fehler1.JPG

Danach bekomme ich:

http://zelltod.ze.ohost.de/backstage/fehler2.JPG

Hast du irgendeine Ahnung was ich falsch gemacht haben könnte ?!

mfg

geskill 16. Jul 2008 16:16

Re: Bild über Ressource-Dll laden
 
Das ist jetzt eine blöde Standard Frage aber:
Hast du die DLL richtig ordentlich erzeugt oder compiliert?
Lad dein Code mal hoch ich gucke mal wenns möglich wäre :)

ZelltoD 16. Jul 2008 16:28

Re: Bild über Ressource-Dll laden
 
Erstmal danke für deine schnelle Antwort.

Das ist der Quellcode von meinem Testprogramm:

Delphi-Quellcode:
unit testunit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;

type
  TForm1 = class(TForm)
    Image1: TImage;
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);

VAR LibHandle: HINST; Bitmap: TBitmap;
BEGIN
  LibHandle:=Loadlibrary(PChar(ExtractFilePath(ParamStr(0))+'NAME.dll'));
  IF LibHandle <> 0 THEN BEGIN
   Bitmap:=TBitMap.Create;
       TRY
        Bitmap.LoadFromResourceID(LibHandle, 1);      
         Image1.Canvas.Draw(0,0,Bitmap);
        FINALLY
         Bitmap.Free;
        END;
  FreeLibrary(LibHandle);
  END ELSE
    RaiseLastOSError();

end;

end.
Der Code meiner DLL:
Delphi-Quellcode:
library NAME;

   {$R *.res} 
   {$R 'BILDER.res' 'BILDER.rc'} 
    begin
    end.
Meine *.rc-Datei:
Delphi-Quellcode:
1 BITMAP "zoid.bmp"
Und der Inhalt meines Testordners:

http://zelltod.ze.ohost.de/backstage/inhalt.JPG

Mal ne blöde Frage: gibt es einen Unterschied im Kompilieren von *.dll Dateien im Vergleich zu normalen Projekten?
Ich hab nähmlich gemerkt, dass nach dem vermeindlichen Kompiliren zwar ne *.res aber keine *.drc Datei im Ordner war :gruebel:
Zu meiner Verteidigung: Ich bin blutiger Anfänger in Sachen dll und versuche jetzt so im Moment nach und nach den Durchblick zu bekommen. :angel2:

geskill 16. Jul 2008 16:33

Re: Bild über Ressource-Dll laden
 
Zitat:

Zitat von ZelltoD
Ich hab nähmlich gemerkt, dass nach dem vermeindlichen Kompiliren zwar ne *.res aber keine *.drc Datei im Ordner war :gruebel:

Das ist wahrscheinlich ein Tipfehler von mir muss natürlich *.rc heißen,
jedoch bemerke ich das du keine BILDER.res-Datei im Ordner hast!
Ich schließe deshalb mal darauf du hast die DLL nicht compiliert (im Projektmanager rechtsklick auf das DLL Projekt)
oder du hast es falsch oder gar nicht eingebunden, was sich aber mit dem Quelltext wiederspricht.

EDIT: Du kannst ja mal im Projektmanager gucken ob da die *.rc angezeigt wird, wenn nich dann mal von dort (rechtsklick auf das Projekt, dann Hinzufügen, dort *.rc wählen ... naja und dann mal schauen)

Zitat:

Zitat von ZelltoD
Zu meiner Verteidigung: Ich bin blutiger Anfänger in Sachen dll und versuche jetzt so im Moment nach und nach den Durchblick zu bekommen. :angel2:

War/bin ich ja auch :) ^^ ...

ZelltoD 16. Jul 2008 17:47

Re: Bild über Ressource-Dll laden
 
Hmm ich habs jetzt nochmal Versucht, jetzt stehe ich aber vor folgendem Problem:

Zitat:

jedoch bemerke ich das du keine BILDER.res-Datei im Ordner hast!
Ich schließe deshalb mal darauf du hast die DLL nicht compiliert (im Projektmanager rechtsklick auf das DLL Projekt)
oder du hast es falsch oder gar nicht eingebunden, was sich aber mit dem Quelltext wiederspricht.
Naja wenn ich die dll mit rechtsklick im Projektmanager/compilieren Kompilieren möchte Kommt er mit dem Fehler
"[DCC Fehler] E1026 Datei nicht gefunden: 'BILDER.res'" :gruebel:

mfg

geskill 16. Jul 2008 17:50

Re: Bild über Ressource-Dll laden
 
dann versuchs mal mit erzeugen ^^
bzw. das über den Projektmanager hinzufügen...

ZelltoD 16. Jul 2008 17:54

Re: Bild über Ressource-Dll laden
 
Erzeugen geht genauso wenig ..... -> gleicher Fehler

geskill 16. Jul 2008 17:59

Re: Bild über Ressource-Dll laden
 
Wie gesagt hast du im Projektmanager die *.rc ?

ZelltoD 16. Jul 2008 18:11

Re: Bild über Ressource-Dll laden
 
So ich muss mich berichtigen: das res Problem scheint soweit gelöst...
Jetzt hab ich beim kompilieren der DLL noch folgenden Fehler:
[DCC Fehler] E2161 Warning: Duplicate resource: Type 2 (BITMAP), ID 1; File E:\Delphi\Meine Programme\test\BILDER.res resource kept; file E:\Delphi\Meine Programme\test\BILDER.res resource discarded. :roll:


....

Stop hat sich erledigt ... hatte was doppelt in der dll ...

ZelltoD 16. Jul 2008 18:19

Re: Bild über Ressource-Dll laden
 
Soweit sogut, beides -> Projekt sowie dll lassen sich jetzt einwandfrei compilieren, aber wenn ich die dll mit f9 starten will, um die eigendliche dll datei im ordner zu erstellen, bekomme ich nen Fehler...

http://zelltod.ze.ohost.de/backstage/host.JPG

geskill 16. Jul 2008 18:25

Re: Bild über Ressource-Dll laden
 
Also ich bitte dich, der Fehler sagt doch alles oder ? Die Fehlermeldung ist sogar auf Deutsch, mach mal genau das was die Fehlermeldung besagt! Host-Anwendung ist dein Testprojekt ;)

ZelltoD 16. Jul 2008 18:39

Re: Bild über Ressource-Dll laden
 
Ja schon klar, aber wenn ich die ganze Sache über die Hostanwendung, also mein Projekt starte sagt er nichts anderes als "Systemfehler Code 126 Das angegebende Modul wurde nicht gefunden".

Und ich dachte, dass es vielleicht daran liegt, dass ich auch nach dem compilieren der dll keine *.dll Datei in meinem Verzeichnis hab.

:twisted:

________

Naja solangsam ists genug, ich werd jetz noch ne weile herumprobieren...vielleicht bekomm ichs hin.

Ansonsten noch ein ganz großes Dankeschön für deine Hilfe.

Achja falls du bei dir irgendwo ein Beispielprojekt liegen hast wäres super wenn du mir das mal schicken könntest, vielleicht hilft mir das weiter ...

mfg

geskill 16. Jul 2008 18:46

Re: Bild über Ressource-Dll laden
 
Zitat:

Zitat von ZelltoD
Und ich dachte, dass es vielleicht daran liegt, dass ich auch nach dem compilieren der dll keine *.dll Datei in meinem Verzeichnis hab.

Ne, dass ist weil du versucht eine DLL auszuführen, wenn wirklich keine DLL erstellt wird (beim compilieren/erzeugen) dann prüfe deine Ausgabeverzeichnis (Projektoptionen), ansonsten ist dein compiler kaputt...

ZelltoD 16. Jul 2008 18:49

Re: Bild über Ressource-Dll laden
 
Gut dann liegt der Fehler irgendwo bei mir ...

:lol:

ZelltoD 20. Jul 2008 11:51

Re: Bild über Ressource-Dll laden
 
Habs gestern nochmal versucht und überrraschenderweise hats geklappt, keine Ahnung wo mein Fehler lag ?! Ich war schon daran an mir selbst zu zweifeln...

Nochmal Danke für die Mühe die du dir gegeben hast...

mfg


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:15 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz