Вверх ↑
Этот топик читают: Гость
Ответов: 2193
Рейтинг: 673
#16: 2022-02-16 19:41:25 ЛС | профиль | цитата
flint2, это вас не понятно что смущает. Давайте по пунктам 1 и 2 вашим разберемся. Что не так? Вместо If стоит Case, он выполняет туже работу что и If и begin и End там не нужен. И так построена логика элемента.
flint2 писал(а):
Иначе у нас работает одна строчка "1: Pos := Length(str) - Count - Pos + 2;"

Она и должна срабатывать при установке RightToLeft. Где тут ошибка? Что тут не так? Вам не хватает begin и end? Или от того что вы поменяете Case на If код начнет лучше работать? Вы сами не понимаете как работает элемент, а сейчас когда у вас спрашивают что не так, вы "я устал, я ухожу"@

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

0
Разработчик
Ответов: 26061
Рейтинг: 2120
#17: 2022-02-16 19:44:43 ЛС | профиль | цитата
sla8a, что бы я добавил в этот компонент, так это блокировку нуля и отрицательных значений, через функцию Max
      Pos := Max(1, ReadInteger(_Data, _data_Position, _prop_Position)); 
Count := Max(1, ReadInteger(_Data, _data_Count, _prop_Count));

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

0
Ответов: 2059
Рейтинг: 131
#18: 2022-02-16 19:51:33 ЛС | профиль | цитата
Или от того что вы поменяете Case на If код начнет лучше работать?

Не надо всё утрировать!

Вопрос -- что не так?

Вопрос зачем?
Length(str) = 10 (1234567890);
Pos = 2; это 123
Count = 5 это -2 с переходом через ноль.
То есть Pos=0 Count = 3(012) = строка(123)
В чём глубокий смысл Length(str) - Count - Pos + 2; ?
Длина строки нас не волнует и не нужна.

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

0
Разработчик
Ответов: 26061
Рейтинг: 2120
#19: 2022-02-16 19:56:36 ЛС | профиль | цитата
flint2 писал(а):

...
Count = 5 это -2 с переходом через ноль.
...

В нашем алгоритме нет перехода через ноль и никогда не было, те работа по кольцу никогда не предполагалась, от слова совсем. А еще раз объясняю -- Pos при реверсе это позиция с конца. Она так всегда работало, так и будет впредь работать. Если нужен отдельный компонент с переходом через ноль, то это будет уже совсем другой компонент. А Pos=0 -- это вообще анахронизм, который со строками категорически неприменим.
flint2, объясни мне сакральный смысл работы в реверсе со строками через кольцо, с отсчетом от начала?
Может быть, твоя идея и имеет смысл, но ее реализация повлечет за собой изменение алгоритма, а это неприемлемо для большинства пользователей.

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

0
Ответов: 2059
Рейтинг: 131
#20: 2022-02-16 20:05:10 ЛС | профиль | цитата
В нашем алгоритме нет перехода через ноль и никогда не было.

Это же условно!
Позиция 4 Count = 5 начинаем обратный отсчёт(в уме!!! а то опять чего то не так будет)
43210
С начала строки копируем 12345 - всё.
Позиция 2 Count = 5 начинаем обратный отсчёт 210-1-2
Count-2 копируем три позиции (012) строка 123 - всё.
На буквах пример наглядней, а то и номер позиции цифра и значение цифра.
Строка абвгдежзиклмн
Count-2 копируем три позиции (012) строка абв - всё.
Позиция 7(знак 'з') Count = 5
7-5 копируем гдежз

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

0
Разработчик
Ответов: 26061
Рейтинг: 2120
#21: 2022-02-16 20:17:24 ЛС | профиль | цитата
flint2 писал(а):
Это же условно!

Я прекрасно понял твой алгоритм. Его кардинальное отличие в том, что позиция реверса берется с начала, а это у нас неприменимо. При реверсе у нас всегда отсчет идет с конца. Возьми тот же строковый компонент Delete, по твоему алгоритму он должен будет удалить по кольцу, предположим от Pos=2 реверсом Count=5, так он и удалит два символа в начале и три в конце. Я представляю глаза пользователей от такого беспредела. А ведь в том компоненте работает ровно такая же функция Pos для реверса.

--- Добавлено в 2022-02-16 20:25:48

flint2, ответь мне на такой вопрос -- как по твоему алгоритму скопировать пять последних символов в строке до второго с конца, если я не знаю изначально длину строки?

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

0
Ответов: 2059
Рейтинг: 131
#22: 2022-02-16 20:27:13 ЛС | профиль | цитата
Copy(str,Pos,Count)
А где здесь реверс?
В любом случае мы делаем прямое копирование.
_hi_CreateEvent(_Data, @_event_onCopy, Copy(str,Pos,Count));
Просто когда справа налево смещаем позицию.
карма: 6

0
Разработчик
Ответов: 26061
Рейтинг: 2120
#23: 2022-02-16 20:29:22 ЛС | профиль | цитата
flint2 писал(а):
Copy(str,Pos,Count)
А где здесь реверс?
В любом случае мы делаем прямое копирование.
_hi_CreateEvent(_Data, @_event_onCopy, Copy(str,Pos,Count));
Просто когда справа налево смещаем позицию.

Здесь нет прямого реверса. В компоненте именно смещение позиций от конца к началу. Именно так он и задумывался, что бы иметь возможность копировать и начальную часть строки, и конечную.

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

0
Ответов: 2059
Рейтинг: 131
#24: 2022-02-16 20:30:12 ЛС | профиль | цитата
Ну наконец то!

