Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   JPG ohne Resource einfügen (https://www.delphipraxis.net/190377-jpg-ohne-resource-einfuegen.html)

Danny92 29. Sep 2016 00:57

JPG ohne Resource einfügen
 
Hey Leute,
ist es möglich, eine jpg-Datei ohne Resource einzufügen?
Ich will ein Bild als Image einfügen, aber sobald ich die Resource lösche oder verschiebe, hab ich ein Problem.
Ich will nur die ausführbare exe haben, ohne Datei drumherum...
Geht das?

haentschman 29. Sep 2016 05:20

AW: JPG ohne Resource einfügen
 
Moin...:P

Das ist der Zweck einer Ressource das man Bilder oder Text "eincomplieren" kann. :gruebel:

Wie stellst du das an an es nicht funktioniert? :P Oder ich habe dich nicht verstanden... :gruebel:

jaenicke 29. Sep 2016 05:25

AW: JPG ohne Resource einfügen
 
Wann hast du beim Entfernen der Ressourcendatei (.res) ein Problem? Beim Kompilieren oder beim Ausführen der Anwendung?

Beim Kompilieren wäre normal, denn da wird ja die Exe erst erstellt.

Wenn beim Ausführen, hast du etwas beim Laden der Ressource falsch gemacht. Dazu lässt sich ohne Quelltext aber nichts sagen.

ringli 29. Sep 2016 05:27

AW: JPG ohne Resource einfügen
 
Ich denke mal Danny92 meint mit Ressource die JPG-Datei und lädt diese direkt anstatt das Bild erstmal in eine Ressourcedatei (*.rc bzw. *.res) einzubinden. Das würde erklären das das Programm die Datei nicht mehr finden kann sobald sie verschoben oder gelöscht wird.

Danny92 29. Sep 2016 07:09

AW: JPG ohne Resource einfügen
 
Das Problem entsteht beim Ausführen der exe.

Das Kompilieren geht alles einwandfrei, und solange die Resource im angegebenen Pfad existiert, auch beim Ausführen. Lösche ich die Resource jedoch, lässt sich die exe ohne Fehlermeldung nicht mehr ausführen: "Die angeforderte Datei wurde nicht gefunden. Stellen Sie sicher, dass Pfad- und Dateiname richtig sind."

haentschman 29. Sep 2016 07:20

AW: JPG ohne Resource einfügen
 
Moin...:P
Zitat:

Ressourcedatei (*.rc bzw. *.res)
...hast du das Bild in die Ressourcendatei aufgenommen? Wie holst du das Bild aus der Ressource? (Quelltext)

Frage: Was bezeichnest du als Ressource? Das Bild im Dateisystem?

trojaner 29. Sep 2016 07:24

AW: JPG ohne Resource einfügen
 
Morgen

hohl dir den http://www.resource-builder.com/

Gruss

Danny92 29. Sep 2016 07:27

AW: JPG ohne Resource einfügen
 
Code:
procedure TForm1.SpieleMusikAb(FileName: string);
var
  rStream: TResourceStream;
  fStream: TMemoryStream;
  fname: string;
begin
  fname := ExtractFileDir(Paramstr(0))+'\sound\'+FileName+'.mp3';
  rStream := TResourceStream.Create(hInstance, FileName, RT_RCDATA) ;
  try
    fStream := TMemoryStream.Create;
    try
      fStream.CopyFrom(rStream, 0) ;
    finally fStream.Free; end;
  finally rStream.Free; end;
  MediaPlayer1.Close;
  MediaPlayer1.FileName:=fname;
  MediaPlayer1.Open;
  MediaPlayer1.Play;
end;
Code:
implementation

{$R *.dfm} {$R AboutDelphi.res}
Hier nehme ich beispielsweise statt eines Bildes eine mp3-Datei in einer Resource.

Kompilieren und ausführen funktioniert wie gesagt tadellos, solange die res-Datei davor nicht gelöscht wird.
Ich möchte die exe lediglich ohne res Datei ausführen können. Sonst ging das eigentlich auch immer

jaenicke 29. Sep 2016 07:40

AW: JPG ohne Resource einfügen
 
Also fassen wir mal zusammen was du machst:
  • Du baust dir einen Dateinamen in fname zusammen
  • Du lädst eine Ressource in rStream, kopierst diese in den MemoryStream fStream und gibst beides wieder frei
  • Und nun versuchst du aus der Datei, deren Dateiname in fname steht, zu lesen
Aber du benutzt den Inhalt der Ressource ja nirgends. Du lädst ja nach wie vor einfach aus der .mp3 Datei.

Lösungen:
  • Du kopierst den Inhalt der Ressource in einen TFileStream und legst die Datei lokal ab. Dann solltest du das allerdings nicht im Anwendungsverzeichnis machen, da du dort normalerweise keine Schreibrechte hast.
  • Oder du benutzt eine richtige Mediaplayer-Bibliothek wie bass, die auch aus Streams abspielen kann. Dann brauchst du auch die lokale Datei nicht mehr.

p80286 29. Sep 2016 08:22

AW: JPG ohne Resource einfügen
 
Deinen Code kann man auch gleich so reduzieren:

Delphi-Quellcode:
procedure TForm1.SpieleMusikAb(FileName: string);
var
  fname: string;
begin
  fname := ExtractFileDir(Paramstr(0))+'\sound\'+FileName+'.mp3';
  // ggf if Fileexists(fname) then begin
  MediaPlayer1.Close;
  MediaPlayer1.FileName:=fname;
  MediaPlayer1.Open;
  MediaPlayer1.Play;
end;
Da ist nichts mit Resource !

Gruß
K-H

Danny92 29. Sep 2016 08:30

AW: JPG ohne Resource einfügen
 
ok ich hab die resource einfach nochmal neu erstellt mit brcc32.exe. Jetzt gehts jedenfalls..
Keine Ahnung. Dankeschön^^

haentschman 29. Sep 2016 08:32

AW: JPG ohne Resource einfügen
 
...er möchte die nicht auf der Platte liegen haben. Nur ging der Versuch mit der Ressource schief. 8-) jaenicke hat es schon erklärt...

Ich trau dem Frieden noch nicht. :zwinker: Zeig noch mal den letzten Stand des Codes...

Danny92 3. Okt 2016 21:02

AW: JPG ohne Resource einfügen
 
Da das mit den Resourcen jetzt funktioniert,

will ich die jpg-Dateien als globale Variablen speichern, um sie später zu verwenden.
Wie geht das am einfachsten?
var
bild: TJpegImage;
RStream: TResourceStream;
begin
RStream := TResourceStream.Create(HInstance, 'A'+IntToStr(i), RT_RCDATA);
bild:=TJpegImage.Create;
bild.LoadFromStream(RStream);
RStream.Free;
end
Wenn ich das mit TJpegImage und LoadFromSteam mache, bekomme ich an irgendeiner Stelle immer Fehlermeldungen.
*Brett vorm Kopf*

jaenicke 4. Okt 2016 00:03

AW: JPG ohne Resource einfügen
 
An welcher Stelle und welche Fehlermeldungen?
Im Zweifelsfall (wenn du damit nichts anfangen kannst) halte an, wenn der Fehler aufgetreten ist und mache einen Screenshot wie es dann in Delphi aussieht. Vor allem den Stacktrace, die markierte Stelle, die Fehlermeldung...

Danny92 4. Okt 2016 01:05

AW: JPG ohne Resource einfügen
 
Code:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Image1: TImage;
    Button1: TButton;
    Image2: TImage;
    Image3: TImage;
    procedure FormActivate(Sender: TObject);
    procedure Image1Click(Sender: TObject);
    procedure Image2Click(Sender: TObject);
    procedure Image3Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
    procedure wahl(tuernummer: integer);
    function tuerwahl(autoposition, wahl1: byte): byte;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  gewaehlt: integer = 0;
  tuer: array[1..3] of TJpegImage;
  autoposition: byte;

implementation

{$R *.dfm} {$R es.res}

function TForm1.tuerwahl(autoposition, wahl1: byte): byte;
begin
  if autoposition=wahl1 then
  case autoposition of
  1: result:=Random(2)+2;
  3: result:=Random(2)+1;
  else
    if Random(2)=0
    then result:=1
    else result:=3
  end
  else
  case autoposition of
  1: if wahl1=2 then result:=3 else result:=2;
  3: if wahl1=2 then result:=1 else result:=2;
  else
    if wahl1=1
    then result:=3
    else result:=1
  end
end;

procedure TForm1.wahl(tuernummer: integer);
begin
  if gewaehlt=0 then
  begin
    case tuernummer of
      1: if tuerwahl(autoposition, tuernummer)=2
         then Image2.Picture.Graphic:=tuer[3]
         else Image3.Picture.Graphic:=tuer[3];
      2: if tuerwahl(autoposition, tuernummer)=1
         then Image1.Picture.Graphic:=tuer[3]
         else Image3.Picture.Graphic:=tuer[3];
    else
      if tuerwahl(autoposition, tuernummer)=2
      then Image2.Picture.Graphic:=tuer[3]
      else Image1.Picture.Graphic:=tuer[3];
    end;
    gewaehlt:=tuernummer;
  end else
  begin



  end
end;

procedure TForm1.FormActivate(Sender: TObject);
var
   jpgLogo: TJpegImage;
   RStream: TResourceStream;
   i, j: integer;
begin
   for i:=1 to 3 do
   begin
     RStream := TResourceStream.Create(HInstance, 'A'+IntToStr(i), RT_RCDATA);
     try
        jpgLogo := TJpegImage.Create;
        Try
           jpgLogo.LoadFromStream(RStream);
           tuer[i].LoadFromStream(RStream);
           //tuer[i]:=jpgLogo;
           if i=1 then
           for j:=1 to 3 do
           case j of
            1: Image1.Picture.Graphic := jpgLogo;
            2: Image2.Picture.Graphic := jpgLogo;
           else
             Image3.Picture.Graphic := jpgLogo;
           end
        finally
           //jpgLogo.Free;
        End;
     finally
        RStream.Free;
     end
   end

end;

procedure TForm1.Image1Click(Sender: TObject);
begin
  Wahl(1);
end;

procedure TForm1.Image2Click(Sender: TObject);
begin
  Wahl(2);
end;

procedure TForm1.Image3Click(Sender: TObject);
begin
  Wahl(3);
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  i: integer;
begin
  Randomize;
  autoposition:=Random(3)+1;
  for i:=low(tuer) to high(tuer) do
    tuer[i]:=TJpegImage.Create;
end;

end.
die Fehlermeldungen erscheinen am Ende des OnClick-Ereignis der TImage Komponenten.

jaenicke 4. Okt 2016 01:41

AW: JPG ohne Resource einfügen
 
Zitat:

Zitat von Danny92 (Beitrag 1349618)
die Fehlermeldungen erscheinen am Ende des OnClick-Ereignis der TImage Komponenten.

Und welche?

Das hier kannst du auch kürzer schreiben, ich habe nur das Gefühl, dass das so nicht gemeint war:
Delphi-Quellcode:
           if i=1 then
           for j:=1 to 3 do
           case j of
            1: Image1.Picture.Graphic := jpgLogo;
            2: Image2.Picture.Graphic := jpgLogo;
           else
             Image3.Picture.Graphic := jpgLogo;
           end
Das ist das gleiche wie:
Delphi-Quellcode:
           if i = 1 then
           begin
             Image1.Picture.Graphic := jpgLogo;
             Image2.Picture.Graphic := jpgLogo;
             Image3.Picture.Graphic := jpgLogo;
           end;
Denn du gehst ja mit j die Werte 1, 2 und 3 durch und bei jedem davon wird eine der drei Zeilen ausgeführt. Am Ende also alle drei.

Danny92 4. Okt 2016 01:48

AW: JPG ohne Resource einfügen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ja genau, danke^^

wie löse ich jetzt das Problem?

Zacherl 4. Okt 2016 02:54

AW: JPG ohne Resource einfügen
 
Die Graphic mit
Delphi-Quellcode:
:=
zuzuweisen, ist eine sehr schlechte Idee. Probiers stattdessen mal mit
Delphi-Quellcode:
Assign
. Die Fehlermeldung heißt allerdings, dass dein Stream an der gegebenen Position kein gültiges JPEG enthält. Das könnte daran liegen, dass du versuchst zwei Grafiken aus der selben Resource zu laden.

himitsu 4. Okt 2016 03:11

AW: JPG ohne Resource einfügen
 
Delphi-Quellcode:
:=
macht hier (hier) intern ein Assign.

Es wird eine komplette Kopie des übergebenen TGraphic-Nachfahren angelegt.
(neue Instanz erstellt und dieser mit Assign eine Kopie des Inhalts reingegeben)


#41 = Empty File Input

Bei Google suchenLibJPEG Error Codes -> http://www.efg2.com/Lab/Library/Delp...JpegErrors.txt

Embarcadero/Borland übernimmt leider viel Fremdcode, aber bei der Aufnahme der Codes sind die einfach zu doof.
* Selten Links/Hinnweise zum Originalhersteller oder wenigstens die Erwähnung des Namens des Originalcodes,
* niemals Verweise zur Dokumentation der übernommenen Funtionen
* und vorallem niemals denkt jemand nach, und erweitert "ordentlich" die übernommenen Codes.

So hätte man locker diese Fehlercodes übersetzen können anstatt nur 'ne nutzlose Fehlernummer anzuzeigen. (Nutzlos, wenn man niemandem sagt, was sie bedeuten sollen)

Zacherl 4. Okt 2016 03:57

AW: JPG ohne Resource einfügen
 
Zitat:

Zitat von himitsu (Beitrag 1349622)
Delphi-Quellcode:
:=
macht hier (hier) intern ein Assign

Oh, dann ist das wohl eine der wenigen Stellen, an denen tatsächlich mal ein Operator sinnvoll überladen bzw. ein ordentlicher Setter implementiert wurde :thumb:

bytecook 4. Okt 2016 07:44

AW: JPG ohne Resource einfügen
 
Zitat:

Zitat von trojaner (Beitrag 1349125)
Morgen

hohl dir den http://www.resource-builder.com/

Gruss

oder :)

http://melander.dk/reseditor/

Danny92 4. Okt 2016 13:46

AW: JPG ohne Resource einfügen
 
Die Resource funktioniert ja!
Aber mit Assign passiert gar nix mehr. Ich möchte doch lediglich 3 Bilder als Variablen speichern, um sie jederzeit in eine Image-Komponente zu laden und dort angezeigt zu bekommen^^
Es sind auch alle Bilder in der Resource vorhanden und ich kann sie auch direkt aus der Resource reinladen, aber mit dem Speichern in die Variablen komm ich einfach nicht klar mit.^^

Zacherl 4. Okt 2016 14:36

AW: JPG ohne Resource einfügen
 
Laut diesem Code:
Delphi-Quellcode:
   for i:=1 to 3 do
   begin
     RStream := TResourceStream.Create(HInstance, 'A'+IntToStr(i), RT_RCDATA);
     try
        jpgLogo := TJpegImage.Create;
        Try
           jpgLogo.LoadFromStream(RStream);
           tuer[i].LoadFromStream(RStream);
.. hast du doch schonmal 3 Resourcen A1 bis A3, welche alle ein JPEG enthalten.

Das Problem ist, dass du JEDES MAL 2 JPEGS ausliest. Das erste
Delphi-Quellcode:
LoadFromStream
wird funktionieren; das Zweite allerdings nicht, weil die Leseposition des Streams sich dann schon entsprechend an das Ende gesetzt hat.

haentschman 4. Okt 2016 14:47

AW: JPG ohne Resource einfügen
 
Recht hat er...:P
Zitat:

das Zweite allerdings nicht, weil die Leseposition des Streams sich dann schon entsprechend an das Ende gesetzt hat.
Wäre eine Imagelist für deine Icons (so sah es danach aus) nicht besser? 8-)... dann wäre das Array und das LoadFromStream überflüssig. 8-)

pesi 4. Okt 2016 14:54

AW: JPG ohne Resource einfügen
 
Hallo,

jetzt will ich aber auch mal meinen unqualifizierten Senf dazu geben und erzählen wie ich es machen würde (würde mich in diesem Kreis hier allerdings auch eher als Laie bezeichnen :roll:)
Resourcen mögen ja auch ganz nett sein, auch wenn ich damit noch nie gearbeitet habe und keinen Plan habe, aber ich mach mir das Leben in solchen Situationen ganz einfach:

1. Ich lege mir X TImages auf eine Form, lade die gewünschten Images über den Objektinspektor (Eigenschaft Picture) und setze die Images auf unsichtbar (oder packe sie auf eine Form die eh nicht angezeigt wird)
2. Je nach Situation (mittels IF oder CASE oder WASAUCHIMMER) gehe ich dann einfach her und weise dem Image in dem es angezeigt werden soll (hier "AngezeigtesBild") das entsprechende Bild zu.

AngezeigtesBild.Picture.Assigne(ImageXY.Picture)

3. Alternativ könntest Du auch natürlich auch eine TImageList nehmen und dort die gewünschten Bilder per Objektinspektor laden und dann später Deinem Ziel assignen.

Frage an die Experten: Was spricht dagegen???

Grüße
Peter

pesi 4. Okt 2016 14:54

AW: JPG ohne Resource einfügen
 
Mist... Haentschman war schneller :?

Danny92 6. Okt 2016 19:52

AW: JPG ohne Resource einfügen
 
Ja danke! Das doppelte LoadfromStream war das Problem. Danke nochmal.


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

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