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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.07.2017, 13:47   #1
Dimitr69
Пользователь
 
Регистрация: 27.07.2015
Сообщений: 10
По умолчанию подскажите как рисовать на компоненте TListBox иконки/битмапы одинакового размера, чтобы они размещались в ряд, как это сделано в TotalCommander

Граждане программисты, подскажите как рисовать на компоненте TListBox иконки/битмапы одинакового размера, что бы они размещались вряд, так как это сделано в TotalCommander при редактировании ButtonBar
buttonBarTotal.jpg
Картинки в TListBox должны располагаться в ряд.

На форме имеем
imageList1 и ListBox1

в imageList1 загружены картинки одного размера
далее
Понятно что
Код:
...
ListBox1.Style := lbOwnerDrawFixed;

// как мин этот метод определить
procedure TFrameConnListBox.ListBox1DrawItem(Control: TWinControl;
  Index: Integer; Rect: TRect; State: TOwnerDrawState);
begin
  ListBox1.Canvas.FillRect(Rect); // очистили айтем
  // // рисуем картинку из списка
  ImageList1.Draw(ListBox1.Canvas,Rect.Left+2,Rect.Top+2, Index);
end;


Что бы в картинки строились в ряд, присваивал
Код:
ListBox1.Columns := ImageList1.Count;
Не помогло.
Они то выстраивались в ряд, но наплывали друг на друга, т.е. скролинга картинок по горизонтали в лист боксе не было.
Картинки старались поместиться в исходную ширину лист бокса.

Последний раз редактировалось Вадим Мошев; 08.07.2017 в 20:53.
Dimitr69 вне форума Ответить с цитированием
Старый 08.07.2017, 23:32   #2
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Я думаю в TotalCommander используется компонент ListView
Использовать примерно так
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  ListItem: TListItem;
begin
    ListView1.ViewStyle := vsList; //Выбираем нужный стиль
    ListView1.SmallImages:= ImageList1; //привязываем контейнер с иконками к листу
    ListItem := ListView1.Items.Add; //Создаем строку
    ListItem.Caption := 'dsdsdsdds'; //Название если нужно
    ListItem.ImageIndex:= 0; //выводим иконку с индексом 0 в листе
end;

Последний раз редактировалось Aliens_wolfs; 09.07.2017 в 00:32.
Aliens_wolfs вне форума Ответить с цитированием
Старый 23.07.2017, 12:53   #3
Dimitr69
Пользователь
 
Регистрация: 27.07.2015
Сообщений: 10
По умолчанию

Нет, там TListBox используется в форме редактирования иконок для
TButtonBar
Dimitr69 вне форума Ответить с цитированием
Старый 24.07.2017, 15:57   #4
Filka
Форумчанин
 
Регистрация: 29.10.2015
Сообщений: 272
По умолчанию

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ImgList;

type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    Button1: TButton;
    OpenDialog1: TOpenDialog;
    procedure FormCreate(Sender: TObject);
    procedure ListBox1DrawItem(Control: TWinControl; Index: Integer;
      Rect: TRect; State: TOwnerDrawState);
    procedure Button1Click(Sender: TObject);
  private
    FImgList: TImageList;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses
  ShellAPI;

function GetIconIndex(const FileName: string): Integer;
var
  FileInfo: TSHFileInfo;
begin
  SHGetFileInfo(PChar(FileName), 0, FileInfo, SizeOf(FileInfo), SHGFI_SYSICONINDEX);
  Result := FileInfo.iIcon;
end;

function GetSysImgListHandle: THandle;
var
  FileInfo: TSHFileInfo;
begin
  Result := SHGetFileInfo(nil, 0, FileInfo, SizeOf(FileInfo),
    SHGFI_SYSICONINDEX or SHGFI_LARGEICON);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FImgList := TImageList.Create(Self);
  FImgList.Handle := GetSysImgListHandle;
  FImgList.DrawingStyle := dsTransparent;
  FImgList.ShareImages := True;

  ListBox1.Style := lbOwnerDrawFixed;
  ListBox1.ItemHeight := FImgList.Height + 2;
  ListBox1.Columns := 5;
  ListBox1.ClientWidth := (FImgList.Width + 2) * ListBox1.Columns;
  ListBox1.ClientHeight := GetSystemMetrics(SM_CXHSCROLL) + ListBox1.ItemHeight;
