Советы по Delphi. Версия 1.4.3 от 1.1.2001 - Валентин Озеров
0/0

Советы по Delphi. Версия 1.4.3 от 1.1.2001 - Валентин Озеров

Уважаемые читатели!
Тут можно читать бесплатно Советы по Delphi. Версия 1.4.3 от 1.1.2001 - Валентин Озеров. Жанр: Программирование. Так же Вы можете читать полную версию (весь текст) онлайн книги без регистрации и SMS на сайте Knigi-online.info (книги онлайн) или прочесть краткое содержание, описание, предисловие (аннотацию) от автора и ознакомиться с отзывами (комментариями) о произведении.
Описание онлайн-книги Советы по Delphi. Версия 1.4.3 от 1.1.2001 - Валентин Озеров:
…начиная с 1001. Смотрите другие файлы…
Читем онлайн Советы по Delphi. Версия 1.4.3 от 1.1.2001 - Валентин Озеров

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 107 108 109 110 111 112 113 114 115 ... 123

Nomadic советует: 

1. Необходимо поставить patch на ODBC-драйвер (доступен на www.sybase.com);

2. Достаточно флажка Keys in SQL Statistics в ODBC-администpатоpе, для того, чтобы исчезла необходимость ставить втоpичные индексы по ключевым полям;

3. Если Вы пользуетесь BDE 3.5, то обновите ее до версии 4.x, или замените idodbc.dll на тот, который идет в комплекте поставки BDE 3.0. 

Разное 

Ресурсы 

Пример ресурсной таблицы строк

Delphi 1 

Как мне создать ресурсную таблицу строк (Resource String Table), про которую упоминается в функции FmtLoadStr, но не сказано как создать эту таблицу, про это вообще нигде не сказано!

Создайте файл в приведенном ниже формате и обзовите его, скажем (подойдите к этому творчески), strings.rc: 

STRINGTABLE LOADONCALL MOVEABLE DISCARDABLE

{

 1, "UNPACK.INI"

 2, "AcrobatClass"

 3, "ACROEXCH.EXE"

 4, "^.PDF"

 5, "Extensions"

 6, "ACROEXCH.EXE"

 7, "PDF"

 8, "AABSETUP.EXE"

 9, "DelFiles-"

 10, "INI-"

 11, "UNPACK.INI"

 12, "ACROSRCH.DLL"

 13, "Regedit"

 14, "ACROREAD.EXE"

 15, "ACRO_LE.EXE"

}

Затем, с помощью компилятора ресурсов Borland (BRCC.EXE в вашем каталоге DelphiBin), скомпилируйте это в файл ресурсов:

BRCC strings.rc

Вы получите файл с именем strings.res. В вашем .DPR-файле после строки {$R *.RES} добавьте строку {$R STRINGS.RES}, после этого строковые ресурсы будут компилироваться с вашим exe-файлом.

– Ralph Friedman 

Компиляция ресурсов

У меня имеется приблизительно 36 маленьких растровых изображений, которые я хочу сохранить в файле и затем прилинковать его к exe. Как мне поместить их в res-файл?

Самый простой путь – создать файл с именем «BITMAPS.RC» и поместить в него список ваших .BMP-файлов:

BMAP1 BITMAP BMAP1.BMP

BMAP2 BITMAP BMAP2.BMP

CLOCK BITMAP CLOCK.BMP

DBLCK BITMAP DBLCK.BMP

DELOK BITMAP DELOK.BMP

LUPE BITMAP LUPE.BMP

OK BITMAP OK.BMP

TIMEEDIT BITMAP TIMEEDIT.BMP

Затем загрузите Resource Workshop (RW) и выберите пункт меню File|Project Open. В выпадающем списке «File Type» (тип файла) выберите RC-Resource Script и откройте файл, который вы только что создали. После того, как RW загрузит ваш файл, выберите пункт меню File|Project save as. Выберите объект RES-Resource из выпадающего списка «File Type» (тип файла). В поле редактирования «New File name» задайте имя нового файла, скажем, BITMAPS.RES. Нажмите OK. Теперь у вас есть файл ресурса. В вашем модуле Delphi добавьте после строки {$R *.RES} строку {$R BITMAPS.RES}. После компиляции вы получите exe-файл с скомпилированными ресурсами. Для получения доступа к ресурсам во время выполнения программы нужно сделать следующее:

myImage.Picture.Bitmap.Handle := LoadBitmap(HInstance, 'TIMEEDIT');

В качестве предостережения: убедитесь в том, что имена (в самой левой колонке) изображений в .RC файле написаны в верхнем регистре, при вызове также необходимо писать их имена в верхнем регистре.

-Ralph Friedman 

Ошибка дублирования идентификатора ресурса

Delphi 1 

У вас есть исходный код VCL? Если да, то в этом случае ее можно всю перекомпилировать, добавив каталог к вашему библиотечному пути (Library path) в опциях среды (Environment Options | Library). Я думаю это нужно сделать, чтобы отделаться от этой ошибки. При другом способе необходимо вычислить вызывающую проблему директиву $R, временно удалить ее, и осуществить перекомпиляцию. Временно выключить директиву $R можно добавлением '.' перед $ (но это не единственный путь выключить ее).

Вероятно, вы сабкласситесь от VCL. Убедитесь в том, что идентификатор ресурса для вашей иконки уникальный. Просто загрузите ее в любой редактор ресурсов, и измените ее номер. После этого вы должны пересобрать вашу библиотеку.

Сохранение и выдёргивание ресурсов в DLL или EXE

Письмо читателя

