Вверх ↑
Этот топик читают: Гость
Ответов: 1535
Рейтинг: 176
#1: 2022-02-16 07:32:37 ЛС | профиль | цитата
В данном примере пытаюсь копировать 12 символов справа налево от символа "|". В результате получаю не то, что ожидал. Чего не так делаю? Чего не знаю?
Copy - ошибка копирования

Add(MainForm,2953706,259,126)
{
Width=503
Height=191
link(onCreate,6781627:doSearch,[])
}
Add(Position,6781627,329,140)
{
Target="|"
ShortSearch=1
link(onSearch,6593059:doEvent,[])
link(Str,4095516:Var2,[])
}
Add(Copy,10286756,392,140)
{
Count=12
Direction=1
link(onCopy,12840568:doText,[])
link(Str,4095516:Var3,[(398,124)])
}
Add(Edit,2468859,329,84)
{
Left=85
Top=60
Width=315
Text=""{\pard\li200\sa100\sb100\fs26\cf2\highlight9 |\par}""
}
Add(GetDataEx,4095516,329,119)
{
link(Data,2468859:Text,[])
}
Add(Label,12840568,448,140)
{
Left=85
Top=85
Width=315
}
Add(Debug,6593059,371,140)
{
link(onEvent,10286756:doCopy,[])
}

Редактировалось 3 раз(а), последний 2022-02-16 17:20:26
карма: 1
Не так страшна ошибка, как опасность её не заметить.

0
vip
#1.1контекстная реклама от партнеров
Ответов: 263
Рейтинг: 18
#2: 2022-02-16 11:49:09 ЛС | профиль | цитата
Похоже позицию символа нужно отсчитывать тоже с права на лево


Add(MainForm,4804447,189,140)
{
Width=373
Height=143
link(onCreate,15115267:doWork2,[])
}
Add(Position,6781627,350,154)
{
Target="|"
ShortSearch=1
link(onSearch,14734495:doEvent,[])
link(Str,3765092:Var2,[])
}
Add(Copy,10286756,525,154)
{
Count=12
Direction=1
link(onCopy,12840568:doText,[])
link(Str,3765092:Var3,[(531,131)])
}
Add(Edit,2468859,350,77)
{
Left=10
Top=30
Width=315
Text=""{\pard\li200\sa100\sb100\fs26\cf2\highlight9 |\par}""
}
Add(Label,12840568,574,154)
{
Left=10
Top=55
Width=315
}
Add(GetDataEx,3765092,350,126)
{
link(Data,2468859:Text,[])
}
Add(Length,7770609,273,154)
{
link(onLength,14165619:doEvent,[])
link(Str,3765092:Var1,[(279,131)])
}
Add(Debug,14165619,322,154)
{
link(onEvent,6781627:doSearch,[])
}
Add(Debug,14734495,406,154)
{
link(onEvent,2907134:doCalc,[])
}
Add(Debug,4597121,490,154)
{
link(onEvent,10286756:doCopy,[])
}
Add(MathParse,2907134,441,154)
{
MathStr="%2 - %1 + 1"
ResultType=0
link(onResult,4597121:doEvent,[])
link(X2,7770609:Result,[(454,142)(426,142)(426,201)(279,201)])
}
Add(Button,7857878,189,182)
{
Left=10
Top=5
Caption="Find"
link(onClick,15115267:doWork3,[(256,188)])
}
Add(HubEx,15115267,252,154)
{
link(onEvent,7770609:doLength,[])
}

карма: 3

0
Ответов: 2059
Рейтинг: 131
#3: 2022-02-16 13:00:41 ЛС | профиль | цитата
Никаких костылей не надо!
Надо исправить компонент https://forum.hiasm.com/getfile/39394 который делался с бодуна.
Он изначально не правильно работал в этом режиме.
Надо объяснять построчно, что не так?
P.S.
Перезалил.

Редактировалось 4 раз(а), последний 2022-02-16 21:20:34
карма: 6

0
Разработчик
Ответов: 26066
Рейтинг: 2120
#4: 2022-02-16 15:08:40 ЛС | профиль | цитата
flint2 писал(а):
Надо объяснять построчно, что не так?

Если не трудно. Че-то я припоминаю, что прения по этому вопросу уже были, в результате оставили "как есть".
карма: 22

0
Ответов: 2059
Рейтинг: 131
#5: 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) лучше в скобках для наглядности.
В архиве ровно так и сделано.

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

0
Ответов: 2200
Рейтинг: 673
#6: 2022-02-16 17:26:17 ЛС | профиль | цитата
ser_davkin, логичнее будет сделать так:
Add(MainForm,6522328,315,140)
{
Width=503
Height=191
link(onCreate,6781627:doSearch,[])
}
Add(Position,6781627,357,154)
{
Target="|"
ShortSearch=1
link(onSearch,5405:doOperation,[])
link(Str,4095516:Var2,[])
}
Add(Copy,10286756,441,154)
{
Count=12
link(onCopy,12840568:doText,[])
link(Str,4095516:Var3,[(447,138)])
}
Add(Edit,2468859,357,98)
{
Left=85
Top=60
Width=315
Text=""{\pard\li200\sa100\sb100\fs26\cf2\highlight9 |\par}""
}
Add(GetDataEx,4095516,357,133)
{
link(Data,2468859:Text,[])
}
Add(Label,12840568,483,154)
{
Left=85
Top=85
Width=315
}
Add(Math,5405,399,154)
{
OpType=1
Op2=12
link(onResult,10286756:doCopy,[])
AddHint(-4,-38,36,13,Op2)
}
flint2 писал(а):
который делался с бодуна.
Он изначально не правильно работал в этом режиме.
Не согласен!
Менять case на If смысла особого нет. А вот какой смысл менять логику элемента?
Для реализации ser_davkin достаточно отодвинуть позицию (схема выше).
flint2, а как в вашей реализации можно скопировать последних 12 символов? Можно схему посмотреть? Чтоб вот так получилось:
Add(MainForm,6522328,308,406)
{
Width=503
Height=191
link(onCreate,8711249:doCopy,[])
}
Add(Label,12840568,497,420)
{
Left=85
Top=85
Width=315
}
Add(Copy,8711249,378,420)
{
Count=12
Direction=1
link(onCopy,15954917:doEvent,[])
link(Str,12844220:Text,[])
}
Add(Edit,12844220,378,364)
{
Left=85
Top=60
Width=315
Text=""{\pard\li200\sa100\sb100\fs26\cf2\highlight9 |\par}""
}
Add(Debug,15954917,455,420)
{
link(onEvent,12840568:doText,[])
}
И сразу вопрос, что чаще реализуется, копирование как у ser_davkin или схема выше?

Редактировалось 1 раз(а), последний 2022-02-16 17:26:53
карма: 11

0
Ответов: 2059
Рейтинг: 131
#7: 2022-02-16 17:33:30 ЛС | профиль | цитата
sla8a писал(а):
ser_davkin, логичнее будет сделать так:

Причём здесь схема вообще?!!!
Компонент не работает!!!
Можно как то это объяснить
1: Pos := Length(str) - Count - Pos + 2;
в контексте кода?!
Менять case на If смысла особого нет.

Можно и с case сделать, но лучше делать не запутанный, легко читаемый код.
Кстати, из за этого всё и поплыло. Запутались в нулях какой end; к чему относится.
как в вашей реализации можно скопировать последних 12 символов?

В компоненте не заложен метод отсчёта от длины(конца строки).
Подавай в качестве позиции длину строки, Count=12 и отсчёт справа налево.
Add(MainForm,2953706,21,105)
{
Height=188
}
Add(Edit,9403533,252,35)
{
Left=20
Top=10
Width=255
Text="Edithdfgdfgqwerty"
}
Add(Edit,5936633,427,133)
{
Left=20
Top=40
Width=245
}
Add(Button,9939578,154,133)
{
Left=25
Top=70
link(onClick,7088663:doLength,[])
}
Add(Copy,5016563,322,133)
{
Count=12
Direction=1
link(onCopy,5936633:doText,[])
link(Str,5989022:Var3,[(328,89)])
}
Add(Length,7088663,252,133)
{
link(onLength,5016563:doCopy,[])
link(Str,5989022:Var2,[])
}
Add(GetDataEx,5989022,252,84)
{
link(Data,9403533:Text,[])
}

Вот и всё.

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

0
Ответов: 2200
Рейтинг: 673
#8: 2022-02-16 17:50:49 ЛС | профиль | цитата
flint2 писал(а):
Компонент не работает!!!
Давайте все таки определимся что в вашем понимании не работает.
Вот пример из двух элементов которые при свойстве чтения строки с права налево (он же реверс) работают одинаково. Что в вашем понимание тут работает не правильно? И если неправильно то в двух элементах?
Add(MainForm,2953706,322,266)
{
Width=793
Height=721
}
Add(Edit,2468859,399,266)
{
Left=85
Top=60
Width=315
Text=""{\pard\li200\sa100\sb100\fs26\cf2\highlight9 |\par}""
}
Add(Str_Enum,16022203,399,329)
{
Delimiter=""
To=12
Direct=1
link(onEnum,13319259:doAdd,[])
link(String,11356111:Var2,[])
}
Add(ListBox,13319259,560,329)
{
Left=175
Top=95
Width=95
Height=165
}
Add(Button,8210384,322,329)
{
Left=80
Top=105
Caption="test1"
link(onClick,16022203:doEnum,[])
}
Add(Copy,13640125,385,392)
{
Position=1
Count=12
Direction=1
link(onCopy,10038980:doText,[])
link(Str,11356111:Var1,[(391,313)])
}
Add(Button,10360467,322,392)
{
Left=75
Top=315
Caption="test2"
link(onClick,13640125:doCopy,[])
}
Add(Label,10038980,553,392)
{
Left=160
Top=315
Width=230
}
Add(GetDataEx,11356111,399,308)
{
link(Data,2468859:Text,[])
}
flint2 писал(а):
Причём здесь схема вообще?!!!

