Delphi - объектно-ориентированный язык программирования, разработанный компанией Borland в 1995 году. Он основан на языке программирования Pascal, но имеет более расширенные возможности и добавлены новые функции.
Delphi является интегрированной средой разработки (IDE), которая позволяет разрабатывать программное обеспечение для различных платформ, включая Windows, macOS, Android и iOS. Delphi достигает многоплатформенности с помощью...
Изображения и курсоры могут храниться в файлах ресурсов (RES) и прилинковываться (связаваться) к EXE-файлу вашего приложения. RES-файлы могут создаваться с помощью Delphi утилит Image Editor и Borland Resource Workshop, входящие в поставку Delphi RAD Pack. Изображения и курсоры, хранимые в RES-файлах (после упаковки их в EXE или DLL) могут быть извлечены с помощью API функций LoadBitmap и LoadCursor соответственно.
Загрузка изображений
Функция API LoadBitmap определена следующим образом:
functionLoadBitmap(Instance: THandle; BitmapName: PChar): HBitmap;
Первый параметр должен содержать дескриптор модуля (EXE или DLL), содержащего файл RES, из которого вы хотите получить ресурс. Delphi хранит дескриптор запущенного EXE-файла в глобальной переменной с именем Hinstance. В приведенном ниже примере мы предполагаем, что модуль, из которого мы пытаемся загрузить изображение, - ваше приложение. Тем не менее, модуль мог бы быть другим EXE- или DLL-файлом. Следующий пример загружает изображение с именем BITMAP_1 из RES-файла, прилинкованного к EXE-файлу приложения:
procedureTForm1.Button1Click(Sender: TObject); var
Bmp: TBitmap; begin
Bmp := TBitmap.Create; Bmp.Handle := LoadBitmap(HInstance,'BITMAP_1'); Canvas.Draw(0, 0, Bmp); Bmp.Free; end
;
Имеется один недостаток использования API вызова LoadBitmap: LoadBitmap все же является API вызовом Windows 3.0, и грузит изображение только как DDB (Device Dependent Bitmaps). Это может вызвать проблемы с цветовой палитрой при загрузке DIB (Device Independent Bitmaps) из RES-файла. Приведенный ниже код может использоваться для извлечения DIB-ов из RES-файлов. Данный код загружает изображение как общий ресурс, передает его в поток, после чего делает Delphi вызов LoadFromStream, реализующий палитру автоматически.
procedureTForm1.Button1Click(Sender: TObject); const
BM = $4D42; {Идентификатор типа изображения} var
Bmp: TBitmap; BMF: TBitmapFileHeader; HResInfo: THandle; MemHandle: THandle; Stream: TMemoryStream; ResPtr: PByte; ResSize: Longint; begin
BMF.bfType := BM;
{Ищем, загружаем и блокируем ресурс, содержащий BITMAP_1} HResInfo := FindResource(HInstance, 'BITMAP_1', RT_Bitmap); MemHandle := LoadResource(HInstance, HResInfo); ResPtr := LockResource(MemHandle); {Создаем Memory-поток, устанавливаем его размер, записываем туда заголовок изображения и, наконец, само изображение } Stream := TMemoryStream.Create; ResSize := SizeofResource(HInstance, HResInfo); Stream.SetSize(ResSize + SizeOf(BMF)); Stream.Write(BMF, SizeOf(BMF)); Stream.Write(ResPtr^, ResSize); {Освобождаем поток и сбрасываем его позицию в 0} FreeResource(MemHandle); Stream.Seek(0, 0); {Создаем TBitmap и загружаем изображение из MemoryStream} Bmp := TBitmap.Create; Bmp.LoadFromStream(Stream); Canvas.Draw(0, 0, Bmp); Bmp.Free; Stream.Free; end;
Загрузка курсоров
Функция API LoadCursor определена следующим образом:
functionLoadCursor(Instance: THandle; CursorName: PChar): HCursor;
Первый параметр Instance должен содержать дескриптор модуля, содержащего файл RES. Как и пример, приведенный выше, данный пример предполагает, что модуль, из которого мы пытаемся загрузить курсор, - ваше приложение. Второй параметр - имя курсора. В секции interface сделайте следующее объявление:
constcrMyCursor = 5; {Другие модули могут также использовать эту константу}
Затем добавьте следующие две строчки к обработчику события формы OnCreate:
procedureTForm1.FormCreate(Sender: TObject); begin
Screen.Cursors[crMyCursor] := LoadCursor(HInstance, 'CURSOR_1'); Cursor := crMyCursor; end
;
или же вы можете изменить один из стандартных курсоров Delphi как показано ниже (константы Cursor описаны в электронной справке в статье Cursors Property):
procedureTForm1.FormCreate(Sender: TObject); begin
{Данный пример изменяет курсор SQL Hourglass} Screen.Cursors[crSQLWait] := LoadCursor(HInstance, 'CURSOR_1'); end
;
Примечание: в нормальной ситуации необходимо удалить любые ресурсы курсоров с помощью DeleteCursor, тем не менее, в Delphi в этом нет необходимости, поскольку Delphi сама удаляет все курсоры из массива Cursors.