Форум: "Прочее";
Текущий архив: 2006.11.05;
Скачать: [xml.tar.bz2];
ВнизКак сделать так чтобы пользователь не нажал на кнопку много раз? Найти похожие ветки
← →
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;
то так не пашет:)
← →
RASkov (2006-10-07 00:26) [41]> то так не пашет:)
т.е. не отвечает на вопрос...
← →
Ketmar © (2006-10-07 00:27) [42]>[40] RASkov 7-Oct-2006, 00:25
>то так не пашет:)
естественно. потому что Application.ProcessMessages() забывать тоже не надо. это просто альтернатива "Enabled", не более. причём кривая.
я просто пояснял, что есть "снять обработчик".
← →
velimir © (2006-10-07 00:27) [43]To Ketmar: Спасибо за наводку на автора, а то у меня тока какой-то В. Понамарев...
А насчет отношения к жизни взгляды у нас с тобой совпадают ;-)
← →
Ketmar © (2006-10-07 00:29) [44]>[43] velimir(c) 7-Oct-2006, 00:27
>Спасибо за наводку на автора
можешь завести отдельную тему с вопросом "что бы почитать о...". насоветуют кучу хорошей литературы. %-) советовать, что читать -- это мы любим. %-)
← →
velimir © (2006-10-07 00:31) [45]To Ketmar: Можешь начинать советовать, я записываю ;)
← →
velimir © (2006-10-07 00:32) [46]To Ketmar: И лучше не только авторов, но и названия книг!!! Заранее благодарен!!!
← →
Ketmar © (2006-10-07 00:34) [47]пока эту осиль. а потом, как вопросы появятся, спрашивай дальше. %-)
главное -- никогда-ни-за-что не читай флёнова и архангельского. %-)
← →
RASkov (2006-10-07 00:35) [48]> [42] Ketmar © (07.10.06 00:27)
Ну в итоге вот то что надо автору:procedure TForm2.Button1Click(Sender: TObject);
begin
(Sender as TButton).Enabled := False;
SendC;
Application.ProcessMessages;
(Sender as TButton).Enabled := True;
end;
По твоему мнению опять что-то не так?
← →
velimir © (2006-10-07 00:40) [49]ТО RASkov: Спасибо! Я уже понял как оно будет работать!!!
ТО Ketmar: Уже скачиваю "Программирование для Microsoft Windows на С" - Чарльз Петзольд. Всего-то 80Мб... Или ты советовал другую книгу? Можешь название точное дать?
PS. Пономарева тоже читать не стоит %-)
← →
RASkov (2006-10-07 00:45) [50]Мое подозрение - от того что происходит в SendC - что и этот метод может не помочь. Например в SendC создается поток и выполняется какоето время...
Ну мож я и обманываюсь:)
← →
Ketmar © (2006-10-07 00:48) [51]>[48] RASkov 7-Oct-2006, 00:35
>По твоему мнению опять что-то не так?
есть мелочи, в принципе. но работать будет. %-)
>[49] velimir(c) 7-Oct-2006, 00:40
>ТО Ketmar: Уже скачиваю "Программирование для Microsoft
>Windows на С" - Чарльз Петзольд.
кажись, оно. не помню уже -- давно было. %-)
← →
velimir © (2006-10-07 00:50) [52]RASkov, не обманываешься... Но все равно я счаз проверить не смогу...
Но я думаю должно сработать!
← →
Германн © (2006-10-07 00:52) [53]Ненавижу, когда процедуры общения с внешним кстройством запихивают в обработчик нажатия кнопки. Я бы предпочел иной вариант:
procedure WMSendCommandToDevice(var Mes: TMessage); message WM_SendCommandToDevice;
procedure TfmMain.btnOneClick (Sender: TObject)
begin
btnOne.Enabled := false;
PostMessage(Handle,WM_SendCommandToDevice,0,0);
end;
procedure WMSendCommandToDevice(var Mes: TMessage);
begin
//вызываем процедуру отсылки на девайс
SendC;
//Ждем 1 секунду пока отработает девайс
sleep(1000);
btnOne.Enabled := true;
end;
← →
RASkov (2006-10-07 00:53) [54]> [51] Ketmar © (07.10.06 00:48)
> >[48] RASkov 7-Oct-2006, 00:35
> >По твоему мнению опять что-то не так?
> есть мелочи, в принципе. но работать будет. %-)
Не сочти за "докапывание" хотелось бы узнать про "мелочи", чесное слово. Без смеха и шуток.
← →
Ketmar © (2006-10-07 00:53) [55]>[53] Германн(c) 7-Oct-2006, 00:52
>Я бы предпочел иной вариант
не пугай новичков. %-))
← →
Ketmar © (2006-10-07 00:55) [56]>[54] RASkov 7-Oct-2006, 00:53
>Не сочти за "докапывание" хотелось бы узнать про "мелочи"
собственно, мелочь одна, она де главная: UI заморозится. а потом скопом выполнит всё, что юзер успел накликать. %-)
← →
velimir © (2006-10-07 00:57) [57]ТО Германн: А чем плохо если, вся прога посвещена работе с внешним девайсом и обращения к нему идет прямо с обработки события OnClick?
← →
RASkov (2006-10-07 00:58) [58]> [53] Германн © (07.10.06 00:52)
И опять же здесь будет зависить SendC т.е. как она реализована.
А чем лучше послать "себе" сообщение и там отработать, чем отработать в нажатии кнопки? - это про этот конкретный пример.
← →
Ketmar © (2006-10-07 00:59) [59]>[58] RASkov 7-Oct-2006, 00:58
в этом конкретном -- избавлен от проблем с Application.ProcessMessages(), как минимум. да и всяко изящней. а вдруг захочется ещё пункт меню привинтить? и хоткей? и по таймеру?
← →
RASkov (2006-10-07 01:01) [60]> [56] Ketmar © (07.10.06 00:55)
Понял. Ну это как реализована SendC есче. И это по всей видимости ответ на мой вопрос Германну. Хотя...
← →
RASkov (2006-10-07 01:03) [61]> [59] Ketmar © (07.10.06 00:59)
Согласен. Все понятно. Спасибо.
← →
velimir © (2006-10-07 01:05) [62]Я все же сделаю по [48], про очень много кнопок, который много разных функций юзают... И у меня все работает кроме одного пунктика, что от перекликов не защищен... Но и [53] я тоже буду иметь ввиду на будущее.
← →
Германн © (2006-10-07 01:09) [63]
> RASkov (07.10.06 01:01) [60]
>
> > [56] Ketmar © (07.10.06 00:55)
>
> Понял. Ну это как реализована SendC есче. И это по всей
> видимости ответ на мой вопрос Германну. Хотя...
Мой вариант не зависит никак от реализации SendC. Соль именно в Post. А вообще использование PostMessage в обработчиках очень полезно и в ряде других случаев.
← →
Palladin © (2006-10-07 01:10) [64]хем (дубль два, долго терпел :), но надеялся что [39] возымеет действие... отнюдь... ), наглядность использования tag, для тех кто недогнал что это просто аттрибут класса и никаких ожиданий сообщений системы не требует для догона что он уже не тот
TForm1 = class(TForm)
Button1: TsButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
...
Type
TMyThread=Class(TThread)
Protected
Procedure Execute; override;
End;
Procedure TMyThread.Execute;
Begin
Sleep(10000);
End;
procedure TForm1.Button1Click(Sender: TObject);
begin
If Button1.Tag=0 Then
Begin
Button1.Tag:=1;
With TMyThread.Create(False) Do
Begin
FreeOnTerminate:=True;
While not Terminated Do
Begin
Sleep(100);
Application.ProcessMessages;
End;
End;
Button1.Tag:=0;
End Else ShowMessage("Фигушки, есче в процессе!");
end;
← →
RASkov (2006-10-07 01:11) [65]А там в [53], по идее, в параметрах PostMessage(Handle, WM_SendCommandToDevice, 0, 0); в место нулей можно передавать какого Sendera заЕнаблить.
← →
Ketmar © (2006-10-07 01:15) [66]>[64] Palladin(c) 7-Oct-2006, 01:10
а зачем тут тэг вообще? запретить кнопку нафиг, и все проблемы. %-)
← →
Германн © (2006-10-07 01:15) [67]
> RASkov (07.10.06 01:11) [65]
>
> А там в [53], по идее, в параметрах PostMessage(Handle,
> WM_SendCommandToDevice, 0, 0); в место нулей можно передавать
> какого Sendera заЕнаблить.
Конечно можно.
← →
velimir © (2006-10-07 01:15) [68]ТО Palladin: Не вижу принципиальной разницы в использовании tag или enabled. Ключевая штучка Application.ProcessMessages;
← →
Ketmar © (2006-10-07 01:16) [69]>[64] Palladin(c) 7-Oct-2006, 01:10
ну и, коли уж пишешь так длинно -- ну не ленись ты делать try ... finally. %-)
← →
Германн © (2006-10-07 01:17) [70]
> velimir © (07.10.06 01:15) [68]
>
> ТО Palladin: Не вижу принципиальной разницы в использовании
> tag или enabled.
Надень очки :-) То бишь почитай книжки. Разница именно принципиальная! Но я всё равно против.
← →
Ketmar © (2006-10-07 01:17) [71]>[68] velimir(c) 7-Oct-2006, 01:15
>Не вижу принципиальной разницы
вообще-то разница есть -- для юзера. но это дело вкуса. просто некоторые особо одарённые юзеры могут перепугаться запрещённой кнопки -- "как так? работает только один раз?"
правда, другие могут раздражаться от окошка "занят я"... %-)
← →
Palladin © (2006-10-07 01:20) [72]
> [69] Ketmar ©
издеваешься?? лениво :) главное донести, дальше пусть сами думают...
хотя конечно, ты прав, все таки "начинающим"... хотя все равно больше одного потока не запустится...
> [68] velimir ©
application.processmessages был для чтоб
1. приложение не "зависло"
2. сообщение showmessage сработало для наглядности
оно и без него (цикла while с sleep(100)) так же отработает
← →
velimir © (2006-10-07 01:21) [73]ТО Ketmar: Как раз необходимость возникла именно из-за "одоренности" юзеров %-( %-)
← →
RASkov (2006-10-07 01:24) [74]> [72] Palladin © (07.10.06 01:20)
В примере [64] строчка
While not Terminated Do
помоему к Application относится а не к потоку...
както страно выполняется (я откомпилировал).
← →
Ketmar © (2006-10-07 01:24) [75]>[72] Palladin(c) 7-Oct-2006, 01:20
>равно больше одного потока не запустится...
а вдруг что-нибудь таки упадёт? "начинающим" же, как ты верно заметил... %-)
← →
Ketmar © (2006-10-07 01:25) [76]>[74] RASkov 7-Oct-2006, 01:24
with видел? %-)
← →
RASkov (2006-10-07 01:25) [77]> > [72] Palladin © (07.10.06 01:20)
Но суть не в этом и... ясна.:)
← →
RASkov (2006-10-07 01:26) [78]> [76] Ketmar © (07.10.06 01:25)
Видел и поэтому написал
> помоему к Application относится а не к потоку...
так как откомпилил и странное поведение при нажатии кнопки...
← →
Ketmar © (2006-10-07 01:26) [79]кстати, да. косяк-с. FreeOnTerminate? и проверка свойства у объекта, который порушили нафиг? %-)
← →
RASkov (2006-10-07 01:26) [80]> > помоему к Application относится а не к потоку...
Страницы: 1 2 3 4 5 6 вся ветка
Форум: "Прочее";
Текущий архив: 2006.11.05;
Скачать: [xml.tar.bz2];
Память: 0.61 MB
Время: 0.05 c