Тихо шифером шурша..., или снова о деревьях....

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

Ответить
Alexander
Местный житель
Сообщения: 248
Зарегистрирован: 28 ноя 2006, 13:29

Тихо шифером шурша..., или снова о деревьях....

Сообщение Alexander »

Что нужно: есть 3 связанных таблицы. 1-я browse; 2-Tree, цепляется к 1-й; 3-я Tree, цепляется к 2-й.
Проблема: browse и 2-й Tree работают нормально, но 3-й Tree не желает отображаться.... как я только не приседал-бесполезно!
Делаю так:
vew

Код: Выделить всё

select ... where((
         owner1    == Tbl2.crec 
   and Tbl1.nrec == Tbl2.ctbl1
   and owner2    == Tbl3.crec
   and tbl2.nrec  == Tbl3.ctbl2));
hanleevent
      cmTreeTop : {
         owner1 := comp(0);
         owner2  := comp(0);
      }
      cmTreeDown : {
         owner1 := Tbl2.nrec;
         owner2 := Tbl3.nrec;
      }
      cmTreeUp:{
         owner1 := Tbl2.crec;
         owner2 := Tbl3.crec;
      }
    cmTreeNeedOwner:
    {
       TreeJumpToRecord(TreeTbl2, Tbl2.nrec);
     TreeJumpToRecord(TreeTbl3, Tbl3.nrec);
    }
    cmTreeNodeType:
    {
      if TreeIsTerminal(TreeTbl2) then TreeSetNodeType(TreeTbl2, ntfText);
    if TreeIsTerminal(TreeTbl3) then TreeSetNodeType(TreeTbl3, ntfText);
    }
end;
Заменил 3-й Tree на Browse, данные отображаются корректно! :-?
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Сообщение edward_K »

чего то вы наприседались :-D
по хорошему события должны быть разнесены если не по панелям, то по таблам. В конце концов всегда можно встроить фейс по Tbl3.
owner2 видимо при любом перемещении по tbl1,tbl2 нужно приравнивать 0 и делать jump на первую запись tree3.
Alexander
Местный житель
Сообщения: 248
Зарегистрирован: 28 ноя 2006, 13:29

Сообщение Alexander »

Во! Точно! Пойду кофе налью, а то что-то тормозить стал :-)
Попутный вопрос: как сделать, чтобы в гриде колонка как пометка(checkbox) отображалась? Как-то видел на форуме, но что-то ветку не найду...
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Сообщение edward_K »

if(SearchMarker(MarkerRepFiles,Repfiles.NRec,IndexRepIeSpr),'√','') (fieldname=picked),
вы про это?
Alexander
Местный житель
Сообщения: 248
Зарегистрирован: 28 ноя 2006, 13:29

Сообщение Alexander »

edward_K
нет, я про другое.
в скрине

Код: Выделить всё

