Enabled

13.01.2013
23
0
#1
помогите написать простенькую функцию Enabled типа Boolean :(
что то типа: if Enabled then {какие то действия} else {другие действия}
и при присвоение где то уже в другой процедуре Enabled:= True\False чтобы работало
 
13.01.2013
23
0
#5
значит ошибка в программе
нет никакой ошибки в программе, просто тут же рекурсия получается вот она и тупит...

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

Код:
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...

п.с. вы сами откройте делфю и протестите
 
13.01.2013
23
0
#6
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;
 

-master-

Well-known member
14.01.2012
616
12
#7
Это и есть ошибка, в моей версии никаких рекурсий, а у вас непойми что.
То что вы пытаетесь сделать на зывается - свойство, но чтобы его сделать нужен класс..

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

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

Senset

Well-known member
11.09.2006
136
0
#9
Ваш код:
Код:
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
;
 
13.01.2013
23
0
#10
честно говоря я хотел чтобы именно в отдельной (не стандартной функции) происходили действия... ну да ладно, мне тут уже объяснили что Enabled надо юзать как переменнную - параметр для функции, видимо по другому никак :(
 

Senset

Well-known member
11.09.2006
136
0
#11
честно говоря я хотел чтобы именно в отдельной (не стандартной функции) происходили действия... ну да ладно, мне тут уже объяснили что Enabled надо юзать как переменнную - параметр для функции, видимо по другому никак :(
Все "стандартные функции" - это функции, которые реагируют на события, ибо смысл визуального программирования именно в этом... Писать новый обработчик событий для тех же событий, что итак есть - это мягко говоря странно, но возможно...
Или же если речь идет просто об отдельной функции, то напишите её... назовите как хотите (и конкретизируйте её вызов (if unit1.enabled then ... ) - для вашего первого кода) , потом полюбому придеться привязать её к какому-либо событию (будь то нажатие на кнопку, или срабатывание таймера, создание формы, инициация создания формы или еще что) иначе она просто не включиться) и никогда не заработает
 
13.01.2013
23
0
#12
а можно ли создать обработчик событий для переменной?

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

Код:
Procedure Process(Enabled: Boolean);
begin
if Enabled 
then {какие то действия}
else {какие то действия};
end;
и существует переменная Enabled (не та что в процедуре, а отдельно)

Код:
Var Enabled: Boolean; //в глобальных переменных
и можно ли теперь создать что то типа:

Код:
Procedure EnabledChange(Enabled: Boolean);
begin
Process(Enabled);
end;
главный вопрос: будет ли процедура EnabledChange вызываться при изменении глобальной переменной Enabled?
 

Senset

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