![]() |
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:
Meine Ressource-Datei ist nach dem selben Schema wie im Beispiel:
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
Delphi-Quellcode:
Wenn ich das dann ausführe kommt immer der Fehler "Ressource Bild1 not found"
BILD1 RT_BITMAP "images\logobig.bmp"
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) |
Re: Bild über Ressource-Dll laden
Erste Korrektur ist in Deiner RC-Datei (das "RT_" muss weg!):
Code:
Sicher stellen, daß diese Datei neu kompiliert wird, das macht Delphi standardmäßig NICHT von allein.
BILD1 BITMAP "images\logobig.bmp"
Zweite Korrektur:
Delphi-Quellcode:
HINWEIS: Groß- und Kleinschreibung sind wichtig.
var
h :HINST; begin h := LoadLibrary('bitmaps.dll'); if h <> 0 then try Image1.Picture.Bitmap.LoadFromResourceName(h, 'BILD1'); finally FreeLibrary(h); end ...:cat:... |
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! |
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:
...:cat:...
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 |
Re: Bild über Ressource-Dll laden
Warum muss ein Bitmap als RCDATA Ressource hinterlegt werden und nicht als BITMAP Ressource?
Folgendes Problem: Ressourcedatei
Code:
Delphicode
1 BITMAP Gipsy.bmp
Delphi-Quellcode:
das liefert mir eine Zugriffsverletzung beim Erzeugen des Ressourcen Streams.
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; Nennen ich den Typ BMP und und gebe als Ressourcentyp 'BMP' an, funktioniert es. |
Re: Bild über Ressource-Dll laden
Zitat:
<> |
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. |
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:
2.
library NAME;
{$R *.res} {$R 'BILDER.res' 'BILDER.rc'} begin end. 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:
So die Textdatei abspeichern und um umbennenen (BILDER.rc) etc.!
1 BITMAP "SplashScreen.bmp"
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:
Ich hoffe jetzt, dass es doch verständlich war und es dem ein oder anderen doch hilft :-)
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; 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 |
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: ![]() Danach bekomme ich: ![]() Hast du irgendeine Ahnung was ich falsch gemacht haben könnte ?! mfg |
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 :) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:46 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