Иногда возникает необходимость вшить ресурсы в исполняемый файл Вашего приложения (например чтобы предотвратить их случайное удаление пользователем, либо, чтобы защитить их от изменений). Данный пример показывает как вшить любой файл как ресурс в EXE-шнике. Совместимость: Delphi 3.x (или выше)

Далее рассмотрим, как создать файл ресурсов, содержащий корию какого-либо файла. После создания такого файла его можно легко прицепить к Вашему проекту директивой {$R}. Файл ресурсов, который мы будем создавать имеет следующий формат:

+ заголовок

+ заголовок для нашего RCDATA ресурса

+ собственно данные - RCDATA ресурс

В данном примере будет показано, как сохранить в файле ресурсов только один файл, но думаю, что так же легко Вы сможете сохранить и несколько файлов.

Заголовок ресурса выглядит следующим образом:

TResHeader = record

 DataSize: DWORD;        // размер данных??????

 HeaderSize: DWORD;      // размер этой записи

 ResType: DWORD;         // нижнее слово = $FFFF => ordinal

 ResId: DWORD;           // нижнее слово = $FFFF => ordinal

 DataVersion: DWORD;     // *

 MemoryFlags: WORD;

 LanguageId: WORD;       // *

 Version: DWORD;         // *

 Characteristics: DWORD; // *

end;

Поля, помеченные звёздочкой, Мы не будем использовать. Приведённый код создаёт файл ресурсов и копирует его в данный файл:

Листинг 1:

procedure CreateResourceFile(

 DataFile, ResFile: string; // имена файлов

 ResID: Integer //    id ресурсов

);

var

 FS, RS: TFileStream;

 FileHeader, ResHeader: TResHeader;

 Padding: array[0..SizeOf(DWORD)-1] of Byte;

begin

 { Open input file and create resource file }

 FS := TFileStream.Create( // для чтения данных из    файла

  DataFile, fmOpenRead);

 RS := TFileStream.Create( // для записи файла    ресурсов

  ResFile, fmCreate);

 { Создаём заголовок файла ресурсов - все    нули, за исключением HeaderSize, ResType и ResID }

 FillChar(FileHeader, SizeOf(FileHeader), #0);

 FileHeader.HeaderSize := SizeOf(FileHeader);

 FileHeader.ResId := $0000FFFF;

 FileHeader.ResType := $0000FFFF;

 { Создаём заголовок данных для RC_DATA файла

 Внимание: для создания более одного ресурса необходимо повторить следующий процесс,    используя каждый раз различные ID ресурсов }

 FillChar(ResHeader, SizeOf(ResHeader), #0);

 ResHeader.HeaderSize := SizeOf(ResHeader);

 // id ресурса - FFFF означает "не строка!"

 ResHeader.ResId := $0000FFFF or (ResId shl 16);

 // тип ресурса - RT_RCDATA (from Windows unit)

 ResHeader.ResType := $0000FFFF or (WORD(RT_RCDATA) shl 16);

 // размер данных - есть размер файла

 ResHeader.DataSize := FS.Size;

 // Устанавливаем необходимые флаги памяти

 ResHeader.MemoryFlags := $0030;

 { Записываем заголовки в файл ресурсов }

 RS.WriteBuffer(FileHeader, sizeof(FileHeader));

 RS.WriteBuffer(ResHeader, sizeof(ResHeader));

 { Копируем файл в ресурс }

 RS.CopyFrom(FS, FS.Size);

 { Pad data out to DWORD boundary - any oldrubbish will do!}

 if FS.Size mod SizeOf(DWORD) <> 0 then

  RS.WriteBuffer(Padding, SizeOf(DWORD) - FS.Size mod SizeOf(DWORD));

 { закрываем файлы }

 FS.Free;

 RS.Free;

end;

Данный код не совсем красив, и отсутствует обработка ошибок. Правильнее будет создать класс, включающий в себя данный пример. Извлечение ресурсов из EXE теперь рассмотрим пример, показывающий, как извлекать ресурсы из исполняемого модуля. Вся процедура заключается в создании потока ресурса, создании файлового потока и копировании из потока ресурса в поток файла.

Листинг 2:

procedure ExtractToFile(Instance:THandle; ResID: Integer; ResType, FileName:String);

var

 ResStream: TResourceStream;

 FileStream: TFileStream;

begin

 try

  ResStream := TResourceStream.CreateFromID(Instance, ResID, pChar(ResType));

  try

   //if FileExists(FileName) then

   //DeleteFile(pChar(FileName));

   FileStream := TFileStream.Create(FileName, fmCreate);

   try

    FileStream.CopyFrom(ResStream, 0);

   finally

    FileStream.Free;

   end;

  finally

   ResStream.Free;

  end;

 excepton E:Exception do

  begin

   DeleteFile(FileName);

   raise;

  end;

 end;

end;

Всё, что требуется, это получить Instance exe-шника или dll (у Вашего приложения это Application.Instance или Application.Handle, для dll Вам прийдётся получить его самостоятельно :) ResID тот же самый ID , который был присвоен ресурсу ResType WAVEFILE, BITMAP, CURSOR, CUSTOM – это типы ресурсов, с которыми возможно работать, но у меня получилось успешно проделать процедуру только с CUSTOM FileName – это имя файла, который мы хотим создать из ресурса

1 ... 107 108 109 110 111 112 113 114 115 ... 123
На этой странице вы можете бесплатно читать книгу Советы по Delphi. Версия 1.4.3 от 1.1.2001 - Валентин Озеров бесплатно.

Оставить комментарий

Рейтинговые книги