Форум: "Основная";
Текущий архив: 2002.07.15;
Скачать: [xml.tar.bz2];
ВнизРазложение строки Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.011 c