![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Делаю подобие каталогизатора файлов, большая часть готова, но застрял на обработке в 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 ?
|