Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 3 495

/ вопрос открыт /

Доброго времени суток, уважаемые эксперты!
Как получить файлs в TreeView как в проводнике? Чтобы в TreeView двойным щелчком я мог открыть файлы и любой из файлов переместить в listbox илив listView? Помагите пожалуйста весь интернет облазил ниче подобного не могу найти? Заранее большое большое спасибо!

Kraken Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Kraken (статус: Посетитель)
Вопрос отправлен: 5 декабря 2009, 20:40
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: Жикльор

Здравствуйте, Kraken!

Наконец-то я закончил написание программы!!!!! Она ищет по всем жестком диске любые файлы и отображает их в иерархической структуре в TreeView. При перетягивании с TreeView в ListBox, получаем полный путь к файлу. По двойном щелчку по файлу в ListBox вы его открываете, правда только exe. Вот собственно и сам код:

З.Ы. В этом коде все файлы отображаются как папки, брал со стандартной библиотеки Дельфи иконки.

Приложение:
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7. Dialogs, ComCtrls, StdCtrls;
  8.  
  9. type
  10. TForm1 = class(TForm)
  11. TreeView1: TTreeView;
  12. ListBox1: TListBox;
  13. Label1: TLabel;
  14. Label2: TLabel;
  15. procedure FormCreate(Sender: TObject);
  16. procedure TreeView1Expanding(Sender: TObject; Node: TTreeNode;
  17. var AllowExpansion: Boolean);
  18. procedure ListBox1DragDrop(Sender, Source: TObject; X, Y: Integer);
  19. procedure ListBox1DragOver(Sender, Source: TObject; X, Y: Integer;
  20. State: TDragState; var Accept: Boolean);
  21. procedure ListBox1DblClick(Sender: TObject);
  22. private
  23. { Private declarations }
  24. public
  25. { Public declarations }
  26. end;
  27.  
  28. var
  29. Form1: TForm1;
  30. Count: integer;
  31.  
  32. implementation
  33.  
  34. {$R *.dfm}
  35. {$R FileCtrl}
  36.  
  37. procedure NextLevel(ParentNode: TTreeNode);
  38. function DirectoryName(name: string): boolean;
  39. begin
  40. result := (name <> '.') and (name <> '..');
  41. end;
  42. var
  43. sr, srChild: TSearchRec;
  44. node: TTreeNode;
  45. path: string;
  46. begin
  47. node := ParentNode;
  48. path := '';
  49. repeat
  50. path := node.Text + '&#092;' + path;
  51. node := node.Parent;
  52. until node = nil;
  53. if FindFirst(path + '*.*', faAnyFile, sr) = 0 then begin
  54. repeat
  55. if (sr.Attr and faAnyFile <> 0) and DirectoryName(sr.Name) then begin
  56. node := Form1.TreeView1.Items.AddChild(ParentNode, sr.Name);
  57. node.ImageIndex := 0;
  58. node.SelectedIndex := 1;
  59. node.HasChildren := false;
  60. if FindFirst(path + sr.Name + '&#092;*.*', faAnyFile, srChild) = 0 then begin
  61. repeat
  62. if (srChild.Attr and faAnyFile <> 0) and DirectoryName(srChild.Name)
  63. then node.HasChildren := true;
  64. until (FindNext(srChild) <> 0) or node.HasChildren;
  65. end;
  66. FindClose(srChild);
  67. end;
  68. until FindNext(sr) <> 0;
  69. end else ParentNode.HasChildren := false;
  70. FindClose(sr);
  71. end;
  72.  
  73. procedure TForm1.FormCreate(Sender: TObject);
  74. const
  75. IconNames: array [0..6] of string = ('CLOSEDFOLDER', 'OPENFOLDER',
  76. 'FLOPPY', 'HARD', 'NETWORK', 'CDROM', 'RAM');
  77. var
  78. c: char;
  79. s: string;
  80. node: TTreeNode;
  81. DriveType: integer;
  82. bm, mask: TBitmap;
  83. i: integer;
  84. begin
  85. TreeView1.Items.BeginUpdate;
  86. TreeView1.Images := TImageList.CreateSize(16, 16);
  87. bm := TBitmap.Create;
  88. mask := TBitmap.Create;
  89. for i := low(IconNames) to high(IconNames) do begin
  90. bm.Handle := LoadBitmap(HInstance, PChar(IconNames[i]));
  91. bm.Width := 16;
  92. bm.Height := 16;
  93. mask.Assign(bm);
  94. mask.Mask(clBlue);
  95. TreeView1.Images.Add(bm, mask);
  96. end;
  97. for c := 'A' to 'Z' do begin
  98. s := c + ':';
  99. DriveType := GetDriveType(PChar(s));
  100. if DriveType = 1 then continue;
  101. node := Form1.TreeView1.Items.AddChild(nil, s);
  102. case DriveType of
  103. DRIVE_REMOVABLE: node.ImageIndex := 2;
  104. DRIVE_FIXED: node.ImageIndex := 3;
  105. DRIVE_REMOTE: node.ImageIndex := 4;
  106. DRIVE_CDROM: node.ImageIndex := 5;
  107. else node.ImageIndex := 6;
  108. end;
  109. node.SelectedIndex := node.ImageIndex;
  110. node.HasChildren := true;
  111. end;
  112. TreeView1.Items.EndUpdate;
  113. end;
  114.  
  115. procedure TForm1.TreeView1Expanding(Sender: TObject; Node: TTreeNode;
  116. var AllowExpansion: Boolean);
  117. begin
  118. TreeView1.Items.BeginUpdate;
  119. node.DeleteChildren;
  120. NextLevel(node);
  121. TreeView1.Items.EndUpdate;
  122. end;
  123.  
  124. procedure TForm1.ListBox1DragDrop(Sender, Source: TObject; X, Y: Integer);
  125. var
  126. name: string;
  127. nod: TTreeNode;
  128. begin
  129. name := Form1.TreeView1.Selected.Text;
  130. nod := Form1.TreeView1.Selected;
  131. while true do
  132. begin
  133. if nod.Parent <> nil then
  134. begin
  135. name:=nod.Parent.Text + '/' + name;
  136. nod:=nod.Parent;
  137. end
  138. else
  139. break;
  140. end;
  141. Form1.ListBox1.Items.Add(name);
  142. end;
  143.  
  144. procedure TForm1.ListBox1DragOver(Sender, Source: TObject; X, Y: Integer;
  145. State: TDragState; var Accept: Boolean);
  146. begin
  147. if Sender is TTreeView then Accept:=true;
  148. end;
  149.  
  150. procedure TForm1.ListBox1DblClick(Sender: TObject);
  151. begin
  152. WinExec(PChar(Form1.ListBox1.Items[Form1.ListBox1.ItemIndex]),0);
  153. end;
  154.  
  155. end.


