Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.01.23;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.04 c
3-1103554933
alex145
2004-12-20 18:02
2005.01.23
FoxPro


3-1103416263
Fantasy
2004-12-19 03:31
2005.01.23
SQL


11-1085817453
Майк_110
2004-05-29 11:57
2005.01.23
ListView, lvoCheckboxes, lvoOwnerData - проблемка


3-1103555237
Сергей Яковлев
2004-12-20 18:07
2005.01.23
lblPage в QuickRep - это кто?


3-1103264188
Mate_ru
2004-12-17 09:16
2005.01.23
QRChart





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский