![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Компонент 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]Значит текущий выбранный элемент отсутствует, т.е. элемент не выбран.