Вверх ↑
Этот топик читают: Гость
Ответов: 537
Рейтинг: 14
#1: 2020-04-18 20:11:06 ЛС | профиль | цитата
Сделал программу которая открывает файлы .txt редактирует и сохраняет результат в тот же файл, при сохранении строк добавляется в конце строк переход на новую строку. Сделал удаление этой пустой строки, в Memo ее нет, визуально видно что курсор находится в конце последнего слова всех строк, но при сохранении в файл добавляется пустая строка (переход на новую строку), нужно сохранять без этой пустой строки, это возможно сделать?
Получается несоответствие количества строк, например: сохраняется 5 строк, а в файле их 6

Add(MainForm,2953706,84,231)
{
}
Add(Memo,16112228,266,203)
{
Left=5
Top=5
Width=375
Height=220
Strings=#14:11111111111111|14:22222222222222|14:33333333333333|14:44444444444444|14:55555555555555|
ScrollBars=2
Point(doSave)
}
Add(Button,733943,147,231)
{
Left=165
Top=235
Caption="Save"
link(onClick,961651:doExecute,[])
}
Add(SDialog,961651,210,231)
{
FileName="1.txt"
link(onExecute,16112228:doSave,[])
}

В примере сохранятся текст через Memo, а в программе желательно сохранять через StrList
карма: 4

0
vip
#1.1контекстная реклама от партнеров
Ответов: 871
Рейтинг: 322
#2: 2020-04-19 08:16:25 ЛС | профиль | цитата
Такой костыль не устроит?
Add(MainForm,12068710,329,294)
{
Width=225
Height=312
}
Add(Button,733943,392,294)
{
Left=25
Top=215
Caption="Save"
link(onClick,11839378:doEvent1,[])
}
Add(SDialog,961651,602,294)
{
FileName="1.txt"
link(onExecute,6052811:doSave,[])
}
Add(Label,6474089,707,336)
{
Left=30
Top=250
link(Text,6052811:EndIdx,[])
}
Add(Button,11889922,788,294)
{
Left=125
Top=215
Caption="Load"
link(onClick,13578018:doEvent1,[])
}
Add(ODialog,489638,917,294)
{
FileName="1.txt"
link(onExecute,3885905:doLoad,[])
}
Add(Hub,13578018,840,294)
{
link(onEvent1,489638:doExecute,[])
link(onEvent2,296676:doEnum,[(882,307)(882,356)])
}
Add(Hub,11839378,448,294)
{
link(onEvent1,961651:doExecute,[])
link(onEvent2,6474089:doText,[(568,307)(568,342)])
}
Add(StrList,6052811,686,259)
{
Strings=#4:1111|4:2222|4:3333|4:4444|4:5555|
Point(EndIdx)
}
Add(Memo,15710692,1127,350)
{
Left=15
Top=10
Width=180
Height=190
Point(EndIdx)
}
Add(ArrayEnum,296676,1008,350)
{
link(onItem,15710692:doAdd,[])
link(onEndEnum,8906264:doText,[(1094,363)(1094,439)])
link(Array,3885905:Array,[])
}
Add(Label,8906264,1148,433)
{
Left=130
Top=250
link(Text,15710692:EndIdx,[])
}
Add(StrList,3885905,994,266)
{
Point(EndIdx)
}


Да, сохраняется правильно, но вот открывается лишнее.

Редактировалось 1 раз(а), последний 2020-04-19 08:22:45
карма: 1

0
Ответов: 537
Рейтинг: 14
#3: 2020-04-19 10:40:31 ЛС | профиль | цитата
Не правильно сохраняется, если открыть файл там есть пустая строка. Программа составляет файлы и они отправляются на сайт и важно чтобы было без пустой строки, мне приходится открывать файл вручную и удалять эту пустую строку. Решение нашел, компонент RichEdit сохраняет файл правильно.
карма: 4

0
Ответов: 207
Рейтинг: 14
#4: 2020-04-19 10:55:08 ЛС | профиль | цитата
Там еще сам StrList добавляет перенос.

Add(MainForm,2953706,126,126)
{
}
Add(Button,10723851,126,189)
{
Left=45
Top=210
link(onClick,7226889:doAdd,[])
}
Add(RichEdit,7226889,238,189)
{
Left=5
Top=15
Width=140
Height=185
link(Str,13961135:Text,[])
}
Add(StrList,13961135,238,133)
{
Strings=#1:1|1:2|1:3|
}
Чтобы этого не было, нужно заменить
procedure THIStrList._var_Text;
в hiStrList.pas
procedure THIStrList._var_Text;
var s:string;
begin
s := FList.Text;
if(FList.count > 0)and(FList.Items[FList.Count-1] <> '')then
delete(s, length(s)-1, 2);
dtString(_Data,s);
end;

карма: 2

0
Ответов: 537
Рейтинг: 14
#5: 2020-04-19 11:46:11 ЛС | профиль | цитата
Отредактировал файл hiStrList.pas если открыть сохраненный файл пустая строка осталась

Add(MainForm,8916453,182,175)
{
Width=215
Height=130
}
Add(Button,733943,252,175)
{
Left=25
Top=25
Width=135
Height=50
Caption="Save"
link(onClick,961651:doExecute,[])
}
Add(SDialog,961651,308,175)
{
FileName="1.txt"
link(onExecute,10596750:doSave,[])
}
Add(StrList,10596750,364,147)
{
Strings=#14:11111111111111|14:22222222222222|14:33333333333333|14:44444444444444|14:55555555555555|
Point(doSave)
}

