Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 5 218

/ вопрос открыт /

Здравствуйте, уважаемые эксперты!
Почему кнопки становятся неактивными только после выполнения процедуры?
Как сделать чтобы код выполнялся поочередно?
Процедура AddTo; конектится к БД и получает данные. Мне нужно чтобы при нажатии на кнопку, все кнопки на форме стали не активными пока не выполнится процедура. А получается так , сначала выполняется процедура, потом кнопки исчезают и сразу появляются, как это исправить, что неправильно?

Приложение:
  1. procedure TForm2.bAddClick(Sender: TObject);
  2. begin
  3. bCloce.Enabled:= False;
  4. bAdd.Enabled:= False;
  5. Application.ProcessMessages;
  6. AddTo;
  7. bCloce.Enabled:= True;
  8. bAdd.Enabled:= True;
  9. end;


mr_switch Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: mr_switch (статус: Посетитель)
Вопрос отправлен: 21 апреля 2011, 12:17
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 24; последнее сообщение — 21 апреля 2011, 15:46; участников в обсуждении: 2.

Страницы: [1] [2] [Следующая »]

Вадим К

Вадим К (статус: Академик), 21 апреля 2011, 12:26 [#1]:

процедура AddTo достаточно долго исполняется?
Галочка "подтверждения прочтения" - вселенское зло.
mr_switch

mr_switch (статус: Посетитель), 21 апреля 2011, 12:30 [#2]:

относительно, в ней еще есть несколько функций и процедур, для обработки полученных данных.
Вадим К

Вадим К (статус: Академик), 21 апреля 2011, 12:47 [#3]:

использовать sleep в главном потоке - плохо.
Значит что то в процедуре Addto делает их доступными. (Enabled не скрывает кнопку, он просто делает ее доступной/недоступной).
Показывайте код этой процедуры.

Но в целом, очень похоже, что Вам нужно использовать тред.
Галочка "подтверждения прочтения" - вселенское зло.
mr_switch

mr_switch (статус: Посетитель), 21 апреля 2011, 12:55 [#4]:

использовать sleep в главном потоке - плохо. - это я для пробы, а так sleep вообще не где нет.
Мне нужно только чтобы кнопка стала неактивной enabled = false
Вадим К

Вадим К (статус: Академик), 21 апреля 2011, 12:58 [#5]:

шутку оценил:)
как Вы думаете, по этим исходникам можно что то понять? Ничего. Тут в основном только вызовы процедур.
Если исходники выкладывать не хочется по каким то причинам, можно начать с того, что закомментировать часть кода и посмотреть, воспроизводится ли проблема.
Галочка "подтверждения прочтения" - вселенское зло.
mr_switch

mr_switch (статус: Посетитель), 21 апреля 2011, 13:06 [#6]:

да не хочется их всех искать, в них нет работы с этими кнопками это точно... они обрабатывают только полученные данные...
Вадим К

Вадим К (статус: Академик), 21 апреля 2011, 13:11 [#7]:

Там только база? (если база, то какая, какие компоненты).
Там есть xml? если да, то какие компоненты, методы.

И не стоило удалять код:)
Галочка "подтверждения прочтения" - вселенское зло.
mr_switch

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

mr_switch (статус: Посетитель), 21 апреля 2011, 13:17 [#9]:

вот скажите что раньше должно выполниться здесь ?
mr_switch

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

mr_switch (статус: Посетитель), 21 апреля 2011, 13:35 [#11]:

может есть какие-то параметры у формы? я не понимаю почему один и тот же код работает по разному. В другой проге этот же код работает нормально, выполняется все поочередно.
Вадим К

Вадим К (статус: Академик), 21 апреля 2011, 13:38 [#12]:

Application.ProcessMessages; - это тоже костыль. Лучше не использовать. И то, что кнопки тут не становятся недоступными - меня не удивляет. Но есть некоторые моменты, которые ещё нужно уточнить.
Если в LoadEnter по очереди комментировать строки, можете ли найти такую строку (пару строк), после которых работает как нужно?
Галочка "подтверждения прочтения" - вселенское зло.
mr_switch

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

mr_switch (статус: Посетитель), 21 апреля 2011, 14:00 [#15]:

Application.ProcessMessages; не нужно комментировать. в данном случае он играет ключевую роль. - и так и так одно и тоже...

gUpload - это что за компонент? - анимация - я ее удалил с формы.. и все равно тоже самое ...

bClear - это кнопка? (имя типа какое?)- да это обычный Button
mr_switch

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

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

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] [Следующая »]

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:30
Выполнено за 0.03 сек.