Вверх ↑
Ответов: 2059
Рейтинг: 132
#1: 2022-02-16 16:47:10 ЛС | профиль | цитата
nesco писал(а):
Если не трудно.

procedure THICopy._work_doCopy;
var str:string;
Pos,Count:integer;
begin
str := ReadString(_Data,_data_Str,'');
if str <> '' then begin
Pos := ReadInteger(_Data, _data_Position, _prop_Position);
Count := ReadInteger(_Data, _data_Count, _prop_Count);
case _prop_Direction of
1: Pos := Length(str) - Count - Pos + 2;
end;
if Pos <= 0 then begin
Inc(Count, Pos-1);
Pos := 1;
end;
_hi_CreateEvent(_Data, @_event_onCopy, Copy(str,Pos,Count));
end;
end;

1.       case _prop_Direction of
1: Pos := Length(str) - Count - Pos + 2;
нет необходимости делать через case. Мы проверяем только одно значение.
2. Вся комбинация должна выполнятся внутри case 1: ... end;
Стало быть нужно сделать так:
  case _prop_Direction of
1:
begin
.......
end;
end;
Иначе у нас работает одна строчка "1: Pos := Length(str) - Count - Pos + 2;"
Но логичней сделать так:
  if _prop_Direction = 1 then
begin
.......
end;
Про Count - Pos + 2 и Pos := 1; я нечего не говорю, это уже подгоняли костыли по росту.
Отсчёт в строке начинается с нуля то и позицию при отрицательном значении ставим Pos := 0;
Это необъяснимо, похоже с бодуна: Length(str) - Count - Pos + 2 зачем вычитать это дело из длины строки, когда это работает внутри условия отрицательной позиции???
И это тоже костыли:
     if Pos <= 0 then begin 
Inc(Count, Pos-1);
Pos := 1;
end;
Нам просто надо уменьшить Count на отрицательное значение Pos(на сколько вылезло ниже нуля),
значит Count + Pos(значение отрицательное). а позицию приравнять началу строки, то бишь нулю.
Раз мы елозим в районе нуля, по условию проверки, то надо писать везде (Count-1) лучше в скобках для наглядности.
В архиве ровно так и сделано.
карма: 6

0
Редактировалось 4 раз(а), последний 2022-02-16 17:03:27