Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.10.2006, 11:58   #1
Alar
Александр
Администратор
 
Аватар для Alar
 
Регистрация: 28.10.2006
Сообщений: 17,501
По умолчанию работа со строками

перенесено со старого форума. сообщение от CAM.

Подскажите пожалуйста, как написать длинную строку в столбик,например,
имеется строка: "Очень длинная строка", надо записать так:
Очень
длинная
строка

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


перенесено со старого форума. сообщение от Virtson.

работа со строками: Copy и Delete ..

перенесено со старого форума. сообщение от zetrix.

Можно посимвольно проходить строку, и через каждый пятый (для твоего примера) вставлять символ #13, надеюсь все знают, что это переход на новую строку.

перенесено со старого форума. сообщение от CAM.

Спасибо,а можно примерчик, как это посимвольно проходить строку?

перенесено со старого форума. сообщение от Alar.

procedure TForm1.Button1Click(Sender: TObject);
begin
showmessage('очень'+#13+'длинная'+# 13+'строка');
end;


перенесено со старого форума. сообщение от zetrix.

Вот пожалуйста пример, просто разбивает строку:

function longstring(s:string;x:integer):stri ng;
var i:integer;
begin
for i:=1 to length(s) do //проходим посимвольно строку s
if i mod (x+1) = 0 then insert(#13,s,i); //через каждые х симлов ставим #13 - знак переноса
Result:=s; //возвращаем строку s
end;

У функции 2 параметра: s -исходная строка, х - на какое кол-во символов разбивать.

s:='Очень_длинная_строка';
s:=longstring(s,5);
Получаем что s равна:
Очень
_длин
ная_с
трока

перенесено со старого форума. сообщение от CAM.

Zetrix, спасибо. А как узнать длину последней строки т.е. в этом примере длину "трока". Я сделал так:
begin
j:=1;
for i:=1 to length(s) do //проходим посимвольно строку s
if i mod(x+1)=0 then
begin
insert(#13,s,i); //через каждые х симлов ставим #13 - знак переноса
Inc(j);
end;
j:=j*x;
k:=length(s)-j; //искомая длина
Может быть есть более элегантное решение?

Вообще-то в итоге должно получиться:

1. Очень

_длин

ная_с

трока 5 шт.



2. Слово 1,2 л.

...


т.е. что-то вроде таблицы со столбцами определенной ширины.

перенесено со старого форума. сообщение от Virtson.

вместо
if i mod(x+1)=0 then
я бы написал
if (i-j) mod(x)=0 then

мы вставляем символы -> изменяем длину строки..

перенесено со старого форума. сообщение от zetrix.

Нормально, пусть такое и останется:
j:=j*x;
k:=length(s)-j; //искомая длина

перенесено со старого форума. сообщение от Virtson.

ваш пример не работает для строк, которые не делятся ровно
(длина не кратна X=5)


function longstring(s:string;x:integer; var l: integer):string;

var

i, n:integer;

begin

n:= length(s);

l:= n mod x; // длина остатка известна сразу

i:= 0;



While i<n do //

begin

inc(i);

if i mod (x+1) = 0 then

begin

insert(#13,s,i); //

inc(n);

end;

end;

Result:=s; //

end;
Alar вне форума Ответить с цитированием
Старый 30.10.2006, 11:59   #2
Alar
Александр
Администратор
 
Аватар для Alar
 
Регистрация: 28.10.2006
Сообщений: 17,501
По умолчанию

перенесено со старого форума. сообщение от Virtson.

Программа переносит строку (делит на части),
вписывая ее в поле.
Сделана попытка учитывать
правила переноса в русском языке.


исходники в rar тоже не захотели.

Const

nn = 80;

glasn = ['а', 'я', 'е', 'э', 'о', 'ё', 'и', 'ы', 'у', 'ю'];

prep = ['.', ',', ':', ';', '?', '!', '-', '"', #39];



function longstring(s:string; x:integer; var l: integer): string;

{x - max длина подстроки, на которые делим s}

{l - сколько получили подстрок-'кусков'}

var

i, j, n:integer;

k, i0, p:integer;

begin

n:= length(s);

l:= 0;

i:= 0; // позиция в строке

j:= 0; // текущая длина куска

p:= 0; // последний пробел

s:= s+' ';



While i<=n do //проходим посимвольно строку s

begin

inc(i);

inc(j);

if s[i]=' ' then

begin

p:= i;

end;

if (j>=x) then

begin

if (i=p) then

begin

s[i]:= #13;

j:= 0;

end

else

if (j=x)and(s[i+1]=' ') then

begin

s[i+1]:= #13;

inc(i);

j:= 0;

end

else

if (p>0)and(s[p]<>#13) then

begin

s[p]:= #13;

j:= i-p;

end

else

begin

if (j=x)and ((s[i-1] in glasn)or not (s[i-2] in glasn))

then inc(i);

if not (s[i] in prep) then

begin

insert('-',s, i-1);

inc(n); // применяли insert();

end;

insert(#13,s, i);

j:= 0;

inc(n);

end;

inc(l); // был вставлен #13

end;

end;



if j>0 then inc(l);

Result:= s; //возвращаем строку s

end;



procedure TForm1.FormShow(Sender: TObject);

begin

font:= Label1.Font;

Trackbar1.Max:= nn;

TrackBar1.Position:= 6;

end;



procedure TForm1.TrackBar1Change(Sender: TObject);

var

i, n: integer;

s: string;

begin

s:= '';

for i:= 1 to Memo1.Lines.Count do s:= s+Memo1.Lines[i-1];

n:= Trackbar1.Position;

Label1.Caption:=

longstring(s, n, i);

Shape1.Width:= 2;

Shape1.Height:= round( canvas.TextWidth('|')* i*1.82);

Caption:= Format('%d strings by %d char max', [i, n]);

s:= '';

for i:= 1 to n do s:= s+'#';

Shape1.Left:= Label1.Left + canvas.TextWidth(s);

end;

http://58r.ru/temp1/strings.rar
http://58r.ru/temp1/Perenos.rar

Первый ссылка - исходники (весь project),
вторая - exe.
Alar вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа со строками GoAnd Общие вопросы по Java, Java SE, Kotlin 9 22.09.2010 03:36
Работа со строками. ViNcHeStEr Помощь студентам 6 29.06.2008 08:14
РАБОТА СО СТРОКАМИ kluwa Общие вопросы C/C++ 7 20.12.2007 18:30