Вверх ↑
Этот топик читают: Гость
Ответов: 16884
Рейтинг: 1239
#1: 2015-03-29 19:34:01 ЛС | профиль | цитата
setlengthstr.rar
Перезалито
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
файлы: 1setlengthstr.rar [1.3KB] [374]
vip
#1.1контекстная реклама от партнеров
Ответов: 4622
Рейтинг: 746
#2: 2015-03-29 20:23:32 ЛС | профиль | цитата
И зачем это?

Можно добавить в Copy методы doCopyFirst(Count), doCopyLast(Count). И выбросить Direction.
карма: 26

0
Ответов: 16884
Рейтинг: 1239
#3: 2015-03-29 20:40:48 ЛС | профиль | цитата
Netspirit писал(а):
И зачем это?
От нечего делать.
Образно для Delphi:
SetLength(str,n) - это str[0]:=n и никаких циклов.
Copy(str,1,n) - это For i:=1 to n do s:=s+str[i]; (появились ещё две переменные - счетчик i,результат s и проверка выполнения условия (i=n)? при каждой интерации)
Интересно, каким кодом ты решишь предложенные методы doCopyFirst(Count), doCopyLast(Count)?

И последнее: Copy()- это готовый испытанный компонент. Не надо его модифицировать.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 1343
Рейтинг: 31
#4: 2015-03-29 22:00:28 ЛС | профиль | цитата
ммм это что одноразовый компонент что ли...

code_35405.txt

загоняем к примеру 666666 в компонент с обрезкой на 5
загоняем пустую строку
загоняем к примеру 555

в итоге он скомкает в 5556¶
карма: 2

0
файлы: 1code_35405.txt [1KB] [361]
Ответов: 16884
Рейтинг: 1239
#5: 2015-03-29 22:16:55 ЛС | профиль | цитата
Не понял, что ты хотел получить от своей схемы. Какой должен быть результат ?
code_35406.txt
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
файлы: 1code_35406.txt [610B] [522]
Разработчик
Ответов: 26072
Рейтинг: 2122
#6: 2015-03-29 22:23:42 ЛС | профиль | цитата
Rysik писал(а):
ммм это что одноразовый компонент что ли...

Tad, я предполагал, что ты этого не заметишь. Нужно копирование строки, как это сделано в StrMask

procedure THISetLength._work_doSetLen;
var
l:integer;
begin
s := ReadString(_Data, _data_Str, _prop_Str) + #0;
l := ReadInteger(_Data, _data_Count, _prop_Count);
if l > length(s) - 1 then
l := length(s) - 1;
SetLength(s, l);
_hi_OnEvent(_event_onRes, s);
end;

карма: 22

0
Ответов: 16884
Рейтинг: 1239
#7: 2015-03-29 23:06:53 ЛС | профиль | цитата
1. Для кого нужно писать s := ReadString(_Data, _data_Str, _prop_Str) + #0? Это сишные мансы для типа *char
тип String писал(а):
В Object Pascal(DELPHI) и STL(стандартная библиотека шаблонов в языке программирования C++) строка является «чёрным ящиком», в котором выделение/высвобождение памяти происходит автоматически — без участия программиста. При создании строки память выделяется автоматически; как только на строку не останется ни одной ссылки, память возвращается системе. Преимущество этого метода в том, что программист не задумывается над работой строк. С другой стороны, программист имеет недостаточный контроль над работой программы в критичных к скорости участках; также трудно реализуется передача таких строк в качестве параметра в DLL. Также Object Pascal автоматически следит, чтобы в конце строки был символ с кодом 0. Поэтому если функция требует на входе нуль-терминированную строку, для конвертации надо просто написать PAnsiChar(строковая_переменная) или PWideChar(строковая_переменная) (для Pascal), переменная.c_str() (для Builder/STL).

2.
Rysik писал(а):
это что одноразовый компонент что ли...
Скорее "односторонний". Выпустил из вида, что SetLength может не только обрезать, но и увеличивать строку. Это да, каюсь, упустил. Завтра добавлю.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Разработчик
Ответов: 26072
Рейтинг: 2122
#8: 2015-03-29 23:27:25 ЛС | профиль | цитата
Tad писал(а):
Для кого нужно писать s := ReadString(_Data, _data_Str, _prop_Str) + #0? Это сишные мансы для типа *char

Ты не понял меня. Ты вообще, похоже, ничего не понял. Да по барабану что там будет в конце, хоть #0, хоть #255. Если написать просто s := ReadString(_Data, _data_Str, _prop_Str), то дополнительная память выделяться не будет и в s просто запишется указатель на строку, которая хранится в TData. Если же приплюсовать любой символ, то будут выделена дополнительная память, строка скопируется в новую область, и s получит указатель на эту область, данные же затронуты не будут. Мы уже не раз на это попадали, не зря же я написал
nesco писал(а):
Нужно копирование строки, как это сделано в StrMask

