Problem polega na tym, że kilka modułów pracuję z tym samym plikiem Resources.
Podczas wywoływania procedury tworzącej w drugim module, następuje ostrzeżenie:
[Error] WARNING. Duplicate resource(s):
[Error] Type JPEGFILE, ID OPCJE0:
[Error] File ścieżka resource kept; file Resources.RES resource discarded.
[Error] Type JPEGFILE, ID OPCJE1:
[Error] File ścieżka resource kept; file Resources.RES resource discarded.
[Error] Type JPEGFILE, ID POMOC0:
[Error] File ścieżka resource kept; file Resources.RES resource discarded.
[Error] Type JPEGFILE, ID POMOC1:
[Error] File ścieżka resource kept; file Resources.RES resource discarded.
[Error] Type JPEGFILE, ID TESTY0:
[Error] File ścieżka resource kept; file Resources.RES resource discarded.
[Error] Type JPEGFILE, ID TESTY1:
[Error] File ścieżka resource kept; file Resources.RES resource discarded.
[Error] Type JPEGFILE, ID THEME:
[Error] File ścieżka resource kept; file Resources.RES resource discarded.
[Error] Type JPEGFILE, ID THEMEEXAM1:
[Error] File ścieżka resource kept; file Resources.RES resource discarded.
[Error] Type JPEGFILE, ID WYNIKI0:
[Error] File ścieżka resource kept; file Resources.RES resource discarded.
[Error] Type JPEGFILE, ID WYNIKI1:
[Error] File ścieżka resource kept; file Resources.RES resource discarded.
[Error] Type JPEGFILE, ID ZAKONCZ0:
[Error] File ścieżka resource kept; file Resources.RES resource discarded.
[Error] Type JPEGFILE, ID ZAKONCZ1:
[Error] File ścieżka resource kept; file Resources.RES resource discarded.
Moduł główny - Main:
unit Main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, jpeg, ExtCtrls, ShellAPI, MyImage1;
...
TJPEGRes = class(TJPEGImage)
public
procedure LoadFromResource(const ResID: PChar); virtual;
end;
...
implementation
uses Exam1;
{$R *.dfm}
{$R Resources.RES}
procedure TJPEGRes.LoadFromResource(const ResID: PChar);
var
Res : TResourceStream;
begin
Res := TResourceStream.Create(hInstance, ResID, 'JPEGFILE');
try
LoadFromStream(Res);
finally
Res.Free;
end;
end;
procedure TMainForm.LoadTheme;
var
JPG : TJPEGRes;
begin
JPG := TJPEGRes.Create;
try
JPG.LoadFromResource('Theme');
IMGMainTheme.Picture.Assign(JPG);
JPG.LoadFromResource('Testy0');
IMGTesty.Picture.Assign(JPG);
JPG.LoadFromResource('Wyniki0');
IMGWyniki.Picture.Assign(JPG);
JPG.LoadFromResource('Pomoc0');
IMGPomoc.Picture.Assign(JPG);
JPG.LoadFromResource('Opcje0');
IMGOpcje.Picture.Assign(JPG);
JPG.LoadFromResource('Zakoncz0');
IMGZakoncz.Picture.Assign(JPG);
finally
JPG.Free;
end;
end;
...
Kolejny moduł - Exam1:
unit Exam1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, jpeg, ExtCtrls, ShellAPI, MyImage1;
type
TExam1Form = class(TForm)
IMGExam1Theme: TImage;
procedure LoadTheme;
end;
TJPEGRes = class(TJPEGImage)
public
procedure LoadFromResource(const ResID: PChar); virtual;
end;
var
Exam1Form: TExam1Form;
implementation
{$R *.dfm}
{$R Resources.RES}
uses Main;
procedure TJPEGRes.LoadFromResource(const ResID: PChar);
var
Res : TResourceStream;
begin
Res := TResourceStream.Create(hInstance, ResID, 'JPEGFILE');
try
LoadFromStream(Res);
finally
Res.Free;
end;
end;
procedure TExam1Form.LoadTheme;
var
JPG : TJPEGRes;
begin
JPG := TJPEGRes.Create;
try
JPG.LoadFromResource('Theme');
IMGExam1Theme.Picture.Assign(JPG);
finally
JPG.Free;
end;
end;
end.
Zastanawiałem się nad tym trochę, czy kompilatorowi nie chodzi przypadkiem o to, że Resources został już wczytany do pamięci w poprzednim module? Należy go zwolnić i jeszcze raz załadować w drugim module, czy odwołać się do procedury ładującej?