Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.03.2010, 22:23   #11
Dozent
Форумчанин
 
Регистрация: 21.05.2008
Сообщений: 495
По умолчанию

ну да это я понел) Вчера соный был

Но я тогда ваше ни чо не понимаю...

Код:
procedure readtree( intrn : integer; treenodetemp: ttreenode; ttree : ttreeview );
var
bflag: boolean;
begin
ADOQuery1.Close;(После этой строки выдаёт ошикбу 
Цитата:
Access violation at address 00499090 in module "Project1.exe". Read of address 00000258
) ADOQuery1.sql.clear; bflag := false;
Dozent вне форума Ответить с цитированием
Старый 31.03.2010, 23:58   #12
Dozent
Форумчанин
 
Регистрация: 21.05.2008
Сообщений: 495
По умолчанию

Переделал, пойду немножко другим путём...

Код:
procedure TForm1.Button3Click(Sender: TObject);
var
pint:integer;
begin
 All.Items.Clear;
 ADOQuery1.Close;
 ADOQuery1.SQL.Clear;
 ADOQuery1.SQL.Add('select * from structure where p_id=0;');
 ADOQuery1.Open;
 ADOQuery1.First;
 While not ADOQuery1.Eof do
  begin
    All.Items.AddFirst(nil, ADOQuery1.FieldValues['name']);
    ADOQuery1.Next;
  end;
  ADOQuery1.Close;
end;
Т.е. сдесь отобразятся только строки с верхнего уровня, а дальше будут прорисовыватся только те которые нужны, при событие Expanding.

Вот терь у меня второй вопрос, как определить какую строку выбрал пользователь? Допустим надо загрузить дочернии обьекты для 2 итема, как определить что выбран имено второй итем, как бы мне нужен контейнер который будит хранить соотвествие итемов и номеров в базе...

В дальнейшем планируется возможность удаления пользователем ветвей дерева или их перенос, поэтому свойства как абсолют итем и тд не подходят...

Последний раз редактировалось Dozent; 01.04.2010 в 00:01.
Dozent вне форума Ответить с цитированием
Старый 01.04.2010, 21:10   #13
Dozent
Форумчанин
 
Регистрация: 21.05.2008
Сообщений: 495
По умолчанию

Если у когонить есть варианты решения, плз поделитесь...
Dozent вне форума Ответить с цитированием
Старый 05.04.2010, 13:02   #14
Dozent
Форумчанин
 
Регистрация: 21.05.2008
Сообщений: 495
По умолчанию

Мб кому интересно будит я нашёл решение своей проблемы, путём добавления в таблицу structure ешё двух полей abindex,status В 1 записываются абсолют ади разделов при построении во сторой пишится статус(т.е. отображён раздел или нет, это нужно для того чтобы при ег овыделении он не добавлялся дважды)

Постороение Корневых разделов идёт при создании формы

Код:
procedure TForm1.FormCreate(Sender: TObject);
var
 i,a:integer;
begin
//Load structure of structure.db
 Bool:=False;
 All.Items.Clear;
 ADOQuery1.Close;
 ADOQuery1.SQL.Clear;
 ADOQuery1.SQL.Add('select * from structure where p_id=0;');
 ADOQuery1.Open;
 ADOQuery1.First;
 i:=0;
 While  i<=ADOQuery1.RecordCount-1 do
  begin
    All.Items.AddChildObject(nil, ADOQuery1.FieldValues['name'],0);
      //***********************************************************************************************************
      ADOQuery2.Close;
      ADOQuery2.SQL.Clear;
      All.Items.Item[i].Selected:=true;
      ADOQuery2.SQL.Add('update structure set abindex='+inttostr(All.Selected.AbsoluteIndex)+' where id='+inttostr(ADOQuery1.FieldValues['id'])+';');
      ADOQuery2.ExecSQL;
      ADOQuery2.Close;
      //icons
        ADOQuery3.Close;
        ADOQuery3.SQL.Clear;
        ADOQuery3.SQL.Add('select * from structure');
        ADOQuery3.Open;
         ADOQuery2.SQL.Clear;
         ADOQuery2.SQL.Add('select count(id) as kol from structure where p_id='+IntToStr(ADOQuery1.FieldValues['id'])+';');
         ADOQuery2.Open;
      //showmessage(IntToStr(ADOQuery2.FieldValues['kol'])+'     '+IntTOStr(ADOQuery1.FieldValues['id'])+ '   ' + IntTOStr(i) +'   '+inttostr(All.Items.Item[i].AbsoluteIndex));
    if ADOQuery2.FieldValues['kol']>0 then All.Items.Item[ADOQuery1.FieldValues['abindex']].StateIndex:=1;
    ADOQuery2.Close;
    ADOQuery3.Close;
    ADOQuery1.Next;
    inc(i);
  end;
  ADOQuery1.Close;
  Bool:=true;
