Autor |
Beitrag |
byoean
      
Beiträge: 26
Win XP Pro
Delphi 7, Delphi 2000, Visual Basic, PHP, JS, SQL etc.
|
Verfasst: Fr 26.01.07 13:27
Hallo!
Ich möchte eine Bitmap aus einer DLL an mein Form1 übergeben. Dazu habe ich in meine DLL eine .res eingebunden.
Die funktion der dll sieht so aus:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| library icons;
uses ShareMem, SysUtils, Graphics;
{$R C:\test\imagelist.RES}
function getimage(res:PChar):TBitmap; stdcall; var image : TBitmap; begin image := TBitmap.Create; image.LoadFromResourceName(HInstance,res); result := image; end;
exports getimage;
begin end. |
Die Dll wird statisch über eine zusätzliche Unit eingebunden.
Die Funktion wird so aufgerufen:
Delphi-Quelltext 1:
| speedbutton1.Glyph := getimage('img6'); |
Hier tritt die Fehlermeldung auf: "TBitmap kan nicht TBitmap zugewiesen werden"
Kann mir da jemand helfen??
Schöne Grüße =)
|
|
Logikmensch
      
Beiträge: 390
Win XP
Delphi 2007 Prof., XE2, XE5
|
Verfasst: Fr 26.01.07 13:41
Versuch mal
speedbutton1.Glyph.Assign(getimage('img6'));
Ich habe grad kein Delphi zur Hand, aber ich hoffe, es funzt jetzt.
_________________ Es gibt keine Probleme - nur Lösungen!
|
|
byoean 
      
Beiträge: 26
Win XP Pro
Delphi 7, Delphi 2000, Visual Basic, PHP, JS, SQL etc.
|
Verfasst: Fr 26.01.07 18:27
Titel: geht leider auch nicht
Das haut leider nicht hin! Gleiche Meldeung :-/
meine res sieht übrigends so aus:
img1 BITMAP D:\Delphi\Icons\bmp_01.bmp
[...]
img9 BITMAP D:\Delphi\Icons\bmp_09.bmp
Verstehe einfach nicht warum das nicht funktioniert...
|
|
alias5000
      
Beiträge: 2145
WinXP Prof SP2, Ubuntu 9.04
C/C++(Code::Blocks, VS.NET),A51(Keil),Object Pascal(D2005PE, Turbo Delphi Explorer) C# (VS 2008 Express)
|
Verfasst: Fr 26.01.07 19:29
Der Hintergrund und eine Lösung (?) wird hier erklärt: www.delphi-forum.de/viewtopic.php?t=66821
Die Lösung deines Problems hat IMHO Stefan-Buchholz dort gepostet.
Ansonsten müsste die Forensuche sicher eine Lösung dazu werfen, ich kann mir nicht vorstellen, dass das nicht schonmal kam.
Gruß alias5000
_________________ Programmers never die, they just GOSUB without RETURN
|
|
byoean 
      
Beiträge: 26
Win XP Pro
Delphi 7, Delphi 2000, Visual Basic, PHP, JS, SQL etc.
|
Verfasst: Fr 26.01.07 20:22
das hilft mir irgendwie nicht weiter. das problem schein darin zu bestehen ein TBitmap aus der DLL zu übergeben. In der suche habe ich nichts gefunden.
Hat noch jemand eine Idee? 
|
|
byoean 
      
Beiträge: 26
Win XP Pro
Delphi 7, Delphi 2000, Visual Basic, PHP, JS, SQL etc.
|
Verfasst: Fr 26.01.07 23:24
Titel: Eine Idee...
Habe nocheinmal herumprobiert und einen Weg gefunden, der mir aber nicht so glücklich erscheint. Und zwar lade ich das bild jetzt wie folgt:
Delphi-Quelltext 1: 2:
| getimage('img6').SaveToFile('temp.bmp'); speedbutton.Glyph.LoadFromFile('temp.bmp'); |
Leider tritt ein Fehler auf, wenn ich das Programm danach beenden will: "Ungültige Zeigeroption"
Ich habe auch versucht das in einen TStream zu speichern und dann zu laden - das haut erst recht nicht hin!
Hat jemand eine saubere Lösung auf Lager? =)
|
|
ich1506
      
Beiträge: 49
Win XP, Win 98, Win 2000, Eisfair
Delphi 5 Enterp
|
Verfasst: Fr 26.01.07 23:46
Hallo,
noch eine möglichkeit wäre: erst einem TBitmap (im Hauptprogramm) das Bild zuweisen und dann dieses verwenden.
Oder speichere das TBitmap nich auf die Festplatte, sondern in einen Stream o.Ä., dann musst du dich nicht darum kümmern, die Datei am Ende wieder zu löschen...
Aber probier mal erst nr 1 aus, vielleicht grenzt sich das Problem dann eher ein.
|
|
byoean 
      
Beiträge: 26
Win XP Pro
Delphi 7, Delphi 2000, Visual Basic, PHP, JS, SQL etc.
|
Verfasst: Sa 27.01.07 00:37
Bei der ersten Methode erhalte ich leider den gleichen Fehler wieder. Wenn ich es wie im untenstehenden programmcode mache, erhalte ich zwar keine Fehlermeldung, doch es wird einfach kein Bild angezeigt (als ich es hingegen mit savetofile / loadfromfile auf der festplatte gespeichert hatte schon).
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| [...] var temp : TMemoryStream begin
try temp := TMemoryStream.Create; getimage('img6').SaveToStream(temp); speedbutton1.Glyph.loadfromstream(temp); finally if assigned(temp) then FreeAndNil(temp); end;
speedbutton.Repaint; |
|
|
alias5000
      
