Форум: "Прочее";
Текущий архив: 2006.11.05;
Скачать: [xml.tar.bz2];
ВнизКак сделать так чтобы пользователь не нажал на кнопку много раз? Найти похожие ветки
← →
Velimir © (2006-10-06 19:56) [0]Ситуация такова. Для простоты начну с куска кода
procedure TfmMain.btnOneClick (Sender: TObject)
begin
if (btnOne.Enabled) then
begin
btnOne.Enabled := false;
//вызываем процедуру отсылки на девайс
SendC;
//Ждем 1 секунду пока отработает девайс
sleep(1000);
btnOne.Enabled := true;
end;
end;
А теперь дело в следущем, если пользователь нажимает кнопку более одного раза, то происходит несколько вызовов данной процедуры OnClick.
И собсно возникает сабж?
У меня было 2 решения проблемы:
1. Почистить буфер клавы и мыши (но я не знаю как!!!)
2. Закрыть кнопку другой кнопкой. Но т.к. кнопок много (более 20, просто общее тело процедур похоже), то этот вариант не подходит.
Может кто подскажет как решить вопрос при помощи пункта 1, или предложит свой способ!!!
Заранее благодарен за помощь!
← →
Loginov Dmitry © (2006-10-06 20:07) [1]btnOne.Enabled := false;
← →
velimir © (2006-10-06 22:28) [2]Вот в том то и дело, что прога как-то запоминает, что были нажатия...
Или я наверное не правильно условия написал...
Кнопка (кнопки) должны блокироваться на время отсылки данных и снова быть доступными по окончанию отсылки.
А в моем примере... прога запоминает нажатия и в итоге если пользователь сделает даблклик или нажмет больше раз, то процедура сработает 2 и более раз и отправит последовательно несколько пакетов, что не допустимо!
← →
Zeqfreed © (2006-10-06 22:31) [3]Она не запоминает нажатия, а сообщения скапливаются в очереди. Обнуляй обработчик на время обработки.
← →
Palladin © (2006-10-06 22:39) [4]неозябательно... tag есть... :)
← →
velimir © (2006-10-06 22:50) [5]А можно пример? А то я в Делфях лох... Всю жизнь на Си и Ассе в Досе писал проги
Заранее благодарен!
← →
velimir © (2006-10-06 23:11) [6]Palladin, а как можно tag использовать?
← →
Palladin © (2006-10-06 23:13) [7]хем
procedure TfmMain.btnOneClick (Sender: TObject)
begin
if (btnOne.tag=0) then
begin
btnOne.tag := 1;
//вызываем процедуру отсылки на девайс
SendC;
//Ждем 1 секунду пока отработает девайс
sleep(1000);
btnOne.tag := 0;
end;
end;
← →
Percent (2006-10-06 23:14) [8]Sleep(1000);
Application.ProcessMessages;
btnOne.Enabled := true;
← →
RASkov (2006-10-06 23:18) [9]
procedure TForm2.Button1Click(Sender: TObject);
var N: Integer;
begin
if not (Sender as TButton).Enabled then Exit;
(Sender as TButton).Enabled:=False;
for N:=0 to 3000 do Caption:=IntToStr(N);
Application.ProcessMessages;
(Sender as TButton).Enabled:=True;
end;
← →
RASkov (2006-10-06 23:18) [10]Ну да как и [8]
← →
RASkov (2006-10-06 23:20) [11]Вместо Sleep и for N:=0 to 3000 do Caption:=IntToStr(N);
вызываем SendC;
← →
velimir © (2006-10-06 23:38) [12]
> Zeqfreed
> Она не запоминает нажатия, а сообщения скапливаются в очереди.
> Обнуляй обработчик на время обработки.
Как обнулить счетчик сообщений?
← →
Ketmar © (2006-10-06 23:40) [13]>[12] velimir(c) 6-Oct-2006, 23:38
>> Обнуляй обработчик на время обработки.
>Как обнулить счетчик сообщений?
ему про Фому, а он про Ерёму...
← →
Zeqfreed © (2006-10-06 23:44) [14]> [12] velimir © (06.10.06 23:38)
Уже предложили использовать Application.ProcessMessages;
← →
velimir © (2006-10-06 23:45) [15]Ketmar, сорри... Опечатался.... =)
Как обнулить обработчик на время обработки?
← →
RASkov (2006-10-06 23:46) [16]Автору>
А я вот даже проверил то что написал... и работает ведь... Или не то что надо?
← →
velimir © (2006-10-06 23:47) [17]Т.е. Application.ProcessMessages; обнулит счетчик на время обработки?
Опять опечатался в предидущем сообщении =)
← →
RASkov (2006-10-06 23:48) [18]> [17] velimir © (06.10.06 23:47)
Так уже попробывал бы...
← →
velimir © (2006-10-06 23:50) [19]RASkov, счаз проверить не могу... Может и работает...
Пока я встретил, тока одну не знакомую мне хрень:
Application.ProcessMessages;
Если мне расскажут как она (Application.ProcessMessages;) действует, то наверное можно будет тему считать закрытой.
← →
Percent (2006-10-06 23:51) [20]velimir © (06.10.06 23:47) [17]
Т.е. Application.ProcessMessages; обнулит счетчик на время обработки?
НЕТ, НЕ ОБНУЛИТ!
RASkov (06.10.06 23:48) [18]
> [17] velimir © (06.10.06 23:47)
Так уже попробывал бы...
Спи спокойно, Сема. Теперь пусть он ворочается... (С) Анекдот
← →
RASkov (2006-10-06 23:52) [21]> [19] velimir © (06.10.06 23:50)
"Проглотит" все сообщения
← →
Ketmar © (2006-10-06 23:53) [22]>[17] velimir(c) 6-Oct-2006, 23:47
>Т.е. Application.ProcessMessages; обнулит счетчик на время
>обработки?
бред. не трогай очередь сообщений -- программа будет здоровее.
снять обработчик можно, присвоим OnClick nil. и не забыв присвоить то, что было раньше перед выходом из процедуры. а лучше, всё-таки, кнопочку запретить.
← →
Ketmar © (2006-10-06 23:53) [23]>[21] RASkov 6-Oct-2006, 23:52
>"Проглотит" все сообщения
бред.
← →
Zeqfreed © (2006-10-06 23:53) [24]> [17] velimir © (06.10.06 23:47)
> обнулит счетчик на время обработки?
Какой счетчик? Application.ProcessMessages обработает все сообщения накопившиеся в очереди.
← →
velimir © (2006-10-06 23:54) [25]RASkov, спасибо!!! Значит все заработает!!!
А что еще мона при помощи Application.ProcessMessages; сделать?
И не подскажет ли многоуважаемый All где можно поподробней в инеет узнать про Сообщения!
← →
RASkov (2006-10-06 23:56) [26]> [22] Ketmar © (06.10.06 23:53)
procedure TForm2.Button1Click(Sender: TObject);
var N: Integer;
begin
//if not (Sender as TButton).Enabled then Exit;
//(Sender as TButton).Enabled:=False;
(Sender as TButton).OnClick:=nil;
for N:=0 to 3000 do Caption:=IntToStr(N);
//Application.ProcessMessages;
//(Sender as TButton).Enabled:=True;
(Sender as TButton).OnClick:=Button1Click;
//ShowMessage("tt"); {TEST}
end;
Если расскоментировать строку Application.ProcessMessages; то работает, а так нет тоже и с запретом.
← →
velimir © (2006-10-06 23:56) [27]Zeqfreed, спасибо! Понял как работает... Он обработает все сообщения, а кнопка в этот момент задисеблена и не отреагирует на клики... СПАСИБО!!!
← →
Ketmar © (2006-10-06 23:58) [28]мда... маразм крепчал, и пальцы наши быстры... в очередной раз убеждаюсь, что "начинающим" ничего писать не надо -- они всё равно живут в мире своих фантазий. и покидать его не хотят ни за какие коврижки. %-(
← →
velimir © (2006-10-07 00:01) [29]Ketmar, ну что ты так... Просто привык все контролировать, а тут механизм сообщений... Под дос у меня с прогой проблем не было.... Там все своё... А тут... Вообщем, прощу прощение за ламеризм... Воть.
← →
RASkov (2006-10-07 00:04) [30]> [28] Ketmar © (06.10.06 23:58)
Извеняюсь,... это кому?
← →
Ketmar © (2006-10-07 00:06) [31]>[29] velimir(c) 7-Oct-2006, 00:01
>Ketmar, ну что ты так...
это не я. это ты упорно не хочешь читать рекомендации от умных людей, а предпочитаешь делать свои выводы, основаные на каких-то "потолочных" знаниях.
ну, зашёл в "начинающим" -- правильно. так послушай, что говорят. для тебя же стараемся. если встретил противоречащие мнения -- переспроси. а лучше попробуй разобраться сам, а потом всё равно переспросить, правильно ли понял (если работает не так, как хотелось). право же, мы не просто стараемся тут забить базу "мастеров" буковками...
>прощу прощение за ламеризм...
да нам-то что? это ты себя наказываешь, а не нас. %-)
← →
Ketmar © (2006-10-07 00:06) [32]>[30] RASkov 7-Oct-2006, 00:04
>Извеняюсь,... это кому?
и тебе в том числе. потому что [21] -- это бред, как я уже писал.
← →
velimir © (2006-10-07 00:08) [33]Ketmar, я тебя не понял... Т.е. вывод что "Application.ProcessMessages;
обработает все сообщения, а кнопка в этот момент задисеблена и не отреагирует на клики..." Неверен?
← →
RASkov (2006-10-07 00:11) [34]> [32] Ketmar © (07.10.06 00:06)
Ну приведи свое решение. [22]? Так приведи пример куском кода.
← →
velimir © (2006-10-07 00:14) [35]RASkov, правильно... Кусок работающего кода - это лучший совет... Если даже до конца не поймешь как работает, то хотя бы можно использовать!
← →
Ketmar © (2006-10-07 00:14) [36]>[33] velimir(c) 7-Oct-2006, 00:08
>обработает все сообщения
обработает, а не "обнулит" или "проглотит". разница огромная.
>[34] RASkov 7-Oct-2006, 00:11
>Так приведи пример куском кода.
пора бы запомнить, что код я даю очень редко. %-)
← →
Ketmar © (2006-10-07 00:16) [37]>[35] velimir(c) 7-Oct-2006, 00:14
>Если даже до конца не поймешь как работает, то
>хотя бы можно использовать!
с этим -- например, к господину Ф. на форум. мы тут учим головой работать и знания приобретать. а не заниматься тупым копипастом.
← →
velimir © (2006-10-07 00:21) [38]Как я понял моя проблема уже решена. За что все огромное спасибо! Честно!
To Ketmar: Расскажи про механизм Сообщений! Я так понял ты в этом дока... Или отошли к толковаму мануалу... А то кормить RTFMами я и сам могу, когда дело косается того в чем я дока...
← →
Ketmar © (2006-10-07 00:24) [39]>[38] velimir(c) 7-Oct-2006, 00:21
>To Ketmar: Расскажи про механизм Сообщений!
запросто. как оплачиваешь? в каком объёме? за сколько занятий? или, может, всё-таки будешь сам литературу читать? %-) того же Петзольда, например. он до сих пор актуален. заодно поймёшь, что происходит внутри VCL, и как она добивается от виндов того, чего добивается. %-)
>Я так понял ты в этом дока...
я вообще много знаю. что радует -- не знаю ещё больше.
← →
RASkov (2006-10-07 00:25) [40]> [36] Ketmar © (07.10.06 00:14)
А если серьезно... то ты это имел ввиду или нет?procedure TForm2.Button1Click(Sender: TObject);
begin
(Sender as TButton).OnClick := nil;
SendC;
(Sender as TButton).OnClick := Button1Click;
end;
то так не пашет:)
Страницы: 1 2 3 4 5 6 вся ветка
Форум: "Прочее";
Текущий архив: 2006.11.05;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.1 c