Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > длинная строка


Автор: crazz 13.12.2004, 00:26
Столкнулся с такой траблой
надо вывести тучу текста в консоли
Т.е. есть текст из пары десятков строк, его надо вывести, текст хранится в самой программе.

Код

writeln('...');
writeln('...');
writeln('...');
writeln('...');
writeln('...');


как-то неудобно тучу раз писать writeln
можно еще так

Код

writeln( '...' +
+ '...' +
+ '...' +
+ '...' +
+ '...' );


Это уже проще, но должен же быть способ проще или я ошибаюсь?




Автор: Vit 13.12.2004, 00:30
Засунуть всю строку в ресурс

Автор: crazz 13.12.2004, 10:26
Цитата(Vit @ 13.12.2004, 00:30)
Засунуть всю строку в ресурс

Это ты называешь более простым способом?

Автор: Coder 13.12.2004, 15:47
write('...') и цикл...

Автор: crazz 13.12.2004, 15:55
при чем тут цикл

Автор: Vit 13.12.2004, 16:55
Цитата(crazz @ 13.12.2004, 01:26)
Это ты называешь более простым способом?



Да, если строка действительно большая, то получение её из ресурса будет всего несколько строк кода.

Автор: Полудненко Олег 13.12.2004, 21:41
А строка статическая или динамическая? Если статическая, то проще всего делать так, как предлагает Vit.

Автор: Vladimir13 14.12.2004, 08:24
если надо вывести ВЕСЬ текст, то не легче ли засунуть его в то же Мемо, а потом вывести с помощью writeln его на консоль?! Если надо вывести построчно, то это сделать можно в цикле
for i:=1 to Memo1.Lines.Count do
writeln(Memo1.Lines[i]);

Автор: Snowy 14.12.2004, 10:36
Кокой еще мемо в консольной программе???
С точки зрения минимализации размера программы, оптимальный вариант с кучей writeln.
С точки зрения минимализации кода, проще засунуть в ресурс.
Можно создать TStringList, а потом его циклом вывести.
Можно укоротить имя WriteLn до W, чтобы меньше писать.
Но IMHO, все равно только 2 варианта: писать текст в программе (разными способами), либо в текстовый файл/ресурс. Ибо процесс слишком элементарный, чтобы искать другие пути решения.
Я бы так и оставил WriteLn'ы.

Автор: crazz 15.12.2004, 18:22
а какой толк TStringList юзать в данном случае, все равно туда по стокам запихнуть сначала надо.

Автор: devmstr 15.12.2004, 20:58
Как делает "программист":
пишет прогу которая будет писать программу, которая из заданного файла читает набор строк и сама пишет часть программы типа
writeln({1 строка});
writeln({2 строка});
...
writeln({n строка});


Мы с пацаними в нашей лаборатории вечно чудим. Нам дадут какое-то задание - ну там пару месяцев назад расставить права на 20 компах. Вообщем где-то пол-дня полного методичного гемороя(одинаковая работа) и все бы было готово. Но нет мы писал день прогу, которая это делает сама, а потом день отлаживали. Итог, через два дня прога все сделала сама. "Экономия времени налицо, зато конечно много нового узнали".
excuse me за smile

Автор: crazz 15.12.2004, 22:11
мне не надо из файла читать, у меня прога состоит из одного экзешника а не тучи файлов

Автор: Bes 16.12.2004, 13:58
Ммм.... если я правильно понял надо в длинющую строку вставить "энтеры".
Сам не пробовал, но вот такая идея: либо вставлять скажем через каждые 20-ть символов символ йентер insert-ом либо командой copy копировать по 20-ть символов в промежуточную строку и ее выводить.
тогда можно и репит приделать.
2Crazz: что значит "при чем тут цикл"?

Автор: Snowy 16.12.2004, 14:14
Свмый короткий вариант:
Код

var
 r: char=#13#10;
begin
 WriteLn('Первая строка'+r+
 'Вторая строка'+r+
 'Третья строка'+r+
 ...
 'n-цатая стока'+r+
 'И хватит...');
end.

Текст короче все равно не сделать.

Автор: Bes 16.12.2004, 14:36
Ну да только я понял так, что нет первой и второй строки - есть одна здоровая и ее надо порезать. т.е.

что-то вроде того

Var
C,i,j,z,L:integer;
r,S:string;
begin
r:=#13+#10;
z:=5;
S:=edit1.text; //отсюда строку берем
L:=length(S);

c:=trunc(l/(z+1));
for i:=1 to c do
Insert(r,S,i*z+i-1);
ShowMessage(S); //сюда запихиваем
end;

Это пример дельфовый но сам механизм работает.

Или так если copy больше нравится

Var
z:integer;
r,S:string;
begin
Memo1.Clear; //очищает вывод
S:=edit1.text; //отсюда берем
z:=5;
Repeat
if length(S)>z then
begin
R:=copy(S,1,z);
S:=copy(S,z+1,length(S)-z);
end else
begin
R:=copy(S,1,length(S)+1);
S:='';
end;
Memo1.Lines.Add®; //сюда суем.
Until S='';
end;


Автор: Snowy 16.12.2004, 15:57
to Bes
Цитата

надо вывести тучу текста в консоли
Т.е. есть текст из пары десятков строк, его надо вывести, текст хранится в самой программе.

Автор: Bes 16.12.2004, 16:01
Ага понЯл, а в чем тогда вообще проблема... ? smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)