Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.01 c
14-47784
bbKOT
2002-06-15 13:05
2002.07.15
Что с бойцовским клубом?


3-47240
Nonam
2002-06-20 14:36
2002.07.15
Хранимая процедура в пакете


1-47399
lex1
2002-06-27 15:31
2002.07.15
Визуализация контролов формы.


1-47382
sh_a
2002-07-02 10:10
2002.07.15
Как записать динамический массив в файл?


1-47427
Barmaglot
2002-07-03 09:59
2002.07.15
...Забыл алгоритм взаимодействия ComboBox и Edit ...





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