| 
| 
 | Вопрос # 5 218/ вопрос открыт / | 
 |  Здравствуйте, уважаемые эксперты! Почему кнопки становятся неактивными только после выполнения процедуры?
 Как сделать чтобы код выполнялся поочередно?
 Процедура AddTo; конектится к БД и получает данные. Мне нужно чтобы при нажатии на кнопку, все кнопки на форме стали не активными пока не выполнится процедура. А получается так , сначала выполняется процедура, потом кнопки исчезают и сразу появляются, как это исправить, что неправильно?
 Приложение:Переключить в обычный режим procedure TForm2.bAddClick(Sender: TObject);beginbCloce.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] [Следующая »]  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |