Главная страница
    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.46 MB
Время: 0.016 c
14-47798
Tahion
2002-06-15 18:52
2002.07.15
Страшные наказания!!!!!!!!!!!


1-47496
Cherepovets
2002-07-04 11:50
2002.07.15
Если компонент или подскажи как?


1-47258
easy
2002-06-27 17:08
2002.07.15
Битмапы


14-47737
Alex II
2002-06-12 11:24
2002.07.15
Помогите новичку


1-47395
Shrek
2002-07-02 16:32
2002.07.15
TShellTreeView





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский