Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / WrapText не "враппит" текст / 18 сообщений из 18, страница 1 из 1
27.10.2012, 21:46:17
    #38015775
rasa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WrapText не "враппит" текст
Здравствуйте!
Данные ко мне приходят в 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
27.10.2012, 21:58:37
    #38015787
fd00ch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WrapText не "враппит" текст
rasaЧто можно подправить?генофонд, привив себе любовь к чтению хелпа
...
Рейтинг: 0 / 0
27.10.2012, 23:21:30
    #38015834
rasa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WrapText не "враппит" текст
Спасибо. По которой функции перечитать хелп, можно конкретнее?
...
Рейтинг: 0 / 0
27.10.2012, 23:42:35
    #38015839
Zukora
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WrapText не "враппит" текст
Имхо, режь сам 76 символов.
...
Рейтинг: 0 / 0
28.10.2012, 02:27:19
    #38015916
fd00ch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WrapText не "враппит" текст
rasaПо которой функции перечитать хелп, можно конкретнее?по всем, в которые параметры пихаешь по принципу "от балды, лишь бы скомпилировалось". название темы подсказывает, что начать можно с WrapText()
...
Рейтинг: 0 / 0
28.10.2012, 02:36:37
    #38015917
rasa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WrapText не "враппит" текст
Zukora , я тоже так же посчитал в конечном итоге, в две строки работает.
WrapText не работает с TStream, WrapText на самом деле не вставляет разделители, сдался ли здесь вообще TStringList и тд
Это общем быстрее, чем пытаться получить все через Indy. Слишком много если, но хотя 10469947
...
Рейтинг: 0 / 0
28.10.2012, 12:50:57
    #38016037
S.G.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WrapText не "враппит" текст
rasaWrapText не работает с TStream, WrapText на самом деле не вставляет разделители, сдался ли здесь вообще TStringList и тд
rasa,
обрати внимание на разницу между string и text - первое- набор символов, второе- набор слов. Соответственно, Wrap Text ищет слова, и не находя их, (у тебя одно большое слово), не делает ничего.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
31.08.2017, 18:06:53
    #39513612
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WrapText не "враппит" текст
Подниму тему.
Вот код:
Код: 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
31.08.2017, 18:15:26
    #39513613
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WrapText не "враппит" текст
открой исходник (он есть) и посмотри.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
31.08.2017, 18:21:24
    #39513618
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WrapText не "враппит" текст
Мимопроходящийоткрой исходник (он есть) и посмотри.
На что посмотреть? Очевидно, что работает не так, как мне нужно (как я ожидаю от этой функции). Вопрос в том, баг это или нет?
...
Рейтинг: 0 / 0
31.08.2017, 18:26:31
    #39513620
s62
s62
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WrapText не "враппит" текст
YuRock,
судя по примеру в справке, похоже, что пробелы в счет не входят (иначе Spain была бы во 2 строке).
http://docwiki.embarcadero.com/Libraries/XE3/en/System.SysUtils.WrapText
...
Рейтинг: 0 / 0
31.08.2017, 18:28:44
    #39513622
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WrapText не "враппит" текст
у тебя под рукой код и отладчик.
если это глюк, то ты его локализуешь.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
31.08.2017, 18:30:29
    #39513624
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WrapText не "враппит" текст
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
31.08.2017, 18:32:57
    #39513626
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WrapText не "враппит" текст
Мимопроходящийу тебя под рукой код и отладчик.
если это глюк, то ты его локализуешь.
Спасибо, я быстрей свою напишу.
...
Рейтинг: 0 / 0
31.08.2017, 18:35:35
    #39513629
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WrapText не "враппит" текст
31.08.2017 18:32, YuRock пишет:
> Спасибо, я быстрей свою напишу.

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

Код: 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
01.09.2017, 12:03:00
    #39513983
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WrapText не "враппит" текст
Немного улучшил
Код: 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
Форумы / Delphi [игнор отключен] [закрыт для гостей] / WrapText не "враппит" текст / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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