Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.02.29;
Скачать: [xml.tar.bz2];

Вниз

TreeView   Найти похожие ветки 

 
hyper_omsk   (2004-02-16 06:13) [0]

Вопрос:
Подскажите пожалуйста как сделать
Есть таблица
090000000000000 Драгметаллы
090100000000000 Золото
080000000000000 Запасные части
(всего около 2000)
надо это в TreeView загнать
чтоб выгледило так
+Драгметаллы
-Золото
+Запасные части

количество вложений будет достигать 15 конкреетнее количества цифр

Буду благодарен за ответы


 
Maxud   (2004-02-16 08:35) [1]

var node: TTreeNode;
begin
TreeNode1.Items.BeginUpdate;
node := TreeNode1.Add(nil, "Драгметаллы");
TreeNode1.AddChild(node, "Золото");
TreeNode1.Add(nil, "Запасные части");
TreeNode1.Items.EndUpdate;
end;


 
Maxud   (2004-02-16 08:37) [2]

Т.е., вместо TreeNode1 я имел ввиду TreeView1.


 
NAlexey   (2004-02-16 08:38) [3]

>Maxud © (16.02.04 08:35) [1]
Автор же сказал, что 2000 позиции в таблице. Т.е следуя приведенной логике, необходимо написать еще 1997 строк в эту процедуру?


 
Maxud   (2004-02-16 08:43) [4]


> NAlexey © (16.02.04 08:38) [3]

Из вопроса непонятно, как определять, что будет узлом, что листом. Возможно по этим кодам 090000000000000, но по -любому нужна ф-ция определения уровня элемента таблицы. Тогда можно делать циклы.


 
NAlexey   (2004-02-16 08:47) [5]

>Maxud © (16.02.04 08:43) [4]
Вот вот, данные на основе которых происходит заполнение дерева должны обладать иерархией. Что в данных служит признаком принадлежности папа-дети? Из чисел не ясно как автор это выясняет, прежде всего необходимо определиться с этим. Затем, скорее всего придется парсить эти числа, выбира поуровнево, сначала родителей, потом детей.


 
TUser   (2004-02-16 10:38) [6]

Вообще, если можно эту цифрь записать не в 10-ной системе, а в двоичной, получится намного проще. А в кокретно данном примере надо при добавлении каждого нового чего-нибудь проверять его принадлежность к сужествующим нодам.
По-моему проще всего сделать inttostr и дальше посимвольно искать ноды. Только в строчку дабавить нужное количество нулей. Типа Видим 9 - ищем на верхнем уровне нод с таким индексом. Если не нашли - добавляеем. Если нашли - дальше ищем среди его сынишек. Вот так.


 
KilkennyCat   (2004-02-16 10:58) [7]

я делал так:
поскольку уже какая-то база есть, то написать обработчик списка, который грамотно табы вставит. а потом его грузить в дерево.
Охренительно удобно отслеживаются ошибки. Да и вообще, просто с текстом работать проще. А с этим делфийским деревом с ума сойдешь, если конечно не КОЛ... КОЛовское дерево - зе бест!


 
hyper_omsk   (2004-02-16 12:22) [8]

TUser, мне твоя идея нравится, что еще хорошего не надо переводить в string это уже string так как таблица LongInteger не берет эту разрядность.
вот я так и делал ищу если нет то пишу новый нод но всё равно чтото у меня не получается. Посмотри что я придумал может что подправишь

