Проблемы с переносом слов

отредактировано 01:49 Раздел: FastReport 3.0
Если длина слова превышает размеры Memo и Wordwrap = True то слово режется в произвольном месте. например
"Celeron\FDD\5" - переход на строку
"12MB"
- Есть ли возможность настроить дополнительные символы которые будут считатся разрывом слова ?
Желательна возможность задать их по умолчанию для всех форм.

Комментарии

  • отредактировано 01:49
    Нет, такой возможности нет. Перенос делается исключительно по пробелам, остальные символы пробельными не считаются.
  • отредактировано August 2005
    Сталкивался с похожей проблемой.
    Решить можно внесением изменений в метод procedure TfrxDrawText.WrapTextLine(s: String; Width, FirstLineWidth,
    CharSpacing: Integer);

    procedure TfrxDrawText.WrapTextLine(s: String; Width, FirstLineWidth,
     CharSpacing: Integer);
    var
     n, i, Offset, LineBegin, LastSpace, BreakPos: Integer;
     sz: TSize;
     TheWord: String;
     WasBreak: Boolean;

     function BreakWord(const s: String; LineBegin, CurPos, LineEnd: Integer): String;
     var
       i, BreakPos: Integer;
       TheWord, Breaks: String;
     begin
       // get the whole word
       i := CurPos;
       while (i <= LineEnd) and (Pos(s, ' .,-;') = 0) do
         Inc(i);
       TheWord := Copy(s, LineBegin, i - LineBegin);
       // get available break positions
       Breaks := BreakRussianWord(AnsiUpperCase(TheWord));
       // find the closest position
       BreakPos := CurPos - LineBegin;
       for i := Length(Breaks) downto 1 do
         if Ord(Breaks) < BreakPos then
         begin
           BreakPos := Ord(Breaks);
           break;
         end;
       if BreakPos <> CurPos - LineBegin then
         Result := Copy(TheWord, 1, BreakPos) else
         Result := '';
     end;

    begin
    // remove all HTML tags and build the tag list
     FHTMLTags.NewLine;
     FHTMLTags.ExpandHTMLTags(s);
     FHTMLTags.FPosition := FHTMLTags.FPosition + 2;

     n := Length(s);
     if (n < 2) or not FWordWrap then  // no need to wrap a string with 0 or 1 symbol
     begin
       FText.Add(s);
       Exit;
     end;

    // get the intercharacter spacing table and calculate the width
     sz.cx := FHTMLTags.FillCharSpacingArray(FTempArray, s, FCanvas,
       FHTMLTags.Count - 1, CharSpacing, True);

    // text fits, no need to wrap it
     if sz.cx < FirstLineWidth then
     begin
       FText.Add(s);
       Exit;
     end;

     Offset := 0;
     i := 1;
     LineBegin := 1; // index of the first symbol in the current line
     LastSpace := 1; // index of the last space symbol in the current line

     while i <= n do
     begin
       if (s = ' ') or (s ='\') or (s ='/') or (s ='-') then
         LastSpace := i;

       if FTempArray - Offset > FirstLineWidth then  // need wrap
       begin
         if LastSpace = LineBegin then  // there is only one word without spaces...
         begin
           if i <> LineBegin then       // ... and it has more than 1 symbol
           begin
             if FWordBreak then
             begin
               TheWord := BreakWord(s, LineBegin, i, n);
               WasBreak := TheWord <> '';
               if not WasBreak then
                 TheWord := Copy(s, LineBegin, i - LineBegin);
               if WasBreak then
                 FText.Add(TheWord + '-') else
                 FText.Add(TheWord);
               BreakPos := Length(TheWord);
               FHTMLTags.Wrap(BreakPos, WasBreak);
               LastSpace := LineBegin + BreakPos - 1;
             end
             else
             begin
               FText.Add(Copy(s, LineBegin, i - LineBegin));
               FHTMLTags.Wrap(i - LineBegin, False);
               LastSpace := i - 1;
             end;
           end
           else
           begin
             FText.Add(s[LineBegin]); // can't wrap 1 symbol, just add it to the new line
             FHTMLTags.Wrap(1, False);
           end;
         end
         else // we have a space symbol inside
         begin
           if FWordBreak then
           begin
             TheWord := BreakWord(s, LastSpace + 1, i, n);
             WasBreak := TheWord <> '';
             if WasBreak then
               FText.Add(Copy(s, LineBegin, LastSpace - LineBegin + 1) + TheWord + '-') else
               FText.Add(Copy(s, LineBegin, LastSpace - LineBegin));
             BreakPos := LastSpace - LineBegin + Length(TheWord) + 1;
             FHTMLTags.Wrap(BreakPos, WasBreak);
             if WasBreak then
               LastSpace := LineBegin + BreakPos - 1;
           end
           else
           begin
             FText.Add(Copy(s, LineBegin, LastSpace - LineBegin));
             FHTMLTags.Wrap(LastSpace - LineBegin + 1, False);
           end;
         end;

         Offset := FTempArray[LastSpace]; // starting a new line
         i := LastSpace;
         Inc(LastSpace);
         LineBegin := LastSpace;
         FirstLineWidth := Width; // this line is not first, so use Width
       end;

       Inc(i);
     end;

     if n - LineBegin + 1 > 0 then   // put the rest of line to FText
       FText.Add(Copy(s, LineBegin, n - LineBegin + 1));
    end;

Оставить комментарий

Многофункциональный текстовый редактор. Чтобы отредактировать стиль параграфа, нажмите TAB, чтобы перейти к меню абзаца. Там вы можете выбрать стиль. По умолчанию не выбран ни один стиль. Когда вы выберете текст, появится встроенное меню форматирования. Нажмите TAB, чтобы войти в него. Некоторые элементы, такие как многофункциональные вставки ссылок, картинок, индикаторов загрузки и сообщений об ошибок могут быть вставлены в редактор. Вы можете перемещаться по ним, используя стрелки внутри редактора и удалять с помощью клавиш delete или backspace.