Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Звук, графика и видео > возможно ли засунуть в combo box bmp рисунки


Автор: darkida 1.2.2010, 22:44
Куда и как можно засунуть большое количество bmp файлов? Желательно бы в combobox список, если конечно это возможно. А если нет то какая этому есть альтернатива, чтоб была полоса прокрутки? 
Жду ваши предложения? А то сам допереть ни как не могу?
Заранее благодарен.

Автор: artsb 1.2.2010, 23:01
Цитата(darkida @  1.2.2010,  22:44 Найти цитируемый пост)
Куда и как можно засунуть большое количество bmp файлов?

ImageList для хранения самих изображений. А для отображения хоть ComboBox, хоть ListBox, хоть StringGrid. Но рисовать эти изображения придётся вручную. Поищите на эту тему много говорили.

Добавлено через 1 минуту и 1 секунду
Цитата(artsb @  1.2.2010,  23:01 Найти цитируемый пост)
ImageList для хранения самих изображений.

Забыл сказать, что при использовании ImageList изображения должны быть одного размера.

Автор: darkida 1.2.2010, 23:17
Меня как раз таки интересует отображение, а не хранение. Ну на подобие скролбокса только с выпадающим списком как у комбобокса, в котором и будут отображены мой картинки. 
В ручную это как? Вставка изображения путем канваса? Или самому рисовать эти объекты?
И если не затруднит то можно ссылки?

Автор: artsb 1.2.2010, 23:30
Выставляете у ComboBox Style = csOwnerDrawVariable и ItemHeight = высота картинки (а лучше чуть больше).
В обработчике OnDrawItem:
Код

 ComboBox1.Canvas.FillRect(Rect);
 ImageList1.Draw(ComboBox1.Canvas,
                  Rect.Left,
                  Rect.Top,
                  Index);

Автор: darkida 1.2.2010, 23:52
Оооо спасибо. То что надо. Сейчас попробуй. Я ведь могу таким способом весь Imagelist с картинками накидать(их около 20);

Автор: artsb 2.2.2010, 00:05
Цитата(darkida @  1.2.2010,  23:52 Найти цитируемый пост)
Я ведь могу таким способом весь Imagelist с картинками накидать(их около 20); 

Ага

Автор: darkida 2.2.2010, 00:42
Супер!!!
Все работает. Ещё раз спасибо!!! Вопрос решенный.

Автор: eXtr0gen 2.2.2010, 21:11
Вообщем то, немного не в тему, но рекомендую набор компонентов от LMD. У них решены многие проблемы и красивые комбобоксы в их числе) ну а так ессесно, только обработчик OnDrawItem перекрывать.

Автор: darkida 3.2.2010, 07:46
Блин все хорошо. Но как теперь работать с этими битмапами. Как им index то присвоить?  Помогите!!

Автор: ~FoX~ 3.2.2010, 07:59
Цитата(darkida @  3.2.2010,  08:46 Найти цитируемый пост)
Блин все хорошо. Но как теперь работать с этими битмапами. Как им index то присвоить?  Помогите!! 

Индекс у них в ImageListe-е присваивается

Автор: darkida 3.2.2010, 08:20
Нет ну это понятно, но как к примеру при выборе из combobox'a  bmp' шки выделить нужный. Ведь здесь мы просто нарисовали его.
Код

 ComboBox1.Canvas.FillRect(Rect);
 ImageList1.Draw(ComboBox1.Canvas,
                  Rect.Left,
                  Rect.Top,
                  Index);

 А как теперь присвоить каждому bmp'нику combobox ' ский  index. 

Автор: ~FoX~ 3.2.2010, 08:28
darkida, Савсем ничего не понял... Объясни что тебе надо...
Цитата(darkida @  3.2.2010,  09:20 Найти цитируемый пост)
Ведь здесь мы просто нарисовали его.

Мы его не просто нарисовали, а нарисовали в итеме...т.е. каждый битмап соответствует итему... Ну весьма опосредовано конечно, т.е. нельзя взять например Item.Bitmap или Item.ImageIndex, потому как мы просто канву изуродовали, а не внедряли сам битмап, как объект... Для этих целей имеется специально обученный компонент - ComboBoxEx...

Автор: darkida 3.2.2010, 08:32
Ну вот к примеру написал вот так. 
Код

procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer;  // çàñîâûâàåì bmp â combobox
  Rect: TRect; State: TOwnerDrawState);
  var
  i: integer;
begin
 ComboBox1.Canvas.FillRect(Rect);
 for i:=0 to 4 do begin
 rect.left:=5;
 Rect.Top:=5+i*60;
 ImageList4.Draw(ComboBox1.Canvas, Rect.Left, Rect.Top, i);
 end;
end;