Не вижу неправильно работы в схеме.
flint2 писал(а):
В компоненте не заложен метод отсчёта от длины(конца строки).
Подавай в качестве позиции длину строки, Count=12 и отсчёт справа налево.

По вашей логике и Str_Enum (Перебор элементов строки) тоже переделывать придется (схема выше). Теряется смысл реверса, получается абы что.
flint2 писал(а):
Вот и всё.
Зачем мне знать длину строки? Мне нужно скопировать 12 символов с конца строки, реверс с этим справляется без проблем и это более распространенная задача чем, к примеру в схеме у ser_davkin. И то в его случае нужно сделать отступ влево (схему в первом моем посте смотрите).

Редактировалось 3 раз(а), последний 2022-02-16 17:56:27
карма: 11

0
Ответов: 2059
Рейтинг: 131
#9: 2022-02-16 18:05:15 ЛС | профиль | цитата
Не вижу неправильно работы в схеме.

Ещё раз, схему можно подогнать и под ошибки в компоненте.
Не работает компонент!
Не работает та часть, где установлено направление справа налево.
Copy(str,Pos,Count) штатная функция и не работать не может.
А вот чтобы скопировать кусок строки Count до Pos все пляски с бубном.
Вот этот кусок построчно можно как то объяснить, что там за бред?
Похоже хотели как то учитывать, это мои догадки, прямое копирование, а его там нет!
Оно здесь _hi_CreateEvent(_Data, @_event_onCopy, Copy(str,Pos,Count));

В таком случае, что у меня не так?

Редактировалось 1 раз(а), последний 2022-02-16 18:07:43
карма: 6

0
Ответов: 2200
Рейтинг: 673
#10: 2022-02-16 18:09:33 ЛС | профиль | цитата
flint2, вы не ответили по поводу Str_Enum (Перебор элементов строки), это элемент работает по той же логике что и элемент Copy. Он по вашему тоже работает не верно? Тоже нужно подавать на From длину строки?
Add(MainForm,14707529,280,252)
{
Width=793
Height=721
}
Add(Edit,2468859,357,252)
{
Left=85
Top=60
Width=315
Text=""{\pard\li200\sa100\sb100\fs26\cf2\highlight9 |\par}""
}
Add(Str_Enum,16022203,357,315)
{
Delimiter=""
To=12
Direct=1
link(onEnum,13319259:doAdd,[])
link(String,2468859:Text,[])
}
Add(ListBox,13319259,518,315)
{
Left=175
Top=95
Width=95
Height=165
}
Add(Button,8210384,280,315)
{
Left=80
Top=105
Caption="test1"
link(onClick,16022203:doEnum,[])
}

Редактировалось 1 раз(а), последний 2022-02-16 18:10:10
карма: 11

0
Ответов: 2059
Рейтинг: 131
#11: 2022-02-16 18:21:34 ЛС | профиль | цитата
sla8a писал(а):
flint2, вы не ответили по поводу Str_Enum

Мы как глухой с немым.
Где здесь элемент Str_Enum?
Add(MainForm,2953706,21,105)
{
Height=188
}
Add(Edit,9403533,252,35)
{
Left=20
Top=10
Width=255
Text="Edithdfgdfgqwerty"
}
Add(Edit,5936633,427,133)
{
Left=20
Top=40
Width=245
}
Add(Button,9939578,154,133)
{
Left=25
Top=70
link(onClick,7088663:doLength,[])
}
Add(Copy,5016563,322,133)
{
Count=8
Direction=1
link(onCopy,5936633:doText,[])
link(Str,5989022:Var3,[(328,89)])
link(Count,1354108:Text,[])
}
Add(Length,7088663,252,133)
{
link(onLength,5016563:doCopy,[])
link(Str,5989022:Var2,[])
}
Add(GetDataEx,5989022,252,84)
{
link(Data,9403533:Text,[])
}
Add(Edit,1354108,336,35)
{
Left=295
Top=10
Text="12"
DataType=1
}

