Entwickler-Ecke

Multimedia / Grafik - JPEG von res zur Laufzeit laden


JayK - Sa 16.04.05 13:03
Titel: JPEG von res zur Laufzeit laden
Hallo Leute,
ich habe ein Programm mit res Datei, wo JPGs drin sind.
Auf dem Formular befindet sich eine ComboBox. Wenn man den Wert in der ComboBox verändert, soll von der Ressource mit dem Namen, der dem Text in der Combobox entspricht, in ein TImage geladen werden.

Beispiel:
Kann mir da jemand weiterhelfen?


AXMD - Sa 16.04.05 13:09
Titel: Re: JPEG von res zur Laufzeit laden
user profile iconJayK hat folgendes geschrieben:
Hallo Leute,
ich habe ein Programm mit res Datei, wo JPGs drin sind.
Auf dem Formular befindet sich eine ComboBox. Wenn man den Wert in der ComboBox verändert, soll von der Ressource mit dem Namen, der dem Text in der Combobox entspricht, in ein TImage geladen werden.

Beispiel:

    In der ComboBox wähle ich das Item 'ALL' aus.
    In das Image soll nun 'ALL.jpg' aus der .res Datei geladen werden.

Kann mir da jemand weiterhelfen?


Da gibts was, das nennt sich Suche. Schon mal verwendet :roll:

AXMD


JayK - Sa 16.04.05 13:20
Titel: Re: JPEG von res zur Laufzeit laden
user profile iconAXMD hat folgendes geschrieben:

Da gibts was, das nennt sich Suche. Schon mal verwendet :roll:


Ja, allerdings.
Aber gefunden hab ich nichts, dass brauchbar ist oder für mich verständlich ist.

