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

Вниз

Разложение строки   Найти похожие ветки 

 
ricks ©   (2002-07-02 15:04) [0]

Здравствуйте.
У меня есть такая строка "models\player\barney\barney.mdl", как запихнуть её в TreeView или DevExpress Tree View, что бы она выглядела деревом папок???


 
Alx2 ©   (2002-07-02 15:09) [1]

Ну... Вопрос весьма объемный.
Если на пальцах, то через рекурсию удобнее.


 
ricks ©   (2002-07-02 15:12) [2]

>> через рекурсию удобнее.
Не могли бы написать примерчик, а то я с этой рекурсией замучался ;-(


 
Alx2 ©   (2002-07-02 15:18) [3]

Вот, выцепил что-то из старенького:

procedure TForm1.Button2Click(Sender: TObject);
Var
CachedStrs: TStringList;
Procedure AddItem(Lev: Integer; ParentNode: TTreeNode; S: String);
Function FindNodeWithText(AParent: TTreeNode; Const S: String): TTreeNode;
Var
K : Integer;
fStr : String;
tmpNode: TTreeNode;
Begin
Result := Nil;
fStr := S + IntToStr(Integer(AParent));
K := CachedStrs.IndexOf(fStr);
If K > -1 Then
Result := Pointer(CachedStrs.Objects[K])
Else
Begin
If AParent <> Nil Then
tmpNode := AParent.getFirstChild
Else
tmpNode := TreeView1.Items.GetFirstNode;
While tmpNode <> Nil Do
Begin
If tmpNode.Text = S Then
Begin
Result := tmpNode;
CachedStrs.AddObject(fStr, Pointer(tmpNode));
break;
End;
tmpNode := tmpNode.getNextSibling;
End;
End
End;

Var
prefix: String;
ID : Integer;
aNode : TTreeNode;
Begin
If S = "" Then Exit;
ID := Pos("\", S);
prefix := "";
If ID > 0 Then
prefix := Copy(S, 1, ID - 1)
Else
Begin
prefix := S;
S := "";
End;

aNode := FindNodeWithText(ParentNode, prefix);

If aNode = Nil Then
Begin
aNode := TreeView1.Items.AddChild(ParentNode, prefix);
End;

AddItem(Lev + 1, aNode, Copy(S, ID + 1, Length(S)));

End;


Var K: Integer;
Strs: TStringList;
Begin
Strs := TStringList.Create;
// Заполним, на всякий случай :)
Strs.Add("models\player\barney\barney.mdl");
Strs.Add("models\player\barney1\barney.mdl");

CachedStrs := TStringList.Create;
CachedStrs.Duplicates := dupIgnore;
CachedStrs.Sorted := True;

Try

TreeView1.Items.BeginUpdate;
TreeView1.SortType := stNone;
SCREEN.Cursor := crHourGlass;

For K := 0 To Strs.Count - 1 Do
AddItem(0, Nil, Strs[K]);

Finally
SCREEN.Cursor := crDefault;
TreeView1.Items.EndUpdate;
CachedStrs.Free;
Strs.Free;
End;
End;

Думаю, как пользоваться - понятно.


 
Игорь Шевченко ©   (2002-07-02 15:47) [4]

Еще решение:

procedure TForm1.FormCreate(Sender: TObject);
const
Str = "models\player\barney\barney.mdl";
var
tmp : TStringList;
Node : TTreeNode;
I : Integer;
begin
tmp := TStringList.Create();
try
StrBreakApart(Str, "\", tmp);
Node := nil;
for I:=0 to Pred(tmp.Count) do
Node := TreeView1.Items.AddChild(Node, tmp[I]);
finally
tmp.Free();
end;
end;

Процедуру StrBreakApart брать в UBPFD по адресу
http://delphibase.endimus.com/?action=viewfunc&topic=strconvert&id=10077


 
Alx2 ©   (2002-07-02 15:56) [5]

>Игорь Шевченко © (02.07.02 15:47)
Но ваше решение, Игорь, обрабатывает только частный случай, когда нужно "раздеревянить" только одну строку. Полноценного дерева (когда задано множество таких строк) не получится.


 
Игорь Шевченко ©   (2002-07-02 16:05) [6]

Alx2 © (02.07.02 15:56)

Множество строк - процедура в цикле вызывается...


procedure TForm1.FormCreate(Sender: TObject);
const
Str : array[1..2] of String = ("models\player\barney\barney.mdl",
"models1\player\barney\barney.mdl");
var
tmp : TStringList;
Node : TTreeNode;
I, J : Integer;
begin
for J:=Low(Str) to High(Str) do begin
tmp := TStringList.Create();
try
StrBreakApart(Str[J], "\", tmp);
Node := nil;
for I:=0 to Pred(tmp.Count) do
Node := TreeView1.Items.AddChild(Node, tmp[I]);
finally
tmp.Free();
end;
end;
end;


С уважением,


 
Alx2 ©   (2002-07-02 16:11) [7]

Но получается, что вместо дерева видим "веник". То есть общая вершина всего одна, а одинаковые подкаталоги сидят в разных ветках.
Попробуйте вот это:
"models\player\barney\barney.mdl";
"models\player\barney1\barney.mdl";

Должна получаться ветка models\player, которая дробится в вершине "player" на ветви barney и barney1.


 
Игорь Шевченко ©   (2002-07-02 16:20) [8]

Alx2 © (02.07.02 16:11)

Изначально задача несколько не так стояла :-)

Если надо не веник, то можно и не веник :-)))



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

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

Наверх




Память: 0.49 MB
Время: 0.021 c
4-47860
stainer a
2002-05-10 01:04
2002.07.15
очень интересный вопрос


14-47735
vads
2002-06-09 09:22
2002.07.15
Кто-нибудь работал со cмарт-картами и card-reader ами ???


4-47882
SLY-YO
2002-05-11 14:22
2002.07.15
Как на Delphi отключить отдельные кнопки.


6-47626
ice
2002-04-28 12:07
2002.07.15
Чат


8-47617
Yoga
2002-02-28 22:39
2002.07.15
Графика