Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> В Combobox - items разным цветом, как? 
:(
    Опции темы
Chyslyvchyk
Дата 13.9.2004, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 446
Регистрация: 9.5.2004

Репутация: 1
Всего: 5



Нужно водить в комбобокс items с разным цветом.
Например:
Код
if ComboBox.Items.IndexOf(ComboBox.Text) <> -1
 then
 MessageDlg('Есть уже такое!', mtError, [mbOk], 0)
 else
    begin
       if OneRBtn.Checked then
          begin
          Combobox.именно этот ComboBox.text с цветом:=clWindowText;
          ComboBox.Items.Add(ComboBox.text)
          end
       else
          begin
          Combobox.именно этот ComboBox.text с цветом:=clRed;
          ComboBox.Items.Add(ComboBox.text)
          end;
     end;
 end;



--------------------
Простота - сестра таланта!
PM MAIL   Вверх
Chyslyvchyk
Дата 13.9.2004, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 446
Регистрация: 9.5.2004

Репутация: 1
Всего: 5



Вот тут было найдено следующее:
Код
procedure ComboColor(C: TWinControl; I : Integer; R : TRect; EColor, OColor, FColor : TColor);
begin
 with (C as TCombobox) do    //TCombobox oder T.....box
  begin
     if Odd(I) then Canvas.Brush.color := OColor
                   else Canvas.Brush.color := EColor;
     Canvas.FillRect(R);
     Canvas.Font.Color := FColor;
     Canvas.TextOut(R.Left,R.Top,Items[I]);
   end;
end;

procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
begin
  ComboColor(Control, Index, Rect, clInfoBk, clWhite, clBlack);
end;


Combobox.Style := csOwnerDrawFixed;

Но у меня ничего не получается. sad.gif


--------------------
Простота - сестра таланта!
PM MAIL   Вверх
Pakshin A. S.
Дата 13.9.2004, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: 21
Всего: 61



Пример для ListBox, но по сути эти компоненты должны не отличаться...
Код

procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index:integer; Rect:TRect; State: TOwnerDrawState);
begin
with (Control as TListBox).Canvas do
  begin
   Font.Color:=clWhite;
   Brush.Color:=clBlue;
   FillRect(Rect);
   TextOut(Rect.left, Rect.Top, (Control as TlistBox).Items[Index);
  end;
end;

PM   Вверх
Girder
Дата 14.9.2004, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 31
Всего: 155



Код
procedure TForm1.FormCreate(Sender: TObject);
begin
Combobox1.Style:=csOwnerDrawVariable; //or csOwnerDrawFixed
end;

procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer;
 Rect: TRect; State: TOwnerDrawState);
begin
with (Control as TComboBox) do
 begin
  if (Index mod 2)=0 then //Твоя проверка
   Canvas.Font.Color:=clNone else Canvas.Font.Color:=clSilver;
  Canvas.FillRect(Rect);
  Canvas.TextOut(Rect.left, Rect.Top, Items[Index]);
 end;
end;


Удачи.


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
Chyslyvchyk
Дата 15.9.2004, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 446
Регистрация: 9.5.2004

Репутация: 1
Всего: 5



Girder, ты в который раз меня выручаешь! smile.gif
Код работает (еще бы), только вот хоть убейся не знаю, как его испорльзовать для моей задачи. Описываю:
1) Есть Combobox1
2) В него добавляются данные (а именно код цвета товара, ну там 3Z3, GF5 и т.д.):
Код
procedure TMainForm.ComboBox1KeyDown(Sender: TObject; var Key: Word;
 Shift: TShiftState);
begin
 if Key = 117 then
 begin
 if ComboBox1.Items.IndexOf(ComboBox8.Text) <> -1
   then
   MessageDlg('Уже есть такое!', mtError, [mbOk], 0)
 else
   ComboBox1.Items.Add(ComboBox8.text)
 end;
end;

3) при закрытии программы данные перегоняются в файл:
Код
ComboBox1.Items.SaveToFile(ExtractFilePath(Application.ExeName) + 'Data\Color.ini');

4) при открытии программы, данные загружаются из этого файла:
Код
ComboBox1.Items.LoadFromFile(ExtractFilePath(Application.ExeName) + 'DB\Color.ini');


Дело в том, что есть два вида товара, соответственно два набора кодов цвета. Мне нужно, чтобы эти коды отображались для одного товара - черным цветом, а для другого - красным. Соответственно нужно завести уже два файла ini или разбыть Color.ini на разделы. Допустим, что есть два файла, тогда алгоритм следующий
1) Добавляются данные в Combobox1 при открытии программы:
Код
- если Color.ini, тогда Canvas.Font.Color:=clNone
- если ColorOther.ini, тогда Canvas.Font.Color:=clRed

2) добавление данных в Combobox1 во время программы:
Код
- если Edit1.text = 'Название одного товара', тогда ComboBox1.Items.Add(ComboBox8.text) и цвет Canvas.Font.Color:=clNone
- если Edit1.text = 'Название другого товара', тогда ComboBox1.Items.Add(ComboBox8.text) и цвет Canvas.Font.Color:=clRed

3) при закрытии программы данные перегоняются в файлы:
Код
- если цвет Canvas.Font.Color:=clNone, тогда в файл Color.ini
- если цвет Canvas.Font.Color:=clRed, тогда в файл ColorOther.ini

А вот как реализовать программно? adv/help.gif


--------------------
Простота - сестра таланта!
PM MAIL   Вверх
Girder
Дата 15.9.2004, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 31
Всего: 155



Код
procedure TForm1.FormCreate(Sender: TObject);
var i:integer;
   s:string;
begin
ComboBox1.Style:=csOwnerDrawVariable; //or csOwnerDrawFixed
ComboBox1.Items.NameValueSeparator:='=';
try
 ComboBox1.Items.LoadFromFile(ExtractFilePath(ParamStr(0))+'Color.ini');
except
 ComboBox1.Clear;
end;
if ComboBox1.Items.Count=0 then
 begin
  i:=12;
  repeat //Пример: как добавлять товар
   case (i mod 3) of
    1: s:=' Название другого товара '+IntToStr(i)+'='+IntToStr(clRed);
    2: s:=' Название Хоть третьего и т.д. товара '+IntToStr(i)+'='+IntToStr(clBlue);
   else
    s:=' Название одного товара '+IntToStr(i)+'='+IntToStr(clNone);
   end;
   ComboBox1.Items.Add(s);
   dec(i);
  until (i=0);
 end;
end;

procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
var i:TColor;
begin
with (Control as TComboBox) do
 begin
  try
   i:=StrToInt(Trim(Items.ValueFromIndex[Index]));
  except
   i:=clNone;
   Items[Index]:=Items[Index]+'='+IntToStr(i);
  end;
  Canvas.Font.Color:=i;
  Canvas.FillRect(Rect);
  Canvas.TextOut(Rect.left, Rect.Top, Items.Names[Index]);
 end;
end;


procedure TForm1.FormDestroy(Sender: TObject);
begin
ComboBox1.Items.SaveToFile(ExtractFilePath(ParamStr(0))+'Color.ini');
end;


Удачи.


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.4556 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.