Beiträge: 2145
WinXP Prof SP2, Ubuntu 9.04
C/C++(Code::Blocks, VS.NET),A51(Keil),Object Pascal(D2005PE, Turbo Delphi Explorer) C# (VS 2008 Express)
|
Verfasst: Sa 27.01.07 01:50
Versuch mal
byoean hat folgendes geschrieben: | Delphi-Quelltext 1:
| speedbutton1.Glyph := getimage('img6'); | |
zu
Delphi-Quelltext 1:
| speedbutton1.Glyph.Assign(TBitmap(getimage('img6')); |
machen. Das wäre dann eigentlich auch das, was aus dem genannten Post von Stefan.Buchholz hervorgehen sollte
Gruß alias5000
_________________ Programmers never die, they just GOSUB without RETURN
|
|
ich1506
      
Beiträge: 49
Win XP, Win 98, Win 2000, Eisfair
Delphi 5 Enterp
|
Verfasst: Sa 27.01.07 01:57
Das gibts doch nicht... da war er doch schneller als ich...
Soweit ich das verstehe, ich lasse mich gerne korrigieren, kann das eigentliche Bild nicht genutzt werden, weil es nur "lokal" in der Funktion existiert. Es muss aber quasi kopiert und nicht zugewiesen werden.
Und desshalb assign.
ps.:In dem Code, den du gepostet hast, fehlt die Freigabe des Bitmaps. 
|
|
alias5000
      
Beiträge: 2145
WinXP Prof SP2, Ubuntu 9.04
C/C++(Code::Blocks, VS.NET),A51(Keil),Object Pascal(D2005PE, Turbo Delphi Explorer) C# (VS 2008 Express)
|
Verfasst: Sa 27.01.07 02:17
Ich gebe zu, dass der Code nicht getestet ist (Wäre jetzt für mich ja ein relativ "hoher" Aufwand).
Aber:
Wie gesagt, Stefan erklärt es:
Stefan.Buchholtz hat folgendes geschrieben: | Es liegt an den is- und as-Operatoren. Die funktioniert nicht, wenn man ihn auf Objekte anwendet, die in einem anderen Executable (egal ob EXE oder DLL) erzeugt wurden. Die Delphi-Laufzeitumgebung erzeugt für jede DLL bzw. EXE eine eigene Klassenregistry, in der die Laufzeit-Typinformationen für die bekannten Klassen gespeichert werden. Wenn du in der DLL is oder as auf ein Objekt anwendest, schaut der in der Klassenregistry der DLL nach - dein TImage ist aber von der Exe erzeugt worden, die ihre eigene Klassenregistry hat. Deswegen liefert wird die Klasse nicht gefunden, is liefert immer false zurück und as wirft eine Exception. |
Das ist hier zwar in einer anderen Anwendung, aber es geht doch einfach darum, dass die Klasse TBitmap der Anwendung und die Klasse TBitmap der DLL für den Rechner zwei verschiedene sind, weil sie jeweils durch eine eigene Klassenregistry verwaltet werden. Umgehen kann ich das mit dem Typecast TBitmap(...) weil hier einfach nur der gegebene Pointer als TBitmap (der EXE) interpretiert wird und nicht überprüft wird, ob das auch tatsächlich passt.
Aber wir wissen ja, dass es passt, weil wir jeweils dieselbe Klasse aus derselben Unit verwenden.
Gruß alias5000
PS.: hmja, ich 1506, du hast recht. Das könnte dann aber schon die DLL machen, weil da gehört die Kompo ja auch hin 
_________________ Programmers never die, they just GOSUB without RETURN
|
|
byoean 
      
Beiträge: 26
Win XP Pro
Delphi 7, Delphi 2000, Visual Basic, PHP, JS, SQL etc.
|
Verfasst: Sa 27.01.07 12:45
Ok also das:
Delphi-Quelltext 1:
| speedbutton1.Glyph.Assign(TBitmap(getimage('img6'))); |
Haut auch nicht hin. Gleiche Meldung. Das einzige was funktioniert hatte war mit dem Bild so umzugehen:
Delphi-Quelltext 1: 2: 3:
| getimage('img6').SaveToFile(ExtractFilePath(ParamStr(0))+'temp.bmp'); sbtn1.Glyph.LoadFromFile(ExtractFilePath(ParamStr(0))+'temp.bmp'); deletefile(ExtractFilePath(ParamStr(0))+'temp.bmp'); |
Aber das ist ja eine unsaubere Lösung.
Ursprünglich wollte ich ja meine ganzen Kompos von einer DLL auf meiner Form erstellen lassen ( www.delphi-forum.de/...68429&highlight=).
Aber jetzt will ich zumindest meine palette an icons in einer Dll auslagern. Das muss doch irgendwie machbar sein. Wäre nett wenn ich noch ein bischen Support (vll auch einen Codeschnipsel =) ) bekommen könnte.=)
|
|
|