Delphi-PRAXiS
Seite 3 von 5     123 45      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi PNGs oder Dateien allgemein in EXE einbinden und auslesen (https://www.delphipraxis.net/164427-pngs-oder-dateien-allgemein-exe-einbinden-und-auslesen.html)

Uwe Raabe 13. Nov 2011 14:49

AW: PNGs oder Dateien allgemein in EXE einbinden und auslesen
 
Diese beiden Zeilen scheinen mir nicht zusammenzupassen:

Zitat:

ResStr := TResourceStream.Create(HInstance, 'Pokedex', RT_RCDATA);
und

Zitat:

Pokedex PNG "Pokedex2.png"
Sollte das nicht

Pokedex RCDATA "Pokedex2.png"

heißen?

entwickler 13. Nov 2011 15:24

AW: PNGs oder Dateien allgemein in EXE einbinden und auslesen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Okay, habe ich abgeändert, doch der Fehler ändert sich nicht :?
Vielleicht hilft ja ein Bild des Fehlers, um die Fehlerquelle herauszufinden [Die Anwendung lässt sich normal starten, aber wenn ich auf den Button vom Testprogramm klicke:]:

DeddyH 13. Nov 2011 15:47

AW: PNGs oder Dateien allgemein in EXE einbinden und auslesen
 
Moment, DLL? Was hast Du denn wo drin?

entwickler 13. Nov 2011 16:07

AW: PNGs oder Dateien allgemein in EXE einbinden und auslesen
 
In die DLL ist die *.res eingebunden; die DLL soll der Testanwendung das 80x80 Pixel große Bild als PNG übergeben (da muss ich noch gucken, wie ich das mache). Zwischendurch musste die PNG- Datei in einen Bitmap umgewandelt werden, damit ich aus dem Bild einen Part ausschneiden kann.

DeddyH 13. Nov 2011 16:17

AW: PNGs oder Dateien allgemein in EXE einbinden und auslesen
 
Nun mal langsam: wenn es eine reine Ressourcen-DLL ist, dann übergibt sie ja nichts. Und wenn nicht, kannst Du keine Objektinstanzen zwischen DLL und Hauptprogramm austauschen, dafür müsstest Du eine *.bpl erzeugen.

Bummi 13. Nov 2011 16:32

AW: PNGs oder Dateien allgemein in EXE einbinden und auslesen
 
1. Dass Du die Resource so nicht laden kannst liegt daran dass das Bild nicht unter RC DATA sondern unter PNG liegt.
2. Du erzeugst weiterhin diese Formular, diesmal greifst Du sogar auf PNGButton1 bevor es erzeugt ist
3. Wen Du das Bild irgendwann geladen hast wirst Du es nicht schaffen ein transparentest Bild mit den bisherigen Mitteln zurückzugeben.


Mit ist nicht ganz klar was das mit der DLL soll, wenn Du den Ansatz weiterverfolgen willst würde ich Dir GDI+ ans Herz legen, ist frei herunterladbar.
Hier könntest Du in ein dynamische erzeugtes GPIMage direkt PNG's laden, der DLL würdest das Handle des ZielCanvas übergeben, die Zielkoordinaten, den Quellauschnitt und die DLL könnte direkt transparent in eine beliebiges Zielcanvas malen.

DeddyH 13. Nov 2011 17:18

AW: PNGs oder Dateien allgemein in EXE einbinden und auslesen
 
Liste der Anhänge anzeigen (Anzahl: 1)
So, ich habe das jetzt mal mit einer Ressourcen-DLL gemacht.
DLL:
Delphi-Quellcode:
library imagedll;

{$R pokedex.res}

begin
end.
Anwendung mit einem TImage drauf:
Delphi-Quellcode:
uses pngimage;

procedure TForm1.ButtonClick(Sender: TObject);
var
  DLLHandle: THandle;
  ResStream: TResourceStream;
  bmp: TBitmap;
  png: TPngImage;
begin
  DLLHandle := LoadLibrary(PChar(ExtractFilePath(ParamStr(0)) + 'imagedll.dll'));
  if DLLHandle <> 0 then
    try
      ResStream := TResourceStream.Create(DLLHandle, 'POKEDEX', RT_RCDATA);
      try
        ResStream.Position := 0;
        png := TPngImage.Create;
        try
          png.LoadFromStream(ResStream);
          bmp := TBitmap.Create;
          try
            bmp.Width := 80;
            bmp.Height := 80;
            bmp.PixelFormat := pf32Bit;
            BitBlt(bmp.Canvas.Handle, 0, 0, bmp.Width, bmp.Height, png.Canvas.Handle, 0, 0, SRCCOPY);
            Image1.Picture.Assign(bmp);
          finally
            bmp.Free;
          end;
        finally
          png.Free;
        end;
      finally
        ResStream.Free;
      end;
    finally
      FreeLibrary(DLLHandle);
    end;
end;
Wobei man sich natürlich fragen kann, ob man wirklich die Gesamtgrafik lädt und daraus dann den entsprechenden Ausschnitt herauskopiert oder das nicht vorher macht und die enthaltenen 493 Bildchen einzeln in die Ressource packt (siehe Anhang).

entwickler 14. Nov 2011 09:09

AW: PNGs oder Dateien allgemein in EXE einbinden und auslesen
 
Danke, DeddyH.

[Ich kanns im moment nicht ausprobieren, hab delphi nicht zur Hand]
Der Programmcode klingt erstmal ganz gut, aber was bewirkt dieses

Zitat:

Delphi-Quellcode:
DLLHandle: THandle;

? Das verstehe ich daran nicht.
PS: Danke auch f. d. Einzelgrafiken!

DeddyH 14. Nov 2011 09:13

AW: PNGs oder Dateien allgemein in EXE einbinden und auslesen
 
Aus dem MSDN:
Zitat:

Prozesse rufen LoadLibrary (oder AfxLoadLibrary) auf, um eine explizite Verknüpfung mit einer DLL herzustellen. Wenn der Aufruf erfolgreich ist, ordnet die Funktion die angegebene DLL im Adressbereich des aufrufenden Prozesses zu und gibt ein Handle für die DLL zurück. Dieses Handle kann zusammen mit anderen Funktionen für die explizite Verknüpfung verwendet werden, z. B. GetProcAddressund FreeLibrary.

Sir Rufo 14. Nov 2011 10:02

AW: PNGs oder Dateien allgemein in EXE einbinden und auslesen
 
Und wenn man sauberen Code haben möchte, dann legt man sich das in eine eigenen Funktion und nicht direkt in ein GUI-Event der Form ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:26 Uhr.
Seite 3 von 5     123 45      

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