Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.01.23;
Скачать: CL | DM;

Вниз

Псевдо проводник.   Найти похожие ветки 

 
zt50 ©   (2005-01-03 23:22) [0]

Допустим есть файл в котором лежат записи вида:
"COMMON\GRAPHICS\AVIS\FILECOPY.AVI
COMMON\GRAPHICS\AVIS\FILEDEL.AVI
COMMON\GRAPHICS\AVIS\FILEDELR.AVI
COMMON\GRAPHICS\AVIS\FILEMOVE.AVI
COMMON\GRAPHICS\AVIS\FILENUKE.AVI
COMMON\GRAPHICS\AVIS\FINDCOMP.AVI
COMMON\GRAPHICS\AVIS\FINDFILE.AVI
COMMON\GRAPHICS\AVIS\SEARCH.AVI
COMMON\GRAPHICS\BITMAPS\ASSORTED\BALLOON.BMP
COMMON\GRAPHICS\BITMAPS\ASSORTED\BEANY.BMP
COMMON\GRAPHICS\BITMAPS\ASSORTED\BELL.BMP
COMMON\GRAPHICS\BITMAPS\ASSORTED\CALENDAR.BMP
COMMON\GRAPHICS\BITMAPS\ASSORTED\CAMCORD.BMP
COMMON\GRAPHICS\BITMAPS\ASSORTED\CARD.BMP
COMMON\GRAPHICS\BITMAPS\ASSORTED\CLUB.BMP
COMMON\GRAPHICS\BITMAPS\ASSORTED\CUP.BMP
COMMON\GRAPHICS\BITMAPS\ASSORTED\DELETE.BMP
COMMON\GRAPHICS\BITMAPS\ASSORTED\DIAMOND.BMP
COMMON\GRAPHICS\BITMAPS\ASSORTED\ENVELOPE.BMP
COMMON\GRAPHICS\BITMAPS\ASSORTED\FISH.BMP
COMMON\GRAPHICS\BITMAPS\ASSORTED\HAND.BMP
COMMON\GRAPHICS\BITMAPS\ASSORTED\HAPPY.BMP
COMMON\GRAPHICS\BITMAPS\ASSORTED\HEART.BMP
COMMON\GRAPHICS\BITMAPS\ASSORTED\INTL_NO.BMP
COMMON\GRAPHICS\BITMAPS\ASSORTED\KEY.BMP
COMMON\GRAPHICS\BITMAPS\ASSORTED\MAIL.BMP
COMMON\GRAPHICS\BITMAPS\ASSORTED\NOTE.BMP
..."
Как сделать так, чтобы папки отобразились в TREEVIEW(!) ПРАВИЛЬНО(!!! Т.е. чтобы они не повторялись, лежали пра)... Я уже из сил выбился! Не знаю... Помогите plz!


 
KilkennyCat ©   (2005-01-03 23:42) [1]

Возможно, неоптимально, но надежно:
Получаем строку := "полный путь к файлу", начинаем выделять имена слева направо до слэша, уменьшая на полученное, и запоминая уровень вложенности, проверяем по всему дереву... если, есть совпадение по уровню и по наименованию, запоминаем ветку дерева и цикл повторяем, но уже в этой ветке; если совпадения нет - добавляем, и цикл снова повторяем для оставшегося пути но уже только для созданной ветки.

например:

Дерево пусто.

получаем COMMON, 1 уровень. проверяем по дереву - ветки нет, создаем, запоминаем созданную ветку. проверяем GRAPHICS... и так до конца.
Берем следующую строку, снова получаем СOMMON, 1 уровень. Проверяем все ветки первого уровня в дереве, находим такую, запоминаем. Получаем GRAPHICS, 2 уровень, проверяем в ветке СOMMON все ее корневые ветки... и так далее.
В принципе, запоминание уровней излишне, просто мне показалось, что так понятней будет.


 
zt50 ©   (2005-01-04 00:49) [2]

Я так и делал... вот олько ни чего у меня не получилось(


 
Fay ©   (2005-01-04 01:07) [3]

zt50 ©   (03.01.05 23:22)
Возможно, Вы ошиблись где-то. Возможно, в 17-й строке.


 
Gero ©   (2005-01-04 01:23) [4]


> Возможно, в 17-й строке.

Очень вероятно, кстати.


 
KilkennyCat ©   (2005-01-04 01:51) [5]


> zt50 ©  

это они намекают, что нехило бы код показать, иначе сказать об ошибке нечего.


 
zt50 ©   (2005-01-04 12:25) [6]

Говорить мне, что код даже не смахивает на рациональный не надо...


unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, fdb, ComCtrls;

type
 TForm1 = class(TForm)
   Button1: TButton;
   Memo1: TMemo;
   ListView1: TListView;
   Button2: TButton;
   TreeView1: TTreeView;
   Button3: TButton;
   procedure Button1Click(Sender: TObject);
   procedure Button2Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;
 dirs:TTreeNode;
 nodes:TTreeNodes;
 Root:TList;
 RootDirs:TList;
 ChildDirs:TList;

implementation

{$R *.dfm}

procedure ScanDir(StartDir, Mask: String; List: TStrings);
var
SearchRec: TSearchRec;
SD:string;
begin
 if Mask = "" then Mask:= "*.*";
 if StartDir[Length(StartDir)] <> "\" then StartDir := StartDir + "\";
 if FindFirst(StartDir+Mask, faAnyFile, SearchRec) = 0 then
 begin
  repeat
   Application.ProcessMessages;
    if (SearchRec.Attr and faDirectory) <> faDirectory then begin
     SD:=startdir;
     delete(sd,1,3);
     List.Add(SD + SearchRec.Name);
     end
    else if (SearchRec.Name <> "..") and (SearchRec.Name <> ".") then
     ScanDir(StartDir + SearchRec.Name + "\",Mask,List);
   until FindNext(SearchRec) <> 0;
   FindClose(SearchRec);
 end;
end;

function slash(s:string):boolean;
var
i:integer;
begin
result:=true;
for i:=1 to length(s) do
  if s[i] = "\" then begin result:=false; break; end;

end;

procedure TForm1.Button1Click(Sender: TObject);
var
list: TStrings;
begin
list:= TStringList.Create;
ScanDir("g:\", "*.*", list);
Memo1.Lines:= list;
list.SaveToFile("c:\tft.txt");
list.Free;
end;

procedure CreateItem(cap:string);
var
item:TListItem;
begin
Item:=Form1.ListView1.Items.Add;
Item.Caption:=cap;
end;

procedure CreateChildDir(cap:string);
var
i,j,q:integer;
s:string;
begin
for i:=1 to length(cap) do
if cap[i] = "\" then begin
 s:=cap;
 delete(s,i,length(s)-i+1);
 delete(cap,1,i+1);

 break;
end;
end;

function CheckRoot(cap:string):boolean;
var
j:integer;
begin
result:=false;
if root.count > 1 then
for j:=0 to root.count-1 do
  if cap = TTreeNode(Root.Items[j]).Text then begin result:=true; break; end;
end;

procedure CreateDir(cap:string);
var
i:integer;
s:string;
dir:TTreeNode;
begin
s:="";
for i:=1 to length(cap) do
if cap[i] = "\" then begin
 s:=cap;
 delete(s,i,length(s));
 delete(cap,1,i);
 if CheckRoot(cap) = false then
  begin
   dir:=TTreeNode.create(nodes);
   dir:=Form1.TreeView1.Items.AddNode(dir,dirs,s,nil,naadd);
   dir.Item[1].Item[1].Item[1]:=root.Add(dir);
  end;
 break;
end;
end;

procedure view;
var
s:string;
list:TStrings;
i:integer;
begin
root:=TList.create;
nodes:=TTreeNodes.Create(form1.TreeView1);
dirs:=TTreeNode.create(nodes);
list:= TStringList.Create;
list.LoadFromFile("c:\tft.txt");
for i:=0 to list.Count-1 do
begin
  if slash(list.Strings[i]) then CreateItem(list.Strings[i]);
  if slash(list.Strings[i]) = false then CreateDir(list.Strings[i])
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
view;
end;

end.


 
MBo ©   (2005-01-04 12:40) [7]

http://delphibase.endimus.com/?action=viewfunc&topic=filenames&id=10257


 
zt50 ©   (2005-01-04 17:33) [8]

ОГРОМНОЕ СПАСИБО! СПАИСБООООООООООО!



Страницы: 1 вся ветка

Текущий архив: 2005.01.23;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.026 c
1-1104777225
starling13
2005-01-03 21:33
2005.01.23
Сортировка в ListView


1-1105604589
LML
2005-01-13 11:23
2005.01.23
Иконки из PNG


6-1099571869
kaon
2004-11-04 15:37
2005.01.23
отправка сообщений по сети


4-1101285115
Users
2004-11-24 11:31
2005.01.23
Переход по TAB на API


6-1099476814
Alexandr111
2004-11-03 13:13
2005.01.23
вопрос о подключении к сетевой машине!!!