Ответ отправил: Жикльор (статус: 5-ый класс)
Время отправки: 6 декабря 2009, 02:51
Оценка за ответ: 5


Мини-форум вопроса

Всего сообщений: 21; последнее сообщение — 13 декабря 2009, 20:41; участников в обсуждении: 3.

Страницы: [1] [2] [Следующая »]

unl0K

unl0K (статус: Посетитель), 5 декабря 2009, 20:47 [#1]:

А "ShellTreeView" для чего?
Относись к людям так, как хотел бы, чтобы они к тебе относились!
Жикльор

Жикльор (статус: 5-ый класс), 5 декабря 2009, 22:42 [#2]:

Если тебе нужна программа которая сделает это все в TreeView, то я могу написать ее тебе!
Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию.
Kraken

Kraken (статус: Посетитель), 5 декабря 2009, 22:56 [#3]:

Да спасибо я был бы вам очень благодарен!
Жикльор

Жикльор (статус: 5-ый класс), 5 декабря 2009, 23:04 [#4]:

А тебе насколько примитивный вариант нужен?))
Чтобы каталоги были у виде дерева, и можно было запускать файлы оттуда?
Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию.
Жикльор

Жикльор (статус: 5-ый класс), 5 декабря 2009, 23:08 [#5]:

Если хочешь структуру у виде дерева, то используй поисковые функции FindFirst, FindNext, ихние атрибуты и т.д. А для запуска программы используй WinExec.
Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию.
Kraken

Kraken (статус: Посетитель), 5 декабря 2009, 23:18 [#6]:

Ну да мне надо чтобы они были в виде дерева, запускать и перетаскивать их в листбокс, А в нём как раз таки мне надо чтобы он показывал его объём и когда был создан и изменён!да а можно сделать так чтобы их можно было открывать и из листбокса? если да то как это можно сделать?
Жикльор

Жикльор (статус: 5-ый класс), 5 декабря 2009, 23:31 [#7]:

Ну для всех этих случаев лучше использовать ShellTreeView, но для просто TreeView - это целая программа (и не маленькая).

Унлок!!!! Попробуем?))) Мне кажется более менее интересным, никогда не задумывался над этим, всегда ShellTreeView использовал))
Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию.
Kraken

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

Kraken (статус: Посетитель), 6 декабря 2009, 01:37 [#10]:

Спасибки. :))). буду ждать!!!
Жикльор

Жикльор (статус: 5-ый класс), 6 декабря 2009, 01:49 [#11]:

Ух. Спать хочу!( У меня сейчас час ночи...
Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию.
Жикльор

Жикльор (статус: 5-ый класс), 6 декабря 2009, 18:47 [#12]:

А какие ошибки выбивает?
Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию.
Kraken

Kraken (статус: Посетитель), 6 декабря 2009, 19:01 [#13]:

С ошибками я уже разобрался! Это я сам напортачил! Мне бы ещё коментарии, а то половино не понятно что написано! и Как бы сделать чтобы он всё открывал а не только .ехе ! хотябы примерно!
Жикльор

Жикльор (статус: 5-ый класс), 6 декабря 2009, 19:12 [#14]:

ссылка

Это исходник с коментариями.
Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию.
Kraken

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

Kraken (статус: Посетитель), 6 декабря 2009, 20:04 [#17]:

Спасибо! Тока мне в основно нужно не прграммы открывать а doc, jpg... ну тоесть картинки, вордовские документы, тхт шные файлы... Их можно каким либо способом открыть из listbox?
Жикльор

Жикльор (статус: 5-ый класс), 6 декабря 2009, 20:31 [#18]:

Можно, но вышеуказанным.
Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию.
Kraken

Kraken (статус: Посетитель), 13 декабря 2009, 20:12 [#19]:

Здравствуйте! у меня вопрос есть не подскажите? У меня есть база данных сделанная через BDE. Там восновном DBEdit использованы. А как мне сделать чтобы при нажатии кнопки вся информация из них копировалась в EXEL или Word?
Жикльор

Жикльор (статус: 5-ый класс), 13 декабря 2009, 20:31 [#20]:

Извините, но на БД я не очень специализируюсь.
Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию.

Страницы: [1] [2] [Следующая »]

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:44
Выполнено за 0.03 сек.