Я ограничен числами курсора, определенными в Controls.pas под Delphi 7? - PullRequest
1 голос
/ 25 мая 2011

Я использую Delphi 7 под Windows 7 для загрузки файлов.

Я хочу изменить курсор во время загрузки.

Я установил Screen.Cursor := crHourGlass;, но, посмотрев на постоянные числа курсора в Controls.pas, мне стало интересно, есть ли другие числа, которые я могу использовать, чтобы изменить курсор на ( Я не хочу добавлять курсор в мой файл ресурсов, я просто хочу использовать стандартные номера, которые я могу использовать без добавления ресурсов ).

Ответы [ 3 ]

2 голосов
/ 26 мая 2011

производит ли другие числа значение полных курсоров

Нет.Другие числа, кроме констант встроенных курсоров , будут создавать курсор по умолчанию, идентичный TCursor(crDefault) (другими словами - HCURSOR(Screen.Cursors[crDefault])).Эти встроенные курсоры находятся в ресурсах приложения и предварительно загружаются при запуске VCL.Чтобы добавить собственный курсор, вы ДОЛЖНЫ добавить ресурс CURSOR, а затем загрузить его и добавить его в VCL.

procedure TForm1.FormCreate(Sender: TObject); platform;
const
  crCustom = 42;
var
  Cursor: HCURSOR;
begin
  Cursor := LoadCursor(HInstance, 'CUSTOM');
  Win32Check(Cursor <> 0);  // required error check
  Screen.Cursors[crCustom] := Cursor;
  { Done, newly added crCustom is ready to use }

  Self.Cursor := crCustom; // for example - lets show custom cursor

  { also, TScreen object will manage resource handle }
  { and perform cleanup for you, so DestroyCursor call is unnecessary }
end;

Более сложный пример с созданием косвенного курсора NB : в примере есть множество недостатков: 1) DestroyIcon вызов ошибочен 2) они заметили это, если бы после всех вызовов API была проверка ошибок

1 голос
/ 25 мая 2011

«Стандартные числа» (crHourglass, crDefault и т. Д.) - это предопределенные курсоры, предоставляемые Delphi VCL. Вы можете определить свои собственные и загрузить их в приложение из ресурса или из файла через Windows API, но нет волшебных неопубликованных TCursor определений (или случайных чисел), которые будут означать что угодно. Попытка установить Screen.Cursors [] на неизвестное число без предварительной загрузки курсора приведет к минимальной ошибке массива вне границ, а нарушение доступа в худшем случае приведет к отображению курсора по умолчанию (см. TScreen.GetCursors in Forms.pas).

Краткое объяснение: TCursorRec определяется в источнике VCL как запись, содержащая указатель на следующую запись, индекс и дескриптор курсора (HCURSOR). Это в основном односвязный список, и когда вы запрашиваете курсор при доступе к списку Cursors, VCL просматривает список, начиная с первого элемента и последовательно проходя по нему, пока не найдет индекс, соответствующий запрошенному вами. (в этот момент он устанавливает курсор на значение HCURSOR этого элемента) или определяет, что запрошенный вами индекс не назначен, и в этом случае он возвращает курсор по умолчанию.

0 голосов
/ 25 мая 2011

crHourGlass имеет тип TCursor, который является целочисленным псевдонимом (более или менее).Это индекс, который можно использовать для установки курсора со склада.

Вы можете добавлять курсоры, используя

Screen.Cursors[Number] := ...   needs to be a HCURSOR.

Так что если у вас есть дескриптор нового курсора, вы можете использоватьв Delphi.

Обратите внимание, что константы crXXX и тип TCursor определены в элементах управления, а класс Screen - в формах.Таким образом, вы можете увидеть код для себя.

...