Анимированный курсор в ресурсах
От: Tonal- Россия www.promsoft.ru
Дата: 03.12.04 20:16
Оценка: 3 (1)
Не могу загрузить анимированный курсор из ресурса:

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>>
Re: Анимированный курсор в ресурсах
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 03.12.04 20:40
Оценка:
Здравствуйте, 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 >>
Re: Анимированный курсор в ресурсах
От: MOZG Россия  
Дата: 04.12.04 07:54
Оценка:
Здравствуйте, 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.

Ногу сверло ...
Re: Анимированный курсор в ресурсах
От: Sergei I. Gorelkin Россия  
Дата: 04.12.04 09:25
Оценка:
Здравствуйте, 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 была функция, которая сначала сохраняла ресурс во временном файле, а потом оттуда грузила курсор.
Re[2]: Анимированный курсор в ресурсах
От: Tonal- Россия www.promsoft.ru
Дата: 04.12.04 09:35
Оценка:
Здравствуйте, 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>>
Анимированный курсор в ресурсах
От: Tonal- Россия www.promsoft.ru
Дата: 04.12.04 14:18
Оценка: 20 (1)
#Имя: FAQ.delphi.anicursor
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>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.