[.] Что-то там`
как такой чек сделать в таблице?
Alexander
Местный житель
Сообщения: 248
Зарегистрирован: 28 ноя 2006, 13:29

Сообщение Alexander »

сделал для событий так:

Код: Выделить всё

      cmTreeDown : {
         case (CurTable) of
           #Tbl2:{
              owner1  := Tbl2.nrec;
           }
           #Tbl3:{
              owner2 := Tbl3.nrec;
              owner1  := comp(0);
              TreeJumpToRecord(TreeTbl2, Tbl2.nrec);
           }
         end;
      }
      cmTreeUp:{
         case (CurTable) of
           #Tbl2:{
              owner1  := Tbl3.crec;
           }
           #Tbl3:{
              owner2 := Tbl3.crec;
              owner1  := comp(0);
              TreeJumpToRecord(TreeTbl2, Tbl2.nrec);
           }
         end;
      }
    cmTreeNeedOwner:
    {
         case (CurTable) of
           #Tbl2:{
              TreeJumpToRecord(TreeTbl2, Tbl2.nrec);
           }
           #Tbl2:{
              TreeJumpToRecord(TreeTbl3, Tbl3.nrec);
           }
         end;
    }
    cmTreeNodeType:
    {
         case (CurTable) of
           #Tbl2:{
              if TreeIsTerminal(TreeTbl2) then TreeSetNodeType(TreeTbl2, ntfText);
           }
           #Tbl3:{
              if TreeIsTerminal(TreeTbl3) then TreeSetNodeType(TreeTbl3, ntfText);
           }
         end;
    }
Сказать, что работает, не могу, т.к. жутчайшие тормоза!!!! Фесь фэйс висит, но дерево пытается отобразить... где грабли??
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Сообщение edward_K »

а может лучше сразу весь фейс привести
что-то с логикой не понятно - похоже вы его циклите.
#Tbl3:{
owner2 := Tbl3.crec;
owner1 := comp(0);
TreeJumpToRecord(TreeTbl2, Tbl2.nrec);
}
у вас вроде обратная зависимость tbl3 от tbl2
здесь тоже непорядок
#Tbl2:{
TreeJumpToRecord(TreeTbl3, Tbl3.nrec);
Alexander
Местный житель
Сообщения: 248
Зарегистрирован: 28 ноя 2006, 13:29

Сообщение Alexander »

выдержка из того как есть:

Код: Выделить всё

      where((
                  DReportWorkshop.cpodr == DReportDates.cpodr
              and CurOwnerDates         == DReportDates.crec
              and DReportDates.nrec     == DreportTree.drec
              and CurOwnerTree          == DReportTREE.crec
      ));

Handleevent
      cmTreeTop : {
         case (CurTable) of
           #DREPORTTREE:{
              curOwnerTree  := comp(0);
           }
           #DReportDates:{
              curOwnerDates := comp(0);
              curOwnerTree  := comp(0);
           }
         end;
      }
      cmTreeDown : {
         case (CurTable) of
           #DREPORTTREE:{
              curOwnerTree  := vMain.DReportTree.nrec;
           }
           #DReportDates:{
              curOwnerDates := vMain.DReportDates.nrec;
              curOwnerTree  := comp(0);
              TreeJumpToRecord(TreeMain, vMain.DReportTree.nrec);
           }
         end;
      }
      cmTreeUp:{
         case (CurTable) of
           #DREPORTTREE:{
              curOwnerTree  := vMain.DReportTree.crec;
           }
           #DReportDates:{
              curOwnerDates := vMain.DReportDates.crec;
              curOwnerTree  := comp(0);
              TreeJumpToRecord(TreeMain, vMain.DReportTree.nrec);
           }
         end;
      }
    cmTreeNeedOwner:
    {
         case (CurTable) of
           #DREPORTTREE:{
              TreeJumpToRecord(TreeMain, vMain.DReportTree.nrec);
           }
           #DReportDates:{
              TreeJumpToRecord(TreeDates, vMain.DReportDates.nrec);
           }
         end;
    }
    cmTreeNodeType:
    {
         case (CurTable) of
           #DREPORTTREE:{
              if TreeIsTerminal(TreeMain) then TreeSetNodeType(TreeMain, ntfText);
           }
           #DReportDates:{
              if TreeIsTerminal(TreeDates) then TreeSetNodeType(TreeDates, ntfText);
           }
         end;
    }

   end;
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Сообщение edward_K »

наверное
TreeGetFirstEx
вместо
TreeJumpToRecord
да и вьюху остатвте одну (ну или первой)
везде где перемещаетесь по TreeDates надо прыгать на первую запись в TreeMain
а еще добавте протоколирование во все блоки ( через #IFDEF ) c использованием такой функции
Procedure LogTime( const wstr :string ) ;
{ //if wNotNeedTime then exit ;
if wstr='START' and fileexist(logfilenm) deletefile(logfilenm)
logstrtofile(logfilenm,Datetostr(cur_date,'дата DD/MM/YYYY')+
TimeToStr(cur_time,' тек.вр HH:MM:SS:SSS')+
TimeToStr(sub_time(cur_time,wtime),' - пред.этап = HH:MM:SS:SSS')+
' '+wstr) ;
wtime:=cur_time ;
}
wtime и logfilenm нужно объявить в var фейса и присвоить какие то значения в cmInit
Alexander
Местный житель
Сообщения: 248
Зарегистрирован: 28 ноя 2006, 13:29

Сообщение Alexander »

edward_K
возникла еще приблема:
Т.к. дерево строится не по корневой таблице, возникает ситуация, когда таблица, по которой строится дерево, не валидна.
Если Встать на не валидную строчку, дерево дальше работать отказывается вообще!!!
Alexander
Местный житель
Сообщения: 248
Зарегистрирован: 28 ноя 2006, 13:29

Сообщение Alexander »

Продлема решена просто: в галке все нормально работает, не работает в саппорте. откатился на версию 2-х дневной давности-все ОК! Капец! :???:
Alexander
Местный житель
Сообщения: 248
Зарегистрирован: 28 ноя 2006, 13:29

Сообщение Alexander »

Как у деревьев можно реализовать drag&drop ??? Есть ли стандартный механизм??
А вообще, мне нужно просто уметь менять порядок(положение) веток в дереве...
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Сообщение edward_K »

а причем тут деревья?
Interface uDragDrop EscClose ;
create view
var
PersNameFormat,DepNameBrowserFormat : LongInt;
as select Persons.nrec,Katpodr.nrec
from katpodr,persons,katpodr kat1(KATPODR02)
where (( 'С' == Persons.ISEMPLOYEE
and Persons.galdep == kat1.nrec ))
;
browse brPers show at (,,40,) ;
table Persons ;
fields
Persons.fio 'ФИО' :[20], protect ;
Kat1.name 'Подразделение' :[20], protect ;
end ;

browse brPodr show at (41,,,) ;
table Katpodr ;
fields
Katpodr.name 'Подразделение' : protect ;
end ;
HandleEvent
cmInit :
{
PersNameFormat := DNDRegisterFormat ('PersName');
DepNameBrowserFormat:= DNDRegisterFormat ('KatpodrName');
DNDFieldDropSource (brPodr, #Katpodr.Name);

// регистрируем поля для приема
DNDFieldAcceptDrag (brPers,#Kat1.Name);
}
cmQueryStartDrag:
{
// Запрос на начало перетаскивания (приходит от источника)
if (DNDCurField = #Katpodr.Name) {
if (DNDSetData (DepNameBrowserFormat, Katpodr.nrec) = S_OK) // Записываем PersonID
DNDSetDropEffect (DROPEFFECT_LINK); // Установка возможного действия (подцепка)
}
}
cmDragEnter:
{
// Что-то хотят перетащить в поле ...
if (DNDCurField = #Kat1.Name) // .. в поле Deps.DepName ? ..
if (DNDQueryGetData (DepNameBrowserFormat) = S_OK) // .. данные формата 'DepNameBrowser' ? ..
DNDSetDropEffect (DROPEFFECT_LINK); // .. Могу подцепить !
}
cmDragOver:
{
// Продолжается перетаскивание (cmDragEnter прошел успешно)
if (DNDCurField = #Kat1.Name)
DNDSetDropEffect (DROPEFFECT_LINK)
// (это надо сделать, чтобы процесс не прервался).
}
cmDrop:
{
// Бросили ...
if (DNDCurField = #Kat1.Name) // .. в нужное поле ..
if (DNDGetData (DepNameBrowserFormat, Persons.GalDep) = S_OK) {
// попробуем считать данные ...
UpDateTable; // .. успешно.

update current Persons;
RescanPanel (#Persons);
DNDSetDropEffect (DROPEFFECT_LINK);
// (это необходимо сделать, чтобы источник знал, что произошло.
// иначе ему не придёт событие cmAfterEndDrag )
}
}

end;
end.
Alexander
Местный житель
Сообщения: 248
Зарегистрирован: 28 ноя 2006, 13:29

Сообщение Alexander »

Спасибо!!! то, что надо!!!
Ответить