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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> работа с listview, работа с listview 
:(
    Опции темы
den2005r
Дата 5.1.2010, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Привет всем. как при получении строки вида D:\111.exe в listview отображать соответст в Windows иконкой? (если файла не существует по этому пути) подскажите пожалуйста
PM MAIL   Вверх
Akella
Дата 5.1.2010, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 8
Всего: 329



Цитата(den2005r @  5.1.2010,  20:19 Найти цитируемый пост)
если файла не существует по этому пути

Читать данные нужно из реестра относительно типов файлов.
Примерно так:
Код

//не помню, где нашёл, возможно на forum.sources.ru

uses
 ShellAPI, Registry, ShlObj;

function TfmEmailEdit.GetRegistryIconHandle(FileName: string): HICON;
var
  R: TRegistry;
  Alias, //псевдоним для типа файла в реестре
  IconPath, Ext: string; //путь для файла с изображением
  IconNum, //номер изображения в файле
  QPos: Integer; //позиция запятой в записи реестра
  LI, SI : HICON;
begin
  IconNum := 1;
  Ext:=ExtractFileExt(FileName);
  if (Ext='.exe') or (ext='.EXE') then ext:='.com';

  R := TRegistry.Create;

  try
    R.RootKey := HKEY_CLASSES_ROOT;

    //чтение псевданима
    if R.OpenKey('\' + Ext, True) then
      Alias := R.ReadString('');
    R.CloseKey;

    //чтение записи об иконке
    if R.OpenKey('\' + Alias + '\DefaultIcon', True) then
      IconPath := R.ReadString('');
    R.CloseKey;

    //поиск запятой
    QPos := Pos(',', IconPath);

    //чтение номера иконки в файле если она имеется
    if QPos <> 0 then
    begin
      IconNum := StrToInt(Copy(IconPath, QPos + 1, 4));
      IconPath := Copy(IconPath, 1, QPos - 1)
    end;

  finally
    R.Free;
  end;

  ExtractIconEx(PChar(IconPath), IconNum, LI, SI, 1);
  Result := SI;
  if result = 0 then
    Result := LoadIcon(Hinstance,'NO_FILE');
end;


Используем
Код

procedure TfmEmailEdit.dbgMailAttachmentsCustomDrawCell(
  Sender: TcxCustomGridTableView; ACanvas: TcxCanvas;
  AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean);
Var
 val: boolean;
 vIconHandle: HIcon;
// Icon: TIcon;
begin
  try
    if AViewInfo.GridView.DataController.RecordCount <= 0 then exit;
    val := AViewInfo.GridRecord.Values[dbgMailAttachmentsIsFileExists.Index];
    if not val then
      ACanvas.Font.Color := clRed;


    if (AViewInfo.Item = dbgMailAttachmentsIcon) then
        begin
          vIconHandle := GetRegistryIconHandle(AViewInfo.GridRecord.Values[dbgMailAttachmentsNAME.Index]);
          ACanvas.Brush.Color := clWhite;
          ACanvas.FillRect(AViewInfo.Bounds);
          DrawIconEx(ACanvas.Handle, AViewInfo.ClientBounds.Left + 1, AViewInfo.ClientBounds.Top + 1, vIconHandle, 16, 16, 0, 0, DI_NORMAL or DI_COMPAT);
          ADone := True;
        end;

  except
    abort;
  end;
end;


Это сообщение отредактировал(а) Akella - 5.1.2010, 22:50
PM MAIL   Вверх
den2005r
Дата 6.1.2010, 00:57 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Akella, благодарю но как всё это припаять Listview ??? smile 
PM MAIL   Вверх
Desperate
Дата 6.1.2010, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Вот из DRKB взято только немного под себя уже подкрутил, ты под себя подверти.
Суть в чем, жмем баттон 1 открывается опен диалог, в нем выбираем один и или несколько файлов ОК, все выбранное появляется в ListView с типом и иконкой, а так же дорисовал еще и отображение пути, так же сделал мультиселект в ListView и отображаются номера выбранных при нажатии второго батона. Но это уже для своих целей писалось. Вот код Юнита полностью:
Код

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    ListView1: TListView;
    Button1: TButton;
    ImageList1: TImageList;
    OpenDialog1: TOpenDialog;
    Edit1: TEdit;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
procedure LV_InsertFiles(strPath: string; ListView: TListView; ImageList: TImageList);
 var
   Icon: TIcon;
   ListItem: TListItem;
   FileInfo: SHFILEINFO;
 begin
   // Create a temporary TIcon
  Icon := TIcon.Create;
   ListView.Items.BeginUpdate;
   ListItem := ListView.Items.Add;
         //Get The DisplayName
          SHGetFileInfo(PChar(strPath), 0, FileInfo,
             SizeOf(FileInfo), SHGFI_DISPLAYNAME);
           Listitem.Caption := FileInfo.szDisplayName;
           // Get The TypeName
          SHGetFileInfo(PChar(strPath), 0, FileInfo,
             SizeOf(FileInfo), SHGFI_TYPENAME);
           ListItem.SubItems.Add(FileInfo.szTypeName);
           ListItem.SubItems.Add(strPath);
           //Get The Icon That Represents The File
          SHGetFileInfo(PChar(strPath ), 0, FileInfo,
             SizeOf(FileInfo), SHGFI_ICON or SHGFI_SMALLICON);
           icon.Handle := FileInfo.hIcon;
           ListItem.ImageIndex := ImageList.AddIcon(Icon);
           // Destroy the Icon
          DestroyIcon(FileInfo.hIcon);


     Icon.Free;
     ListView.Items.EndUpdate;
   end;



procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
begin
 // Assign a Imagelist to the ListView

 if OpenDialog1.Execute then
  begin
  ListView1.SmallImages:= ImageList1;
   // Show Listview in Report Style and add 2 Columns
  ListView1.ViewStyle := vsReport;
  for I := 0 to  Opendialog1.Files.Count- 1 do
     LV_InsertFiles(OpenDialog1.Files.Strings[i], ListView1, ImageList1);
   end;
  end;


procedure TForm1.Button2Click(Sender: TObject);
var i:integer;
begin
//Проверяем какие файлы выбраны в ListView1
    edit1.Clear;
 for I := 0 to  ListView1.Items.Count - 1 do
   if ListView1.Items.Item[i].Checked then Edit1.Text:=edit1.text+ inttostr(i)+' ';


end;

end.



Необходимы: ДВа батона, OpenDialog c включенным мультиселектом, ListView так же с включенным checkboxes, Edit и ImageList.

А теперь вопрос может кто подскажет как иконки сделать большими типа как если в вид переключить на большие или эскизы страницы?
PM MAIL   Вверх
artsb
Дата 6.1.2010, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

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



Народ, зачем так сложно. Есть же ExtractAssociatedIcon

Цитата(Desperate @  6.1.2010,  09:52 Найти цитируемый пост)
А теперь вопрос может кто подскажет как иконки сделать большими типа как если в вид переключить на большие или эскизы страницы? 

У ListView есть свойство LargeImages. Должно помочь.


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Akella
Дата 6.1.2010, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 8
Всего: 329



Цитата(den2005r @  6.1.2010,  00:57 Найти цитируемый пост)
Akella, благодарю но как всё это припаять Listview ??? smile  

Ну тебе дали работающий код и пример использования. Попробуй хоть сам чего-то сделать. Что не получается - спрашивай, код покажи.

Добавлено @ 11:48
Цитата(artsb @  6.1.2010,  10:49 Найти цитируемый пост)
Народ, зачем так сложно. Есть же ExtractAssociatedIcon


читай внимательнее  smile 


1. условие:
 
Цитата(den2005r @  5.1.2010,  20:19 Найти цитируемый пост)
(если файла не существует по этому пути



2. и что это за функция
Цитата
The ExtractAssociatedIcon function returns a handle to an indexed icon found in a file or an icon found in an associated executable file. 


Это сообщение отредактировал(а) Akella - 6.1.2010, 11:49
PM MAIL   Вверх
den2005r
Дата 6.1.2010, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Desperate, проблема в том файлов указываемых в listview не существует.
Akella, на там требует индекс а в твоем коде получается чистая иконкаа как иконку вклеить в listview на добавляемый раздел я незнаю... если знаешь подскажи пожалуйста
вот кусок кода
Код


 ListView1.Items.BeginUpdate;
with ListView1.Items.Add do
          begin
          Caption :='file.exe' ;
          ImageIndex:=1;<------сюда надо кидать номер иконки откуда а откуда я незнаю.и как чисто паять иконку даже не догадываюсь
          SubItems.Add('file.exe')
          end;
 ListView1.Items.EndUpdate;


Это сообщение отредактировал(а) den2005r - 6.1.2010, 16:04
PM MAIL   Вверх
artsb
Дата 6.1.2010, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

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



Цитата(Akella @  6.1.2010,  11:46 Найти цитируемый пост)
читай внимательнее

если честно, я этой фразы den2005r'а вообще не понял  smile 

Цитата(Akella @  6.1.2010,  11:46 Найти цитируемый пост)
и что это за функция

Возвращает хендл иконки, из указанного файла lpIconPath. Если сам файл не содержит иконок и является документом, то возвращается хендл соответствующей иконки. Так же эта функция работает и с ярлыками. В параметр lpiIcon заносится индекс иконки, а в lpIconPath путь к файлу из которого она была взята.


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Desperate
Дата 6.1.2010, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



den2005r, толком не понятно что ты имеешь ввиду, ну так догадываюсь что тебе нужно иконку ляпать на строку просто? Если да то вот набросал:
Можно использовать ImageList, по нему двойной клик и добавляй иконки какие хочешь. Затем в ListView в Properties->LargeImage или SmallImage выбираешь ImageList1 и такой код:
Код

ListView1.Items.BeginUpdate;
ListView1.Items.Add;
ListView1.Items.Item[0].Caption:='Мимя.ехе';
ListView1.Items.Item[0].ImageIndex:=0;
listview1.Items.EndUpdate;



imageIndex это и будет индекс иконки хранящейся в ImageList. или по твоему коду:
Код

ListView1.Items.BeginUpdate;
with ListView1.Items.Add do
          begin
          Caption :='file.exe' ;
          ImageIndex:=1;<------сюда надо кидать номер иконки откуда а откуда я незнаю.и как чисто паять иконку даже не догадываюсь
          SubItems.Add('file.exe')
          end;
 ListView1.Items.EndUpdate;



тоже самое, index и есть номер иконки в ImageList. Надеюсь правильно понял!
PM MAIL   Вверх
Akella
Дата 7.1.2010, 00:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 8
Всего: 329



Цитата(den2005r @  6.1.2010,  12:35 Найти цитируемый пост)
Akella, на там требует индекс а в твоем коде получается чистая иконкаа как иконку вклеить в listview на добавляемый раздел я незнаю... если знаешь подскажи пожалуйста
вот кусок кода

Я тебе пример ИСПОЛЬЗОВАНИЯ для чего дал?

Добавлено @ 00:04
А если в гугле поискать: иконка listview delphi
неужели ничего не будет?

Добавлено @ 00:11
Цитата(artsb @  6.1.2010,  16:46 Найти цитируемый пост)
Возвращает хендл иконки, из указанного файла lpIconPath. Если сам файл не содержит иконок и является документом, то возвращается хендл соответствующей иконки. Так же эта функция работает и с ярлыками. В параметр lpiIcon заносится индекс иконки, а в lpIconPath путь к файлу из которого она была взята. 

угу, прочитал smile
Цитата

The ExtractAssociatedIcon function first looks for the indexed icon in the file specified by lpIconPath. If the function cannot obtain the icon handle from that file, and the file has an associated executable file, it looks in that executable file for an icon. Associations with executable files are based on file name extensions, are stored in the per-user part of the registry, and can be defined using File Manager's Associate command.



M
Rrader
Все обсуждения, не касающиеся темы, удалены.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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