Das naheliegenste war Bitmaps von Resourcen lesen [http://www.delphi-forum.de/topic_Bitmaps+von+Resourcen+lesen_6080.html], aber das ist ja für Bitmaps und zu einem anderen Zweck.


AXMD - Sa 16.04.05 13:27

Das Resourcen-Prinzip ist aber immer das gleiche; was du danach mit den Ressourcen machst ist vollkommen unabhängig davon

AXMD


JayK - Sa 16.04.05 13:39

Ich will nicht anmaßend wirken,
aber einem TBitmap werde ich ja wohl schlecht einem TJPEGImage oder ein JPG-Bild (falls das noch nichtmal diesen Typ zugewiesen bekommt) zuweisen. Oder doch :shock: ?
Dasselbe für TIcon.
Und für TGraphic finde ich keine Handle Eigenschaft / Wert.


AXMD - Sa 16.04.05 13:42

Schon klar :roll: Schon mal die Unit jpeg angeschaut oder TJPEGImage?

AXMD


JayK - Sa 16.04.05 20:51

Da gibt's leider ein kleines Problem:
Wenn ich die aus dem Uses-Klausel zu öffnen versuche, öffnet er nur einen Laden-Dialog. :evil:
Borland schickt ja seine Units auch nicht einfach so als Pascal-Datei mit, sonst könnte man die ja einfach verändern und so :roll: .
EDIT: Jepp, ist nur eine DCU Datei, schön vorcompiliert und durchgekaut.


JayK - So 17.04.05 15:02

Na gut OK, ich habs jetzt mal über den Weg mit dem RessourceStream probiert, kriege aber immer wieder eine
Zitat:
Zugriffsverletzung bei Adresse ... Lesen aus Adresse 00000000.
zurück.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, XPMan, ComCtrls, ExtCtrls, ToolWin, StdCtrls, ImgList, Buttons, JPEG,
  axCtrls, Spin;

...

    image1: TImage;

...

procedure TMainForm.Anzeigen(Sender: TObject);
var
  resstream: TResourceStream;
begin
  resstream := tresourceStream.CreateFromID(hInstance, 100, RT_RCDATA);
  try
    image1.Picture.Graphic.LoadFromStream(ResStream);
  finally
    ResStream.Free;
  end;
end;


procedure TMainForm.Button1Click(Sender: TObject);
begin
  Anzeigen(Sender);
end;


Meine RC Datei sieht so aus:

Delphi-Quelltext
1:
2:
3:
100 RCDATA "img\all.jpg"
101 RCDATA "img\fa.jpg"
...

und wurde einfach per "Zu Projekt hinzufügen" ins Projekt eingebunden.

Was mache ich jetzt schon wieder falsch?

(Link zum Thread, wo ich das her habe steht oben ja schon)


JayK - Sa 23.04.05 12:43

Also es scheint ja keiner zu wissen, wie das anzustellen ist.

Geht das vielleicht einfacher, wenn man die JPEGs über "Zum Projekt hinzufügen" einfügt? Oder Frage: Wie kommt man da überhaupt ran?

Ansonsten würde ich natürlich auch gerne Antworten zum .res Problem noch hören.


retnyg - Fr 13.05.05 16:49


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
uses ..., JPEG;

...

procedure TForm1.BitBtn1Click(Sender: TObject);
var Bild: TJPEGImage;
begin
  Bild := TJPEGImage.Create;
  Bild.LoadFromFile('c:\temp\1.jpg');
  image1.Picture.Assign(bild);
  bild.free;
end;


statt loadfromfile nimmst du loadfromresourcename und - tada - problem gelöst.


JayK - Fr 13.05.05 16:59

user profile iconretnyg hat folgendes geschrieben:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
uses ..., JPEG;

...

procedure TForm1.BitBtn1Click(Sender: TObject);
var Bild: TJPEGImage;
begin
  Bild := TJPEGImage.Create;
  Bild.LoadFromFile('c:\temp\1.jpg');
  image1.Picture.Assign(bild);
  bild.free;
end;


statt loadfromfile nimmst du loadfromresourcename und - tada - problem gelöst.

Wäre schön, ist aber nicht so :( .
TJPEGImage hat anscheinend keine LoadFromRessourceName-Methode...


retnyg - Fr 13.05.05 17:03

oh :shock:
na dann probier es mal mit der stream-methode. dein .rc srcipt hast du aber schon mit brcc32 kompiliert ?
der name der jpg's wäre dann übrigens 100 und 101, nicht all oder so. erster absatz im rc script steht für den resource-namen.


JayK - Fr 13.05.05 17:25

user profile iconretnyg hat folgendes geschrieben:
oh :shock:
na dann probier es mal mit der stream-methode.

hatte ich schon. (Siehe oben) Da kam immer diese dumme Fehlermeldung mit Lesen von Adresse 00000000...

user profile iconretnyg hat folgendes geschrieben:
dein .rc srcipt hast du aber schon mit brcc32 kompiliert ?

Ich habs einfach ins Projekt aufgenommen, denn wenn ich es über Kommandozeile mit brc32.exe compilieren will, kommt immer
Borland Resource Compiler hat folgendes geschrieben:
Fatal error. Could not spawn program: ILINK32.EXE
raus.
user profile iconretnyg hat folgendes geschrieben:
der name der jpg's wäre dann übrigens 100 und 101, nicht all oder so. erster absatz im rc script steht für den resource-namen.

Erster Absatz??? Ist erste Zeile, oder erster, na ja, "Parameter" gemeint?


retnyg - Fr 13.05.05 17:32

user profile iconJayK hat folgendes geschrieben:
user profile iconretnyg hat folgendes geschrieben:
oh :shock:
na dann probier es mal mit der stream-methode.

hatte ich schon. (Siehe oben) Da kam immer diese dumme Fehlermeldung mit Lesen von Adresse 00000000...


Quelltext
1:
image1.Picture.Graphic.LoadFromStream(ResStream);                    

mit dem code kann das nicht klappen, denn du kannst graphic keinen jpeg-stream zuweisen.
baue den code in die neue variante ein.

Zitat:
user profile iconretnyg hat folgendes geschrieben:
dein .rc srcipt hast du aber schon mit brcc32 kompiliert ?

Ich habs einfach ins Projekt aufgenommen, denn wenn ich es über Kommandozeile mit brc32.exe compilieren will, kommt immer
Borland Resource Compiler hat folgendes geschrieben:
Fatal error. Could not spawn program: ILINK32.EXE
raus.

such mal auf deiner platte nach der ilink32.exe. das verzeichnis wo die drin ist tust du zu deiner PATH-umgebungsvariable dazu (systemsteuerung, system, erweitert)
dann sollte es kompilieren. solange du das RC nicht zu einer RES datei kompilierst, existiert deine resource nicht.

der name der exe datei ist übrigens BRCC32.exe, nicht BRC32.exe
Zitat:

user profile iconretnyg hat folgendes geschrieben:
der name der jpg's wäre dann übrigens 100 und 101, nicht all oder so. erster absatz im rc script steht für den resource-namen.

Erster Absatz??? Ist erste Zeile, oder erster, na ja, "Parameter" gemeint?

so ist es gemeint. und tu die ordnernamen ( bla\x.gif ) aus deinem rc skript weg. also die bilder in den gleichen ordner legen, wie das RC skript


JayK - Fr 13.05.05 17:50

user profile iconretnyg hat folgendes geschrieben:
user profile iconJayK hat folgendes geschrieben:


Delphi-Quelltext
1:
image1.Picture.Graphic.LoadFromStream(ResStream);                    

mit dem code kann das nicht klappen, denn du kannst graphic keinen jpeg-stream zuweisen.
baue den code in die neue variante ein.

Neue variante? Hab ich was verpasst :shock: ?

user profile iconretnyg hat folgendes geschrieben:
JayK hat folgendes geschrieben:
wenn ich es über Kommandozeile mit brc32.exe compilieren will, kommt immer
Borland Resource Compiler hat folgendes geschrieben:
Fatal error. Could not spawn program: ILINK32.EXE
raus.

such mal auf deiner platte nach der ilink32.exe. das verzeichnis wo die drin ist tust du zu deiner PATH-umgebungsvariable dazu (systemsteuerung, system, erweitert)

:idea: jetzt hab ich auch 'ne idee, wie ich einfacher an den C#-Compiler rankomme :D (nebenbei)

user profile iconretnyg hat folgendes geschrieben:

der name der exe datei ist übrigens BRCC32.exe, nicht BRC32.exe

Ups, :oops: hatte mich verschrieben ;) mit der brcc32.exe gehts erstmal ohne Fehler :).