Тебе же конкретно Rysik указал на ошибку, вставь мой код и проверь, ошибка исчезнет
------------ Дoбавленo в 23.27:
Tad писал(а):
но и увеличивать строку

Кому это надо После нужной строки там вообще черте что, а не данные
карма: 22

0
Ответов: 16884
Рейтинг: 1239
#9: 2015-03-30 09:29:07 ЛС | профиль | цитата
Процедура SetLength(str,Count) изменяет размер строки.
При изменении размера строки, новый размер может быть меньше, такой же или больше, чем у существующей строки. Во всех случаях размер задается в символах и в любом случае создается новая строка. (выделено мной)
Если строка короче, то она отсекается. Если она длиннее, то добавленные символы не будут проинициализированы.
отсюда и
nesco писал(а):
После нужной строки там вообще черте что, а не данные
Т.е. их нужно просто заполнить пробелами. (возвращаемся к коду, предложенному flint2)
Исправленный копонент в первом посту.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Разработчик
Ответов: 26072
Рейтинг: 2122
#10: 2015-03-30 09:33:59 ЛС | профиль | цитата
Tad писал(а):
Т.е. их нужно просто заполнить пробелами

А почему именно пробелами Это Rysik-у нужны были пробелы, а другому понадобятся другие символы. По мне, так я бы добавил свойство символа заполнителя
карма: 22

0
Ответов: 16884
Рейтинг: 1239
#11: 2015-03-30 09:53:37 ЛС | профиль | цитата
nesco писал(а):
а другому понадобятся другие символы
Согласен.
Часто для ComboBox-а самому, из-за полных тёзок, приходится формировать строки Ф.И.О. + № паспорта для списков вроде:
Иванов И.И. ............ 320123423
Иванов И.И. ............ 021543267
Васильев В.В. .......... 098765432
Правда я это делаю одним SQL-запросом к БД
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 4622
Рейтинг: 746
#12: 2015-03-30 11:04:03 ЛС | профиль | цитата
nesco писал(а):
Если написать просто s := ReadString(_Data, _data_Str, _prop_Str), то дополнительная память выделяться не будет и в s просто запишется указатель на строку, которая хранится в TData
Поскольку у нас не ShortString, а AnsiString, то мне кажется, это не имеет значения: такие строки обладают, если я правильно понимаю, copy-on-write semantic. Как ты считаешь, что должен показать этот код:
#pas
var
s1, s2: string;
begin
s1 := ReadString(_Data, _data_Str, _prop_Str);
s2 := s1;
SetLength(s2, 0);
_debug(s1);
end;
nesco писал(а):
Мы уже не раз на это попадали
Хотелось бы пример.

Tad писал(а):
Интересно, каким кодом ты решишь предложенные методы doCopyFirst(Count), doCopyLast(Count)?
doCopyFirst(Count) - также, как и ты. doCopyLast(Count) - стандартным system.copy().
Не совсем понял, почему
Tad писал(а):
Copy(str,1,n) - это For i:=1 to n do s:=s+str[i];

Я думаю, Copy(str,1,n) - это
Tad писал(а):
SetLength(Result, n);
For i:=1 to n do Result[i] := str[i];
Здесь память выделяется один раз в отличие от s:=s+str[i] (я сомневаюсь, что компилятор может угадать размер будущей строки, максимум, выделить с запасом)

Tad писал(а):
Т.е. их нужно просто заполнить пробелами
Если этот компонент - это возврат к теме дополнения строки, то в какой-то компонент (либо создать новый) нужно добавить методы doPadLeft, doPadRight с выбором символа-заполнителя, и не запутывать пользователя "установкой длины строки".
карма: 26

0
Разработчик
Ответов: 26072
Рейтинг: 2122
#13: 2015-03-30 11:34:47 ЛС | профиль | цитата
Netspirit писал(а):
Хотелось бы пример

Add(StrCase,10414582,203,175)
{
}
Попробуй убрать #0 и использовать исходную строку дальше
карма: 22

0
Ответов: 8889
Рейтинг: 823
#14: 2015-03-30 11:35:23 ЛС | профиль | цитата
Tad писал(а):
На доработке
Пословица писал(а):
Взялся за гуж, не говори, что не дюж!

карма: 19

0
Разработчик
Ответов: 26072
Рейтинг: 2122
#15: 2015-03-30 11:37:40 ЛС | профиль | цитата
Netspirit писал(а):
Как ты считаешь, что должен показать этот код:

А какая разница, что он покажет, лучше скажи, как это отобразится на исходной строке Это не я придумал, это черт знает когда обнаружил еще Galkov
карма: 22

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