-
Из файла загружается без проблем, но не охота таскать с собой дополнительные файлы, поэтому создаю файл Cur.res из rc-файла такого содержания: BUSY ANICURSOR 4.ani Пробую - не работает. Что не так? Вот код: const
crMyCursor = 777;
implementation
procedure TForm1.Button1Click(Sender: TObject);
var
h: THandle;
begin
h := LoadImage(hInstance, 'BUSY', IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE);
ShowMessage(IntToStr(h));
Screen.Cursors[crMyCursor] := h;
Screen.Cursor := crMyCursor;
end;
-
Я грузил с помощью LoadCursor и все работало.
-
h := LoadImage(hInstance, 'BUSY', IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE); if (h = 0) then RaiseLastWin32Error(); // что говорит?
-
> RaiseLastWin32Error(); // что говорит?
"Указанный тип ресурса в файле образа отсутствует." Как это понять?
-
> Я грузил с помощью LoadCursor и все работало.
Покажи код, потому что я как ни пробовал - не работает.
-
> Как это понять?
буквально. Не находит ресурс. Просто добавь в проект Project - Add to project - *.rc res можно заранее и не делать
-
> буквально. Не находит ресурс.Просто добавь в проект Project > - Add to project - *.rcres можно заранее и не делать
Никакой разницы. Ошибка аналогичная.
-
я делал так images.rc: #include "resource.inc"
IDB_DIAGBRUSH BITMAP "res\\dpbrush.bmp" resource.inc: const
IDB_DIAGBRUSH = 101; *.pas:
...
FDisabledBitmap.LoadFromResourceID(hInstance, IDB_DIAGBRUSH); по аналогии должно и с курсором работать типа так h := LoadImage(hInstance, MakeIntResource(IDC_BUSY), IMAGE_CURSOR, 0, 0, 0);
-
> по аналогии должно и с курсором работать
С картинкой оно и у мненя работает. Кажеться я понял: программа попросту не понимает, что мой ресурс есть курсором. Возможно я неправильно создаю rc-файл? Как же тогда правильно указать?
-
> Как же тогда правильно указать?
BUSY CURSOR "1.ani"
-
> BUSY CURSOR "1.ani"
Компилятор ругается: Error Cur.rc 1 13: Invalid cursor format
-
> Компилятор ругается: Error Cur.rc 1 13: Invalid cursor format
Ну и пиши ету твою иконку в RCDATA. Я как-то сам давным-давно сюда выкладывал меню с анимированными иконками. Это была главная часть их загрузчика. Грузит из любого раздела реестра. Надо только собсно раздел указать. ЗЫ под ХРеновину и выше сей загрузчик работает на ура, а вот в 98-м (2К и МЕ не проверял) прут просто НЕРЕАЛЬНЫЕ лаги. В лучшем случае возвращается нулевой результат, в худшем - лично я пару раз словил BSOD. Поэтому предупреждаю сразу. А вообще, ИМХО, надо самому склепать расшифровщик, благо у ANI иконок не пользуется шифрование, а заголовочная запись не сильно огромна :)
function LoadIconEx(H:HINST; N, T:string):HICON; var R : HRSRC; S : Cardinal; G : HGLOBAL; P : Pointer; begin Result:=0; R:=FindResource(H, PChar(N), PChar(T)); if R=0 then exit; S:=SizeOfResource(H, R); G:=LoadResource(H, R); P:=LockResource(G); Result:=CreateIconFromResource(P, S, true, $00030000); end;
-
> Компилятор ругается: Error Cur.rc 1 13: Invalid cursor format
BRCC? Попробуй RC.exe от MS.
-
> Ну и пиши ету твою иконку в RCDATA...
Пробовал твой код, выё время вылетает AV (среда XP SP2, D2007)
> BRCC? Попробуй RC.exe от MS.
Действительно, RC.exe скомпилировал ресурсный файл. Но программа ошибку выдаёт всё ту же :(
-
> [13] jetus (12.01.08 13:13) > > > Ну и пиши ету твою иконку в RCDATA... > > Пробовал твой код, выё время вылетает AV (среда XP SP2, > D2007) > > > > BRCC? Попробуй RC.exe от MS. > > Действительно, RC.exe скомпилировал ресурсный файл. > Но программа ошибку выдаёт всё ту же :(
Это происходит потому, что вызывать мою функцию надо (если ты кнешн действительно положил иконку в раздел RCDATA) вот так:
var i:HICON; ... i:=LoadIconEx(hInstance, 'имя_твоей_иконки_в_ресах', RT_RCDATA);
-
> jetus (12.01.08 13:13) [13]
Какую ту-же? В общем, по шагам. - имеем файл курсора 1.ani - Создаем файл AniCusor.rc, в нем пишем одну строку 200 CURSOR "1.ani" - Компилим из CMD командой rc AniCursor.rc только перейти в каталог не забудь - В любой модуль проекта добавляем строку {$R anicursor.res} - Гди-нить, типа в OnCreate или по кнопке пишем код
var
h: Cardinal;
begin
h:= LoadCursor(hInstance, PChar(200));
if h = 0 then RaiseLastOSError;
Screen.Cursors[1]:= h;
Screen.Cursor:= 1;
Запускаем и наслаждаемся.
-
> Запускаем и наслаждаемся.
Сделал точно как ты написал. Вот: System Error. Code: 1814. Указанное имя ресурса не найдено в файле образа.
Ты сам код проверял?
-
2 jetus > Ты сам код проверял?
Да, и не одноератно. И сейчас еще раз проверил - все работает. Глянь каким-нить просмотрщиком ресурсов полученный экзешник, Ресторатором например. А еще попробуй загрузить твой курсор прямо из файла Screen.Cursors[1]:= LoadImage(0, '1.ani', IMAGE_CURSOR, 0, 0, LR_LOADFROMFILE); Мож у тя исходный файл кривой.
-
> Да, и не одноератно. И сейчас еще раз проверил - все работает. > Глянь каким-нить просмотрщиком ресурсов полученный экзешник, > Ресторатором например. А еще попробуй загрузить твой курсор > прямо из файлаScreen.Cursors[1]:= LoadImage(0, '1.ani', > IMAGE_CURSOR, 0, 0, LR_LOADFROMFILE);Мож у тя исходный файл > кривой.
Смотрел ресурс ResHacker'ом - всё на месте. Курсор грузил напрямую из файла - никаких проблем, грузиться отлично. Не знаю уже, в чём беда...
-
> jetus (13.01.08 10:43) [18]
Ну тады я тож не знаю. Пожоже ты один такой несчастливый. На всяк случай выложи код с объявлением ресурса и загрузкой курсора - мож чего увижу.
> Смотрел ресурс ResHacker'ом - всё на месте
А тип ресурса какой, Ani Cursor? Может в имени ошибся? Я ваще не люблю ресурсам имена давать, только числовые индексы - привычка.
-
> Ну тады я тож не знаю. Пожоже ты один такой несчастливый. > На всяк случай выложи код с объявлением ресурса и загрузкой > курсора - мож чего увижу.
Значит так. Создаю файл "Cur.rc" такого содержания: #define BUSY 200
#define CUR 201
BUSY CURSOR "4.ani"
CUR CURSOR "5.cur" Файлы 4.ani (анимированый курсор) и 5.cur (простой курсор) присутствуют. Компилируется ресурс нормально. Код программы:
procedure TForm1.Button1Click(Sender: TObject);
var
h: Cardinal;
begin
h:= LoadCursor(hInstance, PChar(200));
if h = 0 then RaiseLastOSError;
Screen.Cursors[1]:= h;
Screen.Cursor:= 1;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
h: Cardinal;
begin
h:= LoadCursor(hInstance, PChar(201));
if h = 0 then RaiseLastOSError;
Screen.Cursors[2]:= h;
Screen.Cursor:= 2;
end; При нажатии на кнопку Button2 всё нормально - обычный курсор загружается, ошибок нет. При нажатии на кнопку Button1 вылетает: "System Error. Code: 1814. Указанное имя ресурса не найдено в файле образа."
-
Попробуй MAKEINTRESOURCE() вместо приведения к PChar. И посмотри размер скомпиленного ресурса - если он меньше суммарного размера .cur и .ani иконок, значит ресурс-компилер просто пропускает при построении реса этот .ani файл...
ЗЫ Ну уж не знаю чего у тебя там происходит 0_о
в первый раз в жизни такое получаю ©
-
> Попробуй MAKEINTRESOURCE() вместо приведения к PChar. И > посмотри размер скомпиленного ресурса - если он меньше суммарного > размера .cur и .ani иконок, значит ресурс-компилер просто > пропускает при построении реса этот .ani файл...
C MAKEINTRESOURCE() всё аналогично. Размер полученого .res-файла соответствующий.
Хотя, в принципе, ошибку выдаёт правильную "Указанное имя ресурса не найдено в файле образа.": в ресурсах ехе-файла в группе курсоров есть курсор 201, а 200-го нету. 200-ый лежит себе отдельным типом, а почему?
-
> 200-ый лежит себе отдельным типом, а почему? А вот потому что > Error Cur.rc 1 13: Invalid cursor format
Просто RC, вестимо (непонятно, правда, накой) маскирует ету проблему...
-
> 200-ый лежит себе отдельным типом, а почему?
Дык потому, что это и есть отдельный тип - анимированный курсор. Выложи куда-нить этот файл курсора, попробую с ним скомпилить.
-
> Дык потому, что это и есть отдельный тип - анимированный > курсор.Выложи куда-нить этот файл курсора, попробую с ним > скомпилить.
Да зачем выкладывать? Возьми любой .ani-файл (даже из папки винды) и попробуй с ним.
-
Когда-то подключал анимированный курсор из rc-файла, прописывал код: DARROW 21 darrow.ani Были аналогичные проблемы, если в рессурсах модуля присутствовал XP-манифест.
-
компилятор *.rc - файлов для дельфи отстаёт от микрософта, по этому -[26]
-
> Были аналогичные проблемы, если в рессурсах модуля присутствовал > XP-манифест.
Гм... и как узнать, есть ли там манифест?
> компилятор *.rc - файлов для дельфи отстаёт от микрософта, > по этому -[26]
Специально уже компилю через микрософтский rc.exe
-
> JetuS (14.01.08 11:28) [25]
> Да зачем выкладывать? Возьми любой .ani-файл (даже из папки > винды) и попробуй с ним.
С любым я уже пробовал - смотри ага (13.01.08 05:52) [17] Ну твои дела, как знаешь
-
> ALS (14.01.08 12:30) [26]
> Были аналогичные проблемы, если в рессурсах модуля присутствовал > XP-манифест.
А у меня почему-то и с манифестом никаких проблем
-
> С любым я уже пробовал - смотри ага (13.01.08 05:52) [17] > Ну твои дела, как знаешь
Гм... Ну, раз у тебя всё получается, то выложи куда-нибудь архив с проектом (с ехе-шником, rc и res-файлами), а ещё лучше - отправь на jetuso@gmail.com, буду тебе очень благодарен.
-
Да я бы отправил, да только твой сервак не хочет принимать архив с экзешником.
-
> Да я бы отправил, да только твой сервак не хочет принимать > архив с экзешником.
Запакуй rar-ом, тогда ругаться не будет. А если лень, то кинь на jetus@rambler.ru :)
-
Дык я и так паковал - в ZIP, не приниало. Надо было попробовать ахиву расширение заменить, чет не сообразил с недосыпу:)) На рэмблер вроде ушло.
-
> На рэмблер вроде ушло.
Спасибо, пришло ) Действительно, ехе-шник рабочий. А вот с кодом я чего-то не понял: модуль оказался "пустой": unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm1 = class(TForm)
private
public
end;
var
Form1: TForm1;
implementation
end. Ни упоминания о курсоре. Естественно, при компиляции ехе-шник без курсора вышел. То ли ты мне pas-файл не тот выслал, то ли лыжи не едут )
-
Блин, точно пустой:(( Без понятия как оно получилось, чет с недосыпу начудил:( Вот модуль:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
public
end;
var
Form1: TForm1;
implementation
procedure TForm1.FormCreate(Sender: TObject);
var
h: Cardinal;
begin
h:= LoadCursor(HInstance, PChar(200));
if 0 = h then RaiseLastOSError;
Screen.Cursors[1]:= h;
Screen.Cursor:= 1;
end;
end.
-
> Вот модуль:
Гы, действительно работает ) А теперь вот что я сделал: взял другой .ani-файл, назвал его "1.ani" и просто заменил твой. Скомпилировал ресурс. Перебилдил проект. Запускаю - выдаёт: "System Error. Code: 1814. Указанное имя ресурса не найдено в файле образа." Беру твой файл назад. Компилю ресурс. Билдю проект. Запускаю - работает.
Кто-нибудь может объяснить мне, что происходит?! З.Ы. Пробовал на 6 разных .ani-файлах с размерами от 6кБ до 80кБ - одинаково.
-
Всё, проблема решена. Достаточно было удалить строку {$R WindowsXP.res}
Большое спасибо за помощь )
-
> jetus (17.01.08 08:09) [37]
А я те говорил - давай твой курсор, попробую. Так нет, не послушал.
-
Удалено модератором
|