end;
Bool:boolean;
служет для контроля отображения.

Дальше дочернии обьекты строятся при выделении родителя

Код:
procedure TForm1.AllChange(Sender: TObject; Node: TTreeNode);
var
 abin,i:integer;
begin
If Bool=true then
 begin
abin:=All.Selected.AbsoluteIndex;
//showmessage(intTostr(abin));
 ADOQuery1.Close;
 ADOQuery1.SQL.Clear;
 ADOQuery1.SQL.Add('select * from structure where p_id in (select id from structure where abindex='+IntTOStr(abin)+');');
 ADOQuery1.Open;
 If ADOQuery1.RecordCount >0 then
   begin
    ADOQuery1.First;
    i:=0;
    While  i<=ADOQuery1.RecordCount-1 do
           begin
            All.Items.AddChild(All.Selected, ADOQuery1.FieldValues['name']);
      //***********************************************************************************************************
            ADOQuery2.Close;
            ADOQuery2.SQL.Clear;
            Bool:=false;
            All.Items.Item[All.Selected.Index].Item[i].Selected:=true;
            Bool:=true;
            ADOQuery2.SQL.Add('update structure set abindex='+inttostr(All.Selected.AbsoluteIndex)+' where id='+inttostr(ADOQuery1.FieldValues['id'])+';');
            ADOQuery2.ExecSQL;
            ADOQuery2.Close;
      //icons*******************************************************************************************************
          ADOQuery3.Close;
          ADOQuery3.SQL.Clear;
          ADOQuery3.SQL.Add('select * from structure');
          ADOQuery3.Open;
           ADOQuery2.SQL.Clear;
           ADOQuery2.SQL.Add('select count(id) as kol from structure where p_id='+IntToStr(ADOQuery1.FieldValues['id'])+';');
           ADOQuery2.Open;
     // showmessage(IntToStr(ADOQuery2.FieldValues['kol'])+'     '+IntTOStr(ADOQuery1.FieldValues['id'])+ '   ' + IntTOStr(i) +'   '+inttostr(All.Items.Item[i].AbsoluteIndex));
         if ADOQuery2.FieldValues['kol']>0 then All.Items.Item[ADOQuery1.FieldValues['abindex']].StateIndex:=1;
         ADOQuery3.Close;
          ADOQuery2.Close;
       ADOQuery1.Next;
        inc(i);
        end;
  end;
  ADOQuery1.Close;
  end;
  end;
Работает, пока не реализовано поле статус, плюс ко всему не реализовано пока выделение дочернего раздела больше чем одного родителя...
Dozent вне форума Ответить с цитированием
Старый 05.04.2010, 13:04   #15
Dozent
Форумчанин
 
Регистрация: 21.05.2008
Сообщений: 495
По умолчанию

Мб кому интересно будит я нашёл решение своей проблемы, путём добавления в таблицу structure ешё двух полей abindex,status В 1 записываются абсолют ади разделов при построении во сторой пишится статус(т.е. отображён раздел или нет, это нужно для того чтобы при ег овыделении он не добавлялся дважды)

Постороение Корневых разделов идёт при создании формы

Код:
procedure TForm1.FormCreate(Sender: TObject);
var
 i,a:integer;
begin
//Load structure of structure.db
 Bool:=False;
 All.Items.Clear;
 ADOQuery1.Close;
 ADOQuery1.SQL.Clear;
 ADOQuery1.SQL.Add('select * from structure where p_id=0;');
 ADOQuery1.Open;
 ADOQuery1.First;
 i:=0;
 While  i<=ADOQuery1.RecordCount-1 do
  begin
    All.Items.AddChildObject(nil, ADOQuery1.FieldValues['name'],0);
      //***********************************************************************************************************
      ADOQuery2.Close;
      ADOQuery2.SQL.Clear;
      All.Items.Item[i].Selected:=true;
      ADOQuery2.SQL.Add('update structure set abindex='+inttostr(All.Selected.AbsoluteIndex)+' where id='+inttostr(ADOQuery1.FieldValues['id'])+';');
      ADOQuery2.ExecSQL;
      ADOQuery2.Close;
      //icons
        ADOQuery3.Close;
        ADOQuery3.SQL.Clear;
        ADOQuery3.SQL.Add('select * from structure');
        ADOQuery3.Open;
         ADOQuery2.SQL.Clear;
         ADOQuery2.SQL.Add('select count(id) as kol from structure where p_id='+IntToStr(ADOQuery1.FieldValues['id'])+';');
         ADOQuery2.Open;
      //showmessage(IntToStr(ADOQuery2.FieldValues['kol'])+'     '+IntTOStr(ADOQuery1.FieldValues['id'])+ '   ' + IntTOStr(i) +'   '+inttostr(All.Items.Item[i].AbsoluteIndex));
    if ADOQuery2.FieldValues['kol']>0 then All.Items.Item[ADOQuery1.FieldValues['abindex']].StateIndex:=1;
    ADOQuery2.Close;
    ADOQuery3.Close;
    ADOQuery1.Next;
    inc(i);
  end;
  ADOQuery1.Close;
  Bool:=true;
end;
Bool:boolean;
служет для контроля отображения.

Дальше дочернии обьекты строятся при выделении родителя

Код:
procedure TForm1.AllChange(Sender: TObject; Node: TTreeNode);
var
 abin,i:integer;
begin
If Bool=true then
 begin
abin:=All.Selected.AbsoluteIndex;
//showmessage(intTostr(abin));
 ADOQuery1.Close;
 ADOQuery1.SQL.Clear;
 ADOQuery1.SQL.Add('select * from structure where p_id in (select id from structure where abindex='+IntTOStr(abin)+');');
 ADOQuery1.Open;
 If ADOQuery1.RecordCount >0 then
   begin
    ADOQuery1.First;
    i:=0;
    While  i<=ADOQuery1.RecordCount-1 do
           begin
            All.Items.AddChild(All.Selected, ADOQuery1.FieldValues['name']);
      //***********************************************************************************************************
            ADOQuery2.Close;
            ADOQuery2.SQL.Clear;
            Bool:=false;
            All.Items.Item[All.Selected.Index].Item[i].Selected:=true;
            Bool:=true;
            ADOQuery2.SQL.Add('update structure set abindex='+inttostr(All.Selected.AbsoluteIndex)+' where id='+inttostr(ADOQuery1.FieldValues['id'])+';');
            ADOQuery2.ExecSQL;
            ADOQuery2.Close;
      //icons*******************************************************************************************************
          ADOQuery3.Close;
          ADOQuery3.SQL.Clear;
          ADOQuery3.SQL.Add('select * from structure');
          ADOQuery3.Open;
           ADOQuery2.SQL.Clear;
           ADOQuery2.SQL.Add('select count(id) as kol from structure where p_id='+IntToStr(ADOQuery1.FieldValues['id'])+';');
           ADOQuery2.Open;
     // showmessage(IntToStr(ADOQuery2.FieldValues['kol'])+'     '+IntTOStr(ADOQuery1.FieldValues['id'])+ '   ' + IntTOStr(i) +'   '+inttostr(All.Items.Item[i].AbsoluteIndex));
         if ADOQuery2.FieldValues['kol']>0 then All.Items.Item[ADOQuery1.FieldValues['abindex']].StateIndex:=1;
         ADOQuery3.Close;
          ADOQuery2.Close;
       ADOQuery1.Next;
        inc(i);
        end;
  end;
  ADOQuery1.Close;
  end;
  end;
Работает, пока не реализовано поле статус, плюс ко всему не реализовано пока выделение дочернего раздела больше чем одного родителя...

Кстате можете не использовать код там гед написано //icons прост оя использую имедж лист с иконками и мне над ознат ькакую ставить иконку...
Dozent вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как определить номер клиента leontv Работа с сетью в Delphi 11 28.03.2010 23:19
В матрице определить номер и значение элемента. Tonik_A Паскаль, Turbo Pascal, PascalABC.NET 2 18.10.2009 13:53
Как определить номер выбранной строки в стринггриде Deathwatcher Общие вопросы Delphi 2 15.06.2009 14:40
определить номер текущей строки в synmemo LAGOX Компоненты Delphi 1 21.04.2009 01:25
Определить номер строки с наибольшей характеристикой. jenja Общие вопросы Delphi 2 26.03.2008 21:11