Font.GetTextWidth

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Font.GetTextWidth

Сообщение Vlad04 » 25.01.2012 16:42:56

Уважаемые форумчане!
Возникла необходимость в программе изменять шрифт на форме и, соответственно этому изменять размер и положение компонентов на форме. Для изменения размеров компонентов написал такую процедуру:
Код: Выделить всё
uses StrUtils ;

procedure SetSize(C : TControl ; MaxLStr : word) ;
var
  St : ansistring ;
begin
  St := dupestring('W',MaxLStr) ;
  C.ClientWidth := C.Font.GetTextWidth(St) ;
  C.ClientHeight := C.Font.GetTextHeight(St) ;
end ;

которая на входе принимает компонент и максимальный размер строки ввода. Однако она не работает, функции GetTextWidth и GetTextHeight выдают неверные значения (очень маленькие).
Что скажете?
Аватара пользователя
Vlad04
новенький
 
Сообщения: 80
Зарегистрирован: 11.12.2007 21:11:19
Откуда: Караганда. Казахстан

Re: Font.GetTextWidth

Сообщение alexs » 25.01.2012 18:34:08

А почему нельзя использовать привязки и свойство AutoSize, которое есть практически у всех компонентов?
И ничего не надо самому считать...
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4064
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Font.GetTextWidth

Сообщение Vlad04 » 25.01.2012 20:15:38

alexs писал(а):А почему нельзя использовать привязки и свойство AutoSize

Потому что AutoSize у TComboBox и TMaskEdit не работает. У других не проверял, но подозреваю, что оно не работает у всех компонентов, поддерживающих редактирование данных.
Аватара пользователя
Vlad04
новенький
 
Сообщения: 80
Зарегистрирован: 11.12.2007 21:11:19
Откуда: Караганда. Казахстан

Re: Font.GetTextWidth

Сообщение alexs » 25.01.2012 22:24:33

По высоте работает.
А по ширине решается привязками.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4064
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Font.GetTextWidth

Сообщение sign » 26.01.2012 04:27:21

Используйте .Canvas.GetTextWidth(St) и будет вам счастье.
sign
энтузиаст
 
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Re: Font.GetTextWidth

Сообщение Vlad04 » 26.01.2012 05:11:41

alexs, привязки работают при изменении размера формы, а сама форма, при изменении размера шрифта не увеличивается. Таким образом, получается замкнутый круг: для увеливения компонентов надо увеличить форму, а для увеличения формы надо знать размер увеличенных компонентов. Плюс, если в ширину расположено несколько элементов, то привязки не дают желаемого рузельтата - элементы перекрывают друг друга.
sign, у TControl и TWinControl свойство Canvas отсутствует, также как и у TMaskEdit. А писать отдельную процедуру для каждого типа компонета не очень "красиво".
Нашел обходной маневр
Код: Выделить всё
procedure SetSize(C : TControl ; MaxLStr : word) ; // подгонка размеров компонента под размер строки
var
  St : ansistring ;
begin
  St := dupestring('W',MaxLStr) ;
  C.ClientWidth := TCustomControl(C.Parent).Canvas.TextWidth(St) ;
  C.ClientHeight := TCustomControl(C.Parent).Canvas.TextHeight(St) ;
end ;

посмотрим, насколько он будет действеннен.
Однако, вопрос остаётся: почему Font.GetTextWidth(St) выдает неправильный размер?

Добавлено спустя 9 часов 55 минут 31 секунду:
Также встает вопрос: что делать с TGroupBox, TRadioGroup и TCheckGroup?...
Последний раз редактировалось Vlad04 26.01.2012 18:38:18, всего редактировалось 1 раз.
Аватара пользователя
Vlad04
новенький
 
Сообщения: 80
Зарегистрирован: 11.12.2007 21:11:19
Откуда: Караганда. Казахстан

Re: Font.GetTextWidth

Сообщение sign » 26.01.2012 15:32:35

А что вы хотите с ними делать?
sign
энтузиаст
 
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Re: Font.GetTextWidth

Сообщение Vlad04 » 26.01.2012 18:36:40

Они могут содержать компоненты, следовательно являются для них родителями, а свойства Canvas не имеют и "обходной манёвр" с ними не сработает.
Аватара пользователя
Vlad04
новенький
 
Сообщения: 80
Зарегистрирован: 11.12.2007 21:11:19
Откуда: Караганда. Казахстан

Re: Font.GetTextWidth

Сообщение sign » 26.01.2012 18:52:13

А в чём проблема найти родителя по цепочке вверх, который имеет канвас?

Добавлено спустя 22 минуты 18 секунд:
Код: Выделить всё
procedure SetSize(C : TControl ; const S: String);
var w, h: Integer;
    Cnv: TCanvas;
  function FindCanvas: TCanvas;
  var P: TComponent;
  begin
    P := TComponent(C).Owner;
    while Assigned(P) do begin
      if P is TGraphicControl then Exit(TGraphicControl(P).Canvas) else
      if P is TCustomControl then Exit(TCustomControl(P).Canvas);
      P  := P.Owner;
    end;
    Result := nil;
  end;
begin
  Cnv := FindCanvas;
  if Assigned(C) then Cnv.GetTextSize(S, w, h) else Exit;
  C.ClientWidth := w + 10;
  C.ClientHeight := h;
end ;

procedure TfBook.SpeedButton1Click(Sender: TObject);
var S: String;
begin
  S := 'Проверка ширины вводимого текста';
  SetSize(Edit1, S);
  Edit1.Text := S;
end;

procedure TfBook.SpeedButton2Click(Sender: TObject);
var S: String;
begin
  S := 'Проверка ширины вводимого текста. А это ещё длиннее';
  SetSize(Edit1, S);
  Edit1.Text := S;
end;
sign
энтузиаст
 
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Re: Font.GetTextWidth

Сообщение Vlad04 » 29.01.2012 16:59:53

Вы правы: проблем нет.
Аватара пользователя
Vlad04
новенький
 
Сообщения: 80
Зарегистрирован: 11.12.2007 21:11:19
Откуда: Караганда. Казахстан


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 234

Рейтинг@Mail.ru