end;

procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
var
  S: string;
  LB: TListBox;
begin
  LB := TListBox(Control);
  S := LB.Items[Index];
  with LB.Canvas do
  begin
    FillRect(Rect);
    with Rect do
      FImgList.Draw(LB.Canvas, Left + 1, Top + 1, GetIconIndex(S));

    if odFocused in State then
      DrawFocusRect(Rect);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  with OpenDialog1 do
    if Execute then
      ListBox1.Items.Add(FileName);
end;

end.
Filka вне форума Ответить с цитированием
Старый 04.08.2017, 15:38   #5
Dimitr69
Пользователь
 
Регистрация: 27.07.2015
Сообщений: 10
По умолчанию

Фильке за стремление помочь ставлю пять,
за не работающий пример - кол. (Как в фигурном катании - за артистичность 5.0 , за технику 1.0)
И так имеется какой-то TImageList, в нем куча картинок (иконок) одинакового размера. Как их отобразить в TListBox что бы они отражались в один ряд, горизонтально и любую из них можно было выбрать.

Что мне пришло в бошку, так это бросить на форму TListBox, под ним TScrollBar для прокрутки. Из списка картинок сформировать одну картинку
в TBitMap, выстроив их в ряд.
И скопировать Бит мап на канву Лист Бокса при прорисовке айтема.
Айтем лист бокса только один.
Ну и дальше городить отрисовку активной иконки, когда клацаешь мышью...
Но в Тотал Коммандоре это сделано как то проще, без того огорода, что мне придумалось...

Последний раз редактировалось Dimitr69; 04.08.2017 в 15:40.
Dimitr69 вне форума Ответить с цитированием
Старый 04.08.2017, 18:35   #6
Filka
Форумчанин
 
Регистрация: 29.10.2015
Сообщений: 272
По умолчанию

Цитата:
Сообщение от Dimitr69 Посмотреть сообщение
за не работающий пример - кол
Какие ваши доказательства?
Filka вне форума Ответить с цитированием
Старый 05.08.2017, 10:00   #7
Dimitr69
Пользователь
 
Регистрация: 27.07.2015
Сообщений: 10
По умолчанию

Запихнул в IDE Delphi XE2 код и попробовал (Ось - Win7) (возможно несовместимость какая-то).

Да и строки
Код:
 ListBox1.Columns := 5;
  ListBox1.ClientWidth := (FImgList.Width + 2) * ListBox1.Columns;
странные: установить размер лист бокса по кол колонок, которых почему то жестко задали = 5 (почему не 6 или 13 ?)! Количество Айтемов может быть произвольным. Их надо выстроить вряд в лист боксе. Значит колонок должно быть = кол. айтемов.
Короче у меня не заработало...
По идее все должно быть просто (то, как это реализовано в Тотал Командоре)....
Dimitr69 вне форума Ответить с цитированием
Старый 05.08.2017, 10:29   #8
Filka
Форумчанин
 
Регистрация: 29.10.2015
Сообщений: 272
По умолчанию

Цитата:
Сообщение от Dimitr69 Посмотреть сообщение
почему не 6 или 13 ?
А что мешает сделать 6 или 13?
Цитата:
Сообщение от Dimitr69 Посмотреть сообщение
Количество Айтемов может быть произвольным.
А где написано, что должно быть определённое их количество?
Цитата:
Сообщение от Dimitr69 Посмотреть сообщение
Значит колонок должно быть = кол. айтемов.
Это не так...

Последний раз редактировалось Filka; 05.08.2017 в 17:36.
Filka вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Паскаль(Файлы). Два типизированных файла одинакового размера. Получить третий файл как сумму элементов. Артемdgty Помощь студентам 8 08.10.2013 20:32
Что это и как сделано? Как разобраться? gryz Microsoft Office Excel 4 07.02.2012 22:48
как рисовать график ф-ии с на компоненте TImage? Владимир1111 Помощь студентам 4 02.04.2010 10:26
Не понятно. Как это сделано kzld Microsoft Office Excel 2 31.03.2010 11:24
как рисовать на канве битмапы учитывая прозрачность участков битмапа? Alar Общие вопросы Delphi 0 29.10.2006 23:06