Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Resource in abgeleitetes Objekt integrieren?


Kay E. - So 21.11.10 16:21
Titel: Resource in abgeleitetes Objekt integrieren?
Hallo!

Und mal wieder brauch ich eure Hilfe:
Ich hab ein neues Objekt erstellt, das von TImage abgeleitet ist. Dieses Objekt hat die Eigenschaft, dass es 3 Darstellungszustände hat. Im Grundzustand wird Bild a angezeigt, wenn ich links klicke Bild b und wenn ich rechts klicke Bild c.
Bis jetzt lese ich die Bilder aus dem Verzeichnis aus, in dem die Exe liegt. Ich würde aber lieber die Bilder in der Komponente selbst (bzw wenn das nicht geht zumindest in der Exe) kapseln, so dass ich die Bilder nicht immer "lose" mit dem Programm rumschleppen muss.

Wie stell ich das an?

Danke für eure Antworten!


platzwart - So 21.11.10 16:32

http://www.delphi-library.de/viewtopic.php?t=85876&highlight=bild%20%20%20exe%20einbinden


bummi - So 21.11.10 16:34

Lade Dir den XNResource Editor aus dem Web.
3 * Addresource
das ganze Speichern unter Egalwie.res
Egalwie.res in dem Projektordner kopieren
In Deine Komponente einbinden über {$res Egalwie.res}
im Code

Delphi-Quelltext
1:
bmp.LoadFromResourceName(HInstance, 'NAMEBILD1')                    


jaenicke - So 21.11.10 17:11

Und das Einbinden mit {$R xy.res} kannst du natürlich auch in der Unit der Komponente machen. ;-)


bummi - So 21.11.10 18:06

@jaenicke

sorry, da habe ich wohl gepennt :(

@Kay E.

natürlich gehört die res in die Komponente
ich habe es korrigiert...


Kay E. - So 21.11.10 19:31

Hey, dankeschön für die Antworten!

Ich bin die Liste durchgegangen und es hat auch alles funktioniert, nur steh ich jetzt bei dem Problem, die Resourcen im Quellcode anzusprechen. Die Bilder sind JPEG's und wenn ich den aufruf von bummi versuch (LoadFromResourceName), dann stell ich fest, dass JPEG's sowas nicht haben. Ich find da nur LoadFromStream, LoadFromClipboardFormat und in TImage.picture noch das LoadFromFile.
Wie bring ich die Daten aus der Res-Datei denn nun auf das TImage?


jaenicke - So 21.11.10 19:45

Benutze einfach TResourceStream, den kannst du dann an ein TJpegImage füttern. ;-)


Kay E. - So 21.11.10 20:09

Also irgendwie bekomm ichs nicht gebacken.
So sieht das Resource-File aus:
user defined image

und so die Implementierung:

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:
29:
30:
31:
implementation

{$R ImagesTWiesenfeld.res}

//...

procedure TWiesenfeld.LoadPictureFromJpgResource(picture : TPicture;const AResName: string);
var
   rs: TResourceStream;
   jpg: TJPEGImage;
begin
   rs := TResourceStream.Create(HInstance,AResName,RT_RCDATA);
   jpg := TJPEGImage.Create;
   try
      jpg.LoadFromStream(rs);
      picture.Assign(jpg);
   finally
      jpg.Free;
      rs.Free;
   end;
end;


procedure TWiesenfeld.SetPicture(Fieldstate: TFieldState);
begin
  case Fieldstate of
    fsEmpty: LoadPictureFromJpgResource(Picture,'RESEMPTY');
    fsCrystal: LoadPictureFromJpgResource(Picture,'RESCRYSTAL');
    fsBottle: LoadPictureFromJpgResource(Picture,'RESBOTTLE');
  end;
end;


Es compiliert, aber beim Start des Programms kommt dann die Fehlermeldung:
user defined image

Was mach ich denn falsch?


jaenicke - So 21.11.10 20:33

user profile iconKay E. hat folgendes geschrieben Zum zitierten Posting springen:
So sieht das Resource-File aus:
Also ich kenne diesen Editor jetzt nicht (ich mache das lieber manuell), aber ich denke der Knackpunkt ist der:
user profile iconKay E. hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
   rs := TResourceStream.Create(HInstance,AResName,RT_RCDATA);                    
Du gibst hier als Typ RCDATA an, wenn ich den Screenshot des Resourceneditors aber richtig interpretiere, benutzt du dort den Typ JPEG. ;-)

Ich vermute also richtig wäre es so:

Delphi-Quelltext
1:
   rs := TResourceStream.Create(HInstance, AResName, 'JPEG');                    


Kay E. - So 21.11.10 20:44

Ahhhh, perfekt!

Um ehrlich zu sein, hatte ich nicht genau verstanden, was der letzte Parameter von mir will *g* In das RCData hab ich in dem Zusammenhang dann iwo im Netz gefunden. Vielen Dank für die Hilf, so klappt alles!