![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Кнопка
boogier © (2002-01-15 17:58:00)Как правильно сделать кнопку "Отмена" для прерывания вычислений и как обработать нажатие клавиши ESC?
Севостьянов Игорь (2002-01-17 16:59:00) [1]А можно еще поставить HOOK на клаву
Если речь идет о запросе из БД, то используя ассинхронный вид запроса ADO можно его прервать (TADOCommand)
Что-то типа этого
function RepaintScreen: Boolean;
var
Msg: TMsg;
begin
Result := False;
if PeekMessage(Msg, GetActiveWindow, 0, 0, PM_REMOVE) then
Case Msg.message of
WM_PAINT:begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
WM_KEYDOWN,
WM_KEYUP: if Msg.wParam = 27 then Result := True;
end;
end;
procedure TForm1.ExecuteCommand;
begin
with AdoCommand1 do
begin
CommandText := "spInsertNewUserDefaultInfo";
ADODataSet := Execute;
while States = stExecuting do WaitExecuteDone(AdoCommand1);
end;
end;
function TForm1.WaitExecuteDone(DataSet: TADOCommand): Boolean;
begin
if RepaintScreen then
begin
DataSet.Cancel;
raise EDatabaseError.Create("Операция отменена");
end;
end;
Пишу без делфей без проверки
Все вопросы по мылу
Anatoly Podgoretsky (2002-01-17 10:01:00) [2]Вадим © (15.01.02 22:17)
...
until stop;
panov (2002-01-17 08:11:00) [3]И вариант Вадим © (15.01.02 22:17),
и Adder © (16.01.02 08:45) работают.
Для обработки Keypress нужно, чтобы был установлено для формы
KeyPreview := True;
EsKor (2002-01-17 07:23:00) [4]>Adder © (16.01.02 08:45)
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
if key=#27 then Ваши действия;
end;
Эта процедура не работает, если вызывается длительный цикл вычислений щелчком на кнопке формы. Событие OnKeyPress для формы вообще не наступает. Не помогает и строка в цикле Form1.SetFocus.
Если этот обработчик назначить для события OnKeyPress этой кнопке, то обработка идет нормально, но до тех пор пока кнопка имеет фокус.
В связи с этим вопрос.
Как создать обработчик событий от клавиатуры не зависящий от расположения фокуса, или так - глобальный для данной формы, или м.б. для всего приложения?
kengura (2002-01-16 18:56:00) [5]Использовать Thread в который запихнуть выполнение запроса.
boogier (2002-01-16 14:14:00) [6]Вадим ©
Понятно, а как сделать кнопку на прерывание выполняющегося запроса
Adder (2002-01-16 08:45:00) [7]procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
if key=#27 then Ваши действия;
end;
Вадим (2002-01-15 22:17:00) [8]var
stop: boolean;
procedure XXX(...);
begin
Stop := False;
repeat
Application.ProcessMessages;
if stop then Exit;
until ...
end;
procedure Button1Click(...);
begin
Stop := True;
end;