setlengthstr.rar
Перезалито
Этот топик читают: Гость
Ответов: 16884
Рейтинг: 1239
|
|||
карма: 25 |
| ||
файлы: 1 | setlengthstr.rar [1.3KB] [425] |
Ответов: 4631
Рейтинг: 749
|
|||
И зачем это?
Можно добавить в Copy методы doCopyFirst(Count), doCopyLast(Count). И выбросить Direction. |
|||
карма: 26 |
|
Ответов: 16884
Рейтинг: 1239
|
|||
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 |
|
Ответов: 1343
Рейтинг: 31
|
|||
ммм это что одноразовый компонент что ли...
code_35405.txt загоняем к примеру 666666 в компонент с обрезкой на 5 загоняем пустую строку загоняем к примеру 555 в итоге он скомкает в 5556¶ |
|||
карма: 2 |
| ||
файлы: 1 | code_35405.txt [1KB] [396] |
Ответов: 16884
Рейтинг: 1239
|
|||
карма: 25 |
| ||
файлы: 1 | code_35406.txt [610B] [574] |
Разработчик
Ответов: 26163
Рейтинг: 2127
|
|||
Rysik писал(а): ммм это что одноразовый компонент что ли...Tad, я предполагал, что ты этого не заметишь. Нужно копирование строки, как это сделано в StrMask
|
|||
карма: 22 |
|
Ответов: 16884
Рейтинг: 1239
|
|||
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 писал(а): это что одноразовый компонент что ли... |
|||
карма: 25 |
|
Разработчик
Ответов: 26163
Рейтинг: 2127
|
|||
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 |
|
Ответов: 16884
Рейтинг: 1239
|
|||
Процедура SetLength(str,Count) изменяет размер строки.
отсюда и При изменении размера строки, новый размер может быть меньше, такой же или больше, чем у существующей строки. Во всех случаях размер задается в символах и в любом случае создается новая строка. (выделено мной) Если строка короче, то она отсекается. Если она длиннее, то добавленные символы не будут проинициализированы. nesco писал(а): После нужной строки там вообще черте что, а не данныеИсправленный копонент в первом посту. |
|||
карма: 25 |
|
Разработчик
Ответов: 26163
Рейтинг: 2127
|
|||
Tad писал(а): Т.е. их нужно просто заполнить пробеламиА почему именно пробелами Это Rysik-у нужны были пробелы, а другому понадобятся другие символы. По мне, так я бы добавил свойство символа заполнителя |
|||
карма: 22 |
|
Ответов: 16884
Рейтинг: 1239
|
|||
nesco писал(а): а другому понадобятся другие символыЧасто для ComboBox-а самому, из-за полных тёзок, приходится формировать строки Ф.И.О. + № паспорта для списков вроде: Иванов И.И. ............ 320123423 Иванов И.И. ............ 021543267 Васильев В.В. .......... 098765432 Правда я это делаю одним SQL-запросом к БД |
|||
карма: 25 |
|
Ответов: 4631
Рейтинг: 749
|
|||
nesco писал(а): Если написать просто s := ReadString(_Data, _data_Str, _prop_Str), то дополнительная память выделяться не будет и в s просто запишется указатель на строку, которая хранится в TData
nesco писал(а): Мы уже не раз на это попадалиTad писал(а): Интересно, каким кодом ты решишь предложенные методы doCopyFirst(Count), doCopyLast(Count)?Не совсем понял, почему 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]; Tad писал(а): Т.е. их нужно просто заполнить пробелами |
|||
карма: 26 |
|
Разработчик
Ответов: 26163
Рейтинг: 2127
|
|||
Netspirit писал(а): Хотелось бы пример
|
|||
карма: 22 |
|
Ответов: 8930
Рейтинг: 823
|
|||
Tad писал(а): На доработке Пословица писал(а): Взялся за гуж, не говори, что не дюж! |
|||
карма: 19 |
|
Разработчик
Ответов: 26163
Рейтинг: 2127
|
|||
Netspirit писал(а): Как ты считаешь, что должен показать этот код:А какая разница, что он покажет, лучше скажи, как это отобразится на исходной строке Это не я придумал, это черт знает когда обнаружил еще Galkov |
|||
карма: 22 |
|