|
Вопрос # 3 495/ вопрос открыт / |
|
Доброго времени суток, уважаемые эксперты!
Как получить файлs в TreeView как в проводнике? Чтобы в TreeView двойным щелчком я мог открыть файлы и любой из файлов переместить в listbox илив listView? Помагите пожалуйста весь интернет облазил ниче подобного не могу найти? Заранее большое большое спасибо!
 |
Вопрос задал: Kraken (статус: Посетитель)
Вопрос отправлен: 5 декабря 2009, 20:40
Состояние вопроса: открыт, ответов: 1.
|
Ответ #1. Отвечает эксперт: Жикльор
Здравствуйте, Kraken!
Наконец-то я закончил написание программы!!!!! Она ищет по всем жестком диске любые файлы и отображает их в иерархической структуре в TreeView. При перетягивании с TreeView в ListBox, получаем полный путь к файлу. По двойном щелчку по файлу в ListBox вы его открываете, правда только exe. Вот собственно и сам код:
З.Ы. В этом коде все файлы отображаются как папки, брал со стандартной библиотеки Дельфи иконки.
Приложение: Переключить в обычный режим- unit Unit1;
-
- interface
-
- uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs, ComCtrls, StdCtrls;
-
- type
- TForm1 = class(TForm)
- TreeView1: TTreeView;
- ListBox1: TListBox;
- Label1: TLabel;
- Label2: TLabel;
- procedure FormCreate(Sender: TObject);
- procedure TreeView1Expanding(Sender: TObject; Node: TTreeNode;
- var AllowExpansion: Boolean);
- procedure ListBox1DragDrop(Sender, Source: TObject; X, Y: Integer);
- procedure ListBox1DragOver(Sender, Source: TObject; X, Y: Integer;
- State: TDragState; var Accept: Boolean);
- procedure ListBox1DblClick(Sender: TObject);
- private
- { Private declarations }
- public
- { Public declarations }
- end;
-
- var
- Form1: TForm1;
- Count: integer;
-
- implementation
-
- {$R *.dfm}
- {$R FileCtrl}
-
- procedure NextLevel(ParentNode: TTreeNode);
- function DirectoryName(name: string): boolean;
- begin
- result := (name <> '.') and (name <> '..');
- end;
- var
- sr, srChild: TSearchRec;
- node: TTreeNode;
- path: string;
- begin
- node := ParentNode;
- path := '';
- repeat
- path := node.Text + '\' + path;
- node := node.Parent;
- until node = nil;
- if FindFirst(path + '*.*', faAnyFile, sr) = 0 then begin
- repeat
- if (sr.Attr and faAnyFile <> 0) and DirectoryName(sr.Name) then begin
- node := Form1.TreeView1.Items.AddChild(ParentNode, sr.Name);
- node.ImageIndex := 0;
- node.SelectedIndex := 1;
- node.HasChildren := false;
- if FindFirst(path + sr.Name + '\*.*', faAnyFile, srChild) = 0 then begin
- repeat
- if (srChild.Attr and faAnyFile <> 0) and DirectoryName(srChild.Name)
- then node.HasChildren := true;
- until (FindNext(srChild) <> 0) or node.HasChildren;
- end;
- FindClose(srChild);
- end;
- until FindNext(sr) <> 0;
- end else ParentNode.HasChildren := false;
- FindClose(sr);
- end;
-
- procedure TForm1.FormCreate(Sender: TObject);
- const
- IconNames: array [0..6] of string = ('CLOSEDFOLDER', 'OPENFOLDER',
- 'FLOPPY', 'HARD', 'NETWORK', 'CDROM', 'RAM');
- var
- c: char;
- s: string;
- node: TTreeNode;
- DriveType: integer;
- bm, mask: TBitmap;
- i: integer;
- begin
- TreeView1.Items.BeginUpdate;
- TreeView1.Images := TImageList.CreateSize(16, 16);
- bm := TBitmap.Create;
- mask := TBitmap.Create;
- for i := low(IconNames) to high(IconNames) do begin
- bm.Handle := LoadBitmap(HInstance, PChar(IconNames[i]));
- bm.Width := 16;
- bm.Height := 16;
- mask.Assign(bm);
- mask.Mask(clBlue);
- TreeView1.Images.Add(bm, mask);
- end;
- for c := 'A' to 'Z' do begin
- s := c + ':';
- DriveType := GetDriveType(PChar(s));
- if DriveType = 1 then continue;
- node := Form1.TreeView1.Items.AddChild(nil, s);
- case DriveType of
- DRIVE_REMOVABLE: node.ImageIndex := 2;
- DRIVE_FIXED: node.ImageIndex := 3;
- DRIVE_REMOTE: node.ImageIndex := 4;
- DRIVE_CDROM: node.ImageIndex := 5;
- else node.ImageIndex := 6;
- end;
- node.SelectedIndex := node.ImageIndex;
- node.HasChildren := true;
- end;
- TreeView1.Items.EndUpdate;
- end;
-
- procedure TForm1.TreeView1Expanding(Sender: TObject; Node: TTreeNode;
- var AllowExpansion: Boolean);
- begin
- TreeView1.Items.BeginUpdate;
- node.DeleteChildren;
- NextLevel(node);
- TreeView1.Items.EndUpdate;
- end;
-
- procedure TForm1.ListBox1DragDrop(Sender, Source: TObject; X, Y: Integer);
- var
- name: string;
- nod: TTreeNode;
- begin
- name := Form1.TreeView1.Selected.Text;
- nod := Form1.TreeView1.Selected;
- while true do
- begin
- if nod.Parent <> nil then
- begin
- name:=nod.Parent.Text + '/' + name;
- nod:=nod.Parent;
- end
- else
- break;
- end;
- Form1.ListBox1.Items.Add(name);
- end;
-
- procedure TForm1.ListBox1DragOver(Sender, Source: TObject; X, Y: Integer;
- State: TDragState; var Accept: Boolean);
- begin
- if Sender is TTreeView then Accept:=true;
- end;
-
- procedure TForm1.ListBox1DblClick(Sender: TObject);
- begin
- WinExec(PChar(Form1.ListBox1.Items[Form1.ListBox1.ItemIndex]),0);
- end;
-
- end.
 |
Ответ отправил: Жикльор (статус: 5-ый класс)
Время отправки: 6 декабря 2009, 02:51
Оценка за ответ: 5
|
Мини-форум вопроса
Всего сообщений: 21; последнее сообщение — 13 декабря 2009, 20:41; участников в обсуждении: 3.
Страницы: [1] [2] [Следующая »]
|
unl0K (статус: Посетитель), 5 декабря 2009, 20:47 [#1]:
А "ShellTreeView" для чего?
Относись к людям так, как хотел бы, чтобы они к тебе относились!
|
|
Жикльор (статус: 5-ый класс), 5 декабря 2009, 22:42 [#2]:
Если тебе нужна программа которая сделает это все в TreeView, то я могу написать ее тебе!
Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию.
|
|
Kraken (статус: Посетитель), 5 декабря 2009, 22:56 [#3]:
Да спасибо я был бы вам очень благодарен!
|
|
Жикльор (статус: 5-ый класс), 5 декабря 2009, 23:04 [#4]:
А тебе насколько примитивный вариант нужен?))
Чтобы каталоги были у виде дерева, и можно было запускать файлы оттуда?
Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию.
|
|
Жикльор (статус: 5-ый класс), 5 декабря 2009, 23:08 [#5]:
Если хочешь структуру у виде дерева, то используй поисковые функции FindFirst, FindNext, ихние атрибуты и т.д. А для запуска программы используй WinExec.
Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию.
|
|
Kraken (статус: Посетитель), 5 декабря 2009, 23:18 [#6]:
Ну да мне надо чтобы они были в виде дерева, запускать и перетаскивать их в листбокс, А в нём как раз таки мне надо чтобы он показывал его объём и когда был создан и изменён!да а можно сделать так чтобы их можно было открывать и из листбокса? если да то как это можно сделать?
|
|
Жикльор (статус: 5-ый класс), 5 декабря 2009, 23:31 [#7]:
Ну для всех этих случаев лучше использовать ShellTreeView, но для просто TreeView - это целая программа (и не маленькая).
Унлок!!!! Попробуем?))) Мне кажется более менее интересным, никогда не задумывался над этим, всегда ShellTreeView использовал))
Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию.
|
|
Kraken (статус: Посетитель), 6 декабря 2009, 00:10 [#8]:
А в ShellTreeView я пробовал перетаскивать в listbox но у меня ничего не получилось! незнаю почему может что не так делал! Если знаете как то подскажите! Ну вы попробуйте сделать это всё в TreeView! да мне надо сделать чтобы когда listbox перетаскиваешь из TreeView какой нибудь файл то чтобы listbox накапливал их(типа как хранилище). Я пробовал это сделать спомощью ini файлов он вроде накапливал но как открывать их от туда я незнаю. попробуйте сделать с помощью Ini файлов. вот мой примерный код:
procedure TForm1.lOAD ;
var
ini: TIniFile;
begin
ini := TIniFile.Create(ChangeFileExt(ParamStr(0),'.ini'));
ini.ReadSections( ListBox1.Items );
FreeAndNil(ini);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
ini: TIniFile;
fs: TFileStream;
begin
if OpenDialog1.Execute then begin
fs := TFileStream.Create(OpenDialog1.FileName,fmOpenRead);
ini := TIniFile.Create(ChangeFileExt(ParamStr(0),'.ini'));
ini.WriteBinaryStream( ExtractFileName(OpenDialog1.FileName), 'data', fs );
FreeAndNil(ini);
FreeAndNil(fs);
Load;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
n1,n2,n3,n4: TTreeNode ;
i: integer;
begin
Load;
n1 := TreeView1.Items.Add( NIL, 'n1' );
n2 := TreeView1.Items.AddChild( n1, 'n2' );
n1.Expand( True );
{n3 := TreeView1.Items.Add( n1, 'n3' );
n4 := TreeView1.Items.AddChild( n2, 'n4' ); }
n1 := TreeView1.Items.Add( NIL, 'p:' );
TreeView1.Items.AddChild( n1, 'x.txt' );
end;
Да и можно попросить если сделаете то сделайте коментарии а то всё таки интересно узнать как это делается а то так могу не понять!!!
|
|
Жикльор (статус: 5-ый класс), 6 декабря 2009, 01:31 [#9]:
Это будет немного дольше. Думаю, сегодня к вечеру сделаю примитивный вариант. Наброски уже есть (выводит каталоги в TreeView и перетаскивает в ListBox)
Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию.
|
|
Kraken (статус: Посетитель), 6 декабря 2009, 01:37 [#10]:
Спасибки. )). буду ждать!!!
|
|
Жикльор (статус: 5-ый класс), 6 декабря 2009, 01:49 [#11]:
Ух. Спать хочу!( У меня сейчас час ночи...
Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию.
|
|
Жикльор (статус: 5-ый класс), 6 декабря 2009, 18:47 [#12]:
А какие ошибки выбивает?
Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию.
|
|
Kraken (статус: Посетитель), 6 декабря 2009, 19:01 [#13]:
С ошибками я уже разобрался! Это я сам напортачил! Мне бы ещё коментарии, а то половино не понятно что написано! и Как бы сделать чтобы он всё открывал а не только .ехе ! хотябы примерно!
|
|
Жикльор (статус: 5-ый класс), 6 декабря 2009, 19:12 [#14]:
ссылка
Это исходник с коментариями.
Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию.
|
|
Kraken (статус: Посетитель), 6 декабря 2009, 19:46 [#15]:
Большое вам спасибо! Если будут в дальнейшем какие либо вопросы обезательно буду обращатся к вам!
|
|
Жикльор (статус: 5-ый класс), 6 декабря 2009, 19:54 [#16]:
Не за что!))
Но чтобы открыть любой файл, нужно знать сопоставимую ему программу и знать ее путь. Тогда через ShellExecute нужно задать путь к программе + путь к открываемому файлу. Если хотите, то вот код, который откроет djvu-файл с помощью Фоксит Ридера:
procedure TForm1.Button1Click(Sender: TObject);
var app, appdir: PChar;
begin
app:='C:\Program Files\Foxit Software\Foxit Reader\Foxit Reader.exe';
appdir:='C:\Program Files\Foxit Software\Foxit Reader';
shellexecute(0,'open',app,'C:\xakep_Pdf2007end.djvu');
Если я где-то пропустил запятую то извиняюсь. И нужно в разделе uses подключить модуль ShellAPI.
Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию.
|
|
Kraken (статус: Посетитель), 6 декабря 2009, 20:04 [#17]:
Спасибо! Тока мне в основно нужно не прграммы открывать а doc, jpg... ну тоесть картинки, вордовские документы, тхт шные файлы... Их можно каким либо способом открыть из listbox?
|
|
Жикльор (статус: 5-ый класс), 6 декабря 2009, 20:31 [#18]:
Можно, но вышеуказанным.
Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию.
|
|
Kraken (статус: Посетитель), 13 декабря 2009, 20:12 [#19]:
Здравствуйте! у меня вопрос есть не подскажите? У меня есть база данных сделанная через BDE. Там восновном DBEdit использованы. А как мне сделать чтобы при нажатии кнопки вся информация из них копировалась в EXEL или Word?
|
|
Жикльор (статус: 5-ый класс), 13 декабря 2009, 20:31 [#20]:
Извините, но на БД я не очень специализируюсь.
Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию.
|
Страницы: [1] [2] [Следующая »]
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|