Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Компонент TreeVeiw [D7, WinXP]


Finjy ©   (2008-08-29 09:44:00) 

Здравствуйте всем! У меня вот какая проблема:
Есть форма AdvancedSearchForm в ней я пользуюсь компонентами (например IBQParam) из MainFrame,
но с компонентом TreeView1 не получается ничего, вываливает ошибка (Acces Violation....).
Мне нужно получить номер уровня, выбранного в TreeView1 элемента но на строке
"k:=Integer(TreeView1.Selected.Data);" вываливает.
Кто-нить знает в чем дело и как исправить?

 
function TAdvancedSearchForm.BBB: Boolean;
var
 fhh: TMainFrame;
 k:integer;
begin
 fhh:=TMainFrame.Create(nil);
   try
     k:=Integer(TreeView1.Selected.Data);
    with  fhh.IBQParam do
    begin
      SQL.Clear;
      SQL.Add('select par_name from par where par_id in (select par_id from nmk_par where nmk_id in (select '+
      .................
      ...............................

end;


Finjy   (2008-08-29 16:55:00) [1]

Спасибо большое! Попробую, но теперь уже в понедельник!


stas   (2008-08-29 16:55:00) [2]

if TreeView1.Selected<> nil and TreeView1.Selected.Data<>nil then
begin
 with  fhh.IBQParam do
   begin
     SQL.Clear;
     SQL.Add('select par_name from par where par_id in (select par_id from nmk_par where nmk_id in (select '+....
....
end;


aaaaa   (2008-08-29 16:51:00) [3]


> Finjy   (29.08.08 16:46) [16]

сделай так:
function TAdvancedSearchForm.BBB: Boolean;
var
fhh: TMainFrame;
k:integer;
begin
  TreeView1.Items.Item[0].Selected := True;
fhh:=TMainFrame.Create(nil);
  try
    k:=Integer(TreeView1.Selected.Data)
.................


Finjy   (2008-08-29 16:46:00) [4]

В ShowForm, то есть она при создании окна работает


aaaaa   (2008-08-29 16:37:00) [5]

а где ты вызываешь function TAdvancedSearchForm.BBB: Boolean;?


Finjy   (2008-08-29 16:32:00) [6]

про отладчика слышал вроде - у меня в гараже такой стоит.
на счет Selected, то он действительно nil  но вот как его сделать не nil?
форма AdvancedSearchForm - не модальная, мне нужно чтобы после вызова  этой формы, любое дествие с Treewiev на MainFrame - e отражалась в виде показа выбранного уровня на  AdvancedSearchForm, вот и все, а как  загрузка в дерево происходит это не важно.


MsGuns   (2008-08-29 15:34:00) [7]

Похоже про существование отладчика автор даже не догадывается


Сергей М.   (2008-08-29 15:31:00) [8]


> сомнения, что этот самый   TreeView1.Items.AddChildObject
> хотя бы один раз выполнялся


А по барабану выполнился он или не выполнился.

AV, согласно утверждения автора, вываливается на строчке

k:=Integer(TreeView1.Selected.Data);

Если Selected = nil, то вот они и грабли, далеко ходить за ними не надо)


MsGuns   (2008-08-29 15:27:00) [9]

>Finjy   (29.08.08 14:23) [9]

У меня сильные сомнения, что этот самый   TreeView1.Items.AddChildObject хотя бы один раз выполнялся


Сергей М.   (2008-08-29 15:13:00) [10]

Чудесно.

Но все это не имеет отношения к "вываливает ошибка (Acces Violation....)."
Про причины сказано в [1]


Finjy   (2008-08-29 14:23:00) [11]

Вот засовывание
procedure TMainFrame.LoadData(NMK_CLASSIF_TYPE: Integer);
 procedure RefreshTree( Lev: Integer );
 var
   j: Integer;
 begin
   for j := TreeView1.Items.Count - 1 downto 0 do begin  
     IBQTree.First;                                  
     repeat
       if ( Integer( TreeView1.Items.Item[j].Data ) = IBQTree.FieldByName('NMK_CLASSIF_PARENT').AsInteger ) and  
          ( Lev = IBQTree.FieldByName('NMK_CLASSIF_LEVEL').AsInteger ) then
         TreeView1.Items.AddChildObject( TreeView1.Items.Item[j], IBQTree.FieldByName('NMK_CLASSIF_NAME').AsString,
                                       Pointer( IBQTree.FieldByName('NMK_CLASSIF_ID').AsInteger) );
       IBQTree.Next;
     until IBQTree.Eof;
   end;
 end;


Сергей М.   (2008-08-29 13:50:00) [12]


> В MainFrame все туда засовывается



> ParamByName('PARENT').AsInteger := Integer(TreeView1.Selected.
> Data);


Это не "засовывание", а "высовывание")

"Засовывание" - это
TreeView1.Selected.Data := то_что_надо_"засунуть";

Что-то не видать в твоем коде никакого "засовывания" ..


Finjy   (2008-08-29 13:12:00) [13]

procedure TMainFrame.TreeView1Change(Sender: TObject; Node: TTreeNode);
begin
 with IBQList do begin
   Close;
   ParamByName('PARENT').AsInteger := Integer(TreeView1.Selected.Data);
   ParamByName('CUR_ONLY').AsInteger := 0;
   Open;                                                   // ioe?uou cai?in iiiaieeaoo?u
 end;
 DBGridWM1.SelectedField.Name := 'NMK_NOTE';
 IBQParam.Open;
end;
это код, а это запрос
select distinct NMK_ID, NMK_NAME, NMK_NOTE, NMK_NOTUSED
from  GET_NMK_TREE(:PARENT, :CUR_ONLY)
left join  NMK
on NMK.NMK_CLASSIF_ID = GET_NMK_TREE.ID
where ((NMK_NOTE containing :Filter) or (NMK_NAME containing :Filter))
and (NMK_NOTUSED containing :USED)              
order by NMK_NOTE, NMK_NAME


MsGuns   (2008-08-29 11:46:00) [14]

Покажите код "засовывания"


Finjy   (2008-08-29 11:40:00) [15]

В MainFrame все туда засовывается, в этой форме почти такой же запрос работает. Data - это ID справочника


MsGuns   (2008-08-29 11:31:00) [16]

Для того, чтобы обратиться к св-ву TTreeNode.Data, надо туда предварительно что-то засунуть (указатель на объект, структуру, переменную...)
Каким образом и что туда "засовывается" из приведенного кода не видно абсолютно

Св-во "уровень" (TTreeNode.Level) соответствует уровню вложения ноды относительно вершины дерева (корня) и никаким образом не зависит от содержимого его же поля Data


Сергей М.   (2008-08-29 10:28:00) [17]

Почему бы это не сделать самому юзеру ?


Finjy   (2008-08-29 10:23:00) [18]

Как его выбрать?


Сергей М.   (2008-08-29 10:16:00) [19]

Значит текущий выбранный элемент отсутствует, т.е. элемент не выбран.


Наверх

Титульная страница Поиск, карта сайта Написать письмо