-
> kilkennycat © (10.04.17 09:16) [16]
Так у меня полной пересканировки и нет при вводе обычных символов. Она запускается только при вводе кавычек и комментария и то с места их ввода и до конца
-
> Leonid Troyanovsky © (10.04.17 09:50) [17]
> sniknik © (10.04.17 10:10) [18]
Буду колдовать с таймером. Было что-то типа: Scan;
begin
n := 1;
while n <> Length(Text) do begin
inc(n)
end;
end; А теперь что-то из этого мудрить нужно
-
while n <> Length(Text) do begin
if ( fNewText ) then Break;
inc(n)
end;
-
> NoUser © (10.04.17 11:48) [22] > > while n <> Length(Text) do begin > if ( fNewText ) then Break; > {-----} > inc(n) > end;
Ну без задержки таймером все равно не получиться, так как и fNewText и вызов Scan идут с одной точки, оборвать так конечно можно, но нужно как-то ждать выхода из функции. Без таймера тут не обойтись, так как:
unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm1 = class(TForm) Label1: TLabel; Label2: TLabel; procedure FormKeyPress(Sender: TObject; var Key: Char); procedure FormActivate(Sender: TObject); private { Private declarations } public SyspendFlag: Boolean; function Scan: Boolean; end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormActivate(Sender: TObject); begin SyspendFlag := False; Scan; end;
function TForm1.Scan: Boolean; var n: Integer; begin n := 0; while n < 214748364 do begin if SyspendFlag then begin Label2.Caption := IntToStr(n); {тут всегда будет ноль} Break; end; Inc(n); Application.ProcessMessages; end;
SyspendFlag := False; end;
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char); begin SyspendFlag := True; Label1.Caption := Key; Scan; end;
-
type TForm1 = class(TForm) Memo1: TMemo; Label1: TLabel; procedure Memo1KeyPress(Sender: TObject; var Key: Char); procedure FormClose(Sender: TObject; var Action: TCloseAction); private fInScan :Boolean; fReScan :Boolean; fBrScan :Boolean; function Scan: Boolean; procedure WmUser100(var Msg:TMessage); message WM_USER+1; end; var Form1: TForm1;
implementation
{$R *.dfm}
function TForm1.Scan: Boolean; var n: Integer; begin fInScan := True; fBrScan := False; n := 0; while n < 214748364 do begin if (fReScan) then begin fReScan := False; Memo1.Lines.Add(IntToStr(n)); n := 0; end; if (fBrScan) then Break; Inc(n); Application.ProcessMessages; end; fInScan := False; end;
procedure TForm1.WmUser100(var Msg: TMessage); begin if ( fInScan ) then fReScan := True else Scan; end;
procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: Char); begin PostMessage(Handle, WM_USER+1,0,0); end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin fBrScan := True; end;
-
> NoUser © (10.04.17 17:01) [24]
Ну концептуально примерно правильно, но где fBrScan становится истинным, кроме как при закрытии формы? Ведь нужно же обрывать цикл при новом вводе, а выход только по if (fBrScan) then Break; И это не правильная логика, если Scan будет успевать дорабатывать до конца, то нового Скана не будет procedure TForm1.WmUser100(var Msg: TMessage); begin if ( fInScan ) then fReScan := True else Scan; end;
-
точнее при первом нажатии клавиши мы оборвем предыдущий цикл, а новый не начнем.
правильнее наверное будет так: (но только наверное ) нужно потестировать
function TForm1.Scan: Boolean; var n: Integer; begin fInScan := True; n := 0; while n < 214748364 do begin if (fReScan) then begin fReScan := False; Scan; {вызов после прекращения предыдущего} Break; end; Inc(n); Application.ProcessMessages; end;
fInScan := False; end;
-
> Ведь нужно же обрывать цикл при новом вводе,
Зачем обрывать если можно сказать сканируй заново ? (ну, и подсунь данные, которые нужны для нового скана)
А обрывать, это если юзеру уже нужно новый документ или винда пошла обновляться. ))
> если Scan будет успевать дорабатывать до конца, то нового Скана не будет
отлично, значит успели просканить до ввода нового символа - как и задумано!
|