Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 05.04.2013, 18:05
Corwin13 Corwin13 вне форума
Прохожий
 
Регистрация: 05.04.2013
Сообщения: 20
Версия Delphi: Enterprise 7.0
Репутация: 10
По умолчанию Не получается забороть listview

Делаю подобие каталогизатора файлов, большая часть готова, но застрял на обработке в listview. Смысл в том, чтобы можно было загонять файлы через Opendialog и в listview можно было бы двойным кликом открывать файлы.
1. Файлы закидываются.
2. Двойным кликом открываются.
3. Список файлов сохраняется в файл.

А вот при следующем запуске программы и загрузке списка файлов из файла - всё подгружается, но двойной клик не работает.

Выкладываю часть проги, которая относится именно к listview.

Прошу помощи, listbox на форме чисто для проверки.
Вложения
Тип файла: rar proba.rar (215.2 Кбайт, 20 просмотров)
Ответить с цитированием
  #2  
Старый 05.04.2013, 19:23
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от Corwin13
...при следующем запуске программы и загрузке списка файлов из файла - всё подгружается, но двойной клик не работает...
Код:
procedure TForm1.ListView1DblClick(Sender: TObject);
begin
ShellExecute(Application.MainForm.Handle,'Open',PChar(ListView1.Selected.SubItems[0]),Nil,Nil,SW_SHOW);
end;
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
Corwin13 (09.04.2013)
  #3  
Старый 05.04.2013, 19:55
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Большой сюрпиз вам приподнесет OpenDialog. Попробуйте выделить в нем скажем 1000 файлов и загнать в ваш ListView.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #4  
Старый 05.04.2013, 21:08
Corwin13 Corwin13 вне форума
Прохожий
 
Регистрация: 05.04.2013
Сообщения: 20
Версия Delphi: Enterprise 7.0
Репутация: 10
По умолчанию

Цитата:
Сообщение от Alegun
Код:
procedure TForm1.ListView1DblClick(Sender: TObject);
begin
ShellExecute(Application.MainForm.Handle,'Open',PChar(ListView1.Selected.SubItems[0]),Nil,Nil,SW_SHOW);
end;
Вот большое спасибо, уже дня 3 с этой засадой сидел, вся работа встала. Благодарю.
Ответить с цитированием
  #5  
Старый 07.04.2013, 00:30
Corwin13 Corwin13 вне форума
Прохожий
 
Регистрация: 05.04.2013
Сообщения: 20
Версия Delphi: Enterprise 7.0
Репутация: 10
По умолчанию

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

Код:
var
Writer : TWriter;
FileStream : TFileStream;

begin

if SaveDialog1.Execute then begin
FileStream:=TFileStream.Create(SaveDialog1.FileName,fmOpenWrite or fmCreate);
Writer := TWriter.Create(FileStream, SizeOf(ListView1));
Writer.WriteRootComponent(ListView1);
Writer.Free;
FileStream.Free;

Загрузка:
Код:
var
reader : TReader;
FileStream : TFileStream;
begin

if OpenDialog1.Execute then begin
FileStream:=TFileStream.Create(OpenDialog1.FileName,fmOpenread);
Reader := TReader.Create(FileStream, SizeOf(ListView1));
Reader.ReadRootComponent(ListView1);
Reader.Free;
FileStream.Free;
Ответить с цитированием
  #6  
Старый 07.04.2013, 06:42
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от Corwin13
...не сохраняются, и не загружаются иконки файлов...
И не будут - при загрузке ListView "подсовывается" пустой ImageList, иконок там нет и нечего грузить. Чтоб это исправить, замените в своём коде процедуры сохранения\загрузки на эти
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  FStr: TFileStream;
  MemStr: TMemoryStream;
  i: integer;
begin
  FStr:= TFileStream.Create('c:\ImageList1.sav', fmCreate);
  MemStr:= TMemoryStream.Create;
  MemStr.WriteComponent(ImageList1);
  MemStr.Position:= 0;
  ObjectBinaryToText(MemStr, FStr);
  MemStr.Free;
  FStr.Free;

  SaveListViewToFile1(ListView1, 'C:\1.sav');
 ListBox1.Items.SaveToFile('c:\lisbox.txt');
end;

procedure TForm1.Button2Click(Sender: TObject);

var
  FStr: TFileStream;
  MemStr: TMemoryStream;
