**BRegieFE.prg   -  Regie-Zentrum fr Bestattungsverwaltung
//                      Verwaltung der Masken-Files
// 06.11.2005 Auftrnr statt 6 jetzt 7-stellig bei MengX
// 06.11.2005: E ersetzt 6: aus StrX(1->auftrnr,6,0) wird StrX(1->auftrnr,E,0)

#include "Gra.ch"
#include "Xbp.ch"
#include "Appevent.ch"
#include "Appedit.ch"
#include "Appbrow.ch"
#include "Font.ch"
#include "Dmlb.ch"
#include "Set.ch"

FUNCTION FilesEingabe( oDlg1, cDat, cForm, aPos, ASize )
   LOCAL oDlg, nEvent, mp1, mp2, oXbp, oBrowse, oEdit
   LOCAL oCtrl, oFocus := SetAppFocus(oDlg1), aEditControls := {}
   LOCAL aPP := { { XBP_PP_FGCLR       , GRA_CLR_BLACK    } , ;
                  { XBP_PP_BGCLR       , GRA_CLR_WHITE    } }
   LOCAL aPPSle := { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } }
   LOCAL aPPTxt := { { XBP_PP_FGCLR       , GRA_CLR_BLACK    } , ;
                     { XBP_PP_BGCLR       , XBPSYSCLR_DIALOGBACKGROUND } }
   LOCAL nOldArea := Select(), lFlucht := .F.
   PRIVATE oCB, oFEDA, oSle0, oSle, oPS, cDatei
   aPos := IIf(Empty(aPos),{10,30*nV},aPos)
   ASize:= IIf(Empty(ASize),{770*nH,500*nV},ASize)
/*14.04.2008 19:25 nH, nV ver„ndert wegen Resize */
//   IF nV < 1              // wenn die Fensterh”he reduziert wurde
      aPos := {oDlg1:cargo:currentpos()[1]+4,oDlg1:cargo:currentpos()[2]} //14.04.2008 14:28 unten wie Hauptmaske
//      aPos := {5*IIf(nH<1,1,nH),30*IIf(nV<1,1,nV)}       //06.04.2008 19:20
      ASize := {oDlg1:currentsize()[1],oDlg1:cargo:currentsize()[2]}  //14.04.2008 14:22 H”he wie Hauptmaske
