Как получить конкретные строки из нескольких заметок - PullRequest
0 голосов
/ 23 февраля 2019

Я хочу проверить определенные строки из нескольких заметок, и если все они извлечены, то запустить процедуру, но в моем коде иногда процедура выполняется, а иногда нет, а иногда она запускается только тогда, когда некоторые из них извлечены,

Вот мой код:

procedure TForm1.Timer14Timer(Sender: TObject);
begin
  if (pos('ActiveTunnel',memo10.Text)<>0) or (pos('https://ipfounder.net/?sponsor',memo10.text)<>0)
    and (pos('ActiveTunnel',memo9.Text)<>0) or (pos('https://ipfounder.net/?sponsor',memo9.text)<>0)
    and (pos('ActiveTunnel',memo8.Text)<>0) or (pos('https://ipfounder.net/?sponsor',memo8.text)<>0)
    and (pos('ActiveTunnel',memo7.Text)<>0) or (pos('https://ipfounder.net/?sponsor',memo7.text)<>0)
    and (pos('ActiveTunnel',memo6.Text)<>0) or (pos('https://ipfounder.net/?sponsor',memo6.text)<>0)
    and (pos('ActiveTunnel',memo5.Text)<>0) or (pos('https://ipfounder.net/?sponsor',memo5.text)<>0)
    and (pos('ActiveTunnel',memo4.Text)<>0) or (pos('https://ipfounder.net/?sponsor',memo4.text)<>0)
    and (pos('ActiveTunnel',memo3.Text)<>0) or (pos('https://ipfounder.net/?sponsor',memo3.text)<>0)
    and (pos('ActiveTunnel',memo2.Text)<>0) or (pos('https://ipfounder.net/?sponsor',memo2.text)<>0)
    and (pos('ActiveTunnel',memo1.Text)<>0) or (pos('https://ipfounder.net/?sponsor',memo1.text)<>0)
  then
  begin
    if Checkbox1.Checked = true then
    begin
      starttun;
      sleep(3000);
      routesaddlast;
    end;
  end;
end;

1 Ответ

0 голосов
/ 23 февраля 2019

Если вы посмотрите на эту таблицу , вы увидите, что and имеет более высокий приоритет, чем or.Это означает, что предложения в вашем коде на самом деле эквивалентны:

if (pos(..., memo10.Text) <> 0) 
   or ((pos(..., memo10.Text) <> 0) and (pos(..., memo9.Text) <> 0))
   or ((pos(..., memo9.Text) <> 0) and (pos(..., memo8.Text) <> 0))
   or ((pos(..., memo8.Text) <> 0) and (pos(..., memo7.Text) <> 0))
   etc...

, и именно поэтому вы получаете , иногда он работает, как ожидалось, а иногда нет .Я предполагаю, что вы действительно хотите:

if ( (pos(..., memo10.Text) <> 0) or (pos(..., memo10.text) <> 0) ) and
   ( (pos(..., memo9.Text) <> 0) or (pos(..., memo9.text) <> 0) ) and
   ( (pos(..., memo8.Text) <> 0) or (pos(..., memo8.text) <> 0) ) and
   etc...

Другими словами, добавьте скобки вокруг предложений or , чтобы дать им более высокий приоритет, чем и .

Обратите внимание, что , поэтому вам не нужно повторяться , вы можете сделать:

const 
  S0 = 'ActiveTunnel';
  S1 = 'https://ipfounder.net/?sponsor';

procedure TForm1.Timer14Timer(Sender: TObject);
begin
  if ((Pos(S0, memo10.Text) <> 0) or (Pos(S1, memo10.Text) <> 0)) and
     ((Pos(S0, memo9.Text) <> 0) or (Pos(S1, memo9.Text) <> 0)) and
  // etc...  

и упростить это:

function FindIt(memo: TMemo): Boolean;
begin
  Result := (Pos(S0, memo.Text) <> 0) or (Pos(S1, memo.Text) <> 0);
end;

procedure TForm1.Timer14Timer(Sender: TObject);
begin
  if FindIt(memo10) and 
     FindIt(memo9) and 
     FindIt(memo8) // etc. 

Конечно, вы также можете задать FindIt параметр открытого массива и передать любое количество строк, чтобы сделать его более общим.

...