procedure TForm1.Button1Click(Sender: TObject);
begin
table1.First;
While not table1.EOF do
begin
extstrtomas(Table1.FieldByName("KOD").AsString);// здесь я стринг разбил на цыфры и в массив получилось вместо 090000000000000 - 0,9,0,0,0,0,0,0,0,0,0,0,0,0,0
if mas[2]<>masold[2] then TreeView1.Items.Add(nil,Table1.FieldByName("VID").AsString) else
if mas[3]<>masold[3] then TreeView1.Items.Addchild(TreeView1.items.Item[0],Table1.FieldByName("VID").AsString) else
if mas[4]<>masold[4] then TreeView1.Items.Addchild(TreeView1.items.Item[1],Table1.FieldByName("VID").AsString) else
if mas[5]<>masold[5] then TreeView1.Items.Addchild(TreeView1.items.Item[2],Table1.FieldByName("VID").AsString) else
if mas[6]<>masold[6] then TreeView1.Items.Addchild(TreeView1.items.Item[3],Table1.FieldByName("VID").AsString) else
if mas[7]<>masold[7] then TreeView1.Items.Addchild(TreeView1.items.Item[4],Table1.FieldByName("VID").AsString) else
if mas[8]<>masold[8] then TreeView1.Items.Addchild(TreeView1.items.Item[5],Table1.FieldByName("VID").AsString) else
if mas[9]<>masold[9] then TreeView1.Items.Addchild(TreeView1.items.Item[6],Table1.FieldByName("VID").AsString) else
if mas[10]<>masold[10] then TreeView1.Items.Addchild(TreeView1.items.Item[7],Table1.FieldByName("VID").AsString) else
if mas[11]<>masold[11] then TreeView1.Items.Addchild(TreeView1.items.Item[8],Table1.FieldByName("VID").AsString) else
if mas[12]<>masold[12] then TreeView1.Items.Addchild(TreeView1.items.Item[9],Table1.FieldByName("VID").AsString) else
if mas[13]<>masold[13] then TreeView1.Items.Addchild(TreeView1.items.Item[10],Table1.FieldByName("VID").AsString) else
if mas[14]<>masold[14] then TreeView1.Items.Addchild(TreeView1.items.Item[11],Table1.FieldByName("VID").AsString) else
TreeView1.Items.Addchild(TreeView1.Items.Item[12] ,Table1.FieldByName("VID").AsString);
extstrtomasold(Table1.FieldByName("KOD").AsString);//здесь делаю тоже разбиение сохраняю в массив masold для сравнение
Table1.Next;
end;
end;

что то я с этим TreeView затупил конкретно


 
TUser   (2004-02-16 12:48) [9]

node:=// сюда записываем начальный нод
for i:=1 to length(s) do begin // s = 090000000...
Здесь пробежать все чайлды node"а.
if найден тот, которому приписан s[i] then node:=то, что нашли
else node:=addChiled(node);
end;


 
hyper_omsk   (2004-02-16 13:00) [10]

TUser можно попадробнее
node-?
if найден тот-?


 
[lamer]Barmaglot   (2004-02-16 13:20) [11]

Вы объясните Вам шашечки или доехать?

Если нужен качественный алгоритм, то слушай меня...

1. Зачем тебе добавлять данные в TreeView, если они у тебя уже где-то храняться. просто сообщи системе, что ты собираешься поддерживать данные сам. Конкретнее смотри TV_Item, в параметре
pszText -> LPSTR_TEXTCALLBACK. этим ты сократишь потребляемую память. (рекомендация не моя, microsoft"овская)
2. Что бы не жрать дополнительную память и ресурсы на поддержку ненужных нод, можно обрабатывать сообщение TVN_ITEMEXPANDING, TVN_ITEMEXPANDED, и заполнять TreeView данными по требованию в момент развертывания или свертывания.


 
NAlexey   (2004-02-16 14:08) [12]

>[lamer]Barmaglot © (16.02.04 13:20) [11]
Ты это серьезно? А это ты видел? - hyper_omsk © (16.02.04 12:22) [8]



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

Форум: "Основная";
Текущий архив: 2004.02.29;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.009 c
3-93760
Dron
2004-02-04 13:22
2004.02.29
Как отобразить в DBGrid результаты нескольких запросов.


14-94127
SiJack
2004-02-06 15:01
2004.02.29
Может кто подскажет какой грид взять чтобы в нем следующее мона


1-94014
BaDeVlad
2004-02-16 09:09
2004.02.29
Многоуровневая отмена в Ричедите


1-93895
Anton
2004-02-15 11:56
2004.02.29
Как изменить элемент массива?


3-93789
magic
2004-02-01 16:14
2004.02.29
DBLookupComboBox





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