Пока мы обсуждаем hiCopy.
Я вообще не говорил ни слова о Str_Enum и почему он сюда затесался?
Если вдруг не работает Str_Enum, то его будем обсуждать в порядке очереди. Вроде всё работало раньше.
Покажи пальцем в моём коде что не так.
Я показал в старом коде почему это не может работать.
flint2, вы не ответили по поводу Str_Enum (Перебор элементов строки), это элемент работает по той же логике что и элемент Copy. Он по вашему тоже работает не верно?
причём здесь принцип????
Мы говорим о "синтаксических" ошибках!
if a=1 then 
b:=2+2;
a:=a+b;
d:=c+a;
и
if a=1 then
begin
b:=2+2;
a:=a+b;
end;
d:=c+a;
логика работы наверное будет разной.

Редактировалось 5 раз(а), последний 2022-02-16 18:48:27
карма: 6

0
Разработчик
Ответов: 26066
Рейтинг: 2120
#12: 2022-02-16 18:53:57 ЛС | профиль | цитата
О чем вообще спорим? Компонент Copy выполняет алгоритм реверса совершенно верно (как он там, внутри реализован -- это уже другой вопрос) -- отсчет позиций при реверсе берется от конца к началу, если указано Pos=2, то это второй символ с конца, Count=5 -- это отсчитать от конца к началу пять символов, начиная со второго с конца. Так принято во всех наших компонентах. Что не так?

Редактировалось 2 раз(а), последний 2022-02-16 19:23:20
карма: 22

0
Ответов: 2200
Рейтинг: 673
#13: 2022-02-16 18:59:31 ЛС | профиль | цитата
flint2 писал(а):
нет необходимости делать через case. Мы проверяем только одно значение.
Никакого значения это не имеет. На полет пули не влияет.
flint2 писал(а):
2. Вся комбинация должна выполнятся внутри case 1: ... end;
Стало быть нужно сделать так:
begin и end там не обязательны.
Вместо If стоит Case и все. Вы предлагаете поменять логику работы элемента. Который работает по принципу реверса. Строка и отсчитывается с конца и копируется с конца, вы предлагаете считать строку с начала, а копировать с конца.

И вас не смущает что вы вынули из элемента подсчет длинны строки (Length(str)) и предлагаете считать отдельным элементом (Length: Возвращает длину строки).

nesco, ну хоть вы ему объясните логику работы элементов с реверсом строки, а то у меня не выходит. Он мне все в код тычет.

Редактировалось 3 раз(а), последний 2022-02-16 19:04:01
карма: 11

0
Ответов: 2059
Рейтинг: 131
#14: 2022-02-16 19:24:49 ЛС | профиль | цитата
sla8a, я устал.
Мне сегодня утром делали серьёзную операцию на нёбе и челюсти...
Если хотите разбирайтесь.
Мне ничего доказывать не надо.
Тем более все рассуждения поверхностны, перепрыгиваем с компонента на компонент... без погружения в суть дела.
Надо посмотреть код, дело выеденного яйца не стоит, а бодягу развели.
И вас не смущает что вы вынули из элемента подсчет длинны строки (Length(str)) и предлагаете считать отдельным элементом (Length: Возвращает длину строки).
неужели это тоже надо объяснять, что сделано для наглядности примера(с моими изменениями). откуда я чего вынул?... Всё какие то домыслы. Дело простое, как три копейки!
Если вы считаете, что это будет работать и ничего не смущает:
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;
пусть будет так.
Я устал что либо доказывать.

p.s.
Результирующая функция _hi_CreateEvent(_Data, @_event_onCopy, Copy(str,Pos,Count));
И о обратном переборе речи не может быть! О чём мы говорим?!

Редактировалось 2 раз(а), последний 2022-02-16 19:35:29
карма: 6

0
Разработчик
Ответов: 26066
Рейтинг: 2120
#15: 2022-02-16 19:36:12 ЛС | профиль | цитата
flint2 писал(а):
Если вы считаете, что это будет работать

А что не так-то? Алгоритм я объяснил. Проверим расчет по коду:
Pos := Length(str) - Count - Pos + 2;
Предположим, что наши данные такие:
Length(str) = 10 (1234567890);
Pos = 2;
Count = 5
По формуле получаем Pos = 10 - 5 - 2 + 2 = 5.
Позиция 5 это 5 из данных (отсчет идет от 1, а не от 0), копируем следующую строку -- 56789, 9 -- это второй символ с конца (отсчет тоже идет от 1, а не от 0). Нули стоят в компоненте для того, чтобы не перекрывать чтение входных данных данными из свойств. Отсчет строки всегда берется с 1-го символа и с начала, и с конца. Но вот что надо обязательно сделать, так это заменить эти нули на нужные значения.
Вопрос -- что не так?

Редактировалось 2 раз(а), последний 2022-02-16 19:40:16
карма: 22

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)