Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > вопрос про treeview


Автор: comtat 12.5.2006, 08:11
Загружаю в treeview из БД узлы
все работает ОК

Заношу новый узел он создается нормально

как сделать штобы он стал виден (treeview его не показывает, 
отображается только при новом запуске приложения)

у ShellTreeView есть Refresh как сделать такое для TreeView

или другой метод решения   smile  

Автор: Rouse_ 12.5.2006, 08:23
invalidate, а вообще показывай код добавления, все там нормально должно отображаться... 

Автор: comtat 12.5.2006, 08:41
вот оно

Код

procedure TForm5.Button2Click(Sender: TObject);
var NUM:integer;
begin
   // заполнение
   IBQuery1.SQL.Clear;
   IBQuery1.SQL.Add('INSERT into tree VALUES(2,:NUM,:NAME,1,3)');
   IBQuery1.ParamByName('NUM').asString:=IntToStr(NUM);
   IBQuery1.ParamByName('NAME').asString:=Form5.Edit1.Text;
   IBQuery1.Open;

   //Form2.TreeView1.Items.Delete(Form2.TreeView1.TopItem); //чистит treeview

   Form5.Close;
end;
 

Автор: Dynamic 12.5.2006, 09:03
правильно,а в дерево ты при этом не заносишь, поэтому обновляется только при перестроении всего дерева. Добавь сюда вставку нвого узла в соответствие с твоим алгоритмом вставки. 

Автор: comtat 12.5.2006, 09:11
Dynamic Это верно замечено

поэтому поводу
делаю так 

Код

var CanBeExpanded: Boolean;

Form2.TreeView1.Items.Delete(Form2.TreeView1.TopItem); // удаляет root
  Query1.SQL.Clear;
  Query1.SQL.Add('SELECT ID, NUM, NAME, LEGATEES, IND FROM tree WHERE ID = :ID');
  CanBeExpanded := true;
  // открывает узлы root (nil).
  TreeView1Expanding(self, nil, CanBeExpanded);


но обновления нет

такое очучение что не хватает как в SQl (commit) 

Автор: vv3 12.5.2006, 10:05
Ничего не понял...
Почему не сделать наоборот - загнать добавление/удаление в базу данных в замечательные события TTreeView onAddition и onDeletion?
Код

procedure TForm1.TreeView1Addition(Sender: TObject; Node: TTreeNode;
  var S: String);
begin
 IBQuery1.Transaction.StartTransaction;
 IBQuery1.ParamByName('NODE_NAME').AsString:= Node.Text;
 IBQuery1.Open;
 IBQuery1.Transaction.Comit; 
end;
 

Автор: comtat 12.5.2006, 10:32
Щас попробую 

Автор: comtat 19.5.2006, 21:13
vv3, пробовал так не катит

ругается типа "Transaction is active"


может еще как нибудь можно ??  smile  

Автор: Dynamic 21.5.2006, 11:11
Цитата(comtat @  19.5.2006,  21:13 Найти цитируемый пост)
ругается типа "Transaction is active"

ругается на 
Код

IBQuery1.Transaction.StartTransaction;

напиши так
Код

if not IBQuery1.Transaction.Active then 
  IBQuery1.Transaction.StartTransaction;
 

 

Автор: comtat 21.5.2006, 19:53
Dynamic, попробовал ты был прав,
щас ошибки нет, но и обновления тоже нет


может еще как нибудь можно ??  

Автор: Alex 21.5.2006, 20:11
А воспользоваться готовыми решениями http://ibase.ru/develop.htm#tree не проще?  

Автор: comtat 22.5.2006, 11:54
щас попробую воспользоваться 

Автор: vv3 22.5.2006, 22:02
Обновления чего нет???
Alex, воспользоваться готовыми решениями значит никогда не научиться самому... smile smile  Хотя в цейтноте, конечно, готовые решения помогают. 

Автор: Alex 22.5.2006, 22:15
Цитата(vv3 @  22.5.2006,  23:02 Найти цитируемый пост)
Alex, воспользоваться готовыми решениями значит никогда не научиться самому... smile smile  Хотя в цейтноте, конечно, готовые решения помогают.

Угу, то-то я пока не разбиру по "косточкам" последнии года два эти готовые решения, то фиг поймешь как их применять smile Готовое это зачастую написанная рутина, но лично я еще не видел ни одного готового, которое покрывало бы мои потребности на все 100%, все равно что-то правится, дописывается... 

Автор: vv3 22.5.2006, 22:34
Да, извиняюсь, зачем зашел-то...
Код

if IBQuery1.Transaction.Active then IBQuery1.Transaction.Commit;
IBQuery1.Transaction.StartTransaction;

Вот так гарантированно никаких ошибок....

Итак, с самого начала:
На форме TreeView1, Edit1 с надписью "Имя новой ветки дерева", Button1 с Caption "Добавить", 
IBSQL1 с чем-нибудь вроде: 
Код

INSERT INTO MY_TREE_TABLE (ID_NODE, TEXT_NODE)
 VALUES(GEN_ID(ID_NODE_GENERATOR, 1), :NODENAME) 

Каим-то там образом загружаем дерево из базы (пока нас это не тревожит - мы создаем и "обновляем", то есть делаем так, чтобы при добавлении ветки в дерево, она не только записывалась в базу данных, но и сразу отображалась в дереве)

Вписываем в Edit1 'Это наша пробная ветка' и нажимаем кнопку Button1:
Код

procedure TForm1.Button1Click(Sender: TObject);
begin
TreeView1.Selected:= TreeView1.Items.AddChild(TreeView1.Selected, Edit1.Text);
//добавляем ветку с именем, введенным в Edit1 и одновременно выбираем ее текущей
//если это первая ветка, то параметр TreeView1.Selected = nil если нет, то выделенная
//в момент добавления генерируется событие onAddition, которое мы и ловим ниже
end;

procedure TForm1.TreeView1Addition(Sender: TObject; Node: TTreeNode);
begin
if IBSQL.Transaction.Active then IBSQL.Transaction.Commit; //перестраховочная проверка - вдруг 
                                                                                              //мы раньше забыли откоммитить транзакцию.
IBSQL1.Transaction.StartTransaction; //стартуем пишущую транзакцию, без нее мы ничего не запишем
IBSQL1.ParamByName('NODENAME').AsString:= Edit1.Text; //Внимание! Не TreeView1.Selected.Text, 
             //потому что в этот момент новая ветка еще не создана и в параметр попадет либо
             //родительская ветка, либо nil
IBSQL1.ExecQuery; //добавили запись в таблицу
IBSQL1.Transaction.Commit; // откоммитили изменения
end;

И в дереве все появилось, и в таблицу записали. Кто не верит, - может проверить smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)