• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

Enabled

  • Автор темы ilya00
  • Дата начала
I

ilya00

помогите написать простенькую функцию Enabled типа Boolean :(
что то типа: if Enabled then {какие то действия} else {другие действия}
и при присвоение где то уже в другой процедуре Enabled:= True\False чтобы работало
 
I

ilya00

значит ошибка в программе

нет никакой ошибки в программе, просто тут же рекурсия получается вот она и тупит...

вот код, никаких ошибок тут нет...

Код:
function Enabled:Boolean;
begin
result:= Enabled;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Enabled:= True;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
Enabled:= False;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
if Enabled
then Label1.Caption:= 'Enabled'
else Label1.Caption:= 'Desabled';
end;

после присвоения по кнопке Button3 - Enabled:= False; программа не реагирует на любые клики мышки и закрывается только через диспетчер, хотя Label1.Caption и присваевает Desabled...

п.с. вы сами откройте делфю и протестите
 
I

ilya00

upd: экспериментальным путем до меня дошло что лучше назвать функцию PEnabled например, чтобы не путалась с Enabled той же Button

но тут мне выдает ошибку: Left side cannot be assigned to
это при вот таком коде функции:

Код:
Function PEnabled: Boolean;
begin
if PEnabled
then
begin
Result:= True;
{какие то действия}
end
else
begin
Result:= False;
{какие то действия}
end;
end;
 
M

-master-

Это и есть ошибка, в моей версии никаких рекурсий, а у вас непойми что.
То что вы пытаетесь сделать на зывается - свойство, но чтобы его сделать нужен класс..

Добавлено: Это и есть ошибка, в моей версии никаких рекурсий, а у вас непойми что.
То что вы пытаетесь сделать на зывается - свойство, но чтобы его сделать нужен класс..
 
I

ilya00

Это и есть ошибка, в моей версии никаких рекурсий, а у вас непойми что.
То что вы пытаетесь сделать на зывается - свойство, но чтобы его сделать нужен класс..

Добавлено: Это и есть ошибка, в моей версии никаких рекурсий, а у вас непойми что.
То что вы пытаетесь сделать на зывается - свойство, но чтобы его сделать нужен класс..
подскажите пожалуйста как сделать это через класс
 
S

Senset

Ваш код:
Код:
function Enabled:Boolean;
begin
result:= Enabled;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Enabled:= True;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
Enabled:= False;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
if Enabled
then Label1.Caption:= 'Enabled'
else Label1.Caption:= 'Desabled';
end;

Теперь давайте подумаем... на кнопках идет именно пересечение свойств кнопки с именем вашей функции, чтобы его не было, можно дополнить в класс формы метод enabled и выглядеть это будет вот так:
Код:
function form1.enabled:boolean
НО: у формы есть такое свойство enabled, потому если добавить такой метод то, либо компилятор обругается, либо потом поползут ошибки... И вообще чтобы не париться насчет этого, не нужно добавлять/менять классы, сделайте следующее (это называется глобальные переменные):
1) Найдите строчку var form1:TForm1;
2) добавте в тот самый "var" переменную enabled:boolean;
3) Тогда, функцию Enabled:boolean нафиг убрать и получиться:
Ваш код:
Код:
procedure TForm1.Button2Click(Sender: TObject);
begin
unit1.Enabled:= True;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
unit1.Enabled:= False;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
if unit1.Enabled then Label1.Caption:= 'Enabled'
else Label1.Caption:= 'Desabled';
end;

P.S. unit1 - это имя модуля, в котором обозвана ваша переменная, к ней можно будет обратиться из любого другого модуля, чтобы инициировать начальные значения (не авось какие), то например дополнить
Код:
 FormCreate(...)
и написать там:
Код:
unit1.enabled:=true/false
;
 
I

ilya00

честно говоря я хотел чтобы именно в отдельной (не стандартной функции) происходили действия... ну да ладно, мне тут уже объяснили что Enabled надо юзать как переменнную - параметр для функции, видимо по другому никак :(
 
S

Senset

честно говоря я хотел чтобы именно в отдельной (не стандартной функции) происходили действия... ну да ладно, мне тут уже объяснили что Enabled надо юзать как переменнную - параметр для функции, видимо по другому никак :(
Все "стандартные функции" - это функции, которые реагируют на события, ибо смысл визуального программирования именно в этом... Писать новый обработчик событий для тех же событий, что итак есть - это мягко говоря странно, но возможно...
Или же если речь идет просто об отдельной функции, то напишите её... назовите как хотите (и конкретизируйте её вызов (if unit1.enabled then ... ) - для вашего первого кода) , потом полюбому придеться привязать её к какому-либо событию (будь то нажатие на кнопку, или срабатывание таймера, создание формы, инициация создания формы или еще что) иначе она просто не включиться) и никогда не заработает
 
I

ilya00

а можно ли создать обработчик событий для переменной?

например существует процедура:

Код:
Procedure Process(Enabled: Boolean);
begin
if Enabled 
then {какие то действия}
else {какие то действия};
end;

и существует переменная Enabled (не та что в процедуре, а отдельно)

Код:
Var Enabled: Boolean; //в глобальных переменных

и можно ли теперь создать что то типа:

Код:
Procedure EnabledChange(Enabled: Boolean);
begin
Process(Enabled);
end;

главный вопрос: будет ли процедура EnabledChange вызываться при изменении глобальной переменной Enabled?
 
S

Senset

1) Для создания событий используйте TNotifyEvent - тогда можно будет оперативно отлавливать изменение переменной (как это делается - мануалок в нете море)
2) Если вы создали переменную и процедуру в одном блоке кода (модуле)... то сами подумайте как компилятор определит что вы хотите? (обратиться к переменной или процедуре)... чтобы было четкое определение, то:
2.1) либо var enabled:boolean; procedure enabled(x:integer):boolean; - обратите внимание, что теперь будет четко видно что вы хотите
2.2) забыть о языке высокого уровня и использовать turbo asm или delphi asm, где вашей процедуре и переменной сами зададите адресацию и сами вызовите по нужному адресу. На практике же такой критичности и жизненной необходимости в этом нет и еще не было (проще переименовать процедуру или переменную). И подсказать вам в этом вопросе asm (конкретно какой адрес и маркировки) никто не сможет, потому как компы сейчас настолько разные, что написать низкоуровневый софт для каждого железа - это уже ваша задача и первая железка, которая должна сработать - это ваша :)
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!