Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Раскрытие узла дерева


Автор: ura5 26.6.2007, 16:14
Есть меню -дерево :

+ Цех1
   - Участок1
   - Бухгалтерия
+ Цех2
   - Ремонты
   - Мастерские

Проблема: Кликаю я по Цех1,он расрывается,выбираю Участок1- все правильно.
Кликаю по крестику,где находится Цех2 и (неверно) высвечивается данные из предыдущего
Участок1.
Я чищу и  закрываю перед этим sql-запросы.Делаю,как положено.
А,если кликаю по Цех2-все нормально.

У МЕНЯ НЕВЕРНО ИДЕТ ВЫБОРКА ПРИ НАЖАТИИ ТОЛЬКО НА КРЕСТИК,который стоит перед названием 
NEW ITEM.
пОЧЕМУ?
   



Автор: _hunter 26.6.2007, 17:09
дык. ставь брейк-поинт в обработчике клика и смотри почему ты передаеш неправильный индекс...

Добавлено через 49 секунд
P.S.
выборка идет неверно потому как делаеш ее по неверным данным...

Автор: ura5 27.6.2007, 08:37
Благодарю за ответ,но ,к сожалению,ничего не понял.Вы бы конкретнее объяснили.

Автор: _hunter 27.6.2007, 10:40
объясняю конкретно: где-то в твоей программе что-то происходит неправильно. это дает неверный результат. так понятно? или еще как-то намекнуть что твой вопрос без кода не имеет особого смысла?..

Автор: Goganchic 27.6.2007, 10:59
ura5, тема бессмыслена без кода, т.к. _hunter тебе скажет что не так, по его мнению, а на практике окажется что ты где-то слажал, причем совершенно в другом месте

Автор: dumb 27.6.2007, 13:23
я так понимаю, проблема в том, что при нажатии на [+] происходит OnClick(в обработчике которого считывается инфа согласно выделенному элементу), но выделение остается прежним.

ura5, попробуй использовать OnChange вместо OnClick.

Автор: ura5 27.6.2007, 13:29
Проблема решается и вопрос мой отпадает,если віборку из меню-дерева поместить в собітие 
OnChange(),а у меня обработка была в OnClick().Теперь по крестику ,если щелкнуть,то
все раскрывается ,как надо.
Но теперь второй по этому поводу вопрос:
При переходе на обработку в OnChange(),информация при выборе из тех пунктов,которые срабатывают в этой форме-все прекрасно и правильно.А вот переход на другую форму (другой пункт меню) и новое окно не происходит.
Вызываю другую форму
Код
    Pereg->Show();


Добавлено через 3 минуты и 36 секунд
Вернее, переход на 2-.форму в новом окне осуществляется,но сама форма остается на заднем плане,ее не видно.Только,если уменьшить 1-форму,тогда можно увидеть 2-ю.
??? 

Автор: ura5 27.6.2007, 15:04
Все поместить в событие  OnChange()  и переход на новую форму (в новом окне) записать ввиде 
Код
Pereg->ShowModal();


Все работает.

Автор: dumb 27.6.2007, 15:18
вообще, при использовании TreeView в качестве управляющего элемента интерфейса, я бы не советовал открывать какие-то формы при кликах на tree item'ах - это очень нестандартно и, мало того, очень неудобно в использовании. все изменения должны быть в пределах одной формы - переключение закладок, скрытие/показ элементов, итд.
и не забывай про то, что некоторые люди(сумасшедшие smile) используют клавиатуру.

набросал небольшую "заготовку":
Код

//---------------------------------------------------------------------------
void __fastcall TForm1::TreeView1MouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
  if (Shift.Contains(ssDouble)) return; // чтоб на двойных кликах два раза не отрабатывать
  THitTests MyHitTest = TreeView1->GetHitTestInfoAt(X, Y);
  if (MyHitTest.Contains(htOnItem)) // см. справку по GetHitTestInfoAt
  {
    DoSelected();
  }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::TreeView1KeyDown(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
  if (Key == VK_RETURN || Key == VK_SPACE)
  {
    DoSelected();
  }
}
//---------------------------------------------------------------------------
// в Unit1.h в раздел public добавить void __fastcall DoSelected();
void __fastcall TForm1::DoSelected()
{
  if (!TreeView1->Selected) return;
  //                         12345678901234567890
  AnsiString ItemCaptions = "first#second#23#";
  switch (ItemCaptions.Pos(TreeView1->Selected->Text))
  {
    case 1: // "first"
      ShowMessage("'first' selected");
      break;
    case 7: // "second"
      Form2->Show();
      break;
    case 14: // "23"
      ShowMessage("'23' selected");
      break;
    //...
  }
}
//---------------------------------------------------------------------------


Цитата(ura5 @  27.6.2007,  16:04 Найти цитируемый пост)
Pereg->ShowModal(); Все работает.

эк ты резво курс меняешь - все-таки между ShowModal() и Show() довольно ощутимая разница...

Автор: ura5 2.7.2007, 14:24
dumb!
Спасибо!Работает быстрее,чем ,если делать обработку пунктов меню в событии OnChange();

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