Если вы посмотрите на эту таблицу , вы увидите, что 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 параметр открытого массива и передать любое количество строк, чтобы сделать его более общим.