Страница 1 из 1

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

Добавлено: 29 мар 2007, 12:37
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, данные отображаются корректно! :-?

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

Добавлено: 29 мар 2007, 13:19
Alexander
Во! Точно! Пойду кофе налью, а то что-то тормозить стал :-)
Попутный вопрос: как сделать, чтобы в гриде колонка как пометка(checkbox) отображалась? Как-то видел на форуме, но что-то ветку не найду...

Добавлено: 29 мар 2007, 13:25
edward_K
if(SearchMarker(MarkerRepFiles,Repfiles.NRec,IndexRepIeSpr),'√','') (fieldname=picked),
вы про это?

Добавлено: 29 мар 2007, 13:39
Alexander
edward_K
нет, я про другое.
в скрине

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

[.] Что-то там`
как такой чек сделать в таблице?

Добавлено: 29 мар 2007, 13:50
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;
    }
Сказать, что работает, не могу, т.к. жутчайшие тормоза!!!! Фесь фэйс висит, но дерево пытается отобразить... где грабли??

Добавлено: 29 мар 2007, 14:11
edward_K
а может лучше сразу весь фейс привести
что-то с логикой не понятно - похоже вы его циклите.
#Tbl3:{
owner2 := Tbl3.crec;
owner1 := comp(0);
TreeJumpToRecord(TreeTbl2, Tbl2.nrec);
}
у вас вроде обратная зависимость tbl3 от tbl2
здесь тоже непорядок
#Tbl2:{
TreeJumpToRecord(TreeTbl3, Tbl3.nrec);

Добавлено: 29 мар 2007, 14:22
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;

Добавлено: 30 мар 2007, 10:50
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

Добавлено: 30 мар 2007, 12:16
Alexander
edward_K
возникла еще приблема:
Т.к. дерево строится не по корневой таблице, возникает ситуация, когда таблица, по которой строится дерево, не валидна.
Если Встать на не валидную строчку, дерево дальше работать отказывается вообще!!!

Добавлено: 02 апр 2007, 09:07
Alexander
Продлема решена просто: в галке все нормально работает, не работает в саппорте. откатился на версию 2-х дневной давности-все ОК! Капец! :???:

Добавлено: 11 апр 2007, 10:15
Alexander
Как у деревьев можно реализовать drag&drop ??? Есть ли стандартный механизм??
А вообще, мне нужно просто уметь менять порядок(положение) веток в дереве...

Добавлено: 11 апр 2007, 10:35
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.

Добавлено: 11 апр 2007, 13:07
Alexander
Спасибо!!! то, что надо!!!