карма: 4

0
Разработчик
Ответов: 26066
Рейтинг: 2120
#6: 2020-04-19 17:35:50 ЛС | профиль | цитата
А так работает?

Схема


Add(MainForm,8818863,448,189)
{
}
Add(Memo,16112228,595,175)
{
Left=5
Top=5
Width=375
Height=220
Strings=#14:11111111111111|14:22222222222222|14:33333333333333|14:44444444444444|14:55555555555555|
ScrollBars=2
Point(doSave)
}
Add(Button,733943,448,245)
{
Left=165
Top=235
Caption="Save"
link(onClick,961651:doExecute,[])
}
Add(SDialog,961651,497,245)
{
FileName="1.txt"
link(onExecute,3466773:doValue,[])
}
Add(FileStream,14276103,693,231)
{
Mode=1
AutoCopy=0
Point(doCopyFromStream)
link(FileName,3466773:Value,[(699,222)(734,222)(734,285)(552,285)])
}
Add(Memory,3466773,546,245)
{
link(onData,11911843:doTrim,[])
}
Add(StreamConvertor,3862175,644,245)
{
Mode=7
Point(Data)
link(onResult,14276103:doCopyFromStream,[])
}
Add(Trim,11911843,595,245)
{
Char="\r\n"
Mode=5
link(onTrim,3862175:doConvert,[])
link(Text,16112228:Text,[])
}
карма: 22

0
Ответов: 537
Рейтинг: 14
#7: 2020-04-19 18:12:11 ЛС | профиль | цитата
Спасибо, правильно сохраняет
карма: 4

0
Ответов: 4621
Рейтинг: 746
#8: 2020-04-21 11:04:01 ЛС | профиль | цитата
nesco писал(а):
А так работает?
Ну, и не появилось желания в DataToFileEx добавить сохранение string без всяких префиксов и окончаний, чтобы не городить костыль с StreamConvertor+doCopyFromStream?
карма: 26

0
Ответов: 9906
Рейтинг: 351
#9: 2020-04-21 11:10:10 ЛС | профиль | цитата
У меня появилось.

НО -- в виде отдельного метода в DataToFileEx.
Точнее, двух методов: чтения и запись.
Про количество байтов для записи - понятно, просто длина строки.
Про количество для чтения - видимо целочисленные данные из потока.

Название методов - еще не придумал.
А так-то - проблем никаких не предвидится.

Редактировалось 4 раз(а), последний 2020-04-21 11:14:57
карма: 9

0
Ответов: 4621
Рейтинг: 746
#10: 2020-04-21 11:41:52 ЛС | профиль | цитата
Galkov писал(а):
Про количество для чтения - видимо целочисленные данные из потока.
Почему не верхняя точка Count или Len/ReadLen? А то и дополнить имеющийся DataSize (собственно, он для того и служит - указать длину считываемых данных. Ну, записываемых тоже, но не в случае с новым типом).
Galkov писал(а):
НО -- в виде отдельного метода в DataToFileEx
Какая мотивация? Почему в свойство Type не добавить один пункт и упомянутую верхнюю точку для чтения?

Редактировалось 3 раз(а), последний 2020-04-21 11:47:38
карма: 26

0
Ответов: 9906
Рейтинг: 351
#11: 2020-04-21 12:12:50 ЛС | профиль | цитата
Netspirit писал(а):
Какая мотивация?

Такие переделки затронут архитектуру всего кода.
Следовательно - новое ПОЛНОЕ тестирование. Которое не бывает 100%-ным - по определению.

Нафига оно надо, если есть вариант "незаметной" корректировки, совсем не затрагивая уже работающие варианты.

Можно ли сделать, как Вы говорите -- без сомнения !!!
Но, лично я предпочитаю, проще и надежнее.

Редактировалось 2 раз(а), последний 2020-04-21 12:17:53
карма: 9

0
Ответов: 4621
Рейтинг: 746
#12: 2020-04-21 13:10:40 ЛС | профиль | цитата
Galkov писал(а):
Такие переделки затронут архитектуру всего кода
К сообщению прикреплен готовый вариант. Не затронувший ничего. Следовательно - тестирование только вновь добавленного. Я - протестировал. Пробуйте.

Можно обсудить вопрос надо ли читать верхний DataSize также и в других режимах. Также решить что делать когда файл оканчивается раньше, чем строка полностью считана - выдавать только часть строки или ничего.

Могу предложить дополнительные возможности компоненту:
- чтение размера файла больше 4Гб
- чтение и установка позиции для файлов больше 4Гб
- дополнительные методы
-- doSize - установка размера потока
-- doTrunc - обрезка размера файла до текущей позиции
-- doSkip - изменить позицию на указанное в потоке значение (+/- = вперед/назад)
-- doSeekEof (doSkipAll, doSkipEof) - быстрый переход в конец файла (экв. doPosition(Size)).

Редактировалось 3 раз(а), последний 2020-04-23 09:58:53
карма: 26

0
файлы: 1DataToFileEx_NS_mod_2020-04-21.zip [2.9KB] [386]
12
Сообщение
...
Прикрепленные файлы
(файлы не залиты)