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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.04.2017, 15:16   #1
pas2
Пользователь
 
Регистрация: 02.01.2016
Сообщений: 42
По умолчанию Графический ListBox

Есть ли у кого то графический ListBox на подобии UserListBox либо же адаптированный под XE7. Данный компонент устанавливается без проблем,но когда бросаешь на форму куча не достающих *.dcu. Либо же как добавить изображение от и больше 32*32 в стандартный ListBox.
pas2 вне форума Ответить с цитированием
Старый 22.04.2017, 21:45   #2
Filka
Форумчанин
 
Регистрация: 29.10.2015
Сообщений: 273
По умолчанию

Код:
unit Unit1;

interface

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

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 ListBox1MeasureItem(Control: TWinControl; Index: Integer;
      var Height: Integer);
    procedure Button1Click(Sender: TObject);
  private
    FImgList: TImageList;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses
  ShellAPI, ImgList;

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 := lbOwnerDrawVariable;
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
    begin
      FImgList.Draw(LB.Canvas, Left + 1, Top + 1, GetIconIndex(S));
      TextOut(Left + FImgList.Width + 5, Top + (Bottom - Top - TextHeight(S)) div 2, S);
    end;
    if odFocused in State then
      DrawFocusRect(Rect);
  end;
end;

procedure TForm1.ListBox1MeasureItem(Control: TWinControl; Index: Integer;
  var Height: Integer);
begin
  Height := FImgList.Height + 2;
end;

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

end.

Последний раз редактировалось Filka; 23.04.2017 в 06:31.
Filka вне форума Ответить с цитированием
Старый 25.04.2017, 12:25   #3
pas2
Пользователь
 
Регистрация: 02.01.2016
Сообщений: 42
По умолчанию

Цитата:
Сообщение от Filka Посмотреть сообщение
Код:
Добавляется только путь в ListBox а картинка нет
pas2 вне форума Ответить с цитированием
Старый 25.04.2017, 12:54   #4
pas2
Пользователь
 
Регистрация: 02.01.2016
Сообщений: 42
По умолчанию

Решил вопрос таким путем, но когда выделяю строку в ListBox получается вот так

Код:
const W = 16;
      H = 16;
var BMPRect: TRect;
begin
  with (Control as TListBox).Canvas do
  begin
    FillRect(Rect);
    List1.Canvas.Draw(0, Rect.Top, Image1.Picture.Graphic);
    BMPRect := Bounds(Rect.Left, Rect.Top, W, H);
    TextOut(Rect.Left+W, Rect.Top, List1.Items[index]);
  end;
Изображения
Тип файла: jpg Безымянный.jpg (9.0 Кб, 77 просмотров)
pas2 вне форума Ответить с цитированием
Старый 25.04.2017, 12:59   #5
Filka
Форумчанин
 
Регистрация: 29.10.2015
Сообщений: 273
По умолчанию

Цитата:
Сообщение от pas2 Посмотреть сообщение
Добавляется только путь в ListBox а картинка нет
У меня рисуются картинки...
Для чего это нужно (если не секрет)?
Filka вне форума Ответить с цитированием
Старый 25.04.2017, 13:28   #6
pas2
Пользователь
 
Регистрация: 02.01.2016
Сообщений: 42
По умолчанию

Цитата:
Сообщение от Filka Посмотреть сообщение
По умолчанию
Цитата:
Сообщение от pas2 Посмотреть сообщение
Добавляется только путь в ListBox а картинка нет
У меня рисуются картинки...
Для чего это нужно (если не секрет)?
список с изображениями
pas2 вне форума Ответить с цитированием
Старый 25.04.2017, 13:31   #7
Filka
Форумчанин
 
Регистрация: 29.10.2015
Сообщений: 273
По умолчанию

А где изображения хранятся?
А то, может, проще использовать TreeView + ImageList?
Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    TreeView1: TTreeView;
    Button1: TButton;
    OpenDialog1: TOpenDialog;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses
  ShellAPI, ImgList;

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.Button1Click(Sender: TObject);
var
  Node: TTreeNode;
begin
  with OpenDialog1 do
    if Execute then
      with TreeView1 do
      begin
        Items.BeginUpdate;
        try
          Node := Items.AddChild(nil, FileName);
          Node.ImageIndex := GetIconIndex(FileName);
          Node.SelectedIndex := Node.ImageIndex;
        finally
          Items.EndUpdate;
        end;
      end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  with TreeView1 do
  begin
    Images := TImageList.Create(Self);
    Images.Handle := GetSysImgListHandle;
    Images.ShareImages := True;
    //ReadOnly := True;
    RowSelect := True;
    //ShowLines := False;
    ShowRoot := False;
    //HotTrack := True;
    //ShowButtons := False;
    //HideSelection := False;
    //AutoExpand := True;
    //ParentFont := False;
  end;
end;

end.
Filka вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Графический ListBox pas2 Компоненты Delphi 0 25.03.2017 14:10
[РЕШЕНО]: ListBox: как добавить из TStringList текст через 1 строку, чтобы в listBox данные располагались на чётных/нечётных позициях? pas2 Помощь студентам 2 21.03.2017 20:54
Добавление строк c listbox на listbox WinApi Alll_ Visual C++ 1 21.11.2013 03:34
используя процедуру keypress и фунцию listbox.при нажатии на listbox менялась ее высота Алекс38 Общие вопросы Delphi 1 19.09.2012 19:36
как добавить в listbox файлы(пишу с помощью bassplayer)(Listbox+opendialog=play) blackstersl Общие вопросы Delphi 11 09.06.2010 13:23