powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / WrapText не "враппит" текст
18 сообщений из 18, страница 1 из 1
WrapText не "враппит" текст
    #38015775
rasa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!
Данные ко мне приходят в stream-виде. Из stream передаю данные (данные для base64) в TStringList. Далее кодирую с помощью IdEncoderMIME.EncodeString в base64 и сохраняю. Однако весь итоговый вывод base-64 стремится уместиться в как можно более длинные строки - вот как на картинке:


Здесь в строке по 700-2000 символов

Стараюсь сохранить все это добро так же, как, скажем, сохраняет это программы-почтовики, то есть wrapp'ят текст через каждые 76 символов:


Основной кусок кода такой:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
var
  myStrings: TStringList;
  myStream: TMemoryStream;
...
myStrings := TStringList.Create;
IdAttachment.SaveToStream(myStream);
myStrings.LoadFromStream(myStream);
Memo1.Lines.Add(WrapText(IdEncoderMIME.EncodeString(myStrings.Text), #13#10, [], 76));


Однако все равно получаю себе такие же длинные строки :(
Что можно подправить?
...
Рейтинг: 0 / 0
WrapText не "враппит" текст
    #38015787
fd00ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rasaЧто можно подправить?генофонд, привив себе любовь к чтению хелпа
...
Рейтинг: 0 / 0
WrapText не "враппит" текст
    #38015834
rasa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо. По которой функции перечитать хелп, можно конкретнее?
...
Рейтинг: 0 / 0
WrapText не "враппит" текст
    #38015839
Фотография Zukora
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имхо, режь сам 76 символов.
...
Рейтинг: 0 / 0
WrapText не "враппит" текст
    #38015916
fd00ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rasaПо которой функции перечитать хелп, можно конкретнее?по всем, в которые параметры пихаешь по принципу "от балды, лишь бы скомпилировалось". название темы подсказывает, что начать можно с WrapText()
...
Рейтинг: 0 / 0
WrapText не "враппит" текст
    #38015917
rasa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Zukora , я тоже так же посчитал в конечном итоге, в две строки работает.
WrapText не работает с TStream, WrapText на самом деле не вставляет разделители, сдался ли здесь вообще TStringList и тд
Это общем быстрее, чем пытаться получить все через Indy. Слишком много если, но хотя 10469947
...
Рейтинг: 0 / 0
WrapText не "враппит" текст
    #38016037
Фотография S.G.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rasaWrapText не работает с TStream, WrapText на самом деле не вставляет разделители, сдался ли здесь вообще TStringList и тд
rasa,
обрати внимание на разницу между string и text - первое- набор символов, второе- набор слов. Соответственно, Wrap Text ищет слова, и не находя их, (у тебя одно большое слово), не делает ничего.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
WrapText не "враппит" текст
    #39513612
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подниму тему.
Вот код:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
procedure TForm1.Button1Click(Sender: TObject);
var
  S: String;
begin
  S := '12345678901 1234567890123456'; // длина 28 символов, 12-й символ - пробел.
  ShowMessage( WrapText( S, 27 ) ); // Результат - изначальная строка 28 символов с пробелом примерно посредине - '12345678901 1234567890123456'
  ShowMessage( WrapText( S, 26 ) ); // Результат - 2 строки - '12345678901 ' и '1234567890123456'
end;


Это я чего не догоняю и так и должно работать, или в моей дельфе (д6) эта функция глючит?
Если второе - проверьте, плиз, на более новых.
...
Рейтинг: 0 / 0
WrapText не "враппит" текст
    #39513613
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
открой исходник (он есть) и посмотри.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
WrapText не "враппит" текст
    #39513618
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящийоткрой исходник (он есть) и посмотри.
На что посмотреть? Очевидно, что работает не так, как мне нужно (как я ожидаю от этой функции). Вопрос в том, баг это или нет?
...
Рейтинг: 0 / 0
WrapText не "враппит" текст
    #39513620
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock,
судя по примеру в справке, похоже, что пробелы в счет не входят (иначе Spain была бы во 2 строке).
http://docwiki.embarcadero.com/Libraries/XE3/en/System.SysUtils.WrapText
...
Рейтинг: 0 / 0
WrapText не "враппит" текст
    #39513622
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у тебя под рукой код и отладчик.
если это глюк, то ты его локализуешь.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
WrapText не "враппит" текст
    #39513624
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockПодниму тему.
Вот код:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
procedure TForm1.Button1Click(Sender: TObject);
var
  S: String;
begin
  S := '12345678901 1234567890123456'; // длина 28 символов, 12-й символ - пробел.
  ShowMessage( WrapText( S, 27 ) ); // Результат - изначальная строка 28 символов с пробелом примерно посредине - '12345678901 1234567890123456'
  ShowMessage( WrapText( S, 26 ) ); // Результат - 2 строки - '12345678901 ' и '1234567890123456'
end;



Это я чего не догоняю и так и должно работать, или в моей дельфе (д6) эта функция глючит?
Если второе - проверьте, плиз, на более новых.
Кстати, в Lazarus 1.6.4 даже 2-й вариант не разбивает на 2 строки. Т.е. работает по-другому - еще более неправильно ))
...
Рейтинг: 0 / 0
WrapText не "враппит" текст
    #39513626
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящийу тебя под рукой код и отладчик.
если это глюк, то ты его локализуешь.
Спасибо, я быстрей свою напишу.
...
Рейтинг: 0 / 0
WrapText не "враппит" текст
    #39513629
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
31.08.2017 18:32, YuRock пишет:
> Спасибо, я быстрей свою напишу.

слова джедая слышу я! (С)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
WrapText не "враппит" текст
    #39513631
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s62судя по примеру в справке, похоже, что пробелы в счет не входят
Да. Что ж, меня это уже не устраивает на 100%. Хотя это и не объясняет ни грамма, почему строка из моего примера не враппится.
А объяснение простое - эта ф-ция ищет пробел (или другой символ из указанного множества) справа от MaxCol (да еще и без учета пробелов и других...). Короче, бесполезная функция (для моих нужд).
...
Рейтинг: 0 / 0
WrapText не "враппит" текст
    #39513687
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот, накрапал, если кому интересно, под спойлером.
Вообще это надо было для добавления строки в чек (с жестким ограничением длины), но чтобы и текст максимально грамотно выглядел в случае разбивки.
Вроде работает.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
// Разбивает разделителем BreakStr строку SLine на список строк с максимальной длиной MaxCol,
// выполняя поиск 1-го попавшегося символа-разделителя (из BreakChars) СЛЕВА от (MaxCol+1)-символа
// (при условии, что еще левее него есть символ-НЕразделитель).
//
// Если символа-разделителя слева не найдено - текущая строка всё равно добавляется в
// результат-список с длиной MaxCol, и происходир разбор следующей строки.
//
// Если следующая (не первая) строка начинается с символов SpaceChars - они будут удалены.
// Если последние строки состоят только из SpaceChars - они не будут добавлены.
function WrapToList( const SLine: String; MaxCol: Integer; const BreakStr: String = sLineBreak; const BreakChars: TSysCharSet = [ ' ', '-', #9, '.', ',', ';' ]; const SpaceChars: TSysCharSet = [ ' ', #9 ] ): String;
var
  i, nFullLength, nStartPos, nFind: Integer;
  bFindNonBreak: Boolean;
begin
  nFullLength := Length( SLine );
  if nFullLength <= MaxCol then begin
    Result := SLine;
    Exit;
  end;

  Result := '';
  if MaxCol <= 0 then
    Exit;

  nStartPos := 1;
  repeat
    if SLine[ nStartPos + MaxCol - 1 ] in BreakChars then begin
      Result := Result + Copy( SLine, nStartPos, MaxCol );
      nStartPos := nStartPos + MaxCol;
    end else begin
      nFind := -1;
      for i := nStartPos + MaxCol - 1 downto nStartPos do if SLine[ i ] in BreakChars then begin
        nFind := i;
        Break;
      end;

      if nFind <> -1 then begin
        bFindNonBreak := False;
        for i := nFind downto nStartPos do if not ( SLine[ i ] in BreakChars ) then begin
          bFindNonBreak := True;
          Break;
        end;
        if not bFindNonBreak then
          nFind := -1;
      end;

      if nFind = -1 then
        nFind := nStartPos + MaxCol - 1;

      Result := Result + Copy( SLine, nStartPos, nFind - nStartPos + 1 );
      nStartPos := nFind + 1;
    end;

    if nFullLength >= nStartPos then begin
      if SpaceChars <> [] then begin
        while ( nFullLength >= nStartPos ) and ( SLine[ nStartPos ] in SpaceChars ) do
          Inc( nStartPos );

        if nFullLength < nStartPos then
          Exit;
      end;

      Result := Result + BreakStr;
      if nFullLength - nStartPos + 1 <= MaxCol then begin
        Result := Result + Copy( SLine, nStartPos, MaxInt );
        Exit;
      end;
    end;
  until nFullLength < nStartPos;
end;

...
Рейтинг: 0 / 0
WrapText не "враппит" текст
    #39513983
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Немного улучшил
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
// Разбивает разделителем BreakStr строку SLine на список строк с максимальной длиной MaxCol,
// выполняя поиск 1-го попавшегося символа-разделителя (из BreakChars) СЛЕВА от (MaxCol+1)-символа
// (при условии, что еще левее него есть символ-НЕразделитель).
// Этот поиск выполняется, если MaxCol-символ не разделитель (или следующий за ним символ не из SpaceChars),
// а иначе сразу идет переход на следующую строку
//
// Если символа-разделителя слева не найдено - текущая строка всё равно добавляется в
// результат-список с длиной MaxCol, и происходир разбор следующей строки.
//
// Если следующая (не первая) строка начинается с символов SpaceChars - они будут удалены.
// Если последние строки состоят только из SpaceChars - они не будут добавлены.
function WrapToList( const SLine: String; MaxCol: Integer; const BreakStr: String = sLineBreak; const BreakChars: TSysCharSet = [ ' ', '-', #9, '.', ',', ';' ]; const SpaceChars: TSysCharSet = [ ' ', #9 ] ): String;
var
  i, nFullLength, nStartPos, nFind: Integer;
  bFindNonBreak: Boolean;
begin
  nFullLength := Length( SLine );
  if nFullLength <= MaxCol then begin
    Result := SLine;
    Exit;
  end;

  Result := '';
  if MaxCol <= 0 then
    Exit;

  nStartPos := 1;
  repeat
    if ( SLine[ nStartPos + MaxCol - 1 ] in BreakChars )
       or
       ( SLine[ nStartPos + MaxCol ] in SpaceChars )
    then begin
      Result := Result + Copy( SLine, nStartPos, MaxCol );
      nStartPos := nStartPos + MaxCol;
    end else begin
      nFind := -1;
      for i := nStartPos + MaxCol - 1 downto nStartPos do if SLine[ i ] in BreakChars then begin
        nFind := i;
        Break;
      end;

      if nFind <> -1 then begin
        bFindNonBreak := False;
        for i := nFind downto nStartPos do if not ( SLine[ i ] in BreakChars ) then begin
          bFindNonBreak := True;
          Break;
        end;
        if not bFindNonBreak then
          nFind := -1;
      end;

      if nFind = -1 then
        nFind := nStartPos + MaxCol - 1;

      Result := Result + Copy( SLine, nStartPos, nFind - nStartPos + 1 );
      nStartPos := nFind + 1;
    end;

    if nFullLength >= nStartPos then begin
      if SpaceChars <> [] then begin
        while ( nFullLength >= nStartPos ) and ( SLine[ nStartPos ] in SpaceChars ) do
          Inc( nStartPos );

        if nFullLength < nStartPos then
          Exit;
      end;

      Result := Result + BreakStr;
      if nFullLength - nStartPos + 1 <= MaxCol then begin
        Result := Result + Copy( SLine, nStartPos, MaxInt );
        Exit;
      end;
    end;
  until nFullLength < nStartPos;
end;

...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / WrapText не "враппит" текст
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]