чтение ресурса в программе (делфи)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by bertys, 2 Oct 2012.

  1. bertys

    bertys New Member

    Joined:
    25 Jan 2012
    Messages:
    162
    Likes Received:
    0
    Reputations:
    0
    Я добавил через редактор ресурсов в программу новый ресурс

    Как мне прочитать в делфи что в нем написано (из тойже проги)
     
  2. ViDoG

    ViDoG New Member

    Joined:
    30 Apr 2010
    Messages:
    9
    Likes Received:
    3
    Reputations:
    0
    Можно при помощи метода LoadFromResourceName, который имеет два параметра: идентификатор программы и имя ресурса. В качестве идентификатора программы используется глобальная переменная Hinstance. Имя ресурса должно быть представлено в виде строковой константы.

    Например, инструкция загрузки картинки в переменную Pic может выглядеть так:

    Code:
    Pic.LoadFromResourceName(Hinstance,'FACTORY');
    Пример загрузки картинок из ресурса:

    Code:
    unit Unit1;
    
    {$R images.res} // включить файл ресурсов interface
    
    uses
    
    Windows, Messages, SysUtils, Classes,
    
    Graphics, Controls, Forms, Dialogs,
    
    ExtCtrls, StdCtrls, Buttons;
    
    type
    
    TForm1 = class(TForm)
    
    Timer1: TTimer;
    
    Image1: ТImage;
    
    procedure FormActivate(Sender: TObject);
    
    procedure Timer1Timer(Sender: TObject);
    
    procedure FormClose(Sender: TObject;
    
    var Action: TCloseAction); private
    
    { Private declarations } public
    
    { Public declarations } end;
    
    var
    
    Form1: TForm1;
    
    Back, bitmap, Buf : TBitMap;
    
    // фон, картинка, буфер
    
    BackRct, BufRet: TRect;
    
    // область фона, картинки, буфера
    
    х,у:integer;
    
    // координаты левого верхнего угла картинки
    
    W,H: integer; // размеры картинки
    
    implementation
    
    {$R *.DFM}
    
    procedure TForm1.FormActivate(Sender: TObject);
    
    begin
    
    Back := TBitmap.Create; // фон
    
    bitmap := TBitmap.Create; // картинка
    
    Buf := TBitmap.Create; // буфер
    
    // загрузить из ресурса фон
    
    Back.LoadFromResourceName(HInstance,'FACTORY');
    
    Forml.Image1.canvas.Draw(0,0,Back);
    
    // загрузить из ресурса картинку, которая будет двигаться
    
    bitmap.LoadFromResourceName(HInstance,'APLANE');
    
    bitmap.Transparent := True;
    
    bitmap.TransParentColor := bitmap.canvas.pixels[1,1];
    
    // создать буфер для сохранения копии области фона, на которую
    
    // накладывается картинка
    
    W:= bitmap.Width;
    
    Н:= bitmap.Height;
    
    Buf.Width:= W;
    
    Buf.Height:=H;
    
    Buf.Palette:=Back.Palette; // Чтобы обеспечить соответствие палитр !!
    
    Buf.Canvas.CopyMode:=cmSrcCopy;
    
    BufRct:=Bounds(0,0,W,H);
    
    x:=-W; y:=20;
    
    // определим сохраняемую область фона
    
    BackRct:=Bounds(x,y,W,H); // и сохраним ее
    
    Buf.Canvas.CopyRect(BufRet,Back.Canvas, BackRct);
    
    end;
    
    procedure TForm1.Timer1Timer(Sender: TObject);
    
    begin
    
    // восстановлением фона (из буфера) удалим рисунок Form1.image1.canvas.Draw(x,y, Buf);
    
    x:=x+2;
    
    if x>form1.Image1.Width then x:=-W;
    
    // определим сохраняемую область фона
    
    BackRct:=Bounds(x,у,W,H);
    
    // сохраним ее копию
    
    Buf.Canvas.CopyRect(BufRct,Back.Canvas,BackRct);
    
    // выведем рисунок
    
    Form1.image1.canvas.Draw(x,y,bitmap);
    
    end;
    
    procedure TForm1.FormClose(Sender: TObject;
    
    var Action: TCloseAction);
    
    begin
    
    Back.Free;
    
    bitmap.Free ;
    
    Buf.Free;
    
    end;
    
    end.


    Или с помощью TResourceStream:

    Code:
    var
      RS: TResourceStream;
    begin
      RS := TResourceStream.Create(
        HInstance,     // хендл приложения, которое содежрит DLL
        ResourceName,  // строка с именем ресурса
        RT_RCDATA);    // идентификатор типа RCDATA
        RS := TResourceStream.CreateFromID(
        HInstance,     
        ResourceID
        RT_RCDATA);  
    end;
    Создаем текстовый файл, например, MYRES.RC. В нем пишем следующее:

    Code:
    TEXT RCDATA text.txt
    В этом примере в качестве данных будем использовать текстовый документ формата TXT. Файл TXT с каким-либо текстом лежит в той же папке, что и MYRES.RC.

    Далее, помещаем файл BRCC32.EXE в эту же папку. Пишем файл Compile.bat со следующим содержанием:

    Code:
    brcc32.exe myres.rc myres.res
    После его запуска, получаем файл MYRES.RES в этой же папке.

    Подключаем файл ресурсов к нашему проекту:

    Code:
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    {$R MYRES.RES}
    Помещаем на форму компонент TRichEdit (RichEdit1) и кнопку TButton (Button1).

    Пишем следующий код:

    Code:
    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants,
      Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ComCtrls;
    
    type
      TForm1 = class(TForm)
        Button1: TButton;
        RichEdit1: TRichEdit;
        procedure Button1Click(Sender: TObject);
    
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    
    var
      Form1: TForm1;
    
    
    
    implementation
    
    {$R *.dfm}
    {$R MYRES.RES}
    
    
    procedure TForm1.Button1Click(Sender: TObject);
    var
      RS: TResourceStream;
    begin
        RS := TResourceStream.Create(HInstance, 'TEXT', RT_RCDATA);
      try
        // Загружаем данные в компонент RichEdit
        RichEdit1.Lines.LoadFromStream(RS);
      finally
        // Освобождаем память
        RS.Free;
      end;
    end;
    
    end.
    
     
    #2 ViDoG, 2 Oct 2012
    Last edited: 2 Oct 2012
  3. bertys

    bertys New Member

    Joined:
    25 Jan 2012
    Messages:
    162
    Likes Received:
    0
    Reputations:
    0
    вот такую ошибку выдает:
    [​IMG]


    В строке:
    PHP:
    RS := TResourceStream.CreateFromID(HInstance,100RT_RCDATA);
     
  4. DYUMON

    DYUMON New Member

    Joined:
    15 Sep 2010
    Messages:
    68
    Likes Received:
    2
    Reputations:
    0
    а у тебя в программе самой есть ресурс с таким именем?
    и кстати там наверное
    PHP:
     RS := TResourceStream.CreateFromID(HInstance,'100'RT_RCDATA);
     
  5. bertys

    bertys New Member

    Joined:
    25 Jan 2012
    Messages:
    162
    Likes Received:
    0
    Reputations:
    0
    его нужно добавить через программы для редактирования ресурсов, если да, то я не добавил.
    Подскажите как это правильно сделать, через какие проги
     
  6. ViDoG

    ViDoG New Member

    Joined:
    30 Apr 2010
    Messages:
    9
    Likes Received:
    3
    Reputations:
    0
    Отредактировал немного часть о TResourceStream под TXT файл. У меня всё работает.
    [​IMG]
     
  7. bertys

    bertys New Member

    Joined:
    25 Jan 2012
    Messages:
    162
    Likes Received:
    0
    Reputations:
    0
    Огромнейшее спасибо, все получилось
     
    #7 bertys, 2 Oct 2012
    Last edited: 3 Oct 2012
Loading...
Similar Threads - чтение ресурса программе
  1. Peja
    Replies:
    0
    Views:
    2,625