Консультация № 179463
11.07.2010, 14:16
0.00 руб.
0 6 1
Здравствуйте Уважаемые эксперты.
Подскажите, пожалуйста, как можно выполнить одно и то же действие для всех форм, чтобы не прописывать его в каждой.
Вот:

const
crMyCursor = 5;

Screen.Cursors[crMyCursor] := LoadCursor(HInstance, 'MYC');
Cursor := crMyCursor;

Я хочу применить новый курсор ко всем формам. Мне приходится эти строки прописывать в каждой форме.
Можно ли сделать это проще?

Обсуждение

Неизвестный
11.07.2010, 14:49
общий
Здравствуйте, Dimon4ik.
Посоветую Вам этот код скопировать в новый модуль например uCursor.pas, и завести в нем глобальную переменную, которому нужно присвоить Cursor, пример:

var
saveCursor: TCursor;

//после вашего кода
saveCursor := Cursor;

//а потом в нужной форме просто присваиваете этот saveCursor стандартному курсор
Cursor := saveCursorl;
//при этом нельзя забыть подключить модуль uCursor в эту форму...

ну и не забудьте в директиве uses прописать модуль для работы с курсором.. вроде бы все...
Неизвестный
11.07.2010, 20:30
общий
Dimon4ik:
Не совсем понятна ваша ситуация.
Вам надо Использовать ваш курсор для всего проекта? Или вы хотите динамически изменить/изменять курсор во время выполнения программы?

Для первого варианта, достаточно выполнить ваши операции с курсором для всего проекта - экрана.

program Project1;

uses
Forms, controls, windows,
Unit1 in 'Unit1.pas' {Form1},
Unit2 in 'Unit2.pas' {Form2};

{$R *.res}

const
crMyCursor = 5;


begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TForm2, Form2);

Screen.Cursors[crMyCursor] := LoadCursor(HInstance, 'MYC');
screen.Cursor := crMyCursor;


Application.Run;
end.
Неизвестный
11.07.2010, 21:07
общий
Хамзин Камиль Ренатович:
Спасибо, неплохой способ, но все же приходится хоть не столько но в каждой форме прописывать кода.
Неизвестный
11.07.2010, 21:08
общий
Patriotix-N:
Отлично! Это как раз то, что нужно! Во всем проекте используется курсор без вставки кода в каждой форме.
Большое спасибо. Оформите, как ответ.
Неизвестный
12.07.2010, 17:11
общий
это ответ
Здравствуйте, Dimon4ik.

Для того, чтобы применить курсор ко всем формам, вам действительно не надо прописывать код в каждой из них. Дело в том, что вы используете не совсем верный подход. Вы хотите поменять TForm.Cursor, а вам надо, всего лишь, менять Screen.Cursor, тогда курсор будет применен ко всем формам приложения. Для того, чтобы применить курсор ко всему приложению до его запуска, надо изменить код проекта.
Если брать ваш код, то он будет выглядеть так, как в приложении. Для работы с курсорами вам надо добавить в секцию uses файл Controls, и для работы с экраном - Windows.


Приложение:
program Project1;

uses
Forms, Controls, Windows,
Unit1 in 'Unit1.pas' {Form1},
Unit2 in 'Unit2.pas' {Form2};

{$R *.res}

Const
crMyCursor = 5;

begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TForm2, Form2);

Screen.Cursors[crMyCursor] := LoadCursor(HInstance, 'MYC');
Screen.Cursor := crMyCursor;

Application.Run;
end.
Неизвестный
16.07.2010, 15:07
общий
А если надо отвечать действительному вопросу :), вот так можно вьиполнит одну процедуру вьибраного Вами типа (в примере: TProcForEach = procedure ( aComponent: tComponent; aIParam: integer);) в всех наследников tControl. Кончено, ползуя пример, легхко сделять тоже для все, что в Screen.Forms :):
Код:
{}procedure ControlProcForEach( aWinControl: tWinControl; tSelf: tControlClass; aProcForEach: TProcForEach; aIParam: integer);
var
i: integer;
begin
i:=0;
while i<aWinControl.ComponentCount do begin
if aWinControl.Components[i] is tSelf then begin
aProcForEach( aWinControl.Components[i], aIParam);
end;
inc(i);
end;
end;
Форма ответа