Форум: "Основная";
Текущий архив: 2002.02.04;
Скачать: [xml.tar.bz2];
ВнизКнопка Найти похожие ветки
← →
boogier (2002-01-15 17:58) [0]Как правильно сделать кнопку "Отмена" для прерывания вычислений и как обработать нажатие клавиши ESC?
← →
Вадим (2002-01-15 22:17) [1]var
stop: boolean;
procedure XXX(...);
begin
Stop := False;
repeat
Application.ProcessMessages;
if stop then Exit;
until ...
end;
procedure Button1Click(...);
begin
Stop := True;
end;
← →
Adder (2002-01-16 08:45) [2]procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
if key=#27 then Ваши действия;
end;
← →
boogier (2002-01-16 14:14) [3]Вадим ©
Понятно, а как сделать кнопку на прерывание выполняющегося запроса
← →
kengura (2002-01-16 18:56) [4]Использовать Thread в который запихнуть выполнение запроса.
← →
EsKor (2002-01-17 07:23) [5]>Adder © (16.01.02 08:45)
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
if key=#27 then Ваши действия;
end;
Эта процедура не работает, если вызывается длительный цикл вычислений щелчком на кнопке формы. Событие OnKeyPress для формы вообще не наступает. Не помогает и строка в цикле Form1.SetFocus.
Если этот обработчик назначить для события OnKeyPress этой кнопке, то обработка идет нормально, но до тех пор пока кнопка имеет фокус.
В связи с этим вопрос.
Как создать обработчик событий от клавиатуры не зависящий от расположения фокуса, или так - глобальный для данной формы, или м.б. для всего приложения?
← →
panov (2002-01-17 08:11) [6]И вариант Вадим © (15.01.02 22:17),
и Adder © (16.01.02 08:45) работают.
Для обработки Keypress нужно, чтобы был установлено для формы
KeyPreview := True;
← →
Anatoly Podgoretsky (2002-01-17 10:01) [7]Вадим © (15.01.02 22:17)
...
until stop;
← →
Севостьянов Игорь (2002-01-17 16:59) [8]А можно еще поставить 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;
Пишу без делфей без проверки
Все вопросы по мылу
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.02.04;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.005 c