Не могу загрузить анимированный курсор из ресурса:
Curs.rc
51 ANICURSOR "dinosaur.ani"
52 ANICURSOR "horse.ani"
Project1.dpr
....
{$R 'Curs.res' 'Curs.rc'}
....
Unit1.pas
procedure TForm1.FormCreate(Sender: TObject);
begin
Screen.Cursors[1] := LoadCursor(0, pChar(51));
Screen.Cursors[2] := LoadCursor(0, pChar(52));
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Cursor := 1;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Cursor := 2;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
Cursor := crDefault;
end;
GetLastError возвращает 1813 — ERROR_RESOURCE_TYPE_NOT_FOUND
Замена ANICURSOR в rc на 21 — прямой номер типа ничего не даёт.
Если вместо LoadCursor использовать LoadCursorFromFile — грузить из внешнего файла, то всё работает.
Соответствующий код на VC++ & WTL работает на ура.
Это я затупил, или очередные глюки делфей?
P.S. delphi 6-7
... << RSDN@Home 1.1.4 beta 3 rev. 240>>
Здравствуйте, Tonal-, Вы писали:
T>Curs.rc
T>T>procedure TForm1.FormCreate(Sender: TObject);
T>begin
T> Screen.Cursors[1] := LoadCursor(0, pChar(51));
T> Screen.Cursors[2] := LoadCursor(0, pChar(52));
T>end;
T>
Может, лучше не PChar, а просто '51', '52'?
... << RSDN@Home 1.1.3 stable >>
Здравствуйте, Tonal-, Вы писали:
ms-help://MS.MSDNQTR.2004JUL.1033/winui/winui/windowsuserinterface/resources/cursors/cursorreference/cursorfunctions/loadcursor.htm
lpCursorName
[in] Pointer to a null-terminated string that contains ... blablabla
Короче может быть #0 нужен типа PChar ('51' + #0);
Когда то я только так и писал PChar('Всякая параша ....' + #0) ...
Папробуй.
P.S.
Здравствуйте, Tonal-, Вы писали:
T>Не могу загрузить анимированный курсор из ресурса:
<skipped>
T>T>procedure TForm1.FormCreate(Sender: TObject);
T>begin
T> Screen.Cursors[1] := LoadCursor(0, pChar(51));
T> Screen.Cursors[2] := LoadCursor(0, pChar(52));
T>end;
T>
<skipped>
При загрузке из ресурсов приложения первым аргументом у LoadCursor должен быть HInstance (или Module.ResInstance, если предполагается использовать отдельную dll для ресурсов). С нулем она может только стандартные курсоры грузить.
А вообще, был какой-то нюанс с анимированными курсорами. Только сейчас я уже точно не помню. Но во времена Windows 95 и Delphi3 в RX Library была функция, которая сначала сохраняла ресурс во временном файле, а потом оттуда грузила курсор.
Здравствуйте, Flamer, Вы писали:
T>>Curs.rc
T>>T>>procedure TForm1.FormCreate(Sender: TObject);
T>>begin
T>> Screen.Cursors[1] := LoadCursor(0, pChar(51));
T>> Screen.Cursors[2] := LoadCursor(0, pChar(52));
T>>end;
T>>
F>Может, лучше не PChar, а просто '51', '52'?
Бесполезно.
Изначально я пробывал со строковыми именами ресурсов — м тоже ошибка 1813.
... << RSDN@Home 1.1.4 beta 3 rev. 240>>
T>>Не могу загрузить анимированный курсор из ресурса:
SIG><skipped>
SIG>При загрузке из ресурсов приложения первым аргументом у LoadCursor должен быть HInstance (или Module.ResInstance, если предполагается использовать отдельную dll для ресурсов). С нулем она может только стандартные курсоры грузить.
Спасибо, заработало
Для интересующихся привожу проведённые мной изменения:
Curs.rc
51 21 "dinosaur.ani"
52 21 "horse.ani"
Unit1.pas
procedure TForm1.FormCreate(Sender: TObject);
begin
Screen.Cursors[1] := LoadCursor(HInstance, pChar(51));
Screen.Cursors[2] := LoadCursor(HInstance, pChar(52));
end;
Было 2 наложенных ошибки:
1) LoadCursor требует чесный Instance и на 0 не покупается.
2) Борландовский компилятор ресурсов похоже не знает слова ANICURSOR и создаёт ресурс с типом "ANICURSOR", а вот MS-овский создаёт ресурс с типом 21. Понятно что LoadCursor не может найти наши ресурсы, даже если мы подали ему HInstance — он то просматривает тип 21.
... << RSDN@Home 1.1.4 beta 3 rev. 240>>