• XSS.stack #1 – первый литературный журнал от юзеров форума

Delphi перенос текста на следующую строку, когда он превышает определенную длину

one_deal

RAID-массив
Пользователь
Регистрация
14.12.2019
Сообщения
58
Реакции
5
Доброго времени суток!

Может быть кто-то сталкивался стакой проблемой,
как вывести текст на странице по определенной ширине?

Т.е. надо сделать перенос текста на следующую строку,
когда он превышает определенную длину.

Похожее есть в notepad.exe когда выбираешь формат -> перенос по словам.
 
C WordWrap понятно, у меня текст выводится в WebBrowser, вместе со всякими блоками,
не знаю, как сделать чтобы при выводе текста строки обрезались до заданного размера и
переносились на новую строку. Пишу парсер, может кто-то сталкивался с чем-то похожим.
 
Чего? Отправь запрос через тот же IdHTTP и распарсь его к примеру этой функцией:

Код:
function Pars(T_, Text, _T: string): string;
 var a, b:integer;
 begin
Result := '';
if (T_='') or (Text='') or (_T='') then Exit;
a:=Pos(T_, Text);
if a=0 then Exit else a:=a+Length(T_);
Text:=Copy(Text, a, Length(Text)-a+1);
b:=Pos(_T, Text);
if b>0 then Result:=Copy(Text, 1, b - 1);
end;

Examle:
var str, str2: string;
begin
str:='my_best_string';
str2:=Pars('my_',str,'_string');
WriteLn(str2); or ShowMessage(str2);
end;

Тебе браузер не нужен.
 
Не понимаю как преобразовывать текст к определенному формату.

Надо текст перенести на следующую строку, если он превышает определенную длину.
function format_text(s: string): string;
var
i: integer;
max_length: integer;
begin
result := '';
for i := 1 to Length(s) do
begin
//Разбиваем текст на слова
//Получаем строки, обрезанные до max_length
end;
end;
Что-то типа этого.
 
Самое простое - использовать стандартные ф-ции, а именно: StringReplace.
Example: Form1.Memo2.Lines.Text:=StringReplace(Form1.Memo1.Lines.Text,#32, #13#10, [rfReplaceAll, rfIgnoreCase]);

1617628210358.png


Более лучший вариант:
Код:
function FText(const data: WideString): WideString;
var tmp: TStringList;
begin
 tmp:=TStringList.Create;
 tmp.Delimiter:=#32;
 tmp.StrictDelimiter:=True;
 tmp.DelimitedText:=data; 
 Result:=tmp.Text ;
 FreeAndNil(tmp);
end;

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

upd: забыл дописать ф-цию обсчета выходных строк на основе ширины компонента, в который выводите данные. Но опять же, в чем суть такого изъеба?
 
Последнее редактирование:
Код:
procedure Izeb(out ObjOutput: TMemo; const data: WideString; maxWidth: Int32 = 0);
function FText(const data: WideString): WideString;
var tmp: TStringList;
begin
 tmp:=TStringList.Create;
 tmp.Delimiter:=#32;
 tmp.StrictDelimiter:=True;
 tmp.DelimitedText:=data;
 Result:=tmp.Text;
 FreeAndNil(tmp);
end;
var tmpData: TStringList;
    i, j, SizeNow: Int32;
    tmpLine: WideString;
begin
 {
  1 character is 10 units of width.
  This condition is true only when disabled WordWrap.
 }
 tmpData:=TStringList.Create;
 tmpData.Text:=FText(data);
 ObjOutput.WordWrap:=False;

 if (ObjOutput.Width > maxWidth) and (maxWidth > 0) then
 begin
  ObjOutput.Width:=maxWidth;
  SizeNow:=ObjOutput.Width div 10;
 end else
 begin
  SizeNow:=ObjOutput.Width div 10;
 end;

 for I:=0 to tmpData.Count-1 do
 begin
  if (Length(tmpLine) + Length(tmpData[i])+1) < SizeNow  then
   tmpLine:=tmpLine+ ' ' +tmpData[i] else
  begin
   ObjOutput.Lines.Add(tmpLine);
   tmpLine:='';
  end;
 end;
 ObjOutput.Lines.Add(tmpLine);

 FreeAndNil(tmpData);
end;

Использование: Izeb(Form1.Memo2, Form1.Memo1.Lines.Text);

Что касается SizeNow - тебе остается самостоятельно рассчитать ширину 1 символа. Я взял примерные значения, чтобы точно получилось. Комментарий в коде оставил.
 
Да, то что надо, только обрезает некоторые слова.
 

Вложения

  • Новый точечный рисунок.jpg
    Новый точечный рисунок.jpg
    141.5 КБ · Просмотры: 15
Да, то что надо, только обрезает некоторые слова.
У вас 2 ф-ции, протестируйте отдельно каждую. Вложенная функция ничем не отличается от этой.

Я не вижу никакой ошибки, скорее всего исходные данные такие.
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх