Zduplikowane Resources - problem

0

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?

1

plik res dołącza się do projektu tylko RAZ

0

Czyli muszę go dołączyć do głównego modułu.
W takim razie jak mam załadować coś z innego modułu. Proszę o nakierowanie, z kodem sobie poradzę.

0

możesz go dodać gdzie chcesz. I tyle. Ale tylko raz

0

No dobrze, ale czy odczytywanie zawartośći z tego pliku następuje w ten sam sposób co w MainForm czy w inny? To mnie najbadziej interesuję.

0

No dobrze, ale czy odczytywanie zawartośći z tego pliku następuje w ten sam sposób co w MainForm czy w inny? To mnie najbadziej interesuję.

Sprawdź, dzięki temu:

  1. Oszczędzisz nam czasu
  2. Poznasz odpowiedź.
2

zasoby dodają się do pliku wynikowego (exe, dll, ...) a nie do unitu. I jako takie nie ma znaczenia w którym unicie je dodasz bo i tak są widoczne - do konstruktora TResourceStream podajesz uchwyt instancji, która zawiera dany zasób

1 użytkowników online, w tym zalogowanych: 0, gości: 1