Вверх ↑
Этот топик читают: Гость
Ответов: 2059
Рейтинг: 132
#1: 2015-09-14 09:43:11 ЛС | профиль | цитата
[flood]Чего-то наблюдается некое затишье, надо-бы пустить круги по воде.[/flood]
Задача такая:
Нужно хранить список строк (список, - потому что строки должны добавляется, заменятся/удалятся по индексу).
Строки могут содержать 0A 0Dh (10 13) - перевод строки. Короче говоря, обычная строка с нулём.
StrList работает до перезапуска приложения, пока не загрузил (сначала конечно сохранил) список из файла.
То есть компонент разбивает строки по индексам по признаку 10 13.
Пока сделал так:

Make(delphi)
ver(4.04 build 185)
Add(MainForm,2953706,21,105)
{
Width=532
Height=406
}
Add(Memo,5902294,182,91)
{
Width=236
Height=230
Strings=#3:эти|6:строки|4:надо|7:хранить|9:по одному|8:индексу.|
ScrollBars=2
}
Add(Memo,12080701,399,247)
{
Left=250
Width=271
Height=230
ScrollBars=2
}
Add(UpDown,3533713,28,259)
{
Left=15
Top=330
Position=3
link(onPosition,5529659:doText,[])
}
Add(Edit,5529659,77,259)
{
Left=65
Top=330
Text="3"
}
Add(Button,9136544,14,343)
{
Left=55
Top=250
Caption="запись"
link(onClick,6813609:doEvent1,[])
}
Add(StrList,4841449,259,224)
{
FileName="hhhh"
Strings=#0:|0:|0:|0:|0:|0:|0:|0:|0:|0:|0:|
Point(doGetString)
Point(onGetString)
Point(doReplace)
link(Str,5231541:Value,[])
link(onGetString,15846449:doReplace,[(299,237)(299,251)])
}
Add(Replace,15846449,308,245)
{
SubStr=""
DestStr="
"
link(onReplace,16305687:doEvent1,[])
}
Add(Replace,54857,182,175)
{
SubStr="
"
DestStr=""
link(onReplace,5231541:doValue,[])
link(Str,5902294:Text,[])
}
Add(DoData,8336849,112,350)
{
link(onEventData,4841449:doReplace,[(202,356)(202,279)])
link(Data,15437649:Var3,[(118,317)])
}
Add(Hub,6813609,63,343)
{
link(onEvent1,54857:doReplace,[(133,349)(133,181)])
link(onEvent2,8336849:doData,[])
}
Add(Memory,5231541,259,175)
{
}
Add(Hub,16305687,357,245)
{
link(onEvent1,12080701:doClear,[(385,251)(385,260)])
link(onEvent2,12080701:doAdd,[(385,258)(385,253)])
}
Add(DoData,14198965,91,406)
{
link(onEventData,4841449:doGetString,[(202,412)(202,272)])
link(Data,15437649:Var2,[])
}
Add(GetDataEx,15437649,91,312)
{
Angle=3
link(Data,3533713:Position,[(34,317)])
}
Add(Button,3426285,28,406)
{
Left=320
Top=250
Caption="чтение"
link(onClick,14198965:doData,[])
}
Add(Label,8079583,91,42)
{
Left=35
Top=290
Width=81
Height=17
Caption="номер индекса"
}



P.S.
Что означает фраза "Инициализирует список строками в виде: <Строка1,Строка2,...>" в похожих компонентах?
Очень лаконичное описание.
Разделителем является запятая?
карма: 6

0
файлы: 1code_36263.txt [1.8KB] [549]
Ответов: 16884
Рейтинг: 1239
#2: 2015-09-14 12:14:38 ЛС | профиль | цитата
flint2 писал(а):
Строки могут содержать 0A 0Dh (10 13) - перевод строки. Короче говоря, обычная строка с нулём.

В ТЕКСТОВЫХ ФАЙЛАХ WINDOWS (и DOS) разделитель строк 0D0A (CR+LF)
0A0D - это разделитель строк текстовых файлов в системах Macintosh.
0A - это разделитель строк текстовых файлов в ОС семейства UNIX
flint2 писал(а):
Разделителем является запятая?
Нет. Разделителем является 0D0A
------------ Дoбавленo в 12.14:
flint2 писал(а):
Что означает фраза "Инициализирует список строками в виде: <Строка1,Строка2,...>" в похожих компонентах?
Фраза означает
Строка1
Строка2
...
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 2059
Рейтинг: 132
#3: 2015-09-14 13:56:07 ЛС | профиль | цитата
0A0D - это разделитель строк текстовых файлов в системах Macintosh.

Открыл первый попавшейся в библиотеке.
Да, есть такое дело.
Сейчас посмотрел, в библиотеке есть файлы и из UNIX.

Всё равно не понятно "doText=Инициализирует список строками в виде: <Строка1,Строка2,...>"
Тогда, чем это отличается от doAdd=Добавляет строку в список из потока или поля str.
карма: 6

0
Ответов: 4630
Рейтинг: 749
#4: 2015-09-14 14:17:14 ЛС | профиль | цитата
Если в списке уже есть строки, то первый метод их удалит, а второй добавит новые в конец списка. Первый способ экономит лишний вызов doClear.
карма: 26

0
Ответов: 2059
Рейтинг: 132
#5: 2015-09-14 14:25:15 ЛС | профиль | цитата
Понял, спасибо!

карма: 6

