Autor Beitrag
byoean
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 26

Win XP Pro
Delphi 7, Delphi 2000, Visual Basic, PHP, JS, SQL etc.
BeitragVerfasst: 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:

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:
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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 390

Win XP
Delphi 2007 Prof., XE2, XE5
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 26

Win XP Pro
Delphi 7, Delphi 2000, Visual Basic, PHP, JS, SQL etc.
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
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)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 26

Win XP Pro
Delphi 7, Delphi 2000, Visual Basic, PHP, JS, SQL etc.
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 26

Win XP Pro
Delphi 7, Delphi 2000, Visual Basic, PHP, JS, SQL etc.
BeitragVerfasst: 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:

ausblenden Delphi-Quelltext
1:
2:
getimage('img6').SaveToFile('temp.bmp');    //Bild aus Dll wird in Datei gespeichert
speedbutton.Glyph.LoadFromFile('temp.bmp'); //Gespeicherte Datei wird wieder geladen


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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 49

Win XP, Win 98, Win 2000, Eisfair
Delphi 5 Enterp
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 26

Win XP Pro
Delphi 7, Delphi 2000, Visual Basic, PHP, JS, SQL etc.
BeitragVerfasst: 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).

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
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)
BeitragVerfasst: Sa 27.01.07 01:50 
Versuch mal

user profile iconbyoean hat folgendes geschrieben:
ausblenden Delphi-Quelltext
1:
speedbutton1.Glyph := getimage('img6');					


zu
ausblenden 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 :roll:

Gruß alias5000

_________________
Programmers never die, they just GOSUB without RETURN
ich1506
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 49

Win XP, Win 98, Win 2000, Eisfair
Delphi 5 Enterp
BeitragVerfasst: 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. :roll:
alias5000
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
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)
BeitragVerfasst: 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:
user profile iconStefan.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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 26

Win XP Pro
Delphi 7, Delphi 2000, Visual Basic, PHP, JS, SQL etc.
BeitragVerfasst: Sa 27.01.07 12:45 
Ok also das:

ausblenden 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:

ausblenden 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.=)