Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.10.2014, 17:17   #1
tarakan1983
Форумчанин
 
Аватар для tarakan1983
 
Регистрация: 09.09.2008
Сообщений: 418
По умолчанию combobox текст по центру

Здравствуйте, помогите пожалуйста.
Использование сторонних компонентов критично.
Нужно сделать текст в combobox по центру.
Начал так.
Код:
procedure TFmCode.Button1Click(Sender: TObject);
  var
    i,j,h : Integer;
begin
  h := ComboBox1.Width;
  for i := 0 to ComboBox1.Items.Count -1 do
    begin
      j := Canvas.TextWidth(ComboBox1.Items[i]);
      // Дальше не могу сообразить
    end;
end;
Измерил ширину ComboBox1.
Измерил ширину текста в каждой строке.
как теперь добавить пробелов, чтобы текст по центру получился?
Спасибо.
tarakan1983 вне форума Ответить с цитированием
Старый 16.10.2014, 17:42   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Баловство какое-то. Можно так, но придется еще поиграться с цветом и фоном в зависимости от State. Да, и ComboBox1.Style:=csOwnerDrawFixed
Код:
procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
begin
  DrawText(ComboBox1.Canvas.Handle,PChar(ComboBox1.Items[Index]),Length(ComboBox1.Items[Index]),Rect,DT_CENTER)
end;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 16.10.2014 в 17:44.
Аватар вне форума Ответить с цитированием
Старый 16.10.2014, 19:33   #3
tarakan1983
Форумчанин
 
Аватар для tarakan1983
 
Регистрация: 09.09.2008
Сообщений: 418
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Баловство какое-то. Можно так, но придется еще поиграться с цветом и фоном в зависимости от State. Да, и ComboBox1.Style:=csOwnerDrawFixed
Код:
procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
begin
  DrawText(ComboBox1.Canvas.Handle,PChar(ComboBox1.Items[Index]),Length(ComboBox1.Items[Index]),Rect,DT_CENTER)
end;
спасибо конечно, но на данный пример я натыкался, нужен стиль csDropDownList. Тут никак нельзя?
tarakan1983 вне форума Ответить с цитированием
Старый 16.10.2014, 19:39   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

csOwnerDrawFixed и отличается от csDropDownList тем, что нужно самостоятельно прорисовывать. Да, и интересно зачем центрировать выпадающий список? Выбирать же юзеру не удобно. А подсчитать пробелы можно конечно, типа не большого говнокода, добавляя слева и справа пробелы в цикле, пока ширина текста не станет равной или больше клиентской ширине
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 16.10.2014, 19:43   #5
tarakan1983
Форумчанин
 
Аватар для tarakan1983
 
Регистрация: 09.09.2008
Сообщений: 418
По умолчанию

Цитата:
типа не большого говнокода
а можете помочь с таким кодом?
tarakan1983 вне форума Ответить с цитированием
Старый 16.10.2014, 19:47   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

ComboBox1.ClientWidth - клиентская ширина
и цикл WHILE или REPEAT добавляя поочередно пробел слева и справа к тексу опции, пока TextWidth не станет >= ClientWidth
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 16.10.2014, 19:53   #7
tarakan1983
Форумчанин
 
Аватар для tarakan1983
 
Регистрация: 09.09.2008
Сообщений: 418
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
ComboBox1.ClientWidth - клиентская ширина
и цикл WHILE или REPEAT добавляя поочередно пробел слева и справа к тексу опции, пока TextWidth не станет >= ClientWidth
Спасибо большое
tarakan1983 вне форума Ответить с цитированием
Старый 17.10.2014, 13:11   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Вот еще вариант, не такой говнокодистый
Код:
procedure TForm1.Button1Click(Sender: TObject);
var k,i,j: Integer;
begin
  ComboBox1.Items.BeginUpdate;
  k:=ComboBox1.Canvas.TextWidth(' ')*2;
  for i:=0 to ComboBox1.Items.Count-1 do begin
    j:=ComboBox1.Canvas.TextWidth(Trim(ComboBox1.Items[i]));
    if j<ComboBox1.ClientWidth then ComboBox1.Items[i]:=StringOfChar(' ',(ComboBox1.ClientWidth-j) div k)+Trim(ComboBox1.Items[i])
                               else ComboBox1.Items[i]:=Trim(ComboBox1.Items[i]);
  end;
  ComboBox1.Items.EndUpdate;
end;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 17.10.2014, 13:52   #9
tarakan1983
Форумчанин
 
Аватар для tarakan1983
 
Регистрация: 09.09.2008
Сообщений: 418
По умолчанию

у меня чуть проще получилось
Код:
procedure TForm1.CbCenter(cb: TComboBox);
  var
    i: Integer;
begin
  for i := 0 to cb.Items.Count - 1 do
    while cb.Width >= Canvas.TextWidth(cb.Items[i]) do
      cb.Items[i] := ' '+cb.Items[i]+' ';

end;
tarakan1983 вне форума Ответить с цитированием
Старый 17.10.2014, 14:01   #10
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Это проще , но дольше

PS

Кстати, с днем рождения!
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 17.10.2014 в 14:07.
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
текст по центру по высоте внутри Diva johny_03 HTML и CSS 2 31.01.2013 13:59
Как разместить текст внизу страницы по центру Vitalik85 HTML и CSS 9 10.08.2012 14:32
Тег SELECT - выровнять текст по центру (IE) Linel HTML и CSS 0 17.02.2011 13:35
Не могу сделать текст по центру pahanzona Общие вопросы Delphi 3 05.02.2011 12:37
Выровнять текст в Стринг Грид по центру cowboy Общие вопросы Delphi 1 25.04.2010 13:03