user profile iconretnyg hat folgendes geschrieben:
und tu die ordnernamen ( bla\x.gif ) aus deinem rc skript weg. also die bilder in den gleichen ordner legen, wie das RC skript

Das wäre aber doof, es sind ca. 30 oder mehr Bilder...


GSE - Fr 13.05.05 17:58

mal was prinizipielles (nicht zur Frage gehörendes)
Zitat:
Borland schickt ja seine Units auch nicht einfach so als Pascal-Datei mit, sonst könnte man die ja einfach verändern und so
das ist nur in den personal bzw. Standard Versionen so, ab Delphi Pro liegen alle Borland-Units als pas Dateien vor, du kannst sie also auch einsehen und ggf. ändern.

mfg
GSE


retnyg - Fr 13.05.05 18:14

pas hat folgendes geschrieben:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
{$R test.res}
procedure TForm1.BitBtn1Click(Sender: TObject);
var Bild: TJPEGImage;
  resstream: TResourceStream;
begin
  Bild := TJPEGImage.Create;
  resstream := tresourceStream.Create(hInstance, 'BILD', RT_RCDATA);
  bild.LoadFromStream(resstream);
  //  Bild.LoadFromFile('c:\temp\1.jpg');
  image1.Picture.Assign(bild);
  bild.free;
  resstream.free;
end;

test.rc hat folgendes geschrieben:

Quelltext
1:
bild  RCDATA  "C:\temp\1.jpg"                    

wichtig ist auch, dass man RCDATA gross schreiben muss. der sch... hat mich grade 10 min gekostet deswegen :evil:


JayK - Fr 13.05.05 18:38

Super! Es klappt jetzt :D :D . Danke Leute!! ;)