А когда на click пишу так:
Код

procedure TForm1.ComboBox1Click(Sender: TObject);
var
i: integer;
begin
 for i:=0 to 4 do begin
combobox1.ItemIndex:=i;
end;
end;


То выходит ошибка при выборе какого-нибудь элемента, а точнее начиная со второго.

Цитата

Мы его не просто нарисовали, а нарисовали в итеме...т.е. каждый битмап соответствует итему... Ну весьма опосредовано конечно, т.е. нельзя взять например Item.Bitmap или Item.ImageIndex, потому как мы просто канву изуродовали, а не внедряли сам битмап, как объект... Для этих целей имеется специально обученный компонент - ComboBoxEx...


оо это хорошо, но почему тогда вылазит эта ошибка где не так.

Автор: ~FoX~ 3.2.2010, 08:42
darkida, Жесткий изврат! Каждый итем рисуется сам по себе, не надо не надо ни каких циклов при этом... Иначе ты просто каждый итем 4 раза пытаешься перерисовать...
Код

procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
begin
 ComboBox1.Canvas.FillRect(Rect);
 ImageList1.Draw(ComboBox1.Canvas,
                  Rect.Left,
                  Rect.Top,
                  Index);
 ComboBox1.Canvas.TextOut(Rect.Left + 18, Rect.Top+2, ComboBox1.Items.Strings[Index]);
end;

Цитата(darkida @  3.2.2010,  09:32 Найти цитируемый пост)
А когда на click пишу так:

А зачем ты это пишешь??? А сколько у тебя элементов? А ты знаешь что делает этот код combobox1.ItemIndex:=i;?

Автор: darkida 3.2.2010, 08:46
ой на клике чушь написал по моему. Но мне надо чтоб при выборе в combobox'e он нарисовал этот bmp где нибудь.

А или надо присвоить combobox index к imagelist.draw index'u при рисовки.
Все по моему доперло. 

Автор: ~FoX~ 3.2.2010, 08:51
Наде же так все усложнить.... Во первых не по клику, а по ченьджу...
Код

procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
begin
 ComboBox1.Canvas.FillRect(Rect);
 ImageList1.Draw(ComboBox1.Canvas, Rect.Left, Rect.Top, Index);
 ComboBox1.Canvas.TextOut(Rect.Left + 18, Rect.Top+2, ComboBox1.Items.Strings[Index]);
end;

procedure TForm1.ComboBox1Change(Sender: TObject);
begin
  ImageList1.Draw(Form1.Canvas, 50, 50, ComboBox1.ItemIndex);
end;

Автор: darkida 3.2.2010, 09:03
Цитата

Жесткий изврат! Каждый итем рисуется сам по себе, не надо не надо ни каких циклов при этом... Иначе ты просто каждый итем 4 раза пытаешься перерисовать...

....................

А зачем ты это пишешь??? А сколько у тебя элементов? А ты знаешь что делает этот код combobox1.ItemIndex:=i;?

Мда я знаю!!!!  ))))))).  Я тока учусь. И почему то думал что он только первый элемент закинет из ImageList. 

Спасибо ~FoX~.

А на клике теперь как писать?  
Код

ImageList4.Draw(form1.Canvas, xx[2], yy[2], i);

 Вместо i          combobox1.itemindex да?

Спасибо еще раз ~FoX~. И это я там еще одну тему создал для новичков не мог ты посмотреть где там ошибка. А то ни кто не отвечает. Еще раз спасибо. Туплю такое бывает. )))


Ой блин еще и торможу. Ты уже ответил. ))))

Автор: artsb 3.2.2010, 13:57
darkida, вот примерчик:
Код

// после выбора другого Item'ма отрисовываем его в Image1
procedure TForm1.ComboBox1Change(Sender: TObject);
var
 bmp: TBitmap;
begin
 bmp := TBitmap.Create();
 ImageList1.GetBitmap(ComboBox1.ItemIndex, bmp);
 Image1.Picture.Bitmap.Assign(bmp);
 bmp.Free();
end;

procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
begin
 ComboBox1.Canvas.FillRect(Rect);
 ImageList1.Draw(ComboBox1.Canvas,
                  Rect.Left + 2,
                  Rect.Top + 2,
                  Index);
 ComboBox1.Canvas.TextOut(Rect.Left + 38, Rect.Top+12, ComboBox1.Items.Strings[Index]);
end;

procedure TForm1.FormCreate(Sender: TObject);
var
 cnt: integer;
begin
 for cnt := 0 to ImageList1.Count - 1 do
   ComboBox1.Items.Add('string ' + intToStr(cnt+1));
end;

Автор: darkida 3.2.2010, 15:52
Спасибо. Понял. Все хорошо работает.
Весьма признателен.

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