Главная страница
    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.012 c
1-47382
sh_a
2002-07-02 10:10
2002.07.15
Как записать динамический массив в файл?


1-47591
Igor_sh
2002-06-28 18:11
2002.07.15
Использование редактора свойств от TDBGrid


6-47659
программист
2002-05-07 18:29
2002.07.15
Помогите пожалуйста...


1-47503
Вадим
2002-07-04 13:04
2002.07.15
HICON и TImageList


7-47842
Lmatveev
2002-04-23 22:01
2002.07.15
---|Ветка была без названия|---





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