0
Ответов: 16884
Рейтинг: 1239
#6: 2015-09-14 14:50:38 ЛС | профиль | цитата
Netspirit писал(а):
Первый способ экономит лишний вызов doClear.
Как говорит nesco - "Не смеши мои тапочки".
Точка doText придумана совсем не для этого.
Как только усвоите разницу между понятием "Текст"(набор строк) и "Строка" - сразу всё встанет на свои места.
Текст можно загрузить и по doAdd, перебирая его построчно (по одной строке).
Как и строки, добавленные по doAdd, можно прочитать в виде ТЕКСТА с нижней точки Text.

Текст, созданный, например, в Linux, куда бы ты его не загружал и откуда бы ты его не читал, в наших компонентах будет всегда ОДНА СТРОКА.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 2059
Рейтинг: 132
#7: 2015-09-14 15:03:32 ЛС | профиль | цитата
Tad,
Как только усвоите разницу между понятием "Текст"(набор строк) и "Строка"

Тут возникает путаница из за понятий.
Текст - это нуль-терминированная строка, в которой абзацы разделяются 0D0A, а "Строка" в кавычках это не нуль-терминированная, а кусок символов между 0D0A.
Правильно я понимаю?
Точка doText придумана совсем не для этого.

Опять не понятно, - для чего?
карма: 6

0
Ответов: 16884
Рейтинг: 1239
#8: 2015-09-14 16:10:59 ЛС | профиль | цитата
flint2 писал(а):
Опять не понятно, - для чего?
Для того, чтобы ты не парился с перебором строк при загрузке многострочного текста.
flint2 писал(а):
Текст - это нуль-терминированная строка
это кто такое и где сказал ?
Нуль-терминированные строки являются стандартом в Си и некоторых других языках программирования. Поскольку они используются для передачи строковых аргументов в стандартные функции во многих операционных системах, операции для работы с нуль-терминированными строками появились в Паскале и других языках.
Где ты их нашёл в текстовых файлах - загадка великая.
Если в DOS-е ещё был знак "→" конца текстового файла , то в винде потерять последнюю строку текстового файла - запросто. Никаких знаков. Что в наших текстовых компонентах исключено, добавлением 0D0A в конце.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 2059
Рейтинг: 132
#9: 2015-09-14 19:05:05 ЛС | профиль | цитата
Tad,
я так и ожидал что так будет понято.
Нуль-терминированные строки являются стандартом в Си и некоторых других языках программирования. Поскольку они используются для передачи строковых аргументов в стандартные функции во многих операционных системах, операции для работы с нуль-терминированными строками появились в Паскале и других языках.

Имеется ввиду, что символы между CR+LF - это не строка. Подразумевалась обычная строка - длина-буковки-ноль, а не терминированная CR+LF.
Есть разное представление строк, но для удобства почти все варианты имеют ноль на конце. Ноль на конце - иначе нуль-терминированная.
Вариант с Си - это частный случай. В данном случае язык не важен для рассуждений, пусть будет Си.
Где ты их нашёл в текстовых файлах - загадка великая.

Ну причём здесь это.
Предположим я помещаю весь текст книжки в строковую переменную, как она будет представлена? - одной строкой.
Для того, чтобы ты не парился с перебором строк при загрузке многострочного текста.

Понятно.
Но мне кажется всё равно парсится по переводу строки и возврату каретки, когда каждому узлу списка присваивается псевдострока.
Просто, наверное, не делается каких-то лишних телодвижений.
Смысл мне понятен.
карма: 6

0
Ответов: 16884
Рейтинг: 1239
#10: 2015-09-14 20:15:11 ЛС | профиль | цитата
flint2 писал(а):
но для удобства почти все варианты имеют ноль на конце.
Пример текста у которого строки разделены нулём в студию.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 2059
Рейтинг: 132
#11: 2015-09-14 20:18:31 ЛС | профиль | цитата
Пример текста у которого строки разделены нулём в студию.

Так, что нужен дамп памяти.
Мы-же не о текстовом файле говорим.
разделены нулём

Это здесь не уместно.
Мы говорим о строковых переменных, по этому не разделены нулём, а терминирован.
Я же писал
Предположим я помещаю весь текст книжки в строковую переменную, как она будет представлена? - одной строкой.

Где здесь написано разделены нулём и вообще, где написано разделены нулём?
карма: 6

0
Разработчик
Ответов: 26151
Рейтинг: 2127
#12: 2015-09-14 20:22:50 ЛС | профиль | цитата
flint2 писал(а):
Подразумевалась обычная строка - длина-буковки-ноль

В Delphi у строки нет нуля в конце, если ты его туда сам не поставишь, те остается только длина-буковки. Это позволяет работать с непрерывным массивом символов в памяти, не ставя никаких нулей в конце строк, те с таким типом строк можно работать как с обычным участком памяти
карма: 22

0
Ответов: 16884
Рейтинг: 1239
#13: 2015-09-14 21:03:23 ЛС | профиль | цитата
flint2 писал(а):
но для удобства почти все варианты имеют ноль на конце.
Пример текста у которого строки разделены нулём в студию.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 2059
Рейтинг: 132
#14: 2015-09-14 21:09:04 ЛС | профиль | цитата
nesco, Tad,
Да, это я с PChar ассоциировал, но строки с завершающим нулем не содержат байтов длины.
А можно бы было ставить ноль не учитываемый в длине, для быстрой конвертации. Тогда и конвертировать ничего не надо.
Но саму суть заболтали.
Текст разделённый 0D0A не множество строк, а одна строка.
карма: 6

0
Разработчик
Ответов: 26151
Рейтинг: 2127
#15: 2015-09-14 21:18:45 ЛС | профиль | цитата
flint2 писал(а):
Текст разделённый 0D0A не множество строк, а одна строка.

Нет, это не одна строка, это одна строковая переменная, содержащая набор печатных символов. А текст -- это именно набор строк разделенных символами 0D0A
карма: 22

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