![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Александр
Администратор
Регистрация: 28.10.2006
Сообщений: 17,630
|
![]()
перенесено со старого форума. сообщение от 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; |
![]() |
![]() |
![]() |
#2 |
Александр
Администратор
Регистрация: 28.10.2006
Сообщений: 17,630
|
![]()
перенесено со старого форума. сообщение от 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. |
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Работа со строками | 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 |