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

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

Дерево из записей [D5, IB5.x]


Beer ©   (2002-03-12 14:41:00) 

Уважаемые мастера!
Как создать дерево (как в реестре) из значений определенного поля в БД, и получать запись, соответствеющую этому значению, при его выборе...
С уважением...


Beer   (2002-03-12 19:29:00) [1]

Да, еще вопрос, как определить стректуру, если заранее не известно количество и типы полей?


Beer   (2002-03-12 19:17:00) [2]


Ок, жду...
Спасибо!


DiggerAbstract   (2002-03-12 16:36:00) [3]

спорол косяк - не все написал.
шлю на мыло пример
этот пример работает, просто настрой коннекцию и напиши SQL запрос по примеру который есть там


Beer   (2002-03-12 16:04:00) [4]

to DiggerAbstract>
Не совсем понятен тип переменной ItemList? Хотя рискну предположить, что это TStringList.
Вызывая метод AddObject дублируется ли физически значение объекта, который передаем вторым параметром?
Как затем получить значение поля через TTreeNode?


DiggerAbstract   (2002-03-12 14:55:00) [5]

Вот кусок кода из одной проги



type
Attrib = record
sCod: string;
sCodP: string;
sName: string;
iCode: integer;
bSelect: Boolean;
end;
PAttrib = ^Attrib;


procedure TFormTree.CreateTreeView (pQ: TADOQuery; TV: TTreeView);
var
iIndex, iNumber: Integer;
Atr, AtrF: PAttrib;
iII: Integer;
pListNode: TStringList;
FullItemsListChild: TStringList;
pNode: TTreeNode;

function FindCod(ssCod: string):Boolean;
var
iI: Integer;
begin
if FullItemsListChild.Find(ssCod, iI) then Result:=true
else Result:=false;
end;

begin
pListNode := TStringList.Create;
FullItemsListChild := TStringList.Create;
pQ.First;
for iIndex:=0 to pQ.RecordCount-1 do
begin
New(Atr);
Atr^.sCod := pQ.Fields.Fields[0].AsString;
Atr^.sCodP := pQ.Fields.Fields[1].AsString;
Atr^.sName := pQ.Fields.Fields[2].AsString;
Atr^.iCode := pQ.Fields.Fields[3].AsInteger;

New(AtrF);
AtrF^.sCod := pQ.Fields.Fields[0].AsString;
AtrF^.sCodP := pQ.Fields.Fields[1].AsString;
AtrF^.sName := pQ.Fields.Fields[2].AsString;
AtrF^.iCode := pQ.Fields.Fields[3].AsInteger;
FullItemsListChild.AddObject(AtrF^.sCod, TObject(AtrF));

ItemsList.AddObject(Atr^.sCodP, TObject(Atr));
pQ.Next;
end;
iIndex:=0;
iII:=0;
FullItemsListChild.Sort;
while iIndex<ItemsList.Count do
begin
if (PAttrib(ItemsList.Objects[iII])^.sCodP=PAttrib(ItemsList.Objects[iII])^.sCod) or (not FindCod(PAttrib(ItemsList.Objects[iII])^.sCodP)) then
begin
pNode := TV.Items.AddObject(nil, PAttrib(ItemsList.Objects[iII])^.sName, ItemsList.Objects[iII]);
pListNode.AddObject(PAttrib(ItemsList.Objects[iII])^.sName, pNode);
ItemsList.Delete(iII);
ItemsList.Sort;
Dec(iII);
end;
Inc(iIndex);
Inc(iII);
end;
//////////////////////

for iIndex:=0 to pListNode.Count-1 do
begin
AddFirstInUroven(TTreeNode(pListNode.Objects[iIndex]));
end;

iNumber := FullItemsListChild.Count-1;
for iIndex:=0 to iNumber do
begin
Atr := PAttrib (FullItemsListChild.Objects[iNumber-iIndex]);
Dispose(Atr);
end;
FullItemsListChild.Clear;
FullItemsListChild.Free;

ItemsList.Sort;
pListNode.Clear;
pListNode.Free;
// TreeView1.AlphaSort;

TreeView1.CustomSort(@CustomSortProc, 0);
end;


Запрос примерно такой:

select id, id_parent, name, id, name from kzk.b_budgetentry where id in
(
select id_entry from
(
select * from kzk.b_budget where id_period=:ID_PERIOD and id_dept=:ID_DEPT
and cost<>0 ) as s
group by id_entry
)


Наверх

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