Форум: "Основная";
Текущий архив: 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.011 c