|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Не получается забороть listview
Делаю подобие каталогизатора файлов, большая часть готова, но застрял на обработке в listview. Смысл в том, чтобы можно было загонять файлы через Opendialog и в listview можно было бы двойным кликом открывать файлы.
1. Файлы закидываются. 2. Двойным кликом открываются. 3. Список файлов сохраняется в файл. А вот при следующем запуске программы и загрузке списка файлов из файла - всё подгружается, но двойной клик не работает. Выкладываю часть проги, которая относится именно к listview. Прошу помощи, listbox на форме чисто для проверки. |
#2
|
||||
|
||||
Цитата:
Код:
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
|
||||
|
||||
Большой сюрпиз вам приподнесет OpenDialog. Попробуйте выделить в нем скажем 1000 файлов и загнать в ваш ListView.
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#4
|
|||
|
|||
Цитата:
|
#5
|
|||
|
|||
Почему-то не сохраняются, и не загружаются иконки файлов. Пробовал сохранять поток тоже не выходит:
Код:
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
|
||||
|
||||
Цитата:
Код:
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
|
|||
|
|||
Спасибо, все получилось, а с файлами потом разбираться буду, пока так быстрей.
|
#8
|
|||
|
|||
Продолжаю мучить 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
|
||||
|
||||
Цитата:
Код:
... ListView1.Selected.SubItems.Strings[0] {индекс колонки для замены текста} := Edit1.Text; ... Цитата:
Код:
if FileExists('имя файла') then begin ... .. . end else ShowMessage('Нет файла!'); Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
Corwin13 (09.04.2013)
|
#10
|
|||
|
|||
С добавлением описания все заработало, а вот условие не подойдет. У меня файлы добавляются в listview и оттуда запускаются таким образом:
Код:
ShellExecute(Application.MainForm.Handle,'Open',PChar(ListView1.Selected.SubItems[1]),Nil,Nil,SW_SHOW); |
#11
|
||||
|
||||
Цитата:
Код:
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
|
|||
|
|||
Да, все работает. Спасибо.
|
#13
|
|||
|
|||
Пробую прикрутить поиск к своему 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
|
|||
|
|||
Заработала такая процедура, правда корявенько
Код:
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
|
||||
|
||||
А вы все так же используете OpenDialog ?
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |