|
Вопрос # 5 218/ вопрос открыт / |
|
Здравствуйте, уважаемые эксперты!
Почему кнопки становятся неактивными только после выполнения процедуры?
Как сделать чтобы код выполнялся поочередно?
Процедура AddTo; конектится к БД и получает данные. Мне нужно чтобы при нажатии на кнопку, все кнопки на форме стали не активными пока не выполнится процедура. А получается так , сначала выполняется процедура, потом кнопки исчезают и сразу появляются, как это исправить, что неправильно?
Приложение: Переключить в обычный режим- procedure TForm2.bAddClick(Sender: TObject);
- begin
- bCloce.Enabled:= False;
- bAdd.Enabled:= False;
- Application.ProcessMessages;
- AddTo;
- bCloce.Enabled:= True;
- bAdd.Enabled:= True;
- end;
 |
Вопрос задал: mr_switch (статус: Посетитель)
Вопрос отправлен: 21 апреля 2011, 12:17
Состояние вопроса: открыт, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 24; последнее сообщение — 21 апреля 2011, 15:46; участников в обсуждении: 2.
Страницы: [1] [2] [Следующая »]
|
Вадим К (статус: Академик), 21 апреля 2011, 12:26 [#1]:
процедура AddTo достаточно долго исполняется?
Галочка "подтверждения прочтения" - вселенское зло.
|
|
mr_switch (статус: Посетитель), 21 апреля 2011, 12:30 [#2]:
относительно, в ней еще есть несколько функций и процедур, для обработки полученных данных.
|
|
Вадим К (статус: Академик), 21 апреля 2011, 12:47 [#3]:
использовать sleep в главном потоке - плохо.
Значит что то в процедуре Addto делает их доступными. (Enabled не скрывает кнопку, он просто делает ее доступной/недоступной).
Показывайте код этой процедуры.
Но в целом, очень похоже, что Вам нужно использовать тред.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
mr_switch (статус: Посетитель), 21 апреля 2011, 12:55 [#4]:
использовать sleep в главном потоке - плохо. - это я для пробы, а так sleep вообще не где нет.
Мне нужно только чтобы кнопка стала неактивной enabled = false
|
|
Вадим К (статус: Академик), 21 апреля 2011, 12:58 [#5]:
шутку оценил
как Вы думаете, по этим исходникам можно что то понять? Ничего. Тут в основном только вызовы процедур.
Если исходники выкладывать не хочется по каким то причинам, можно начать с того, что закомментировать часть кода и посмотреть, воспроизводится ли проблема.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
mr_switch (статус: Посетитель), 21 апреля 2011, 13:06 [#6]:
да не хочется их всех искать, в них нет работы с этими кнопками это точно... они обрабатывают только полученные данные...
|
|
Вадим К (статус: Академик), 21 апреля 2011, 13:11 [#7]:
Там только база? (если база, то какая, какие компоненты).
Там есть xml? если да, то какие компоненты, методы.
И не стоило удалять код
Галочка "подтверждения прочтения" - вселенское зло.
|
|
mr_switch (статус: Посетитель), 21 апреля 2011, 13:16 [#8]:
var
log:String;
begin
LoadEnter;
Application.ProcessMessages;
Sleep(100000000);
log:=
Post_action(wpro,'add_car','uid='+IntToStr(FUser.uid)+',link='+elink.Text+',size='+esize.Text+',color='+ecolor.Text+',kol='+IntToStr(ekol.Value));
if checkErr(log) then
begin
end;
------------------------------------------------------
procedure LoadEnter;
begin
gUpload.Visible:= True;
bClear.Enabled:= False;
bAdd.Enabled:= False;
bCreateOrder.Enabled:= False;
bCloce.Enabled:= False;
Cursor:= crAppStart;
Application.ProcessMessages;
end;
|
|
mr_switch (статус: Посетитель), 21 апреля 2011, 13:17 [#9]:
вот скажите что раньше должно выполниться здесь ?
|
|
mr_switch (статус: Посетитель), 21 апреля 2011, 13:23 [#10]:
procedure TFCar.Button3Click(Sender: TObject);
var
log:String;
begin
LoadEnter;
Application.ProcessMessages;
Sleep(1000000);
end;
странно но даже так, пока не выполнится sleep кнопки не становятся недоступными....
|
|
mr_switch (статус: Посетитель), 21 апреля 2011, 13:35 [#11]:
может есть какие-то параметры у формы? я не понимаю почему один и тот же код работает по разному. В другой проге этот же код работает нормально, выполняется все поочередно.
|
|
Вадим К (статус: Академик), 21 апреля 2011, 13:38 [#12]:
Application.ProcessMessages; - это тоже костыль. Лучше не использовать. И то, что кнопки тут не становятся недоступными - меня не удивляет. Но есть некоторые моменты, которые ещё нужно уточнить.
Если в LoadEnter по очереди комментировать строки, можете ли найти такую строку (пару строк), после которых работает как нужно?
Галочка "подтверждения прочтения" - вселенское зло.
|
|
mr_switch (статус: Посетитель), 21 апреля 2011, 13:53 [#13]:
procedure TFCar.Button3Click(Sender: TObject);
begin
//gUpload.Visible:= True;
Button3.Enabled:= False;
//bClear.Enabled:= False;
//bAdd.Enabled:= False;
bCreateOrder.Enabled:= False;
bCloce.Enabled:= False;
//Cursor:= crAppStart;
//Application.ProcessMessages;
Sleep(2000);
end;
вот так Button3.Enabled:= False; отрабатывает как нужно... остальные только по истечению таймера....(((
|
|
Вадим К (статус: Академик), 21 апреля 2011, 13:56 [#14]:
Application.ProcessMessages; не нужно комментировать. в данном случае он играет ключевую роль.
gUpload - это что за компонент?
bClear - это кнопка? (имя типа какое?)
Галочка "подтверждения прочтения" - вселенское зло.
|
|
mr_switch (статус: Посетитель), 21 апреля 2011, 14:00 [#15]:
Application.ProcessMessages; не нужно комментировать. в данном случае он играет ключевую роль. - и так и так одно и тоже...
gUpload - это что за компонент? - анимация - я ее удалил с формы.. и все равно тоже самое ...
bClear - это кнопка? (имя типа какое?)- да это обычный Button
|
|
mr_switch (статус: Посетитель), 21 апреля 2011, 14:02 [#16]:
procedure TFCar.Button1Click(Sender: TObject);
begin
Button1.Enabled:= False;
Button3.Enabled:= False;
Application.ProcessMessages;
Sleep(3000);
end;
даже так, только Button1.Enabled:= False; отрабатывает нормально, Button3.Enabled:= False; - по истечению таймера...(
|
|
Вадим К (статус: Академик), 21 апреля 2011, 14:05 [#17]:
Значит Ваша система не успевает обработать сообщения. Нужно понимать, что изменения свойства кнопки - это посылка сообщения системе, система должна обработать его и прислать уведомления о перерисовеке окна, которое собственно Application.ProcessMessages; и обработает.
Я могу посоветовать правильный способ и костыльный.
Костыльный заключается в том, что нужно после каждого изменения свойств компонентов насовать Application.ProcessMessages; (не нужно понимать дословно, может быть Вам хватит 5-6 штук всего, в ключевых точках).
Правильный способ - использовать тред.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
mr_switch (статус: Посетитель), 21 апреля 2011, 14:15 [#18]:
Правильный способ - использовать тред. - потоки? я правильно понял?
но мне все же кажется что это скорее всего глюк в этом приложении. дело в том что я только что создал новое приложение в котором этот код -
procedure TForm2.Button1Click(Sender: TObject);
begin
gUpload.Visible:= True;
Button1.Enabled:= False;
Button2.Enabled:= False;
Button3.Enabled:= False;
Button4.Enabled:= False;
Sleep(1000000);
Button1.Enabled:= True;
Button2.Enabled:= True;
Button3.Enabled:= True;
Button4.Enabled:= True;
gUpload.Visible:= False;
end;
выполняется поочередно без каких либо проблем , даже Application.ProcessMessages не нужен.
|
|
Вадим К (статус: Академик), 21 апреля 2011, 14:38 [#19]:
А основное приложение не использует ли компонентов для украшения формы скинами? или компонент WebBrowser ?
Галочка "подтверждения прочтения" - вселенское зло.
|
|
mr_switch (статус: Посетитель), 21 апреля 2011, 14:40 [#20]:
решил применить костыльный способ )))
procedure TFCar.Button3Click(Sender: TObject);
begin
gUpload.Visible:= True;
Button3.Enabled:= False;
bClear.Enabled:= False;
bAdd.Enabled:= False;
bCreateOrder.Enabled:= False;
bCloce.Enabled:= False;
mysleep(100);
sleep(10000);
ShowMessage('sleep off');
end;
----------------
procedure mysleep(i:Integer);
var
z:Integer;
begin
for z:=0 to i do
begin
Sleep(5);
Application.ProcessMessages;
end ;
end;
---------------
это немного помогло решить проблему... кнопки становятся неактивными до выполнения sleep(10000);
|
Страницы: [1] [2] [Следующая »]
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|