In jouw code wil je een resource van het type RCDATA lezen, maar je geeft 'JPEG' als het type dat je daadwerkelijk leest:
Dat gaat natuurlijk niet goed.
Ik heb even een Delphiproject tevoorschijn gehaald waarin verschillende soorten resources zitten: een bitmap, twee icons (zelfde icon, maar met andere namen) en een dialog template. Dit is de RC-file, die met een resource compiler moet worden gecompileerd:
DEFWIZWATERMARK BITMAP DISCARDABLE DefWizWatermark.bmp
WIZTIP RCDATA DISCARDABLE WizTip.ico
12345 RCDATA DISCARDABLE WizTip.ico
DEFWIZEXTERIOR DIALOG DISCARDABLE 40, 0, 317, 193
STYLE WS_CHILD | WS_DISABLED
FONT 8, "MS Sans Serif"
BEGIN
END
In dezelfde directory staan de bestanden DefWizWatermark.bmp en WizTip.ico, die beide als resource in de resource file moeten worden opgenomen. Een bitmap is een standaard resourceformaat van het type BITMAP. De icons zijn - net als een JPEG-afbeelding - geen voorgedefinieerd resourcetype, vandaar dat ze moeten worden opgeslagen als het resourcetype RCDATA. Om dit script comfortabel te kunnen compileren tot een *.res-bestand kun je een batchbestand schrijven:
brcc32.exe MijnResource.rc MijnResource.res
pause
Natuurlijk moet je niet vergeten dat resourcebestand mee te compileren in je executable door in de implementation sectie van een van de units een resource directive op te nemen.
Nu een beetje stoeien met het laden van de icon resource uit het bestand.
Delphi:
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
| {$R MijnResource.res}
procedure LoadMyIcon(Image: TImage; IconLib: HINST; IconID: PAnsiChar);
var
AIconID: Integer;
ResStream: TResourceStream;
begin
with Image do
begin
AutoSize := True;
if GetIconLib = 0 then
Picture.Icon.Handle := LoadIcon(0, IconID)
else
begin
AIconID := Integer(IconID);
try
{ There's a bug in TResourceStream.CreateFromID, which raises an access
violation instead of EResNotFound when the icon is not found }
ResStream := TResourceStream.CreateFromID(IconLib, AIconID, RT_RCDATA);
except
on EAccessViolation do
raise EResNotFound.CreateFmt('Resource %s not found', [IntToStr(AIconID)])
else
raise;
end;
try
Picture.Icon.LoadFromStream(ResStream);
finally
ResStream.Free;
end;
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
{ Assumption: MyImage is an existing TImage instance, for example on Form1 }
{ Load the standard Windows question mark. Use 0 for the instance handle -
this indicates to load the file from the predefined Windows resources. }
LoadMyIcon(MyImage, 0, IDI_QUESTION);
{ Now load the WIZTIP icon resource (a name) from the resources in the executable }
LoadMyIcon(MyImage, HInstance, PAnsiChar('WIZTIP'));
{ Load the 12345 icon resource (a number) from the resources in the executable }
LoadMyIcon(MyImage, HInstance, MakeIntResource(12345));
end; |
Door de unit jpeg aan de uses clause van de unit toe te voegen en Image.Picture.Icon te vervangen door Image.Picture.JPEG kun je de code heel eenvoudig omschrijven tot iets wat een JPEG-afbeelding moet laden.
[
Voor 14% gewijzigd door
Tomatoman op 11-02-2005 18:47
]
Een goede grap mag vrienden kosten.