Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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.62 MB
Время: 0.049 c
2-1161430828
nokk
2006-10-21 15:40
2006.11.05
время gmt


2-1161336939
Gloomer
2006-10-20 13:35
2006.11.05
Посоветуйте простую компоненту для ввода вещественных чисел


15-1160150211
Velimir
2006-10-06 19:56
2006.11.05
Как сделать так чтобы пользователь не нажал на кнопку много раз?


3-1157621718
NotGooDP
2006-09-07 13:35
2006.11.05
Триггеры в MsSQL


2-1161677938
parasolka
2006-10-24 12:18
2006.11.05
Завершение процедуры.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский