Страница 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
чего то вы наприседались
по хорошему события должны быть разнесены если не по панелям, то по таблам. В конце концов всегда можно встроить фейс по 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
Спасибо!!! то, что надо!!!