Строка абвгдежзиклмн
Позиция 7(знак 'ж') Count = 5
7-5 копируем со второй позиции пять штук вгдеж

Позиция 2 Count = 5 копируем с нуля три штуки абв

Add(MainForm,904413,245,175)
{
Height=188
}
Add(Edit,9403533,476,105)
{
Left=20
Top=10
Width=255
Text="абвгдежзиклмн"
}
Add(Edit,5936633,651,203)
{
Left=20
Top=40
Width=245
}
Add(Button,9939578,378,203)
{
Left=25
Top=70
link(onClick,5016563:doCopy,[])
}
Add(Copy,5016563,546,203)
{
Count=8
Direction=1
link(onCopy,5936633:doText,[])
link(Str,9403533:Text,[(552,170)(482,170)])
link(Position,12700301:Text,[])
link(Count,1354108:Text,[(566,170)(636,170)])
}
Add(Edit,1354108,630,105)
{
Left=295
Top=10
Text="5"
DataType=1
}
Add(Edit,12700301,553,105)
{
Left=295
Top=40
Text="7"
DataType=1
}

https://forum.hiasm.com/getfile/39394

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

0
Разработчик
Ответов: 26061
Рейтинг: 2120
#25: 2022-02-16 21:26:43 ЛС | профиль | цитата
flint2, пойдем дальше. Есть имя файла (опустим пока, что есть отдельные компоненты для работы с разделителем), имя файла имеет переменную длину, но расширение имеет всегда три символа с конца. Как мне получить всегда эти три символа по твоему алгоритму для кучи файлов с разной длиной имени, по текущему это делается просто?
карма: 22

0
Ответов: 1535
Рейтинг: 176
#26: 2022-02-16 21:37:32 ЛС | профиль | цитата
Вроде с виду простой элемент, а сколько споров... Ну ладно, если это так сложно, обойдусь и этим:

Add(FTCG_Tools,5105125,462,238)
{
}
BEGIN_SDK
Add(EditMultiEx,2240579,21,21)
{
WorkCount=#6:doCopy|
EventCount=#6:onCopy|
DataCount=#6:SrcStr|
Width=223
Height=137
link(doCopy,1121838:doOperation,[(56,27)(56,111)])
}
Add(FT_Copy,6956057,154,105)
{
link(onCopy,2240579:onCopy,[(215,111)(215,27)])
link(SrcStr,2240579:SrcStr,[(160,96)(27,96)])
link(CharCount,2257155:Var3,[(174,82)])
}
Add(FT_Math,1121838,91,105)
{
OpType=1
ResultType=0
link(onResult,6956057:doCopy,[])
link(Op2,2257155:Var2,[])
}
Add(FT_Memory,3303248,98,35)
{
Default=Integer(12)
}
Add(GetDataEx,2257155,98,77)
{
link(Data,3303248:Value,[])
}
END_SDK


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

0
Разработчик
Ответов: 26061
Рейтинг: 2120
#27: 2022-02-16 21:37:39 ЛС | профиль | цитата
flint2, скопировать конец строки без определения изначально длины строки не получится никак. Твой алгоритм несостоятелен в этом плане, неужели ты этого не видишь? Пойми, алгоритм, предложенный тобой, нам никогда не был нужен. Я не встречал раньше, чтобы нужно было именно копировать конец строки с отсчетом символов с начала.
Хотя, ser_davkin-у вот понадобилось, но там есть решение без изменения алгоритма самого компонента.

--- Добавлено в 2022-02-16 21:48:20

ser_davkin, я твое условие решил вот так
Схема

Add(MainForm,5154148,252,140)
{
Width=503
Height=191
link(onCreate,9723016:doSplit,[])
}
Add(Copy,10286756,378,154)
{
Position=1
Count=12
Direction=1
link(onCopy,12840568:doText,[])
}
Add(Edit,2468859,322,105)
{
Left=85
Top=60
Width=315
Text=""{\pard\li200\sa100\sb100\fs26\cf2\highlight9 |\par}""
}
Add(Label,12840568,434,154)
{
Left=85
Top=85
Width=315
}
Add(MultiStrData,9723016,322,154)
{
Char="|"
From=1
Count=1
Direct=1
link(Str,2468859:Text,[])
link(onPart1,10286756:doCopy,[])
}

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

0
Ответов: 1535
Рейтинг: 176
#28: 2022-02-16 22:16:06 ЛС | профиль | цитата
nesco, так а в чём суть ппоблемы, поведай старому коту? Почему элемент не справился со своей, казалось бы, простой задачей? Что в моей строке таково, от чего возникло столько споров? (Простым языком)
карма: 1
Не так страшна ошибка, как опасность её не заметить.

0
Разработчик
Ответов: 26061
Рейтинг: 2120
#29: 2022-02-16 22:25:11 ЛС | профиль | цитата
ser_davkin писал(а):
Что в моей строке таково, от чего возникло столько споров?

Компонент Position ведет отсчет от начала строки, ты получаешь 47-й символ от начала, а компонент Copy в режиме RigtToLeft берет отсчет с конца. Ты суешь ему Pos=47, вот он исправно от конца и отсчитывает 47, а должен был отсчитать всего 53-47+1=7.
flint2 тут решил применить кардинальные меры и переделать весь компонент, но так нельзя подходить к решению вопроса, касающегося одной конкретной задачи. Тк это может негативно сказаться на остальных пользователях.

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

0
Ответов: 1535
Рейтинг: 176
#30: 2022-02-16 22:30:11 ЛС | профиль | цитата
Мда-а-а.. Как всё запущено.
nesco, Благодарю за пояснение!

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

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