ListItem: TListItem;
begin

    FStr:= TFileStream.Create('c:\ImageList1.sav', fmOpenRead);
    MemStr:= TMemoryStream.Create;
    ObjectTextToBinary(FStr, MemStr);
    MemStr.Position:= 0;
    MemStr.ReadComponent(ImageList1);
    MemStr.Free;
    FStr.Free;

   ListView1.SmallImages:= ImageList1;
ListView1.Items.BeginUpdate;
LoadListViewToFile1(ListView1, 'C:\1.sav');
ListBox1.Items.LoadFromFile('c:\lisbox.txt');
ListView1.Items.EndUpdate;
 end;
замечание - файлов сохранения становится всё больше и хранить их, наверное, лучше в отдельной папке.
Ответить с цитированием
  #7  
Старый 07.04.2013, 11:37
Corwin13 Corwin13 вне форума
Прохожий
 
Регистрация: 05.04.2013
Сообщения: 20
Версия Delphi: Enterprise 7.0
Репутация: 10
По умолчанию

Спасибо, все получилось, а с файлами потом разбираться буду, пока так быстрей.
Ответить с цитированием
  #8  
Старый 09.04.2013, 18:08
Corwin13 Corwin13 вне форума
Прохожий
 
Регистрация: 05.04.2013
Сообщения: 20
Версия Delphi: Enterprise 7.0
Репутация: 10
По умолчанию

Продолжаю мучить listview. В процедуре добавления файлов есть 6 колонок:
1. Имя
2. Описание
3. Путь
4. Размер
5. Дата
6. Тип

все данные вычитываются из файла, хочу сделать добавление описания к файлу. Сам код добавления файлов:

Код:
procedure LV_InsertFiles(strPath: string; ListView1: TListView; ImageList1: TImageList);
 var
   Icon: TIcon;
   ListItem: TListItem;
   FileInfo: SHFILEINFO;
   sr: TSearchRec;



  NewColumn: TListColumn;

   FilePath: string;
   ext: string;
   IconIndex: word;
   ImageList: TImageList;
   FileName: String;
   SysIL   : THandle;
 SysSIL  : THandle;
 SFI     : TSHFileInfo;
  D : TDateTime;
   i, f: Integer;
  APath: string;
  Descrition: string;
begin

        
  Icon := TIcon.Create;
   ListView1.Items.BeginUpdate;
   i := FindFirst(strPath + '*.*', faAnyFile, SR);

   ListItem := ListView1.Items.Add;
         
          SHGetFileInfo(PChar(strPath), 0, FileInfo,
             SizeOf(FileInfo), SHGFI_DISPLAYNAME);
          Listitem.Caption := FileInfo.szDisplayName;
          
          ListItem.SubItems.Add(Descrition);
          SHGetFileInfo(PChar(strPath), 0, FileInfo,SizeOf(FileInfo), SHGFI_TYPENAME);

           ListItem.SubItems.Add(strPath);

            if sr.Size < 1024 then
        ListItem.SubItems.Add(IntToStr(sr.Size) + ' Байт')
      else
      if sr.Size < 1024 * 1024 then
        ListItem.SubItems.Add(IntToStr(round(sr.Size / 1024)) + ' KБайт')
      else
        ListItem.SubItems.Add(IntToStr(round(sr.Size / (1024 * 1024))) + ' MБайт');
          ListItem.SubItems.Add(DateToStr(FileDateToDateTime(SR.Time)));

           SHGetFileInfo(PChar(strPath), 0, FileInfo,
             SizeOf(FileInfo), SHGFI_TYPENAME);
           ListItem.SubItems.Add(FileInfo.szTypeName);
          

          SHGetFileInfo(PChar(strPath ), 0, FileInfo,
             SizeOf(FileInfo), SHGFI_ICON or SHGFI_SMALLICON);
           icon.Handle := FileInfo.hIcon;
           ListItem.ImageIndex := ImageList1.AddIcon(Icon);

         
     ListView1.Items.EndUpdate;

     
     end;

Пока что добавил ListItem.SubItems.Add(Descrition); чтобы колонки не съезжали. Пробую добавить описание такой процедурой:

Код:
procedure TDialog.OKBtnClick(Sender: TObject);


begin
form1.ListView1.Selected.SubItems.Text:=Edit1.Text;

Close;
end;
,
описание добавляется, но при этом удаляются все остальные колонки кроме названия файла. Не могу найти как делать вставку, а получается замена колонок.

И ещё вопрос, как составить условие на открытие файлов? Скажем:

if Listview1.Selected.SubItems не открывается then
begin
MessageDlg('Нет доступа к файлу!');
exit;
типа того.
Заранее благодарю всех за помощь.
Ответить с цитированием
  #9  
