Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Многострочный TLabel


Автор: aktuba 15.3.2007, 00:29
Собственно сабж... Было бы вообще замечательно, если бы кто-то подсказал подобный компонент с поддержкой html...

Автор: Alexeis 15.3.2007, 10:58
Обычный TLabel и так является многосточным. Какая поддержка HTML Нужна?  smile сделать гибрид TLabel и TWebBrowser? Не крото ли это для простого лабела?

Автор: aktuba 15.3.2007, 13:18
Цитата

Обычный TLabel и так является многосточным.


Знаю, только вот выравнивания по ширине нет...

Цитата

Какая поддержка HTML Нужна?


Выравнивание, выделение части текста и т.д. Т.е. мини-html, так сказать...

Цитата

сделать гибрид TLabel и TWebBrowser? Не крото ли это для простого лабела? 


Почти. И такие компоненты есть, но у них нет выравнивания по ширине, к сожалению...

Автор: Sunvas 15.3.2007, 18:03
Придется, я уверен, делать все самому.

Автор: aktuba 15.3.2007, 18:23
Sunvas, а конкретные предложения и примеры есть?

Автор: Sunvas 15.3.2007, 18:47
Цитата(aktuba @  15.3.2007,  18:23 Найти цитируемый пост)
Sunvas, а конкретные предложения и примеры есть?

Использовать масштабируемый шрифт. Найти среди всех строк самую длинную, а остальным пробелы дорисуй и будет тебе счастье.

Автор: Alexeis 15.3.2007, 19:07
Цитата(Sunvas @  15.3.2007,  18:47 Найти цитируемый пост)
Найти среди всех строк самую длинную, а остальным пробелы дорисуй и будет тебе счастье.

Дальше можно действать так:
1) Определить число слов в строке
2) Оперделить длину строки
3) Определить небходимую длинну строки
4) Определить длинну пробела.
5) (небходимая длинна строки - длина строки) / длинну пробела = число пробелов.
6) число пробелов div число слов = минимальное число пробелов необходимое для добавления после кажого слова.
7) Дабавление оставшихся пробелов (будет уже не равномерный интервал, так как их на всех не хватает, но ширину запонит всю. 

И так для каждой строки.

Автор: MetalFan 16.3.2007, 12:17
aktuba, есть в JVCL компонент TJvHTLabel... да только он выравнивание по ширине не понимает...

Автор: aktuba 16.3.2007, 12:21
Цитата

aktuba, есть в JVCL компонент TJvHTLabel... да только он выравнивание по ширине не понимает... 


Дык, и в TMS есть THTMLabel, который тоже не понимает выравнивание по ширине...

Автор: Guedda 16.3.2007, 15:43
А если просто воспользоваться TRichEdit, немного его усовершенствовав?

Автор: aktuba 16.3.2007, 16:54
Цитата

А если просто воспользоваться TRichEdit, немного его усовершенствовав? 


Т.е.??? Можно подробнее? В общем случае, задача такая: прозрачный текст с урлом, выровненный по ширине и некоторыми выделенными словами. Как ричедит можно усовершенствовать в этом случае?

Автор: MetalFan 16.3.2007, 17:42
aktuba, 
а если ричедиту сделать цвет, как у формы и BorderStyle в none. то будет псевдопрозрачность)
либо допилить TJvHTLabel, чтоб равнял по ширине...

Автор: aktuba 16.3.2007, 18:23
Цитата

а если ричедиту сделать цвет, как у формы и BorderStyle в none. то будет псевдопрозрачность)


Для задачи-минимум, пойдет. Но, в дальнейшем, хотелось бы сделать на фоне графику - вот тогда уже не пойдет =((((

Цитата

либо допилить TJvHTLabel, чтоб равнял по ширине...


Тоже склоняюсь к этому решению, но...

Автор: MetalFan 16.3.2007, 20:19
накидал тут примитивный код для вставки пробелов до нужной ширины...
может пригодиться)
Код

function DoJustifyString( const AText: string; ACanvas: TCanvas; AWidth: Integer ): string;
  const
    C_DELIM :set of char  = [' ',',','.','-',';',':'];
  var
    lLastPos: Integer;
    i: Integer;
    lPrevInDelim: Boolean;
  begin
    Result := '';
    if (AText = '') or not Assigned(ACanvas) or (AWidth = 0) then Exit;
    Result := AText;    
    lLastPos := 0;
    lPrevInDelim := False;
    while ACanvas.TextWidth( Result+' ' ) < AWidth do
    begin
      if lLastPos > Length( Result ) then
        lLastPos := 0;
      lPrevInDelim := False;
      for i := lLastPos + 1 to length( Result ) do
      begin
        lLastPos := i + 1;
        if Result[i] in C_DELIM then
        begin
          lPrevInDelim := True;
          Continue;
        end
        else
        if lPrevInDelim then
        begin
          Result := Copy(Result, 1, i-1)+' ' + Copy(Result, i, MaxInt );
          Break;
        end;
      end;
    end;
  end;

  function DoJustifyText( const AText: string; ACanvas: TCanvas; AWidth: Integer ): string;
  var
    lSL: TStringList;
    i: Integer;
  begin
    Result := '';
    if (AText = '') or not Assigned(ACanvas) or (AWidth = 0) then Exit;
    lSL := TStringList.Create;
    try
      lSL.Text := AText;
      for i := 0 to pred( lSL.Count ) do
        lSL[i] := DoJustifyString( lSL[i], ACanvas, AWidth );
      Result := lSL.Text;
    finally
      lSL.Free;
    end;
  end;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)