Структуры внутри BREAK

Обсуждение извечных проблем кларионовских (и не только) отчетов

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Гость

Сообщение Гость »

Привет коллеги,

CW 5.5

есть REPORT с несколькими GROUP BREAK-ами, каждый из них со своим GROUP
HEADER-ом и FOOTER-ом. Необходимо в run-time в зависимости от условий
открывать/прятать эти хедеры и футеры.

Дык вот, вопрос, как бы определить к какому конкретно брейку принадлежит
тот или иной хедер али футер? PROP:Parent (и PROP:Child) нифига не
возвращают для брейков. :(

ЗЫ. SETTARGET делал.

С уважением,
Новиков Антон
anfront@mail.ru
ICQ# 50995986

(Добавление)

Когда-то с этим разбирался. :):):)

Лови процедурку. Работает только с cw5.5
Получает USE родителя для любого контрола. для Group Header и Foter

дает значение USE Group Break

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

! BreakFeq#=GetParentFeq(Report,?BreakHeader)

GetParentFeq         PROCEDURE  (rep,Feq)

addr      long
Block     long
mod       long
base      long
b         byte,dim(4)
use1      long
use2      long
ptr       long     !Указатель
llong     long     !Целое
FeqParent long

  CODE
  
  addr=ADDRESS(rep)
  PEEK(addr+56H,block)      !Получили адрес списка контролов  !Все это сильно зависит от версии
  PEEK(addr+5AH,mod)        !Длина спика в единицах списка    !Даже изменилось при переходе
  PEEK(addr+66h,base)       !единица списка                   !с 5.5b на 5.5c
  b[1]=       BAND(Feq,      0ffH)
  b[2]=BSHIFT(BAND(Feq,    0ff00H),-8)
  b[3]=BSHIFT(BAND(Feq,  0ff0000H),-16)
  b[4]=BSHIFT(BAND(Feq,0ff000000h),-24)
  r#=0
  LOOP j#=1 TO 4
   r#=5*r#+b[j#]
  END
  r#=r#%mod                               !Смещение
  PEEK(block+r#*base,use1)                !Адрес блока описания
  IF use1=0 THEN RETURN 0.                !На всякий случай
  PEEK(use1,use2)
  PEEK(use2,use2)                         !Получили значение USE
  flagfind#=false
  IF use2<>Feq
    LOOP n#=r#+1 TO mod               !Ищем до того пока не встретим нужный
      PEEK(block+n#*base,use1)
      IF use1=0 THEN CYCLE.
      PEEK(use1,use2)
      PEEK(use2,use2)
      IF use2=Feq
       flagfind#=True
       BREAK
      END !Нашли
    END
  ELSE
   flagFind#=True
  END
                                          !Выдираем адрес родителя
  IF ~FlagFind# THEN RETURN 0 .
  PEEK(use1+10H,use1)                     !Вот и сам блок контрола
  IF rep$feq{prop:type}=29                !В зависимости от типа
   of1#=40H
  ELSE
   of1#=90H
  END
  PEEK(use1+of1#,use1)                     !Получили адрес родителя
  IF use1=0                                !Header или Footer страницы или нет Break
   RETURN 0
  ELSE
   PEEK(use1,use2)
   IF use2<>addr
    RETURN 0                               !Это Header или Footer страничный
   ELSE
    PEEK(use1+8,FeqParent)                 !Получили Feq родителя!!!!!!!!!!!!!!!!!
   END
  END

 RETURN FeqParent
--
С уважением,
Дмитрий Осипов mailto:Dima_Osipov@km.ru

(Добавление)

Да... круто! Спасибо, буду пробовать.

С уважением,
Новиков Антон
Написал: ClaList(2)
Ответить