Старый 09.04.2013, 20:28
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от Corwin13
...описание добавляется, но при этом удаляются все остальные колонки кроме названия файла...
Код:
...
ListView1.Selected.SubItems.Strings[0] {индекс колонки для замены текста}   := Edit1.Text;
...

Цитата:
...как составить условие на открытие файлов?
проверка существования файла
Код:
 if  FileExists('имя файла')  then 
begin
...
..
.
end else 
ShowMessage('Нет файла!'); 
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
Corwin13 (09.04.2013)
  #10  
Старый 09.04.2013, 21:58
Corwin13 Corwin13 вне форума
Прохожий
 
Регистрация: 05.04.2013
Сообщения: 20
Версия Delphi: Enterprise 7.0
Репутация: 10
По умолчанию

С добавлением описания все заработало, а вот условие не подойдет. У меня файлы добавляются в listview и оттуда запускаются таким образом:

Код:
ShellExecute(Application.MainForm.Handle,'Open',PChar(ListView1.Selected.SubItems[1]),Nil,Nil,SW_SHOW);
Ответить с цитированием
  #11  
Старый 09.04.2013, 22:05
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от Corwin13
...условие не подойдет...
Так какие праблы
Код:
 if  FileExists(ListView1.Selected.SubItems[1])  then 
ShellExecute(Application.MainForm.Handle,'Open',PChar(ListView1.Selected.SubItems[1]),Nil,Nil,SW_SHOW) 
else 
ShowMessage('Файла не существует!'
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
Corwin13 (09.04.2013)
  #12  
Старый 09.04.2013, 22:48
Corwin13 Corwin13 вне форума
Прохожий
 
Регистрация: 05.04.2013
Сообщения: 20
Версия Delphi: Enterprise 7.0
Репутация: 10
По умолчанию

Да, все работает. Спасибо.
Ответить с цитированием
  #13  
Старый 13.04.2013, 16:22
Corwin13 Corwin13 вне форума
Прохожий
 
Регистрация: 05.04.2013
Сообщения: 20
Версия Delphi: Enterprise 7.0
Репутация: 10
По умолчанию

Пробую прикрутить поиск к своему listview через процедуру:
Код:
procedure TForm1.Edit2Change(Sender: TObject);

var i:integer;
    s:ShortString;
begin

  for i:=0 to Listview1.Items.count-1 do begin
    s:=Ansiuppercase(system.Copy(form1.ListView1.Items[i].Caption,0,length(edit2.Text)));
    if Ansiuppercase(Edit2.text)=s then begin
       Listview1.Items[i].Selected:=true;
       Listview1.ItemFocused:=Listview1.items[i];
       Listview1.ItemIndex:=i;
       break;
    end;
  end;
  if Listview1.ItemFocused<>nil then
     Listview1.ItemFocused.MakeVisible(true);
end;
,
однако не работает. В чем может быть загвоздка?
Ответить с цитированием
  #14  
Старый 13.04.2013, 19:56
Corwin13 Corwin13 вне форума
Прохожий
 
Регистрация: 05.04.2013
Сообщения: 20
Версия Delphi: Enterprise 7.0
Репутация: 10
По умолчанию

Заработала такая процедура, правда корявенько
Код:
var
rct:TRECT;
i: integer;
s:ShortString;
const LVM_GETITEMRECT=4110;  LVIR_BOUNDS=0;
begin
for i:=0 to ListView1.Items.Count-1  do

begin
 s:=Ansiuppercase(system.Copy(form1.ListView1.Items[i].Caption,0,length(edit1.Text)));
 if Ansiuppercase(Edit1.text)=s then
 
begin
ListView1.Selected:=ListView1.Items[i];
rct.Left:=0;
SendMessage(ListView1.Handle,LVM_GETITEMRECT,0,integer(@rct));
ListView1.Scroll(0,(i-ListView1.TopItem.Index)*(rct.Bottom-rct.Top));


 Listview1.SetFocus;

Проблема в том, что при вводе первой буквы, находит файл и переходит на него, чтобы ввести следующую букву нужно
тыркать в edit. Понятно, что это из-за Listview1.SetFocus;, но без этого не происходит подсветки строки, как можно переделать, чтобы фокус оставался на edit`e, но при этом была подсветка найденной строки?

Последний раз редактировалось Corwin13, 13.04.2013 в 20:05.
Ответить с цитированием
  #15  
Старый 13.04.2013, 20:04
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

А вы все так же используете OpenDialog ?
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 18:26.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter