Mam w funkcji buttona pętlę repeat która przeszukuje kolejno linie memo oraz procedurę WMHOTKEY w której po naciśnięciu klawisza Esc zmienia się wartość zmiennej.
Problem polega na tym, że wartość tej mojej zmiennej zmienia się dopiero po zakończeniu pętli a mnie właśnie chodzi o to by zmieniała się w chwili naciśnięcia przycisku podczas trwania pętli.
Co zatem radzicie?
Pozdrawiam i z góry dziękuję za odpowiedzi
Radzę przetrzeźwieć zanim coś nasmarujesz na forum. Wartość zmiennej zmienia się podczas wpisania jakieś wartości do niej.
yhh skąd tyle sarkazmu w ludziach...
Jeśli w mojej procedurze po naciśnięciu przycisku wartość zmienia się np na 1 to chyba przypisuje do niej wartość?
Tyle że ta waartość przypisuje sie dopiero po zakończeniu pętli
@MCvx - podaj kod, albo szklaną kulę do wróżenia.
Zmienia się po zakończeniu pętli, bo nie używasz wątków.
Dajmy na to, że mam taki program:
private
{ Private declarations }
ESC : Integer;
procedure WMHOTKEY(var Msg : TMessage); message WM_HOTKEY;
var
X : integer;
procedure TForm1.WMHOTKEY(var Msg: TMessage);
begin
if Msg.WParam = ESC then
begin
ShowMessage('Przypisywanie X = 1');
X := 1;
end;
end;
procedure TForm1.PracaClick(Sender: TObject);
Var
L : Integer;
begin
If XY.Lines[0] <> '' then
begin
repeat
For L := 0 to XY.Lines.Count -1 do
begin
{...}
If X = 1 then ShowMessage('Zmiana wartości');
Sleep(500);
end;
until (L = Xy.Lines.Count);
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
const
VK_ESCAPE = 27;
begin
ESC := GlobalAddAtom('Hotkey1');
RegisterHotKey(Handle, ESC, 0, VK_ESCAPE);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
UnRegisterHotKey(Handle, ESC);
GlobalDeleteAtom(ESC);
end;
I program będzie działał na takiej zasadzie, że komunikat "Przypisywanie X = 1" pojawi się dopiero po zakończeniu pętli, a komunikat "Zmiana wartości" wyświetli się dopiero po drugim wciśnięciu przycisku (ale to wiadomo dlaczego w tym wypadku) a w moim przypadku potrzebuje uzyskać taki efekt, że któryś z komunikatów wyświetli sie w chwili wciśnięcia klawisza
chyba po prostu wystarczyło dodać u mnie Application.ProcessMessages;
To jest bardzo złe rozwiązanie { Application.ProcessMessages }.
Lepiej zrób tą pętle na wątkach lub ewentualnie na timierze { ba w związku z tym sleep(500) timer to nawet lepsze rozwiązanie }