//   ENDIF
/**/

   IF Empty(cForm) .or. !FILE(Trim(cForm)+".dbf") ;
      .or. ("FILES"$Upper(cDat) .and. "BL_"$Upper(cForm)) ;
      .or. ("PRNT"$Upper(cDat) .and. "S_"$Upper(cForm))
     oDlg := XbpFileDialog():new( oDlg1:cargo, oDlg1:cargo )
     oDlg:title := ConvToAnsiCP( "W„hlen Sie eine Datei" )
     oDlg:create()
      IF "FILES"$Upper(cDat)
        cDatei := oDlg:open( "S_*.dbf" )
      ELSEIF "PRNT"$Upper(cDat)
        cDatei := oDlg:open( "BL_*.dbf" )
      ENDIF
      oDlg:destroy()
   ELSE
      cDatei := Trim(cForm) + ".dbf"
   ENDIF
     IF cDatei = NIL
      RETURN .T.
     ENDIF
   cDatei := IIf( "\"$cDatei, Right( cDatei, Len(cDatei)-RAt( "\", cDatei )), cDatei )
   IF !FILE(cDatei)
      RETURN .T.
   ENDIF
   cDatei := Left( cDatei, At(".",cDatei)-1 )
   SELECT 16
   DbUseArea( ,, cDatei, "sd",.F. )
   IF "S_"$Upper(cDatei) .OR. "BL_PRNT"$Upper(cDatei)
//      OrdCreate( "dFldPos",, "field_pos" )
      OrdCreate( "dFldPos",, "Str(field_pos+1000,4,0)" ) // 7.2.2005
   ENDIF
   COPY TO s_temp
   DbUseArea( ,, "s_temp", "sd",.F. )


   oDlg := AKDialog():new( AppDesktop(), oDlg1:cargo )
   oDlg:tasklist := .T.
   oDlg:title := "Eingabe/Žnderung von: "+cDatei
   oDlg:title := IIf(SET(43)==0,ConvToAnsiCP(oDlg:title),oDlg:title)   //03.12.2006 18:02
   oDlg:maxButton := .F.
   oDlg:border := XBPDLG_RAISEDBORDERTHIN_FIXED
   oDlg:create(,, aPos, ASize )
   SetAppFocus(oDlg)       // Fenster muá den Focus haben, damit Parts ihn dann kriegen k”nnen!
   oDlg:lockUpdate(.T.)    // damit der Bildaufbau unsichtbar bleibt

//   oDlg:drawingArea:setColorBG( GRA_CLR_PINK )
   oDlg:drawingArea:setColorBG( XBPSYSCLR_TRANSPARENT )
   oCB := oDlg:drawingArea
   oFEDA := oDlg:drawingArea
   oFEDA:cargo := oDlg

// jetzt folgt die Erzeugung der Eingabefelder
   oEdit := FilesFF():new( oFEDA,oDlg, {330*nH,0}, {440*nH,475*nV},,, nBZ, cDat, -100, 299, 16 )
   oEdit:CREATE( oFEDA,oDlg, {330*nH,0}, {440*nH,475*nV},,, nBz, cDat, -100, 299, 16 )
   AEval( oEdit:editControls, {|x| oDlg:addEditControl( x ) } )
//   AEval( oEdit:appendControls, {|x| oDlg:addAppendControl( x ) } )
// bis hierhin geht die Erzeugung der Eingabefelder

   IF Len(oEdit:BEArea)>3 .AND. "FILES"$Upper(cDat)
      oPS := XbpPresSpace():new()
      oPS:CREATE( ATail( oEdit:BEArea ):winDevice(), {770,530} ) // in die letzte BEArea
      oPS:setViewPort( {0,0,308,200} )
      ATail( oEdit:BEArea ):paint := {||Zeichnen( oPS, 16, 1, 499 ) }
   ELSEIF Len(oEdit:BEArea)>3 .AND. "PRNT"$Upper(cDat) .AND. SET(8) == .F. // Nur wenn Netzversion
      SELECT 12
      USE vv
      DbSeek(StrX(1->auftrnr,E,0),.F.)
      SELECT 13
      USE auftr
      DbSeek(StrX(1->auftrnr,E,0),.F.)
      SELECT 16
//      oPS := XbpPresSpace():new()
//      oPS:CREATE( ATail( oEdit:BEArea ):winDevice(), {2100,2970}, GRA_PU_LOMETRIC )
//      oPS:setViewPort( {0,0,200,290} )
//      oEdit:BEArea[4]:paint := {||Zeichnen2( oPS, 16 ) }
   ENDIF

   oDlg:setModalState( XBP_DISP_APPMODAL )
////   oDlg:show()   // siehe oCtrl:read

   oCtrl := XbpGetController():new( oDlg )
   oCtrl:create()
   oCtrl:READ( 1, .F. )
//   SetAppFocus( oEdit:SingleZeile[1] )     // siehe oCtrl:read()
//   SET ORDER TO 1
   * Shortcuts initialisieren
   oDlg:InitShortCuts( oDlg )
   oDlg:lockUpdate(.F.)
   oDlg:invalidateRect()

   nEvent := xbeP_None
   DO WHILE nEvent <> xbeP_Close
      nEvent := AppEvent( @mp1, @mp2, @oXbp )
      IF nEvent == xbeP_Keyboard
      DO CASE
         CASE mp1 == xbeK_RETURN
//
         CASE mp1 == xbeK_ESC
            lFlucht := .T.
            PostAppEvent( xbeP_Close)
         CASE mp1 == xbeK_F1
            ModalDialog( (cDatver+"f1_AE.dbf"), "Bedienungshinweise", oFEDA, 680*nH, 460*nV )
         CASE mp1 == xbeK_F10
            lFlucht := .F.
            PostAppEvent( xbeP_Activate,,, oEdit:DruckKnopf[oEdit:XbpNummer(oEdit:DruckKnopf,"ENDE")] )
//            PostAppEvent( xbeP_Close,,,oDlg)
      ENDCASE
      ENDIF
      oXbp:handleEvent( nEvent, mp1, mp2 )
   ENDDO

   oDlg:setModalState( XBP_DISP_MODELESS )
   DbDeRegisterClient(oEdit)
   oEdit:destroy()
   oDlg:destroy()
   SetAppFocus( oFocus )

   IF lFlucht == .F.
      PACK
      IF IsFieldVar("fname")
         REPLACE ALL 16->fname WITH Upper(cDatei)     // 7.2.2005
         GO TOP
      ENDIF
      IF "PRNT"$Upper(cDat)
         COPY TO (cDatei) FOR (!Empty(spalte) .or. !Empty(zeile) .or. !Empty(text) .or. !Empty(feld))
         cNameB := IIf( IsFieldVar("fname"), 16->fname, cNameB ) // soll bl_.tak erzeugt werden?
      ELSEIF "FILES"$Upper(cDat)
         COPY TO (cDatei) FOR (!Empty(Field_Pos) .or. !Empty(Field_Name) .or. !Empty(TEXT))
         cNameS := IIf( IsFieldVar("fname"), 16->fname, cNameS ) // soll s_.tak erzeugt werden?
      ENDIF
   ENDIF
   16->(DbCloseArea())
   IIf(!Empty(Alias(12)), 12->(DbCloseArea()),)
   IIf(!Empty(Alias(13)), 13->(DbCloseArea()),)
   Select &nOldArea
RETURN .T.

FUNCTION FilesNeu(oDlg1)
   16->(DbAppend())
   IF OrdNumber() > 0
      16->(DbGotop())
   ENDIF
   16->(DbSkip(0))
   SetAppFocus( oDlg1:setParent():childFromName( IIf(IsFieldVar("fname"),2,1) ) )
RETURN .T.

FUNCTION FilesEntf(oDlg1)
   IF ConfirmBox( oDlg1, IIf(SET(43)==0,ConvToAnsiCP("Soll der Datensatz gel”scht werden?"), ;
                        "Soll der Datensatz gel”scht werden?"), ;
                        IIf(SET(43)==0,ConvToAnsiCP("Datensatz l”schen"),"Datensatz l”schen"), ;
                        XBPMB_YESNO, ;
                        XBPMB_QUESTION ) == XBPMB_RET_YES
      Satzsp(oCB)
      16->(DbDelete())
      16->(DbSkip(0))
      RETURN .T.
   ENDIF
RETURN .T.

FUNCTION FilesSuch( oDlg1, cDatei )
   LOCAL oDlg, nEvent, mp1, mp2, oBrowse
   LOCAL aSizeDesktop := AppDesktop():currentSize()
//   LOCAL nBSb := aSizeDesktop[1]
//   LOCAL nBSh := aSizeDesktop[2]
// folgende Zahlen-Werte basieren auf 800x600:
//   LOCAL nV := nBSb/800         // Korrekturfaktor fr tats„chliche Aufl”sung
   LOCAL nOldArea := Select(), oFocus := SetAppFocus()
   LOCAL lFlucht := .F., nRec := RecNo()
   PRIVATE oCB

   (nOldArea)->(DbSuspendNotifications())
   SELECT 26
   USE s_dir


   LOCATE FOR FIELD_NAME = Trim(cDatei)
   IF FILE(cDatei+".dbf") .AND. !26->(Eof())
      26->(DbCloseArea())
      Select &nOldArea
      DbUseArea( ,, cDatei, "sd" )
      OrdCreate( "dFldPos",, "Str(field_pos,3,0)" )
      (nOldArea)->(DbResetNotifications())
      (nOldArea)->(DbGobottom())
      SetAppFocus( oFocus )
      RETURN cDatei
   ENDIF

   oDlg := AKDialog():new( AppDesktop(), oDlg1:cargo )
   oDlg:tasklist := .T.
   oDlg:title := "Dateien suchen"
   oDlg:maxButton := .F.
   oDlg:border := XBPDLG_RAISEDBORDERTHIN_FIXED
   oDlg:create(,, {10,30*nV}, {int(330*nH),int(250*nV)} )

   oDlg:drawingArea:setColorBG( GRA_CLR_DARKCYAN )
   oCB := oDlg:drawingArea
   oCB:cargo := oDlg

// jetzt folgt die Erzeugung der Eingabefelder
   oBrowse := FilesFF():new( oCB,oDlg, {330*nH,0}, {440*nH,475*nV},,, nBz, "s_files",300,399, 26 )
   oBrowse:CREATE( oCB,oDlg, {330*nH,0}, {440*nH,475*nV},,, nBz, "s_files",300,399, 26 )
// bis hierhin geht die Erzeugung der Eingabefelder

   oDlg:setModalState( XBP_DISP_APPMODAL )
   oDlg:show()
   SetAppFocus( oBrowse:BrowseFeld[1] )

   nEvent := xbeP_None
   DO WHILE nEvent <> xbeP_Close
      nEvent := AppEvent( @mp1, @mp2, @oXbp )
//      IF nEvent == xbeM_LbDblClick .AND. SetAppFocus():isDerivedFrom( "XbpBrowse" )
      IF nEvent == xbeBRW_ItemSelected
            PostAppEvent( xbeP_Close)
      ENDIF
      IF nEvent == xbeP_Keyboard
      DO CASE
         CASE mp1 == xbeK_RETURN .or. mp1 == xbeK_F10
            PostAppEvent( xbeP_Close)
         CASE mp1 == xbeK_ESC
            lFlucht := .T.
            PostAppEvent( xbeP_Close)
      ENDCASE
      ENDIF
      oXbp:handleEvent( nEvent, mp1, mp2 )
   ENDDO
   oDlg:setModalState( XBP_DISP_MODELESS )
   oDlg:destroy()    ///
   cDatei := Trim(26->FIELD_NAME)
   26->(DbCloseArea())
   Select &nOldArea
   IF lFlucht = .T.
      (nOldArea)->(DbGoto(nRec))
   ELSE
      DbUseArea( ,, cDatei, "sd" )
      OrdCreate( "dFldPos",, "Str(field_pos,3,0)" )
   ENDIF
   SET ORDER TO 1
   (nOldArea)->(DbResetNotifications())
   (nOldArea)->(DbSkip(0))
   SetAppFocus( oFocus )
RETURN cDatei

FUNCTION Zeichnen( oPS, nA, nAnf, nEnd )
//   LOCAL nV := AppDesktop():currentSize()[1]/800
   LOCAL nBo := (505*nV), nBz := 25*nV
   LOCAL nRec, nZeiF := 0, nZeiT := 0, nZ := 0, nS := 0, aPos, ASize
   LOCAL aAreaAttrs := Array( GRA_AA_COUNT )
   nAnf := IIf( nAnf = NIL, 0, nAnf )
   nEnd := IIf( nEnd = NIL, 999, nEnd )

   (nA)->(DbSuspendNotifications())
   nRec := (nA)->(RecNo())
   (nA)->(DbGotop())
   DO WHILE ! (nA)->(Eof())
      IF ((nA)->FIELD_POS < nAnf .OR. (nA)->FIELD_POS > nEnd) .AND. (nA)->FIELD_POS != 0
         (nA)->(DbSkip())
         LOOP
      ENDIF
      nZ := IIf( (nA)->FIELD_TYPE$"AWwg", 0, nZ)   // Offset, weil Felder in Areas...
      nS := IIf( (nA)->FIELD_TYPE$"AWwg", 0, nS)   //                      ...relative...
      nBo := IIf( (nA)->FIELD_TYPE$"AWwg", (nA)->HOT*nV-25*nV, nBo )   //          ...Koordinaten haben
      nZeiF := IIf( (nA)->FIELD_TYPE$"CNDLMPT", ;
                        IIf( (nA)->ZEIF < 1, nZeiF+nBz*(nA)->ZEIF, nBo+nBz-nBz*(nA)->ZEIF ), ;
                        (nA)->ZEIF*nV )
//      nZeiF := IIf( (nA)->ZEIF>0, (nA)->ZEIF, nZeiF + (nA)->ZEIF )
      aPos := { (nA)->SPAF*nH+nS, nZeiF+nZ }
      ASize := { ((nA)->SPAF+(nA)->BRF)*nH+nS, nZeiF+(nA)->HOF*nV+nZ }
      aAreaAttrs[GRA_AA_COLOR] := GRA_CLR_WHITE
      GraSetAttrArea( oPS, aAreaAttrs )
      GraBox( oPS, aPos, ASize, GRA_OUTLINEFILL )
      nZeiT := IIf( (nA)->FIELD_TYPE$"CNDLP", ;
                        IIf( (nA)->ZEIT < 1, nZeiT+nBz*(nA)->ZEIT, nBo+nBz-nBz*(nA)->ZEIT ), ;
                        (nA)->ZEIT*nV )
//      nZeiT := IIf( (nA)->ZEIT>0, (nA)->ZEIT, nZeiT + (nA)->ZEIT )
      aPos := { (nA)->SPAT*nH+nS, nZeiT+nZ }
      ASize := { ((nA)->SPAT+(nA)->BRT)*nH+nS, nZeiT+(nA)->HOT*nV+nZ }
      aAreaAttrs[GRA_AA_COLOR] := IIf( (nA)->FIELD_TYPE="P", GRA_CLR_YELLOW, ;
                                  IIf( (nA)->FIELD_TYPE$"CNDLM", GRA_CLR_PALEGRAY, GRA_CLR_BACKGROUND ))
      GraSetAttrArea( oPS, aAreaAttrs )
      GraBox( oPS, aPos, ASize, GRA_OUTLINEFILL )
      nZ := IIf( (nA)->FIELD_TYPE$"AW", (nA)->ZEIT*nV, nZ)
      nS := IIf( (nA)->FIELD_TYPE$"AW", (nA)->SPAT*nH, nS)
      (nA)->(DbSkip())
   ENDDO
   (nA)->(DbGoto(nRec))
   (nA)->(DbResetNotifications())
RETURN .T.

FUNCTION Zeichnen2( oPS, nA ) //, nAnf, nEnd )
//   LOCAL nV := AppDesktop():currentSize()[1]/800
   LOCAL nBo := (505*nV), nBz := 25*nV
   LOCAL nRec, nZeiF := 0, nZeiT := 0, nZ := 290/80, nS := 200/80, aPos, ASize
   LOCAL aAreaAttrs := Array( GRA_AA_COUNT )

   (nA)->(DbSuspendNotifications())
   nRec := (nA)->(RecNo())
   (nA)->(DbGotop())
   DO WHILE ! (nA)->(Eof())
      nZei := IIf( (nA)->ZEILE<1, nZei-(nA)->ZEILE, (nA)->ZEILE )
      nSpa := IIf( (nA)->SPALTE<1, nSpa-(nA)->SPALTE, (nA)->SPALTE )
      IF !Empty((nA)->TEXT)
         aPos := { nSpa*nS, nZei*nZ }
         ASize := { nS*10, nZ }
         aAreaAttrs[GRA_AA_COLOR] := GRA_CLR_BLUE
         GraSetAttrArea( oPS, aAreaAttrs )
         GraBox( oPS, aPos, ASize, GRA_OUTLINEFILL )
         nSpa := nSpa+nS*11
      ENDIF
      aPos := { nSpa*nS, nZei*nZ }
      ASize := { nS*10, nZ }
      aAreaAttrs[GRA_AA_COLOR] := GRA_CLR_YELLOW
      GraSetAttrArea( oPS, aAreaAttrs )
      GraBox( oPS, aPos, ASize, GRA_OUTLINEFILL )
      (nA)->(DbSkip())
   ENDDO
   (nA)->(DbGoto(nRec))
   (nA)->(DbResetNotifications())
RETURN .T.

FUNCTION FESatzEinfg( lDel )
   LOCAL nA := SELECT(),i, n
   LOCAL aBlattSE := {} , aBlattZSE[FCount()]
   LOCAL nRec := RecNo(), nFP := IIf( IsFieldVar("Field_Pos"), Field_Pos - 1, )
   lDel := IIf( lDel<>NIL, lDel, .F. )
   DbSuspendNotifications()
   APPEND BLANK
   aBlattZSE := FESatzLese()                    // liest eine leere Zeile
   GO 1
   DO WHILE .NOT. Eof()
      IF !Deleted()
         IF nRec = Recno() .AND. !lDel
            AAdd( aBlattSE, aBlattZSE )         // fgt eine leere Zeile ein
            AAdd( aBlattSE, FESatzLese() )
         ELSEIF nRec = Recno() .AND. lDel       // l„át den aktuellen Satz aus
         ELSE
            AAdd( aBlattSE, FESatzLese() )
         ENDIF
      ENDIF
      SKIP
   ENDDO
   ZAP                                          // l”scht die Datei ganz
   FOR i := 1 to Len( aBlattSE )                // baut die Datei neu auf:
      APPEND BLANK
      aBlattZSE := aBlattSE[i]
      For n := 1 to FCount()
         FieldPut( n, aBlattZSE[n] )
      NEXT
   NEXT
   GO nRec
   IF IsFieldVar( "Field_Pos" ) .AND. !lDel
      IF Empty(Field_Pos)
         REPLACE Field_Pos WITH nFP
      ENDIF
   ENDIF
   DbResumeNotifications()
   DbSkip(0)
RETURN .T.

FUNCTION FESatzLese()
   LOCAL aValue := Array( FCount() ), n
   FOR n := 1 TO FCount()
      aValue[n] := FieldGet(n)
   NEXT
RETURN aValue

PROCEDURE FormBDruck()
   LOCAL nZei := 6, nRec := 16->(RecNo())
   DbSuspendNotifications()
   SET DEVICE TO PRINTW
   GO TOP
   @ 2,8 SAY "Beschreibung des Formulars :"+Alias()
   DO WHILE 16->seite <> "e" .AND. !Eof()
      IF nZei = 6
         @ 4,6 SAY "S Na Prompt               TF FF  Zeile Spalte Bereich"
      ENDIF
      @ nZei,6 SAY 16->seite
      @ nZei,8 SAY 16->na
      @ nZei,11 SAY 16->prompt
      @ nZei,32 SAY 16->tfont
      @ nZei,35 SAY 16->ffont
      @ nZei,38 SAY 16->zeile
      @ nZei,45 SAY 16->spalte
      @ nZei,55 SAY 16->bereich
      @ ++nZei,6 SAY "T: "+SubStr(16->text,1,70)
      @ ++nZei,6 SAY "T: "+SubStr(16->text,71,30)
      @ ++nZei,6 SAY "F: "+SubStr(16->feld,1,70)
      @ ++nZei,6 SAY "F: "+SubStr(16->feld,71,30)
      SKIP
      nZei := IIf( nZei>60, 6, ++nZei )
   ENDDO
   EJECT
   SET DEVICE TO SCREEN
   16->(DbGoto(nRec))
   DbResumeNotifications()
RETURN

PROCEDURE FormSDruck()
   LOCAL nZei := 6, nRec := 16->(RecNo())
   DbSuspendNotifications()
   SET DEVICE TO PRINTW
   GO TOP
   @ 2,8 SAY "Beschreibung der BS-Maske :"+Alias()
   DO WHILE !Eof()
      IF nZei = 6 //6789 123456789 123456789 123456789 123456789 123456789
         @ 4,6 SAY "Name      Typ LEN   DEC  POS  SPAF ZEIF BRF HOF TS ZahlForm"
         @ 5,6 SAY "                              SPAT ZEIT BRT HOT"
      ENDIF
      @ nZei,6 SAY 16->field_name
      @ nZei,17 SAY 16->field_type
      @ nZei,20 SAY 16->field_len
      @ nZei,26 SAY 16->field_dec
      @ nZei,31 SAY 16->field_pos
      @ nZei,36 SAY 16->spaf
      @ nZei,41 SAY 16->zeif
      @ nZei,46 SAY 16->brf
      @ nZei,50 SAY 16->hof
      @ nZei,54 SAY 16->tab_stop
      @ nZei,57 SAY 16->zahl_form
      @ ++nZei,36 SAY 16->spat
      @ nZei,41 SAY 16->zeit
      @ nZei,46 SAY 16->brt
      @ nZei,50 SAY 16->hot
      @ ++nZei,6 SAY "T: "+SubStr(16->text,1,70)
      @ ++nZei,6 SAY "T: "+SubStr(16->text,71,70)
      SKIP
      nZei := IIf( nZei>60, 6, ++nZei )
   ENDDO
   EJECT
   SET DEVICE TO SCREEN
   16->(DbGoto(nRec))
   DbResumeNotifications()
RETURN

//-----------------------------------------------------------
CLASS FilesFF FROM DialogFF
   EXPORTED:
   VAR VArea
   METHOD INIT
   METHOD CREATE
   METHOD notify
ENDCLASS

METHOD FilesFF:INIT( oParent, oOwner, aPos, ASize, aPP, lVisible, nBz, cFF, nAnf, nEnd, nA )
   ::DialogFF:INIT( oParent, oOwner, aPos, ASize, aPP, lVisible, nBz, cFF, nAnf, nEnd, nA )
   ::VArea := nA
   ::BEArea := {}
   AAdd( ::BEArea, oParent )
   ::BENr := Len( ::BEArea )
   ::Fancy := "0"
RETURN self

METHOD FilesFF:CREATE( oParent, oOwner, aPos, ASize, aPP, lVisible, nBz, cFF, nAnf, nEnd, nA )
   ::DialogFF:CREATE( oParent, oOwner, aPos, ASize, aPP, lVisible, nBz, cFF, nAnf, nEnd, nA )
   (nA)->(DbRegisterClient(self))     // reicht es, wenn das Fenster als Ganzes registriert ist??
RETURN self

METHOD FilesFF:notify( nEvent, mp1, mp2 )
   LOCAL nRec, oFocus, i
      IF nEvent == xbeDBO_Notify             // Notify-Ereignis
         IF mp1 == DBO_MOVE_DONE             // Skip ist beendet
            IF !SetAppFocus():isDerivedFrom( "XbpBrowse" ) .AND. Len(::BrowseFeld) > 0
               (::VArea)->(DbSuspendNotifications())
               nRec := (::VArea)->(RecNo())
               FOR i := 1 TO Len(::BrowseFeld)
                  ::BrowseFeld[i]:refreshAll()
               NEXT
               (::VArea)->(DbGoto( nRec ))
               (::VArea)->(DbResetNotifications())
            ENDIF
         ENDIF
      ENDIF
RETURN self
