//////////////////////////////////////////////////////////////////////
//
//  AKDialog aus DATADLG.PRG
//
//  Inhalt:
//      Klassen AKDialog und AKDialogMenu
//////////////////////////////////////////////////////////////////////
//  und ganz unten:    DialogFF als "Dialog from File"
//  und :              BlattFF als "Blatt from File"
///////////////////////////////////
#include "Gra.ch"
#include "Xbp.ch"
#include "Dmlb.ch"
#include "Common.ch"
#include "Appevent.ch"
#include "AKDialog.ch"
#include "Dll.ch"
#include "Thread.ch"

/* 15.04.2008 16:02 ak
   neue Funktion zur Ermittellung der Gr”áen von Titlebar und Menubar
   aus Alaska_Downloads_PI\dbeditor\dialog.prg
   */
//**//**//**//**//**//**//**//**//**//**//**//**//**//**//**//**//**//
// Defines used with the GetSystemMetrics()-API, see XbpGetSystemMetrics()
#define SM_CXDLGFRAME            7
#define SM_CYDLGFRAME            8
#define SM_CYMENU               15
#define SM_CYCAPTION             4

/* Die Original-Methode:
*****************************
METHOD XbpBrowseDialog:Resize(aSizeOld, aSizeNew)
*****************************
* Resize the dialog object; this also adjusts the size of the embedded
* components
Local aSize          :=::CurrentSize()
Local aSizeDA        :=::drawingArea:CurrentSize()
Local nHeightTitlebar:=xbpGetSystemMetrics(SM_CYCAPTION)
Local nHeightMenubar :=xbpGetSystemMetrics(SM_CYMENU)
Local nWidthBorder   :=xbpGetSystemMetrics(SM_CXDLGFRAME)
Local nHeightBorder  :=xbpGetSystemMetrics(SM_CYDLGFRAME)

   // resize dialog
   ::XbpDialog:Resize(aSizeOld, aSizeNew)

   // Compute space occupied by dialog's titlebar, border and menubar
   aSizeDA[1]:=aSize[1]-(nWidthBorder*2)-1
   aSizeDA[2]:=aSize[2]-(nHeightTitlebar+nHeightMenubar+nHeightBorder*2)
   ::drawingArea:setSize({aSizeDA[1],aSizeDA[2]})
   ::drawingArea:setPos({0,20})
   ::drawingArea:resize:={ |mp1,mp2,obj| IIf(Len(obj:childList())>0,obj:childList()[1]:setSize(mp2),Nil) }

   // resize status bar
   ::oStatusBar:setSize({aSizeDA[1],20})
   ::oStatusBar:setPos({0,0})

   // resize infoline
   ::oInfoLine:setSize({aSizeDA[1]-16,16})
   ::oInfoLine:setPos({5,2})

   // resize resize icon
   ::oResizeIcon:setSize({16,16})
   ::oResizeIcon:setPos({aSizeDA[1]-16,2})
   ::oResizeIcon:setCaption(Chr(112))

Return Self
*/
************************
Func XbpGetSystemMetrics(nValue)
************************
Return DllCall("USER32.DLL", DLL_STDCALL, "GetSystemMetrics", nValue)

//**//**//**//**//**//**//**//**//**//**//**//**//**//**//**//**//**//

/*
 * Klassendeklaration
 */
CLASS AKTabPage FROM XbpTabPage  //, XbpDialog
   EXPORTED
      VAR Fenster
      VAR drawingArea
//      VAR minButton
//      VAR maxButton
//      VAR sysMenu  
//      VAR titleBar
      
      METHOD INIT
      METHOD CREATE
ENDCLASS

METHOD AKTabPage:INIT( oParent, oOwner, aPos, ASize, aPP, lVisible )
//      ::XbpDialog:INIT()
      ::XbpTabPage:INIT( oParent, oOwner, aPos, ASize, aPP, lVisible )
      ::Fenster := XbpDialog():new( self, , {0,0}, {ASize[1],ASize[2]-15}, aPP, lVisible )
      ::Fenster:minButton := .F.
      ::Fenster:maxButton := .F.
      ::Fenster:sysMenu   := .F.
      ::Fenster:titleBar  := .F.
//      ::Fenster:XbpDialog():CREATE()
      ::drawingarea := ::Fenster:drawingArea
RETURN self

METHOD AKTabPage:CREATE( oParent, oOwner, aPos, ASize, aPP, lVisible )
      ::XbpTabPage:CREATE( oParent, oOwner, aPos, ASize, aPP, lVisible )
RETURN self

CLASS AKDialog FROM XbpDialog, SCManager
   PROTECTED:
     VAR appendMode              // Wird ein neuer Datensatz angelegt?
     VAR editControls            // XBPs, die Daten „ndern
     VAR appendControls          // XBPs, die nur bei APPEND
                                 // aktiv sind
     VAR keyControls             // Liste von XBPs fr Tastaturnavigation
     VAR keyboardBlock           // Codeblock fr xbeP_Keyboard Ereignisse
   EXPORTED:
     VAR area      READONLY      // aktueller Arbeitsbereich
     VAR newTitle                // Codeblock um Titel zu „ndern
     VAR contextMenu             // Kontextmen fr Datendialog
     VAR windowMenu              // Dynamisches Fenstermen
                                 // im Anwendungsfenster
     VAR currentControl          // Aktuelles Edit Control
     VAR seekOrder               // Daten fr die Suche im
     VAR seekExpr                // SeekDialog
     VAR seekFields
     VAR seekTitle
     VAR cFont
      VAR aData1
      VAR aData2
                                 // 15.04.2008 17:46 fr XbpDialog:resize():
     VAR nHeightTitlebar         // H”he der Titlebar
     VAR nHeightMenubar          // H”he der Menubar
     VAR nWidthBorder            // Breite des linken/rechten Rands
     VAR nHeightBorder           // Breite des unteren Rands
     VAR oLabel                  // das Label auf der Titelzeile
     VAR oIconBar                // die IconLeiste unterhalb der MenuBar 27.06.2008 22:00
     VAR oToolBar                // die DA der ToolLeiste unterhalb der IconBar 24.10.2008 09:43
     VAR oStatusBar              // die DA der TextLeiste am unteren Rand des Fensters 24.10.2008 09:43

     METHOD init                 // Lebenszyklus
     METHOD create
     METHOD configure
     METHOD destroy
     METHOD addEditControl       // XBP fr Edit registrieren
     METHOD addAppendControl     // XBP fr Append registrieren
     METHOD addKeyControl        // XBP fr Keyboard handling registrieren
     METHOD notify               // Nachricht von DBO verarbeiten
     METHOD readData             // Daten einlesen
     METHOD validateAll          // Daten validieren
     METHOD writeData            // Daten schreiben
     METHOD isIndexUnique        // Indexwert prfen
     METHOD setDisplayFocus      // Dialog hat Fokus bekommen
     METHOD keyHandler           // Tastatursteuerung fr Edit controls
     METHOD StrukturErweiterung  // Erweitert die Struktur von Dateien  // 1.1.2005
     METHOD resize               // 07.04.2008 15:14 wenn Gr”áe des Fensters ver„ndert, dann...
     METHOD AddLabel             // Label rechts oben auf die Titelzeile
     METHOD AddIconBar           // Leiste unterhalb der MenuBar  27.06.2008 22:00
ENDCLASS

// 15.04.2008 17:38 aus dbeditor\dialog.prg (Zitat siehe oben)
METHOD AKDialog:resize( aSizeOld, aSizeNew )
//METHOD XbpBrowseDialog:Resize(aSizeOld, aSizeNew)
*****************************
* Resize the dialog object; this also adjusts the size of the embedded components
//Local aSize          :=::CurrentSize()
//Local aSizeDA        :=::drawingArea:CurrentSize()
//Local nHeightTitlebar:=xbpGetSystemMetrics(SM_CYCAPTION)
//Local nHeightMenubar :=xbpGetSystemMetrics(SM_CYMENU)
//Local nWidthBorder   :=xbpGetSystemMetrics(SM_CXDLGFRAME)
//Local nHeightBorder  :=xbpGetSystemMetrics(SM_CYDLGFRAME)
/* Function XbpGetSystemMetrics() siehe oben */
   ::nHeightTitlebar:=xbpGetSystemMetrics(SM_CYCAPTION)
   ::nHeightMenubar :=xbpGetSystemMetrics(SM_CYMENU)
   ::nWidthBorder   :=xbpGetSystemMetrics(SM_CXDLGFRAME)
   ::nHeightBorder  :=xbpGetSystemMetrics(SM_CYDLGFRAME)

   // resize dialog
   ::XbpDialog:Resize(aSizeOld, aSizeNew)

RETURN self
/*
 * Datendialog initialisieren
 */
METHOD AKDialog:init( oParent, oOwner , ;
                        aPos   , aSize  , ;
                        aPParam, lVisible )
   LOCAL aPSize
   LOCAL nBSb
   DEFAULT lVisible TO .T., ;
           oParent  TO SetAppWindow()

   aPParam := IIf( Empty(aPParam), {}, aPParam )
   nBSb := AppDesktop():currentSize()[1]

   IF cBfont != NIL .AND. Val(cBfont)>5      //24.03.2008 15:28
      cFont := Trim(cBfont)                  //24.03.2008 15:28
   ELSEIF  nBSb > 1200
      cFont := "12.Arial"
   ELSEIF nBSb > 1000
      cFont := "10.Arial"
   ELSEIF nBSb >750
      cFont := "8.Arial"
   ELSE
      cFont := "7.Arial"
   ENDIF
   AAdd ( aPParam, { XBP_PP_COMPOUNDNAME, cFont } )

  /*
   * Ohne Angabe einer Position wird das Fenster zentriert angezeigt
   */
   IF aPos == NIL
      aPSize := oParent:currentSize()
      ASize  := {100,100}
      aPos   := { (aPSize[1] - aSize[1]) / 2, ;
                  (aPSize[2] - aSize[2]) / 2  }
   ENDIF

   ::XbpDialog:INIT( oParent, oOwner, ;
                     aPos   , aSize , ;
                     aPParam, lVisible )
   ::XbpDialog:taskList := .T.
   ::minsize := {400,300}     //06.04.2008 17:53
   ::movewithOwner := .F.     //07.04.2008 20:36
//
//06.04.2008 20:33 einstellbar, damit Fenster-Gr”áe variabel/flexibel
   IF cSerieBM != "F"
      ::border          := XBPDLG_RAISEDBORDERTHIN_FIXED
      // 21.04.2007 18:38 Die Wirkung muss beobachtet werden:
      // damit die Fenster nicht immer per 'X' geschlossen werden oder minimiert werden:
      ::sysmenu         := .F.   //21.04.2007 18:31 hebt Min+Max-Button/X/System-Men auf !!
      //
      //     ::minButton       := .T.
      //     ::maxButton       := .T.
      //???wieso wirkt das nicht?:   ::XbpDialog:minButton       := .F.
      // -->Bei einem MDI Client Fenster wird der Pushbutton zum Minimieren des Fensters immer angezeigt, 
      //    es sei denn, :titleBar ist auf .F. (falsch) gesetzt. 
   ENDIF
   ::aData1          := {}
   ::aData2          := {}
   ::area            := 0
   ::editControls    := {}
   ::appendControls  := {}
   ::keyControls     := {}
   ::keyboardBlock   := {|nKey,x,obj| ::keyHandler( nKey, obj ) }
   ::appendMode      := .F.
   ::newTitle        := {|obj| obj:getTitle() }

RETURN self



/*
 * Systemresourcen anfordern
 * und AKDialog im aktuellen Arbeitsbereich registrieren
 */
METHOD AKDialog:create( oParent, oOwner , ;
                          aPos   , aSize  , ;
                          aPParam, lVisible )

   ::xbpDialog:create( oParent, oOwner , ;
                       aPos   , aSize  , ;
                       aPParam, lVisible )

   ::appendMode      := Eof()
   ::area            := Select()

   ::close           := {|mp1,mp2,obj| obj:destroy() }

   DbRegisterClient( self )

/*15.04.2008 17:44 */
   ::nHeightTitlebar:=xbpGetSystemMetrics(SM_CYCAPTION)
   ::nHeightMenubar :=xbpGetSystemMetrics(SM_CYMENU)
   ::nWidthBorder   :=xbpGetSystemMetrics(SM_CXDLGFRAME)
   ::nHeightBorder  :=xbpGetSystemMetrics(SM_CYDLGFRAME)

//+24.10.2008 09:21: damit der HelpThread das betreffende Fenster findet (auch Ersatz fr aThrdFenster??)
   ThreadObject():cargo := self

RETURN self



/*
 * Systemresourcen konfigurieren
 * und Dialog ggf. in neuem Arbeitsbereich registrieren
 */
METHOD AKDialog:configure( oParent, oOwner , ;
                             aPos   , aSize  , ;
                             aPParam, lVisible )
   LOCAL lRegister := (::area <> Select())

   ::xbpDialog:configure( oParent, oOwner , ;
                          aPos   , aSize  , ;
                          aPParam, lVisible )
   IF lRegister
      (::area)->( DbDeRegisterClient( self ) )
   ENDIF

   ::area       := Select()
   ::appendMode := Eof()

   IF lRegister
      DbRegisterClient( self )
   ENDIF

RETURN self



/*
 * Systemresourcen freigeben und AKDialog entregistrieren
 */
METHOD AKDialog:destroy()

  /*
   * Aufruf ignorieren wenn das Fenster schon im INIT Status ist.
   */
   IF ::Status() == XBP_STAT_INIT
      RETURN self
   ENDIF

//   ::writeData()            // wird schon an anderer Stelle gemacht (zB: Button:activate
   ::hide()
//   (::Area)->( DbCloseArea() )

////  /*
////   * Eintrag im Fenstermen l”schen
////   */
////   IF ! Empty( ::windowMenu )
////      ::windowMenu:delItem( self ) //
////      ::windowMenu := NIL
////   ENDIF
////
////  /*
////   * Referenzen auf den AKDialog und das Kontextmen l”schen
////   */
////   IF ! Empty( ::contextMenu )
////      ::contextMenu:cargo := NIL
////      ::contextMenu       := NIL
////   ENDIF

   IF Len(Alias()) > 0           //+01.06.2009 14:18
      DbDeRegisterClient( self )
   ENDIF
   
  /*
   * Systemresourcen freigeben und Instanzvariablen
   * auf die Werte im Zustand :init() zurcksetzen
   */
   ::xbpDialog:destroy()
   ::Area           :=  0
   ::appendMode     := .F.
   ::editControls   := {}
   ::appendControls := {}
   ::newTitle       := {|obj| obj:getTitle() }

RETURN self



/*
 * Notify Methode:
 *   - Vor Bewegen des Satzzeigers, Daten schreiben
 *   - Nach Bewegen des Satzzeigers, Daten neu einlesen
 */
METHOD AKDialog:notify( nEvent, mp1, mp2 )

   IF nEvent <> xbeDBO_Notify
      RETURN self                         // ** RETURN **
   ENDIF

   DbSuspendNotifications()
   DO CASE
   CASE mp1 == DBO_MOVE_PROLOG            // Satzzeiger wird bewegt
      ::writeData()

   CASE mp1 == DBO_MOVE_DONE .OR. ;       // Skip ist beendet
        mp1 == DBO_GOBOTTOM  .OR. ;
        mp1 == DBO_GOTOP
      ::readData()

////      DO CASE
////      CASE Empty( ::contextMenu )
////      CASE Eof()                          // Eintr„ge im Kontextmen
////         ::contextMenu:disableBottom()    // verfgbar machen oder
////         ::contextMenu:disableEof()       // sperren, je nachdem
////      CASE mp1 == DBO_GOBOTTOM            // wo der Satzzeiger sich
////         ::contextMenu:enableAll()        // befindet.
////         ::contextMenu:disableBottom()
////      CASE mp1 == DBO_GOTOP
////         ::contextMenu:enableAll()
////         ::contextMenu:disableTop()
////      OTHERWISE
////         ::contextMenu:enableAll()
////      ENDCASE
////
////      DO CASE
////      CASE Eof()                               // Eintr„ge im Bearbeiten-Men
////         WinMenu():editMenu:disableBottom()    // des Fensters sperren
////         WinMenu():editMenu:disableEof()       // oder verfgbar machen
////      CASE mp1 == DBO_GOBOTTOM                 // je nachdem, wo sich
////         WinMenu():editMenu:enableAll()        // der Satzzeiger befindet
////         WinMenu():editMenu:disableBottom()
////      CASE mp1 == DBO_GOTOP
////         WinMenu():editMenu:enableAll()
////         WinMenu():editMenu:disableTop()
////      OTHERWISE
////         WinMenu():editMenu:enableAll()
////      ENDCASE

   ENDCASE
   DbResetNotifications()

RETURN self



/*
 * EditControl an Liste anfgen
 */
METHOD AKDialog:addEditControl( oXbp )
   IF ValType( oXbp ) = "O"                  // dieses IF von ak am 31.12.02
      IF AScan( ::editControls, oXbp ) == 0
         AAdd(  ::editControls, oXbp )
         ::addKeyControl( oXbp )
      ENDIF
   ELSE
      AAdd(  ::editControls, oXbp )
   ENDIF
RETURN self



/*
 * AppendControl an Liste anfgen
 */
METHOD AKDialog:addAppendControl( oXbp )
   IF AScan( ::appendControls, oXbp ) == 0
      AAdd(  ::appendControls, oXbp )
      ::addKeyControl( oXbp )
   ENDIF
RETURN self



/*
 * XBP an Liste fr die Tastatursteuerung anfgen. Jeder XBP bekommt
 * den gleichen :keyBoard Codeblock. Er wird nach dem Ereignis
 * xbeP_Keyboard ausgewertet und ruft einen benutzerdefinierten
 * Tastatur-Handler
 */
METHOD AKDialog:addKeyControl( oXbp )
   IF AScan( ::keyControls, oXbp ) == 0
      AAdd(  ::keyControls, oXbp )

      oXbp:keyBoard := ::keyboardBlock
   ENDIF
RETURN self



/*
 * Fenster hat den Fokus bekommen.
 * Workarea ausw„hlen, Eintrag im Fenstermen markieren und Fokus
 * auf das aktuelle Edit Control setzen
 */
METHOD AKDialog:setDisplayFocus

   DbSelectArea( ::area )

   IF ::windowMenu <> NIL
      ::windowMenu:checkItem( self )
   ENDIF

   IF ::currentControl <> NIL
      SetAppFocus( ::currentControl )
   ENDIF
RETURN self



//////******************************************************************************
//////* Die ueberladene Keyboard Methode muss die Methode the SCManager Basisklasse
//////* rufen um die ShortCuts zu bearbeiten
//////******************************************************************************
//////METHOD AKDialog:Keyboard( nKey )
//////
//////   LOCAL lHandled := FALSE
//////
//////   lHandled := ::HandleShortCut( nKey )
//////   IF ! lHandled
//////      RETURN ::xbpDialog:keyBoard( nKey )
//////   ENDIF
//////
//////RETURN self

/*
 * Benutzerdefinierte Tastaturverarbeitung
 */
METHOD AKDialog:keyHandler( nKey, oXbp )
   LOCAL i:=AScan( ::keyControls, oXbp )

   //** SCManager:
   LOCAL lHandled := ::HandleShortCut( nKey )

   IF ! lHandled
   DO CASE
   CASE i == 0
   CASE oXbp:isDerivedFrom( "XbpMLE" ) .OR. oXbp:isDerivedFrom( "XbpListbox" )
     // Return, PageUp, PageDown werden zum Editieren von MLE und Listbox
     // verwendet. In dem Fall werden die Tasten hier ignoriert.

   CASE nKey == xbeK_RETURN
      IF ++i > Len( ::keyControls )
         i := 1
      ENDIF
      DO WHILE ! ::keyControls[i]:isenabled()
         i ++
      ENDDO
      SetAppFocus( ::keyControls[i] )

//////   CASE nKey == xbeK_PGDN
//////      IF ! Eof()
//////         SKIP
//////         IF Eof()
//////            DbSuspendNotifications()
//////            SKIP -1                    // Append-Situation vermeiden
//////            DbResetNotifications()
//////            DbGobottom()               // Notification ausl”sen
//////         ENDIF
//////      ENDIF
//////
//////   CASE nKey == xbeK_PGUP
//////      IF ! Bof()
//////         SKIP -1
//////      ENDIF
//////
   ENDCASE
   ENDIF
RETURN self



/*
 * Datensatz lesen und Daten in EditControls einlesen
 */
METHOD AKDialog:readData()
   LOCAL i, imax  := Len( ::editControls )

   FOR i:=1 TO imax                       // Daten aus Datei in
      ::editControls[i]:setData()         // XBPs bertragen
   NEXT

   Eval( ::newTitle, self )               // Neuer Fenstertitel

   IF Eof()                               // XBPs aktivieren oder
      IF ! ::appendMode                   // deaktivieren, die nur
         imax  := Len( ::appendControls ) // bei APPEND zug„nglich
         FOR i:=1 TO imax                 // sein drfen
            ::appendControls[i]:enable()  // Eof() ist erreicht
         NEXT                             // XBPs entsperren
      ENDIF
      ::appendMode := .T.
   ELSEIF ::appendMode                    // Satzzeiger wurde von
      imax  := Len( ::appendControls )    // Eof() auf existierenden
      FOR i:=1 TO imax                    // Datensatz bewegt.
         ::appendControls[i]:disable()    // XBPs wieder sperren
      NEXT
      ::appendMode := .F.
   ENDIF
RETURN



/*
 * Daten der EditControls in eine Datei schreiben
 */
METHOD AKDialog:writeData()
   LOCAL i, imax
   LOCAL lLocked   := .F. , ;       // Ist Satzsperre gesetzt?
         lAppend   := .F. , ;       // Ist Datensatz neu?
         aChanged  := {}  , ;       // XBPs mit ge„nderten Daten
         nOldArea  := Select()      // Aktueller Bereich

   dbSelectArea( ::area )

   IF Eof()                         // Neuen Datensatz anlegen
////      IF ::validateAll()            // Daten vor Append validieren
//////         IF ConfirmBox( self, "Soll ein Datensatz angefgt werden?", ;
//////                        "Dateiende erreicht", ;
//////                        XBPMB_YESNO, ;
//////                        XBPMB_QUESTION ) == XBPMB_RET_YES
////            APPEND BLANK
////            lAppend  := .T.
////            aChanged := ::editControls // Alle XBPs k”nnen ge„ndert sein
////            lLocked  := ! NetErr()     // Automatische Sperre
//////         ELSE
//////            DbSelectArea( nOldArea )   // keinen neuen Datensatz schreiben
//////            RETURN .F.                 // *** ZURšCK ***
//////         ENDIF
////      ELSE
////         MsgBox("Ungltige Daten")  // Keine ungltigen Daten
         DbSelectArea( nOldArea )   // in neuen Datensatz schreiben
         RETURN .F.                 // *** ZURšCK ***
////      ENDIF
   ELSE
      imax := Len( ::editControls ) // Feststellen, welche Daten
      FOR i:=1 TO imax              // ge„ndert wurden
         IF ::editControls[i]:changed
            AAdd( aChanged, ::editControls[i] )
         ENDIF
      NEXT

      IF Empty( aChanged )          // Keine Žnderung ->
         DbSelectArea( nOldArea )   // keine Satzsperre n”tig
         RETURN .T.                 // *** ZURšCK ***
//      ELSEIF ConfirmBox( oCB, "Žnderungen speichern?", ;
//                        "Datensatz wurde ge„ndert.", ;
//                        XBPMB_YESNO, ;
//                        XBPMB_QUESTION ) = XBPMB_RET_NO
//         DbSelectArea( nOldArea )      // keine Satzsperre n”tig
//         RETURN .F.                    // *** ZURšCK ***
      ENDIF
      IF !"AUSKUNFT" $ Alias()      //+31.05.2011 18:57 DELDBE-Files nicht sperren
         lLocked := DbRLock( Recno() ) // Datensatz sperren
      ELSE
         lLocked := .T.
      ENDIF
   ENDIF

   IF ! lLocked
//+15.11.2009 17:51      MsgBox( "Datensatz ist zur Zeit gesperrt" )
      AlertBox( , "Datensatz ist zur Zeit gesperrt!", ;
              { "_OK" }  , ;
              XBPSTATIC_SYSICON_ICONWARNING    , ;
              "" )    //+15.11.2009 17:41
      DbSelectArea( nOldArea )      // keine Satzsperre m”glich
      RETURN .F.                    // *** ZURšCK ***
   ENDIF

   imax := Len( aChanged )          // Schreibzugriff nur fr
   FOR i:=1 TO imax                 // ge„nderte Daten
      IF ! lAppend                  // erforderlich
         IF ! aChanged[i]:validate()
            aChanged[i]:undo()      // ungltige Daten !
            LOOP                    // Original wiederherstellen
         ENDIF                      // und n„chsten XBP validieren
      ENDIF
      aChanged[i]:getData()         // Daten aus XBP holen und
//
//      IIf(i==1 .AND. Alias()!="tl",TransLog(,,aChanged[i]:editbuffer()),)   //29.04.2007 19:03
//
   NEXT                             // in Datei schreiben

   IF !"AUSKUNFT" $ Alias()      //+31.05.2011 18:57 DELDBE-Files nicht sperren
      DbCommit()                       // Datenpuffer wegschreiben
      DbRUnlock( Recno() )             // Sperre aufheben
                                       // Dialogelemente nach Append
   ENDIF
   IF ::appendMode                  // wieder sperren
      imax  := Len( ::appendControls )
      FOR i:=1 TO imax
         ::appendControls[i]:disable()
      NEXT
      ::appendMode := .F.

      IF ! Empty( ::contextMenu )
         ::contextMenu:disableBottom()
         ::contextMenu:enableEof()
      ENDIF
////      WinMenu():editMenu:disableBottom()
////      WinMenu():editMenu:enableEof()
   ENDIF

   DbSelectArea( nOldArea )

RETURN .T.



/*
 * Daten aus allen EditControls validieren
 * Wird bei APPEND gebraucht bevor ein neuer Datensatz angefgt wird
 */
METHOD AKDialog:validateAll()
   LOCAL i := 0, imax := Len( ::editControls )
   LOCAL lValid := .T.

   DO WHILE ++i <= imax .AND. lValid
      lValid := ::editControls[i]:validate()
   ENDDO

RETURN lValid



/*
 * Prfen, ob ein Indexeintrag noch nicht vorhanden ist
 */
METHOD AKDialog:isIndexUnique( nOrder, xIndexValue )
   LOCAL nOldOrder := OrdNumber()
   LOCAL nRecno    := Recno()
   LOCAL lUnique   := .T.
   DEFAULT nOrder TO nOldOrder      //22.06.2008 17:07
   IF !Empty( xIndexValue )
      DbSuspendNotifications()         // Keine Nachricht vom DBO
                                       // an self bei DbSeek() !!!
      OrdSetFocus( nOrder )
      SatzDelete()         // damit er sich nicht selber findet
      lUnique := .NOT. DbSeek( xIndexValue )

      OrdSetFocus( nOldOrder )
      DbGoTo( nRecno )
      SatzRecall()         // damit er wieder da ist
      DbResetNotifications()
   ENDIF
RETURN lUnique

// neue Felder in einer Datei anfgen:
METHOD AKDialog:StrukturErweiterung( cDatei, aNeuFeld, nA )
   LOCAL nOldArea := SELECT(), i, aFeld
   cDatei := cDatver + cDatei
   SELECT (nA)
      DbUseArea( , , cDatei )           // Datei ”ffnen
      COPY TO (cDatei+"k")             // Sicherungskopie
      COPY TO temp                     // Daten zwischenspeichern
      DbCopyExtStruct( "Struct" )         // Struktur bertragen 
 
      DbUseArea( , , "Struct" )           // strukturerweiterte Datei 
      FOR i := 1 TO Len(aNeuFeld)
         aFeld := aNeuFeld[i]
         DbAppend()                          // ”ffnen und neue 
         FIELD->Field_Name := aFeld[1]        // Felddefinition eintragen 
         FIELD->Field_Type := aFeld[2]           
         FIELD->Field_Len  := aFeld[3]            
         FIELD->Field_Dec  := aFeld[4]
      NEXT 
      DbCloseArea() 
////                                          // Sicherungskopie fr 
////      IF FILE(cDatver+"Temp.dbf")
////         COPY FILE ( cDatei+".dbf" ) TO ( cDatver+"Temp.dbf" ) //  - DBF-Datei  
////         COPY FILE ( cDatei+".dbt" ) TO ( cDatver+"Temp.dbt" ) //  - Memo-Datei 
////      ELSE
////         FRename( cDatei+".dbf", cDatver+"Temp.dbf" ) //  - DBF-Datei  
////         Frename( cDatei+".dbt", cDatver+"Temp.dbt" ) //  - Memo-Datei 
////      ENDIF
 
      DbCreateFrom( cDatei,, "Struct" ) // Neue Datei erzeugen 
      DbUseArea( , , cDatei )           // Datei ”ffnen 

 
      DbImport( cDatver+"Temp" )                  // Datens„tze aus Sicherungskopie bernehmen 
      DbCloseArea()
////                                           // Dateien umbenennen 
////      IF FILE(cDatei+".bkf")
////         COPY FILE ( cDatver+"Temp.dbf" ) TO ( cDatei+".bkf" ) //  - DBF-Datei  
////         COPY FILE ( cDatver+"Temp.dbt" ) TO ( cDatei+".bkt" ) //  - Memo-Datei 
////      ELSE
////         FRename( cDatver+"Temp.dbf", cDatei+".bkf" ) //  - DBF-Datei  
////         FRename( cDatver+"Temp.dbt", cDatei+".bkt" ) //  - Memo-Datei 
////      ENDIF
      FErase( "Struct.dbf" )              // Strukturerweiterte Datei l”schen
   SELECT (nOldArea) 
RETURN self 

/* 15.04.2008 22:52 
   Label rechts oben mit Verstorbenennamen und Auftragsnummer:
   */
// This method adds a button onto the titlebar.
// Note : The button itself is a XbpDialog without any frame with
//        an XbpPushButton on its drawingArea in the same
//        size, filling the DA completly.
METHOD AKDialog:AddLabel( cCaption )   // aufrufen, wenn Parameter gesetzt (f08[5]?)
    LOCAL aPos := {::currentsize()[1]-130*nH,::currentsize()[2]-::nHeightTitlebar}
    LOCAL aSize := { 100*nH, ::nHeightTitlebar }
    LOCAL oDlg

    // the dialog created without border, titlebar or anything.
    ::oLabel := XbpDialog():new( AppDesktop(), self, aPos, aSize )
    ::oLabel:movewithOwner := .T.
    ::oLabel:Border        := XBPDLG_NO_BORDER
    ::oLabel:Titlebar      := .F.
    ::oLabel:minButton     := .F.
    ::oLabel:maxButton     := .F.

    ::oLabel:create()

    // the PushButton, in the size of the dialog.
    ::oLabel:cargo := XbpStatic():new( oDlg:drawingarea , , { 0, 0}, ;
                                    oDlg:CurrentSize())
    ::oLabel:cargo:autosize := .F.
//    ::oLabel:cargo:PointerFocus := .F.
    ::oLabel:cargo:caption  := cCaption
    ::oLabel:cargo:Create()

    // add the dialog to the array that stores each user defined
    // button of the titlebar.
//    AAdd( ::aDlg4Buttons, oDlg )
RETURN( self )

//   ::nHeightTitlebar:=xbpGetSystemMetrics(SM_CYCAPTION)
//   ::nHeightMenubar :=xbpGetSystemMetrics(SM_CYMENU)
//   ::nWidthBorder   :=xbpGetSystemMetrics(SM_CXDLGFRAME)
//   ::nHeightBorder  :=xbpGetSystemMetrics(SM_CYDLGFRAME)

METHOD AKDialog:AddIconBar( )   // aufrufen, wenn Parameter gesetzt (f08[5]?)
    LOCAL aPos := {::currentpos()[1]+::nWidthBorder, ;
                  ::currentpos()[2]+::currentsize()[2]-::nHeightTitlebar-::nHeightMenubar - ;
                  Min(::nHeightMenubar,::nHeightMenubar*nV)}
    LOCAL aSize := { ::currentsize()[1]-::nWidthBorder*2, Min(::nHeightMenubar,::nHeightMenubar*nV) }
//    LOCAL oDlg

    // the dialog created without border, titlebar or anything.
    ::oIconBar := XbpDialog():new( AppDesktop(), self, aPos, aSize )
    ::oIconBar:movewithOwner := .T.
    ::oIconBar:Border        := XBPDLG_NO_BORDER
    ::oIconBar:Titlebar      := .F.
    ::oIconBar:minButton     := .F.
    ::oIconBar:maxButton     := .F.

    ::oIconBar:create()
    ::oIconBar:drawingArea:setColorBG( XBPSYSCLR_BACKGROUND )

//////    // the PushButton, in the size of the dialog.
//////    ::oIconBar:cargo := XbpStatic():new( ::oDlg:drawingarea , , { 0, 0}, ;
//////                                    oDlg:CurrentSize())
//////    ::oIconBar:cargo:autosize := .F.
////////    ::oLabel:cargo:PointerFocus := .F.
//////    ::oIconBar:cargo:caption  := cCaption
//////    ::oIconBar:cargo:Create()
//////
//////    // add the dialog to the array that stores each user defined
//////    // button of the titlebar.
////////    AAdd( ::aDlg4Buttons, oDlg )
RETURN( self )
//********************************************************************************
//********************************************************************************
//********************************************************************************

CLASS DialogFF
   PROTECTED:
     VAR appendMode              // Wird ein neuer Datensatz angelegt?
     VAR appendControls          // XBPs, die nur bei APPEND
                                 // aktiv sind
     VAR keyControls             // Liste von XBPs fr Tastaturnavigation
     VAR keyboardBlock           // Codeblock fr xbeP_Keyboard Ereignisse
   EXPORTED:
     VAR editControls            // XBPs, die Daten „ndern

   VAR MenuBar
   VAR SubMenu
   VAR SMNr
   VAR BEArea
   VAR BENr
   VAR TabSeite                  //+15.07.2008 20:54
   VAR TSNr                      //+15.07.2008 20:54
   VAR BrowseFeld
   VAR BFNr
   VAR GruppenBox
   VAR GBNr
   VAR ListBox
   VAR LBNr
   VAR TextZeile
   VAR TZNr
   VAR DruckKnopf
   VAR DKNr
   VAR aDKGesperrt   //+15.03.2009 11:48 enth„lt die Captions der gesperrten Buttons
                     //+ damit kein Druckknopf doppelt wirkt
   VAR MultiZeile
   VAR MZNr
   VAR SingleZeile
   VAR SZNr
   VAR LogikKnopf
   VAR LKNr
   VAR SpinKnopf
   VAR SKNr
   VAR Fancy
   VAR StartFocus
   VAR aFeld
   VAR aFNr
   VAR LastArea      //+25.09.2008 18:18 letzte erzeugte BEArea/Tabseite als Parent fr SLEs etc.
   VAR ActArea       //+25.09.2008 19:10 Area auf der der aktuelle Xbp gezeichnet werden soll
      
   VAR oParent       /* enth„lt den Parent des Dialogs, meist die DrawingArea des Windows */
   VAR oOwner        /* enth„lt den Owner des Dialogs, meist das Window */
   VAR oDrawArea     /* enth„lt die DrawingArea des Owners, meist identisch mit dem Parent */
   VAR VArea         // enth„lt die Area der best.dbf (=1)
   VAR aIndex      // enth„lt die Namen der Indexdateien
   VAR oIndex        //+ Objekt, das die IndexVariable enth„lt/darstellt (SLE) 
   VAR aStructure    // enth„lt die Struktur der Datei in der VArea
   VAR aFelder       // enth„lt alle Feldbezeichnungen der Datei in der VArea
   VAR aBeschreib    // enth„lt alle Feldbeschreibungen der Datei in der VArea
   VAR SuchFeld      // enth„lt die Beschreibung aus aBeschreib   17.04.2005
   VAR aData0        /* enth„lt alle Feldinhalte des aktuellen Datensatzes VOR der Žnderung (fr ::Rueckgaengig()) */
   VAR aData1        /* enth„lt alle Feldinhalte des aktuellen Datensatzes, Stand vorher */
   VAR aData2        /* enth„lt alle Feldinhalte des aktuellen Datensatzes, augenblicklicher Stand */
   VAR aData3        /* enth„lt alle Feldinhalte des aktuellen Datensatzes, augenblicklicher Stand */
   VAR aDataD        /* enth„lt die Differenzen zwischen aData1 und aData2 (wird 29.06.2008 09:15 noch nicht gebraucht) */

   VAR oTip                      // eingeblendete Tip-Zeile
   VAR cTipTime                  // Zeit, zu der PaintTip() aufgerufen wurde  13.04.2008 16:45
   VAR oFocLFSle                 // letztes Feld-SLE, welches den Focus hatte
   VAR oFocLMSle                 // letztes Member-SLE, welches den Focus hatte
   VAR cBestLF                   // cargo des letzten Feld-SLE in Best, welches den Focus hatte
   VAR thisTab                   // die aktuelle Tabpage
   VAR BriefText                 // editierbarer Text in bl_Standardbriefen
   VAR aTxBd                  // Adresse etc. des Briefes
   VAR TxBd0                // editierbarer Text in bl_Standardbriefen
   VAR TxBd1                // editierbarer Text in bl_Standardbriefen
   VAR TxBd2                // editierbarer Text in bl_Standardbriefen
   VAR TxBd3                // editierbarer Text in bl_Standardbriefen
   VAR TxBd4                // editierbarer Text in bl_Standardbriefen
   VAR TxBd5                // editierbarer Text in bl_Standardbriefen
   VAR TxBd6                // editierbarer Text in bl_Standardbriefen
   VAR TxBd7                // editierbarer Text in bl_Standardbriefen
   VAR TxBd8                // editierbarer Text in bl_Standardbriefen
   VAR TxBd9                // editierbarer Text in bl_Standardbriefen
   VAR TxBd10               // editierbarer Text in bl_Standardbriefen
   VAR TxBd11               // editierbarer Text in bl_Standardbriefen
   VAR aR                  // ROT   15.11.2006 09:58 fr Trauerdruck
   VAR aG                  // GELB
   VAR aB                  // BLAU
   VAR aI1                 // HilfsVariable 1   15.11.2006 14:28
   VAR aI2                 // HilfsVariable 2
   VAR aI3                 // HilfsVariable 3
   VAR Sperre           // wenn .T., dann Žndern nur nach Abfrage 26.01.2007 22:36
   VAR aLayout             // Layout der Vorlage als 'S_.TAK-Array'  31.05.2008 18:32
   VAR oTextFenster        // 31.05.2008 19:43 Textfenster zur Ausgabe wie bei DOS fr INEUX

   VAR oVorDlg             //+27.09.2008 22:32:
   VAR ABVorschau          // das Fenster fr die ABVorschau()

//   VAR Scans               //+25.09.2008 09:06 Test mit EZScan + FileView
//   VAR Scans2              //+25.09.2008 09:07  ~
   VAR cScan            // Feld zur Anzeige des Bild-Dateinamens
   VAR cScan2           //+22.07.2008 09:44 Feld zur Eingabe des Scan-Dateinamens fr SonderScans
   VAR cMass            //+29.09.2008 17:24 Maástab fr die Vorschau / den Druck
   
   VAR oDirs               //+ DirTree          fr FileView
   VAR oFiles              //+ FileTree         fr FileView
   VAR oView               //+ Vorschaufenster  fr FileView

   METHOD INIT
   METHOD CREATE
   METHOD CREATEfromARRAY  //26.10.2007 09:40 fr Trauerdruck-Vorschau, rechte Seite/DruckTexte
   METHOD destroy
     METHOD addEditControl       // XBP fr Edit registrieren
     METHOD addAppendControl     // XBP fr Append registrieren
     METHOD addKeyControl        // XBP fr Keyboard handling registrieren
//     METHOD notify
   METHOD SatzLesen              /* liest den aktuellen Datensatz in ::aData0 ... ::aDataD ein 28.06.2008 18:15*/
   METHOD SatzSchreiben          /* beschreibt den aktuellen Datensatz mit ::aData0 ... ::aDataD ein 28.06.2008 18:15*/
//   METHOD Pflichtfelder          //+ * im Prompt erzwingt die Eingabe durch Blockade
   METHOD XbpNummer
   METHOD XbpObjekt
   METHOD XbpObjektSet           // setData in alle Objects desselben Namens in aEditbuffers 05.11.2006 13:41
   METHOD XbpObjektGet           // getData aus allen Objects desselben Namens in aEditbuffers 05.11.2006 13:41
   METHOD BrowseSpalte
   METHOD NEU
   METHOD ENTF
   METHOD SUCH
   METHOD Eingabe
   METHOD Erlaubnis              // Abfrage bei Feldinhalts-Žnderung
   METHOD CodeWort               // fr cAc entwickelt  06.04.2007 18:40
   METHOD BenutzerAendern        // ~
   METHOD BenutzerSuche          // ~
   METHOD PaintTip
   METHOD KillTip
   METHOD TabMax
   METHOD StrukturErweiterung    // neue Felder in einer Datei anfgen
   METHOD AdrDaten               // holt Adresse aus vers.dbf/Area5
   METHOD AutoDaten              // fllt automatisch Felder mit Daten, z.B. Anrede aus 1 Buchstaben
   METHOD PlzDE                  // Suche in Gesamtdeutschland nach PLZ oder Ort
   METHOD IbanBic                //+04.02.2014 16:10 rechnet IBAN&Bic aus Kto+Blz - und umgekehrt
   METHOD TextSuchen             // liest Texte/Bilder aus TEXTE.DBF
   METHOD TextSpeichern          // speichert Texte/Bilder aus TEXTE.DBF
   METHOD HilfeFilm              // zeigt einen Tutor-Film mit Ton
   METHOD DatumSet               // setzt Datumsfelder auf Sterbedatum/Date() oder erh”ht/vermindert um 1/7
   METHOD TextFenster            //31.05.2008 19:41 zur Ausgabe von Text wie bei DOS in ::oTextFenster fr INEUX
   METHOD SwapInachE             //+17.08.2008 16:03 kopiert Felder aus Area I nach Area E
   METHOD PLZ                    //+28.07.2008 20:25 holt zu Straáe+Ort die PLZ, bzw. zur PLZ den Ort
//   METHOD ABDrucken              //+27.09.2008 22:30
   METHOD ABVorschau             //*14.07.2008 16:03 wie in BRegieAB und ~TD
   METHOD Explorator             //+08.07.2009 14:56
//   METHOD FileView               //+26.09.2008 10:42
//   METHOD Gross                  // Upper(::value)
//////   METHOD DateiErzeugen          // neue Datei erzeugen  => sollte schon in INEUx sein!
ENDCLASS

METHOD DialogFF:INIT( oParent, oOwner, aPos, ASize, aPP, lVisible, nBz, cFF, nAnf, nEnd, nA )
   LOCAL i,j,k
   
  /* 07.07.2008 16:18 Fenster in self-Variablen speichern: */
   ::oParent     := IIf( Empty(oParent), SetAppWindow(), oParent )
   ::oOwner      := IIf( Empty(oOwner), ::oParent, oOwner )
   ::oDrawArea   := IIf(IsMemberVar(::oOwner,"drawingArea"),::oOwner:drawingArea,::oOwner)
  /**/
   ::VArea       := nA    // 17.4.2005
   ::SuchFeld    := "AuftragsNummer"
   ::aStructure  := {}    //
   ::aFelder     := {}    //
   ::aBeschreib  := {}    //
   ::aData0      := {}    //
   ::aData1      := {}    //
   ::aData2      := {}    //
   ::aData3      := {}    //
   ::aDataD      := {}    //
   ::aIndex      := {}    // 17.4.2005
   ::SubMenu := {}
   ::SMNr := 0
   ::BEArea := {}
   ::BENr := 0
   ::TabSeite := {}              //+15.07.2008 20:54
   ::TSNr := 0                   //+15.07.2008 20:54
   ::BrowseFeld := {}
   ::BFNr := 0
//   ::BVariable  := {}
//   ::BVNr := 0
   ::GruppenBox := {}
   ::GBNr := 0
   ::ListBox := {}
   ::LBNr := 0
   ::TextZeile := {}
   ::TZNr := 0
   ::DruckKnopf := {}
   ::DKNr := 0
   ::aDKGesperrt := {}  //+15.03.2009 11:51 Inhalt: gesperrte DruckKn”pfe
   ::MultiZeile := {}
   ::MZNr := 0
   ::SingleZeile := {}
   ::SZNr := 0
   ::LogikKnopf := {}
   ::LKNr := 0
   ::SpinKnopf := {}
   ::SKNr := 0
   ::editControls    := {}
   ::appendControls  := {}
   ::keyControls     := {}
   ::keyboardBlock   := {|nKey,x,obj| ::BEArea[1]:cargo:keyHandler( nKey, obj ) }
//   ::keyboardBlock   := {|nKey,x,obj| ::keyHandler( nKey, obj ) }
   ::Fancy := Trim(" ")
   ::aFNr := (nA)->(FCount())    // und: z„hlt bei setname() oberhalb der Anzahl Felder
   ::aFeld := Array( ::aFNr )
   ::StartFocus := "6"
   ::BriefText := ""       // Test fr neues Textprogramm auf bl_Basis (SinzigX)
   ::aTxBd := {}        // Adresse etc. des Briefes
   ::TxBd0 := ""       // Text/Bild fr  Briefe/Trauerdrucke
   ::TxBd1 := ""       // Text/Bild fr  Briefe/Trauerdrucke
   ::TxBd2 := ""       // Text/Bild fr  Briefe/Trauerdrucke
   ::TxBd3 := ""       // Text/Bild fr  Briefe/Trauerdrucke
   ::TxBd4 := ""       // Text/Bild fr  Briefe/Trauerdrucke
   ::TxBd5 := ""       // Text/Bild fr  Briefe/Trauerdrucke
   ::TxBd6 := ""       // Text/Bild fr  Briefe/Trauerdrucke
   ::TxBd7 := ""       // Text/Bild fr  Briefe/Trauerdrucke
   ::TxBd8 := ""       // Text/Bild fr  Briefe/Trauerdrucke
   ::TxBd9 := ""       // Text/Bild fr  Briefe/Trauerdrucke
   ::TxBd10:= ""       // Text/Bild fr  Briefe/Trauerdrucke
   ::TxBd11:= ""       // Text/Bild fr  Briefe/Trauerdrucke
   ::Sperre := IIf(cAdrBM=" ",.T.,.F.)
   ::cScan := ""
   ::cScan2 := ""
RETURN self

// nBz wird hier zur LOCAL! 
//nBzStd h„lt den Standardwert, und nBz h„ngt von HoF ab oder wird zum Standardwert:
//   bei jedem Fenster wird nBz := IIf( !Empty(sv->HoF), sv->HoF*nV, nBzStd )
//   Das gilt nur bis zum n„chsten Fenster ( sv->FIELD_TYPE $ "AWGawg" ) !
METHOD DialogFF:CREATE( oParent, oOwner, aPos, ASize, aPP, lVisible, nBz, cFF, nAnf, nEnd, nA )
   LOCAL oXbp  //nH, nV := AppDesktop():currentSize()[1]/800, [2]/600 waagrecht:nH, senkrecht:nV
   LOCAL nBo := ( AppDesktop():currentSize()[2]-90*nV), nZeiF := 0, nZeiT := 0, cN, nN
   LOCAL aPosT, aSizeT, aPosF, aSizeF
   LOCAL aPPSle := { { XBP_PP_FGCLR       , GRA_CLR_BLACK    } , ;
                     { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } }
   LOCAL aPPTxt := {{ XBP_PP_COMPOUNDNAME, IIf(nV>1.5,"12.Arial",IIf(nV>1,"10.Arial","8.Arial")) }}
   LOCAL aPPB  //+24.08.2008 11:18 fr ABrowse-PresentationParameter
   LOCAL nFGCol := nBGCol := -255, nLFrozen   //+24.08.2008 11:37 fr ABrowse-PresentationParameter
   LOCAL nOldArea := SELECT(), i, y, cFeld, cPic, nBzStd := nBz, nBENr, oPSX, oBitmapX //10.09.2006 13:47
   LOCAL oScroll  //+18.10.2008 21:56 fr die scrollable BEArea 'A'
   PRIVATE bT, cT
//**23.03.2008 12:16://///////////////////////////////////
   IF cBfont != NIL
      IIf(Val(cBfont)>5, aPPTxt := {{ XBP_PP_COMPOUNDNAME, Trim(cBfont) }}, ;
                           cBfont := IIf(nV>1.5,"12.Arial",IIf(nV>1,"10.Arial","8.Arial")) ) 
   ENDIF
   DEFAULT aPP TO aPPTxt
//**
   ::aBeschreib := AClone(::aFelder)
   
   IF FILE( cDatver + cFF + ".dbf" ) // +02.02.2013 10:08 testhalber mit DBF-Dateien statt s_.tak
      DbUseArea( .T.,, cFF, "sv" )           // .T. bedeutet : NEW Area
   ELSEIF FILE( "C:\HDBE\xFldPos.ntx" ) // +22.12.2012 13:58 Aufruf lokal, wegen DbUseArea-Fehler beim Server
      //vv//+05.01.2013 11:18 Trap fr den DbUseArea-Fehler: //////////////////////////
      sleep(1) // vorsichtshalber eine kurze Verschnaufpause, damit s_.tak geschlossen werden konnte...
      bSaveErrorBlock := ErrorBlock( {|e| Break(e)} ) // Fehler-Codeblock sichern und ausschalten
      DO WHILE .T.
         BEGIN SEQUENCE
            DbUseArea( .T.,"SDFNTX", "C:\HDBE\s_.tak", "sv",.F. )   // .T./.F. bedeutet : NEW Area/EXCLUSIVE
            RECOVER  // wird ausgefhrt, wenn USE nicht geklappt hat:
               lstak_used := .F.
               WorkSpaceEval( {|| IIf( Alias()=="SV", lstak_used:=.T., ) } )
               IF lstak_used
                  AlertBox( , "Z„hlen Sie bis 5 und drcke Sie OK!;" + ;
                          ";", ;
                          { "OK" }  , ;
                          XBPSTATIC_SYSICON_ICONWARNING    , ;
                          "Die s_.tak - Datei ist noch von diesem Programm gesperrt?" )
               ELSE
                  AlertBox( , "šberprfen Sie C:\HDBE\S_.SDF + ~S_.TAK;" + ;
                          ";", ;
                          { "OK" }  , ;
                          XBPSTATIC_SYSICON_ICONWARNING    , ;
                          "Ist die s_.tak - Datei gesperrt?" )
               ENDIF
               LOOP  // nochmal USE - vielleicht ist die S_.tak/S_.sdf inzwischen frei?
         ENDSEQUENCE
         IF Alias() == "SV"
            EXIT
         ELSE
               AlertBox( , "šberprfen Sie C:\HDBE\S_.SDF + ~S_.TAK;" + ;
                       ";", ;
                       { "OK" }  , ;
                       XBPSTATIC_SYSICON_ICONWARNING    , ;
                       "Die s_.tak - Datei ist nicht als 'sv' ge”ffnet?" )
               LOOP
         ENDIF
      ENDDO
      ErrorBlock(bSaveErrorBlock)       // Alten Fehler-Codeblock zurckschreiben
      //^^//////////////////////////////////////////////////////////////////////
      OrdListAdd("C:\HDBE\xFldPos")
//+15.10.2008 11:50 mit SCOPE_BOTH geht PLZThrd:Such() nicht, aber mit TOP/BOTTOM:
      DbSetScope( SCOPE_TOP, PadR(Upper(cFF),12) )    //+15.10.2008 10:42
      DbSetScope( SCOPE_BOTTOM, PadR(Upper(cFF),8)+"9999" )    //+15.10.2008 10:42
   ELSEIF FILE( cDatver+"xFldPos.ntx" )                                     // shared am 19.11.2012 17:33 gesetzt:
      DbUseArea( .T.,"SDFNTX", cDatver + "s_.tak", "sv",.T., .T. )   // .T./.T./.T. bedeutet : NEW Area/shared/ReadOnly
      OrdListAdd("xFldPos")          // 9.2.2005: weil schon in ineux geindext
//+15.10.2008 11:50 mit SCOPE_BOTH geht PLZThrd:Such() nicht, aber mit TOP/BOTTOM:
      DbSetScope( SCOPE_TOP, PadR(Upper(cFF),12) )    //+15.10.2008 10:42
      DbSetScope( SCOPE_BOTTOM, PadR(Upper(cFF),8)+"9999" )    //+15.10.2008 10:42
   ELSEIF FILE( cDatver+"s_.tak" )     //+22.03.2010 10:13
      DbUseArea( .T.,"SDFNTX", cDatver + "s_.tak", "sv",, .T. )   // .T./.T. bedeutet : NEW Area/ReadOnly
      OrdCreate( "xFldPos",, "Str(field_pos,3,0)" )
//   ( das entspricht : INDEX ON FIELD_POS TO xFLDPOS )
//+15.10.2008 11:50 mit SCOPE_BOTH geht PLZThrd:Such() nicht, aber mit TOP/BOTTOM:
      DbSetScope( SCOPE_TOP, PadR(Upper(cFF),12) )    //+15.10.2008 10:42
      DbSetScope( SCOPE_BOTTOM, PadR(Upper(cFF),8)+"9999" )    //+15.10.2008 10:42
   ELSE  //+22.03.2010 10:10 es gab manchmal Startschwierigkeiten:
      AlertBox( , "šberprfen Sie die Laufwerke!;"        + ;
              ";", ;
              { "OK" }  , ;
              XBPSTATIC_SYSICON_ICONWARNING    , ;
              "Wo ist die s_.tak - Datei?" )
        DbCloseAll()
        QUIT
   ENDIF
***
////////******************?????      DbSuspendNotifications()
      DbGoTop()
      
/* 27.06.2008 18:18 die Funktionen der Felder der s_.tak:
[FIELDS]
FNAME=C,8,0          der Unter-Name der Bildschirmdatei, z.B. s_best
FIELD_NAME=C,10,0    Feld in einer Datei, Variable, Button-Capture
FIELD_TYPE=C,1,0     C,N,D,M = Variablen mit MGetXR/MMleXR
                     c,n,d   = Variablen mit MGet
                     m,t,u   = Menubar, Mentitel, Meneintrag
                               t mit sv->FIELD_DEC <>0 erzeugt ein Kontextmen
                     A,a     = Static/Fl„chen-Objekt, a: mit BitMapDatei-Darstellung
                     W       = Fenster ohne Titelzeile, auf der DrawingArea 
                     w       = Fenster o.T., auf mit FIELD_DEC einstellbarer ::BEArea 
                     G       = GruppenBox/Rahmen (Static-Objekt)
                     g       = TabPage
                     B       = BrowserRahmen
                     S       = BrowserSpalte/Column
                     s       = BrowserSpalte/Column zum Editieren
                     T       = Text (Static-Objekt)
                     P       = DruckKnopf/PushButton auf der vorigen ::BEArea
                     p       = DruckKnopf/PushButton auf eigenem Fenster (Farbe, Grafik...) 
                                 (neu: auf mit FIELD_DEC einstellbarer ::BEArea/AppDeskTop())
                     X       = ListBox
                     x       = ComboBox
                     o       = CheckBox
                     i       = SpinButton
                     k       = KillInputFocus()
                     K       = KilInputFocus() im editierbaren Browser
                     e       = editable
FIELD_LEN=N,5,0      L„nge des Datenbankfeldes bzw. der Variablen
FIELD_DEC=N,4,0      Dezimalstellen der N-Variablen
                     HelpWerte fr C,D,M,k,e - bei N werden die HelpWerte nur bei k/e angegeben
                     HelpWerte fr X,x,P,p,T,o,i
                     bisher: bei a,w,g,p,T die ::BEArea, auf der das Objekt dargestellt wird
                     jetzt HelpWerte fr awg,p,T
                     bisher: bei S,s: wenn >0, dann Rotanzeige von negativen Werten, <0 ::show()
                     jetzt HelpWerte fr S,s
FIELD_POS=N,3,0      Index der s_.tak-Datei
SPAF=N,4,0           g       = PreOffset
                     X,x,M,C,N,D,o,i = X-Wert der Position
ZEIF=N,4,0           g       = PostOffset
                     X,x,M,C,N,D,o,i = Y-Wert der Position
BRF=N,3,0            bisher: HelpWert der AWGawgT Ss p
                     jetzt:  bei awg,p,T die ::BEArea, auf der das Objekt dargestellt wird
                                         bzw. bei TAB_STOP = "T" die ::TabSeite, auf der das Objekt dargestellt wird
                     jetzt:  bei S,s: wenn >0, dann Rotanzeige von negativen Werten, <0 := ::show()
                     X,x,M,C,N,D,o,i = X-Wert der Gr”áe
HOF=N,3,0            AWGagw  = berlagerter Wert von nBz fr Elemente in diesem AWagw
                     X,x,M,C,N,D,o,i = Y-Wert der Gr”áe
                     T       = Wert <0 zentriert den Text, wenn TAB_STOP = .T.
TAB_STOP=L,1,0       X,x,M,C,N,D,o,P,p = kann mit Tab angesprungen werden
                     g       = .T.: minimized
                     t       = bei Kontextmen wird mit .T.=RBDown, .F.=LBDown gesetzt
                     T       = .T.: Text linksbndig mit HoF<0 zentriert, .F. rechtsbndig
ZAHL_FORM=C,15,0     AWGawgT  = Farbe, Muster
                     X,x,M,C,N,D = Picture
                     C bei memvar: ::unreadable:=****
                     i Grenzwerte
TEXT=C,250,0         G       = Capture-Text
                     g       = TabActivate := &(sv->TEXT)     // CodeBlock
                     AaWw    = Grafik-Datei fr Hintergrund/BitMap
                     t       = MenTitel
                     u       = MenEintrag-Makro, auch als CodeBlock
                     C,N,D,M,o,i = Text als Prompt
                     X,x     = Spaltenberschrift
                     P,p     = Activate-Makro, auch als CodeBlock
                     K,k     = KillInputFocus-Makro, auch als CodeBlock
                     v       = Variablen-Initialierungs-Gleichung
SPAT=N,4,0           AWGawg,T = X-Wert der Position
                     T,B,P,p  = X-Wert der Position
                     C,N,D,M,o,i = X-Wert der Prompt-Position
ZEIT=N,4,0           AWGawg,T = Y-Wert der Position
                     T,B,P,p  = Y-Wert der Position
                     C,N,D,M,o,i = Y-Wert der Prompt-Position
BRT=N,3,0            AWGawg,T = X-Wert der Gr”áe
                     T,B,P,p  = X-Wert der Gr”áe
                     C,N,D,M,o,i = X-Wert der Prompt-Gr”áe
HOT=N,3,0            AWGawg   = Y-Wert der Gr”áe
                                bzw. bei -Wert Einpassen unter ::BEArea, die -Wert davor liegt
                     T,B,P,p  = Y-Wert der Gr”áe
                     C,N,D,M,o,i = Y-Wert der Prompt-Gr”áe
[END]
*/
//+25.09.2008 18:38 ::LastArea wird hier schon zu ::BEArea[::BENr] (=oParent) gesetzt:
   ::LastArea := IIf( ::BENr>0, ::BEArea[::BENr], ::oParent )
    
   DO WHILE !Eof() //.AND. IIf( IsFieldVar("FNAME"), FName=cFF, .T. )
      IF (sv->FIELD_POS < nAnf .OR. sv->FIELD_POS > nEnd .OR. sv->FIELD_POS = 0) //8.2.2005://.AND. .NOT. sv->FIELD_POS < 0
         sv->(DbSkip())
         LOOP
      ENDIF
   /* 26.10.2007 10:47   fr Trauerdruck: s_.tak-Zeile zum Aufbau eines Streifens aus mehreren Zeilen
      dabei steht in der Variablen in sv->FIELD_NAME ( hier: ::aDK[50]...::aDK[59] ) 
      ein zweidimensionales c-Array als String: "{{s_.tak-Zeile1},{s_.tak-Zeile2}...}
   */
      IF sv->FIELD_LEN == 99     //26.10.2007 11:16 zum Aufbau aus String-Array
//         PRIVATE cCfA := sv->FIELD_NAME
//         PRIVATE aCfA := IIf( ValType(&cCfA)=="A", &cCfA, {} )
         PRIVATE cCfA := Trim(sv->FIELD_NAME)      //18.11.2007 14:18
         PRIVATE aCfA := IIf( IsMemberVar(self,cCfA).AND.ValType(oEdit:&cCfA)=="A", ;
                                    AClone(oEdit:&cCfA), {} )  //18.11.2007 14:18
         FOR nCfA := 1 TO Len(aCfA)
            ::CREATEfromARRAY( oParent, oOwner, aPos, ASize, aPP, lVisible, nBz, cFF, nAnf, nEnd, nA, ;
                        nBo, @aPosT, @aSizeT, @aPosF, @aSizeF, @nZeiF, @nZeiT, aCfA, nCfA )  //31.05.2008 19:24
         NEXT
         sv->(DbSkip())
         LOOP
      ENDIF
// 17.04.2005:
      IF Len(::aBeschreib)>0 .AND. sv->FIELD_TYPE $ "CNDM"    //17.4.2005 fr die "sortiert nach"-ToolTips
         cN := IIf( sv->FIELD_NAME[1]=="&", &(SubStr(sv->FIELD_NAME,2)), sv->FIELD_NAME )
         nN := AScan(::aFelder,Upper(Trim(cN)))
         IF nN != 0
            ::aBeschreib[nN] := IIf(!Empty(sv->Text),Trim(sv->TEXT),Trim(sv->FIELD_NAME))
         ENDIF
      ENDIF
//
      DO CASE
       CASE sv->FIELD_TYPE $ "AWGawg"    // erzeugt Browse/Edit - Areas
         nBz := IIf( !Empty(sv->HoF), sv->HoF*nV, nBzStd )
//         aPosT := {Int(sv->SpaT*nH),Int(sv->ZeiT*nV)} ; aSizeT := {Int(sv->BrT*nH),Int(sv->HoT*nV)}
//////         aPosT := {(sv->SpaT*nH),(sv->ZeiT*nV)}
//////       //* 12.07.2008 18:45 damit das Fenster genau reinpasst: wenn sv->HoT<0, dann vorige ::BEArea beachten
//////         aSizeT := { ;  //+ horizontal nach der Parent-Area(!), vertikal nach der Sibling-Area:
//////                  IIf(sv->BrT<0 .AND. ::BEArea[::BENr+1+sv->BrT]:cargo:isderivedfrom("XbpWindow"), ;
//////                  ::BEArea[::BENr+1+sv->BrT]:cargo:currentsize()[1]-aPosT[1], sv->BrT*nH), ;   //*12.07.2008 18:45
//////                  IIf(sv->HoT<0 .AND. ::BEArea[::BENr+1+sv->HoT]:cargo:isderivedfrom("XbpWindow"), ;
//////                  ::BEArea[::BENr+1+sv->HoT]:cargo:currentpos()[2]-aPosT[2], sv->HoT*nV)}   //*12.07.2008 18:45
//+07.06.2009 15:15 aPosT+aSizeT ersetzt durch: (aus AAA\PRGX\DialogFF1.prg)
         aPosT := {(sv->SpaT*nH), ;
                  IIf(sv->ZeiT<0 .AND. ::BEArea[::BENr+1+sv->ZeiT]:cargo:isderivedfrom("XbpWindow"), ;
                  ::BEArea[::BENr+1+sv->ZeiT]:cargo:currentpos()[2] + ;
                  ::BEArea[::BENr+1+sv->ZeiT]:cargo:currentsize()[2], sv->ZeiT*nV)} //+27.10.2008 16:00
       //* 12.07.2008 18:45 damit das Fenster genau reinpasst: wenn sv->HoT<0, dann vorige ::BEArea beachten
         aSizeT := { ;  //+ horizontal nach der Parent-Area(!), vertikal nach der Sibling-Area:
                  IIf(sv->BrT<0 .AND. ::BEArea[::BENr+1+sv->BrT]:cargo:isderivedfrom("XbpWindow"), ;
                  ::BEArea[::BENr+1+sv->BrT]:cargo:currentsize()[1]-aPosT[1], sv->BrT*nH), ;   //*12.07.2008 18:45
                  IIf(sv->HoT<0 .AND. ::BEArea[::BENr+1+sv->HoT]:cargo:isderivedfrom("XbpWindow"), ;
                  ::BEArea[::BENr+1+sv->HoT]:cargo:currentpos()[2]-aPosT[2], ;
                  IIf(sv->HoT=1, ::BEArea[1]:currentsize()[2]-aPosT[2], sv->HoT*nV))}   //+16.02.2009 10:13
//* DrawingArea bekommt FarbVariablen von einem Dummy-"A" (Gr”áe 0) in der Position 1 der s_*.dbf
         IF ::BENr = 1 .AND. cFarbeBG != "0"
//////            ::BEArea[::BENr]:setColorBG( XBPSYSCLR_TRANSPARENT )  // damit Farbe durchscheint
            IF Val(sv->ZAHL_FORM) >= 1000

   // 10.09.2006 13:42 Resourcen aus DLL laden (Muster.dll fr alle Bestatter gleich)
               oPSX := XbpPresSpace():New()   //10.09.2006 13:42
               oPSX:create( ::BEArea[::BENr]:windevice(), ::BEArea[::BENr]:currentsize(), GRA_PU_LOMETRIC )
               oBitmapX    := XbpBitmap():new():create( oPSX )

               ::BEArea[::BENr]:setColorFG( IIf("."$sv->ZAHL_FORM, Val(SubStr(sv->ZAHL_FORM, ;
                                                   At(".",sv->ZAHL_FORM)+1,2)), GRA_CLR_BLACK ))
//               ::BEArea[::BENr]:bitmap := Val( sv->Zahl_Form )
               oBitmapX:load( "MUSTER.DLL", Val( sv->Zahl_Form ) )   //10.09.2006 13:41
               ::BEArea[::BENr]:bitmap := oBitmapX                   //10.09.2006 13:42
               ::BEArea[::BENr]:configure()
            ELSEIF Val(sv->ZAHL_FORM)>0 .AND. Val(sv->ZAHL_FORM)<16  // 31.10.2005 wie weiter unten
               ::BEArea[::BENr]:setColorFG( IIf("."$sv->ZAHL_FORM, ;
                     Val(SubStr(sv->ZAHL_FORM, 1, At(".",sv->ZAHL_FORM)-1)), GRA_CLR_BLACK ))
               ::BEArea[::BENr]:setColorBG( IIf("."$sv->ZAHL_FORM .AND. .NOT. ","$sv->ZAHL_FORM, ;
                     Val(SubStr(sv->ZAHL_FORM, At(".",sv->ZAHL_FORM)+1,2)), ;
                     IIf(","$sv->ZAHL_FORM, GraMakeRGBColor( ;
                     IIf("."$sv->ZAHL_FORM, &("{"+Trim(SubStr(sv->ZAHL_FORM, At(".",sv->ZAHL_FORM)+1))+"}"), ;
                     &("{"+Trim(sv->ZAHL_FORM)+"}") )), ;
                     XBPSYSCLR_DIALOGBACKGROUND ) ))
            ELSE
               ::BEArea[::BENr]:setColorFG( GRA_CLR_BLACK )
               ::BEArea[::BENr]:setColorBG( XBPSYSCLR_DIALOGBACKGROUND )
            ENDIF
         ELSEIF ::BENr = 1
            ::BEArea[::BENr]:setColorFG( GRA_CLR_BLACK )
            ::BEArea[::BENr]:setColorBG( IIf(!Empty(::Menubar), GRA_CLR_DARKGREEN, ;
                                                               XBPSYSCLR_DIALOGBACKGROUND ) )
         ENDIF
//
// "A" macht ein Textfeld und "W" macht ein Fenster ohne Titelzeile
         IF sv->FIELD_TYPE ="A"
//            IF sv->TAB_STOP == .F.
               AAdd( ::BEArea, MStatic():new( oParent, oOwner, aPosT, aSizeT, aPPTxt,, ;
                                                XBPSTATIC_TYPE_BITMAP ) )
               ++::BENr
               ::BEArea[::BENr]:CREATE()
               ::BEArea[::BENr]:helpLink := MagicHelpLabel():New(sv->FIELD_DEC)
               ::LastArea := ::BEArea[::BENr]   //+25.09.2008 18:20
//            ELSE
//               oScroll := DataEntryScrollPage():new( oParent, aPosT, aSizeT,;
//                                                    sv->ZeiF * IIf( nZeiF<50, sv->HoF, 1 ) )
//               oScroll:Create()
//               oScroll:nStep := sv->HoF
//               AAdd( ::BEArea, oScroll:oScrollPage:drawingarea )
//               ++::BENr
////               ::BEArea[::BENr]:CREATE()
//               ::BEArea[::BENr]:helpLink := MagicHelpLabel():New(sv->FIELD_DEC)
//               ::LastArea := ::BEArea[::BENr]
//            ENDIF
         ELSEIF sv->FIELD_TYPE ="a" //18.10.2006 16:35 fr Datei-Bitmaps, z.B. Artikelbilder
            nBENr := IIf( sv->BrF<0, ::BENr + sv->BrF + 1, ;
                     IIf( sv->BrF>0, sv->BrF, ::BENr ) )
            cFeld := Trim( sv->FIELD_NAME )
            IF (nA)->(IsFieldVar( cFeld ))   // 18.10.2006 17:03  XbpStatic mit Bitmap aus Feld
               y := (nA)->(FieldPos( cFeld ))         // y : Feld-Position in WorkArea nA
               AAdd( ::BEArea, BitView():new( ::BEArea[nBENr], ::BEArea[nBENr], aPosT, aSizeT, aPPTxt,, ;
                                             XBPSTATIC_TYPE_BITMAP, @(nA)->&cFeld, y, nA ) )
               ++::BENr
               ::BEArea[::BENr]:CREATE( ::BEArea[nBENr], ::BEArea[nBENr], aPosT, aSizeT, aPPTxt,, ;
                                             XBPSTATIC_TYPE_BITMAP, @(nA)->&cFeld )
               ::BEArea[::BENr]:setData()
               ::BEArea[::BENr]:helpLink := MagicHelpLabel():New(sv->FIELD_DEC)
               ::BEArea[::BENr]:setName( y )
               ::BEArea[::BENr]:cargo := Trim( sv->FIELD_NAME )
               ::addEditControl( ::BEArea[::BENr] )
            ELSE
               AAdd( ::BEArea, MStatic():new( ::BEArea[nBENr], ::BEArea[nBENr], aPosT, aSizeT, aPPTxt,, ;
                                             XBPSTATIC_TYPE_BITMAP ) )
               ++::BENr
               ::BEArea[::BENr]:CREATE()
               ::BEArea[::BENr]:helpLink := MagicHelpLabel():New(sv->FIELD_DEC)
            ENDIF
            ::LastArea := ::BEArea[::BENr]   //+25.09.2008 18:20
         ELSEIF sv->FIELD_TYPE = "G"    // erzeugt eine Gruppenbox  //*** noch testen !!!!!!!
// s.o.           aPosT := {Int(sv->SpaT*nV),Int(sv->ZeiT*nV)} ; aSizeT := {Int(sv->BrT*nV),Int(sv->HoT*nV)}
            // 24.03.2008 15:45 ohne aPP, damit GROUPBOX nicht die Schriftgr”áe ver„ndert!:
            AAdd( ::GruppenBox, MStatic():new( ::BEArea[::BENr], oOwner, aPosT, aSizeT, ,, ;
                                       XBPSTATIC_TYPE_GROUPBOX, ;
                                       IIf(SET(43)==0,ConvToAnsiCP(Trim(sv->TEXT)),Trim(sv->TEXT)) ) )   //03.12.2006 15:26
            ++::GBNr
            IIf( nV<=1, ::GruppenBox[::GBNr]:setFontCompoundName( "6.Arial" ), )
            ::GruppenBox[::GBNr]:create()
            ::GruppenBox[::GBNr]:helpLink := MagicHelpLabel():New(sv->FIELD_DEC)
         ELSEIF sv->FIELD_TYPE ="W"    // Fenster direkt auf der DrawingArea
            IF "ICONBAR" $ Upper(sv->FIELD_NAME)
               aPosT := {0, ::BEArea[1]:currentsize()[2] - ::BEArea[1]:cargo:nHeightMenubar*sv->ZeiT }
               aSizeT := { ::BEArea[1]:currentsize()[1], ::BEArea[1]:cargo:nHeightMenubar*sv->HoT }
            ELSEIF "TOOLBAR" $ Upper(sv->FIELD_NAME)     //+23.10.2008 22:45
               aPosT := {0, ::BEArea[1]:currentsize()[2] - ::BEArea[1]:cargo:nHeightMenubar*sv->ZeiT }
               aSizeT := { ::BEArea[1]:currentsize()[1], ::BEArea[1]:cargo:nHeightMenubar*sv->HoT }
            ELSEIF "STATUSBAR" $ Upper(sv->FIELD_NAME)   //+23.10.2008 22:45
               aPosT := {0,0}
               aSizeT := { ::BEArea[1]:currentsize()[1], ::BEArea[1]:cargo:nHeightMenubar*sv->HoT }
            ENDIF
            oXbp := XbpDialog():new( ::BEArea[1], ::BEArea[1], aPosT, aSizeT, aPPTxt,, )
            oXbp:minButton := .F.
            oXbp:maxButton := .F.
            oXbp:sysMenu   := .F.
            oXbp:titleBar  := .F.
            oXbp:border    := sv->FIELD_LEN + 3    // 3 = XBPDLG_THINBORDER, 1 = XBPDLG_NO_BORDER
            oXbp:CREATE()
            AAdd( ::BEArea, oXbp:drawingArea )     // die DrawingArea des Fensters
            ++::BENr
            ::BEArea[::BENr]:cargo := oXbp         // das XbpDialog-Objekt = Fenster
            ::BEArea[::BENr]:cargo:title := Trim(sv->FIELD_NAME)  // Unterscheidungsmerkmal zum Identifizieren03.08.2008 10:16
            ::BEArea[::BENr]:helpLink := MagicHelpLabel():New(sv->FIELD_DEC)
            ::BEArea[::BENr]:clipSiblings := .T.
            ::BEArea[::BENr]:setColorBG( XBPSYSCLR_TRANSPARENT )  // damit Farbe durchscheint
            IF "ICONBAR" $ Upper(sv->FIELD_NAME)
               ::BEArea[1]:cargo:oIconbar := ::BEArea[::BENr]
            ELSEIF "TOOLBAR" $ Upper(sv->FIELD_NAME)     //+23.10.2008 22:45
               ::BEArea[1]:cargo:oToolbar := ::BEArea[::BENr]
            ELSEIF "STATUSBAR" $ Upper(sv->FIELD_NAME)   //+23.10.2008 22:45
               ::BEArea[1]:cargo:oStatusbar := ::BEArea[::BENr]
            ENDIF
            ::LastArea := ::BEArea[::BENr]   //+25.09.2008 18:20
         ELSEIF sv->FIELD_TYPE ="w"   // Fenster auf einem bereits eingegebenen Fenster
            IF sv->TAB_STOP == .T.     //+15.07.2008 21:34 aktuelle TabSeite als Parent/Owner des BEArea
               //               nBENr := IIf( sv->BrF<0, ::TSNr + sv->BrF + 1, ;
               //                        IIf( sv->BrF>0, sv->BrF, ::TSNr ) )
               aSizeT := {(sv->BrT*nH),IIf(sv->HoT<0, ;
                        ::TabSeite[::TSNr]:currentsize()[2] - ;
                        ::TabSeite[::TSNr]:tabHeight - aPosT[2], sv->HoT*nV)}   //+15.07.2008 21:52
               oXbp := XbpDialog():new( ::TabSeite[::TSNr], ::TabSeite[::TSNr], aPosT, aSizeT, aPPTxt,, )
            ELSE  // beliebige frhere BEArea als Parent/Owner dieses BEArea(weil auf dieser ja schon andere BEArea gewesen sein k”nnten)
               nBENr := IIf( sv->BrF<0, ::BENr + sv->BrF + 1, ;
                        IIf( sv->BrF>0, sv->BrF, ::BENr ) )
               //+27.11.2008 15:21 damit man sowas wie die ICONBAR nicht zu Fuá machen muss:
               IF "ICONBAR" $ Upper(sv->FIELD_NAME)
                  aPosT := {0, ::BEArea[nBENr]:currentsize()[2] - ::BEArea[1]:cargo:nHeightMenubar*sv->ZeiT }
                  aSizeT := { ::BEArea[nBENr]:currentsize()[1], ::BEArea[1]:cargo:nHeightMenubar*sv->HoT }
               ELSEIF "TOOLBAR" $ Upper(sv->FIELD_NAME)
                  aPosT := {0, ::BEArea[nBENr]:currentsize()[2] - ::BEArea[1]:cargo:nHeightMenubar*sv->ZeiT }
                  aSizeT := { ::BEArea[nBENr]:currentsize()[1], ::BEArea[1]:cargo:nHeightMenubar*sv->HoT }
               ELSEIF "STATUSBAR" $ Upper(sv->FIELD_NAME)
                  aPosT := {0,0}
                  aSizeT := { ::BEArea[nBENr]:currentsize()[1], ::BEArea[1]:cargo:nHeightMenubar*sv->HoT }
               ENDIF
               oXbp := XbpDialog():new( ::BEArea[nBENr], ::BEArea[nBENr], aPosT, aSizeT, aPPTxt,, )
            ENDIF
            oXbp:minButton := .F.
            oXbp:maxButton := .F.
            oXbp:sysMenu   := .F.
            oXbp:titleBar  := .F.
            oXbp:border    := sv->FIELD_LEN + 3    // 3 = XBPDLG_THINBORDER, 1 = XBPDLG_NO_BORDER
            oXbp:CREATE()
            AAdd( ::BEArea, oXbp:drawingArea )     // die DrawingArea des Fensters
            ++::BENr
            ::BEArea[::BENr]:cargo := oXbp         // das Xbp_Dialog-Objekt = Fenster
            ::BEArea[::BENr]:cargo:title := Trim(sv->FIELD_NAME)  // Unterscheidungsmerkmal zum Identifizieren03.08.2008 10:16
            ::BEArea[::BENr]:helpLink := MagicHelpLabel():New(sv->FIELD_DEC)
            ::BEArea[::BENr]:clipSiblings := .T.
            ::BEArea[::BENr]:setColorBG( XBPSYSCLR_TRANSPARENT )  // damit Farbe durchscheint
            //+27.11.2008 15:21 damit man sowas wie die ICONBAR nicht zu Fuá machen muss:
            //+ Parent hat in der cargo sein DialogWindow, dessen oIconbar... wird gesetzt:
            IF "ICONBAR" $ Upper(sv->FIELD_NAME)
               ::BEArea[1]:cargo:oIconbar := ::BEArea[::BENr]
            ELSEIF "TOOLBAR" $ Upper(sv->FIELD_NAME)
               ::BEArea[1]:cargo:oToolbar := ::BEArea[::BENr]
            ELSEIF "STATUSBAR" $ Upper(sv->FIELD_NAME)
               ::BEArea[1]:cargo:oStatusbar := ::BEArea[::BENr]
            ENDIF
            ::LastArea := ::BEArea[::BENr]   //+25.09.2008 18:20
//////            IF sv->TAB_STOP == .T.     //+15.07.2008 21:34 aktuelle TabSeite als Parent/Owner des Fensters
//////               //               nBENr := IIf( sv->BrF<0, ::TSNr + sv->BrF + 1, ;
//////               //                        IIf( sv->BrF>0, sv->BrF, ::TSNr ) )
//////               aSizeT := {(sv->BrT*nH),IIf(sv->HoT<0, ;
//////                        ::TabSeite[::TSNr]:currentsize()[2] - ;
//////                        ::TabSeite[::TSNr]:tabHeight - aPosT[2], sv->HoT*nV)}   //+15.07.2008 21:52
//////               oXbp := XbpDialog():new( ::TabSeite[::TSNr], ::TabSeite[::TSNr], aPosT, aSizeT, aPPTxt,, )
//////            ELSE
//////               nBENr := IIf( sv->BrF<0, ::BENr + sv->BrF + 1, ;
//////                        IIf( sv->BrF>0, sv->BrF, ::BENr ) )
//////               oXbp := XbpDialog():new( ::BEArea[nBENr], ::BEArea[nBENr], aPosT, aSizeT, aPPTxt,, )
//////            ENDIF
//////            oXbp:minButton := .F.
//////            oXbp:maxButton := .F.
//////            oXbp:sysMenu   := .F.
//////            oXbp:titleBar  := .F.
//////            oXbp:border    := sv->FIELD_LEN + 3    // 3 = XBPDLG_THINBORDER, 1 = XBPDLG_NO_BORDER
//////            oXbp:CREATE()
//////            AAdd( ::BEArea, oXbp:drawingArea )     // die DrawingArea des Fensters
//////            ++::BENr
//////            ::BEArea[::BENr]:cargo := oXbp         // das Xbp_Dialog-Objekt = Fenster
//////            ::BEArea[::BENr]:cargo:title := Trim(sv->FIELD_NAME)  // Unterscheidungsmerkmal zum Identifizieren03.08.2008 10:16
//////            ::BEArea[::BENr]:helpLink := MagicHelpLabel():New(sv->FIELD_DEC)
//////            ::BEArea[::BENr]:clipSiblings := .T.
//////            ::BEArea[::BENr]:setColorBG( XBPSYSCLR_TRANSPARENT )  // damit Farbe durchscheint
//////            ::LastArea := ::BEArea[::BENr]   //+25.09.2008 18:20
         ELSEIF  sv->FIELD_TYPE = "g"    // kleines "g" - erzeugt eine TabPage auf oDlg:drawingArea
            nBENr := IIf( sv->BrF<0, ::BENr + sv->BrF + 1, ;
                     IIf( sv->BrF>0, sv->BrF, ::BENr ) )
            aPosT := {Int(sv->SpaT*nH),Int(sv->ZeiT*nV)}    // ; aSizeT := {Int(sv->BrT*nH),Int(sv->HoT*nV)}
       //* 12.07.2008 18:45 damit das Fenster genau reinpasst: wenn sv->HoT<0, dann vorige ::BEArea beachten
         aSizeT := {(sv->BrT*nH),IIf(sv->HoT<0 .AND. ::BEArea[::BENr+1+sv->HoT]:cargo:isderivedfrom("XbpWindow"), ;
                  ::BEArea[::BENr+1+sv->HoT]:cargo:currentpos()[2]-aPosT[2], ;
                  IIf(sv->HoT=0, ::BEArea[nBENr]:currentsize()[2], sv->HoT*nV))}   //+12.07.2009 19:37
//            AAdd( ::BEArea, XbpTabPage():new( ::BEArea[nBENr], ::BEArea[nBENr], aPosT, aSizeT, aPPTxt, lVisible ) )
          //+ ::TabSeite ersetzt jetzt ::BEArea, um die Tabseiten bequemer ansprechen zu k”nnen
          //+ die Parent und Owner sind aber nach wie vor ::BEArea !
            AAdd( ::TabSeite, XbpTabPage():new( ::BEArea[nBENr], ::BEArea[nBENr], aPosT, aSizeT, aPPTxt, lVisible ) )
            ::TabSeite[++::TSNr]:caption   := IIf(SET(43)==0,ConvToAnsiCP(sv->FIELD_NAME),sv->FIELD_NAME)  //03.12.2006 15:27
            ::TabSeite[::TSNr]:clipSiblings  := .T.
            ::TabSeite[::TSNr]:tabStop  := .T.
            ::TabSeite[::TSNr]:tabHeight  := sv->FIELD_LEN * nV   //08.07.2008 18:20
            ::TabSeite[::TSNr]:preOffset  := sv->SpaF
            ::TabSeite[::TSNr]:postOffset := SV->ZeiF
//#define XBPTABPAGE_TAB_BOTTOM              2
//#define XBPTABPAGE_TAB_TOP                 4     27.06.2008 19:39: sv->HoF ist aber nBz !!!
            ::TabSeite[::TSNr]:TYPE := IIf(sv->HoF=2,2,4)  //22.04.2007 19:05
            ::TabSeite[::TSNr]:create()
            ::TabSeite[::TSNr]:helpLink := MagicHelpLabel():New(sv->FIELD_DEC)
            ::TabSeite[::TSNr]:minimized := sv->TAB_STOP
            IIf(sv->TAB_STOP,::TabSeite[::TSNr]:minimize(), ;
                              {::TabSeite[::TSNr]:maximize(),::thistab:=::TabSeite[::TSNr]} ) //11.11.2006 19:10
            ::TabSeite[::TSNr]:TabActivate := &(sv->TEXT)     // CodeBlock
            ::TabSeite[::TSNr]:cargo   := Trim(sv->FIELD_NAME)
            ::LastArea := ::TabSeite[::TSNr]   //+25.09.2008 18:20
         ENDIF
         IF cFarbeBG != "0"
            IF ::BEArea[::BENr]:isDerivedfrom( "BitView" )
               // Farbe ist schon als Grafik eingestellt !
            ELSEIF Val(sv->ZAHL_FORM) >= 1000 .AND. IsMemberVar( ::BEArea[::BENr], "bitmap" )
   // 10.09.2006 13:42 Resourcen aus DLL laden (Muster.dll fr alle Bestatter gleich)
               oPSX := XbpPresSpace():New()   //10.09.2006 13:42
               oPSX:create( ::BEArea[::BENr]:windevice(), ::BEArea[::BENr]:currentsize(), GRA_PU_LOMETRIC )
               oBitmapX    := XbpBitmap():new():create( oPSX )

               // Umschaltung der Mandantenfarben  09.09.2006 14:03 :
               IF "," $ sv->ZAHL_FORM .AND. (cDatver = cNetver2 .OR. IIf( IsMemVar("cDru"), ;
                                 Upper(cDru) = Trim(sv->TEXT), .F. )) //04.02.2007 09:54
                  cZF2 := SubStr( sv->ZAHL_FORM, At( ",", sv->ZAHL_FORM)+1 )
                  ::BEArea[::BENr]:setColorFG( IIf("."$cZF2, Val(SubStr( cZF2, ;
                                                      At(".",cZF2)+1,2)), GRA_CLR_BLACK ))
//                  ::BEArea[::BENr]:bitmap := Val( cZF2 )
                  oBitmapX:load( "MUSTER.DLL", Val( cZF2 ) )
                  ::BEArea[::BENr]:bitmap := oBitmapX
                  ::BEArea[::BENr]:configure()
               ELSE
                  ::BEArea[::BENr]:setColorFG( IIf("."$sv->ZAHL_FORM, Val(SubStr(sv->ZAHL_FORM, ;
                                                      At(".",sv->ZAHL_FORM)+1,2)), GRA_CLR_BLACK ))
//                  ::BEArea[::BENr]:bitmap := Val( sv->Zahl_Form ) // stattdessen neu:
                  oBitmapX:load( "MUSTER.DLL", Val( sv->Zahl_Form ) )   //10.09.2006 13:41
                  ::BEArea[::BENr]:bitmap := oBitmapX                   //10.09.2006 13:42
                  ::BEArea[::BENr]:configure()
               ENDIF
            ELSEIF Val(sv->ZAHL_FORM)>0 .AND. Val(sv->ZAHL_FORM)<16 .OR. ","$sv->ZAHL_FORM
               IF sv->FIELD_TYPE = "g"
                  ::TabSeite[::TSNr]:setColorFG( IIf("."$sv->ZAHL_FORM, ;
                        Val(SubStr(sv->ZAHL_FORM, 1, At(".",sv->ZAHL_FORM)-1)), GRA_CLR_BLACK ))
                  ::TabSeite[::TSNr]:setColorBG( IIf("."$sv->ZAHL_FORM .AND. .NOT. ","$sv->ZAHL_FORM, ;
                        Val(SubStr(sv->ZAHL_FORM, At(".",sv->ZAHL_FORM)+1,2)), ;
                        IIf(","$sv->ZAHL_FORM, GraMakeRGBColor( ;
                        IIf("."$sv->ZAHL_FORM, &("{"+Trim(SubStr(sv->ZAHL_FORM, At(".",sv->ZAHL_FORM)+1))+"}"), ;
                        &("{"+Trim(sv->ZAHL_FORM)+"}") )), ;
                        XBPSYSCLR_DIALOGBACKGROUND ) ))
               ELSE
                  ::BEArea[::BENr]:setColorFG( IIf("."$sv->ZAHL_FORM, ;
                        Val(SubStr(sv->ZAHL_FORM, 1, At(".",sv->ZAHL_FORM)-1)), GRA_CLR_BLACK ))
                  ::BEArea[::BENr]:setColorBG( IIf("."$sv->ZAHL_FORM .AND. !","$sv->ZAHL_FORM .AND. !"a"$sv->ZAHL_FORM, ;
                        Val(SubStr(sv->ZAHL_FORM, At(".",sv->ZAHL_FORM)+1,2)), ;
                        IIf(","$sv->ZAHL_FORM .OR. "a"$sv->ZAHL_FORM, GraMakeRGBColor( ;
                        IIf("."$sv->ZAHL_FORM, IIf("a"$sv->ZAHL_FORM,&(Trim(SubStr(sv->ZAHL_FORM, At("a",sv->ZAHL_FORM)))), ;
                           &("{"+Trim(SubStr(sv->ZAHL_FORM, At(".",sv->ZAHL_FORM)+1))+"}")), ;
                           IIf("a"$sv->ZAHL_FORM,&(Trim(SubStr(sv->ZAHL_FORM, At("a",sv->ZAHL_FORM)))), ;
                              &("{"+Trim(sv->ZAHL_FORM)+"}") ) )), ;
                        XBPSYSCLR_DIALOGBACKGROUND ) ))
               ENDIF
            ELSE
               ::BEArea[::BENr]:setColorFG( GRA_CLR_BLACK )
               ::BEArea[::BENr]:setColorBG( XBPSYSCLR_DIALOGBACKGROUND )
            ENDIF
         ELSE
            ::BEArea[::BENr]:setColorFG( GRA_CLR_BLACK )
            ::BEArea[::BENr]:setColorBG( XBPSYSCLR_DIALOGBACKGROUND )
         ENDIF
//////         IF ((".BMP"$Upper( sv->TEXT ) .OR. ".JPG"$Upper( sv->TEXT ) .AND. ::Fancy != "0") ) //18.10.2006 17:07
//////            IF !Empty(sv->text)
//////               ::BEArea[::BENr]:cargo := BitView():new( ::BEArea[::BENr] )
//////               ::BEArea[::BENr]:cargo:load( Trim(::Fancy) + Trim(sv->TEXT) )
//////               ::BEArea[::BENr]:paint := {|x,y,obj| x:=obj:currentSize(), ;
//////                                          ::BEArea[::BENr]:cargo:DISPLAY( {0,0,x[1],x[2]} ) }
//////               ::BEArea[::BENr]:cargo:CREATE()
//////            ELSEIF (nA)->(IsFieldVar(Trim(sv->FIELD_NAME))) .AND. sv->FIELD_TYPE ="A"  // fr Artikelbilder
//////               ::BEArea[::BENr]:cargo := BitView():new( ::BEArea[::BENr] )
//////               cFeld := Trim( sv->FIELD_NAME )
//////               y := (nA)->(FieldPos( cFeld ))         // y : Feld-Position in WorkArea nA
//////               ::BEArea[::BENr]:cargo:datalink := {|x| IIf( PCOUNT()==0,(nA)->&cFeld,(nA)->&cFeld:=x ) }
//////               ::BEArea[::BENr]:cargo:CREATE():setdata()
//////               ::BEArea[::BENr]:cargo:setname( y )
//////               ::addEditControl( ::BEArea[::BENr]:cargo )
//////            ENDIF
//////         ENDIF
         IF Left(sv->TEXT,2)=="{|" .AND. sv->FIELD_TYPE != "g"     //+17.07.2008 18:11 Experiment...geglckt: FileView
            cF := Trim(sv->TEXT)
            Eval( &cF )
         ELSEIF Left(sv->Text,2)!="{|"
            cF := Trim(sv->TEXT)    //*09.07.2008 18:05 damit Makros Dateiname bergeben k”nnen
            cF := IIf( Len(cF)>0 .AND. cF[1]=="&", &(SubStr(cF,2)), cF )
         ENDIF
         //* in ::Fancy kann z.B. auch ein Pfad bergeben werden:
         IF ((".BMP"$Upper( cF ) .OR. ".JPG"$Upper( cF ) .AND. ::Fancy != "0") .OR. ;
               (nA)->(IsFieldVar(Trim(sv->FIELD_NAME))))    // 26.02.2006 fr Artikelbilder
            ::BEArea[::BENr]:cargo := BitView():new( ::BEArea[::BENr] )
            IF !Empty(cF)
               ::BEArea[::BENr]:cargo:load( Trim(::Fancy) + cF )
               ::BEArea[::BENr]:paint := {|x,y,obj| x:=obj:currentSize(), ;
                                          ::BEArea[::BENr]:cargo:DISPLAY( {0,0,x[1],x[2]} ) }
               ::BEArea[::BENr]:cargo:CREATE()
            ELSEIF (nA)->(IsFieldVar(Trim(sv->FIELD_NAME))) .AND. sv->FIELD_TYPE != "a"// fr Artikelbilder
               cFeld := Trim( sv->FIELD_NAME )
               y := (nA)->(FieldPos( cFeld ))         // y : Feld-Position in WorkArea nA
               ::BEArea[::BENr]:cargo:datalink := {|x| IIf( PCOUNT()==0,(nA)->&cFeld,(nA)->&cFeld:=x ) }
               ::BEArea[::BENr]:cargo:CREATE():setdata()
               ::BEArea[::BENr]:cargo:setname( y )
               ::addEditControl( ::BEArea[::BENr]:cargo )
            ENDIF
         ENDIF
*************
**********************************
       CASE sv->FIELD_TYPE = "m"    // kleines "m" - erzeugt eine MenuBar, nur wenn das Fenster AppDeskTop() als Parent hat!
//         ::MenuBar := IIf(::BENr>2,::BEArea[::BENr]:setParent():menubar(),::BEArea[1]:cargo:menuBar())
         ::MenuBar := ::BEArea[1]:cargo:menuBar()
       CASE sv->FIELD_TYPE = "t"    // kleines "t" - erzeugt MenuTitel
         IF sv->HoF < 0       //+ 13.07.2009 10:53 l”scht Meneintr„ge
            ::MenuBar:delItem( - sv->HoF)
         ELSEIF sv->HoF > 0   //+ 13.07.2009 10:53 inaktiviert Meneintr„ge
            ::MenuBar:disableItem(sv->HoF)
         ELSEIF sv->FIELD_DEC <>0       // 06.11.2006 17:47 erzeugt ein Kontextmen
//            nTZNr := IIf( sv->FIELD_DEC<0, ::TZNr + sv->FIELD_DEC + 1, ;
//                     IIf( sv->FIELD_DEC>0, sv->FIELD_DEC, ::TZNr ) )
//++15.09.2008 10:09
            IF !Empty(sv->FIELD_NAME)     //+30.08.2008 14:51
               nTZNr := ::XbpNummer( ::TextZeile, Trim(sv->FIELD_NAME) )
            ELSE
               nTZNr := IIf( sv->FIELD_DEC<0, ::TZNr + sv->FIELD_DEC + 1, ;
                        IIf( sv->FIELD_DEC>0, sv->FIELD_DEC, ::TZNr ) )
            ENDIF
            AAdd( ::SubMenu, XbpMenu():new(::TextZeile[nTZNr]):CREATE() )
            ++::SMNr
            ::SubMenu[::SMNr]:title := IIf(SET(43)==0,ConvToAnsiCP(Trim(sv->TEXT)),Trim(sv->TEXT))
            ::SubMenu[::SMNr]:cargo := IIf(SET(43)==0,ConvToAnsiCP(Trim(sv->TEXT)),Trim(sv->TEXT))
            ::SubMenu[::SMNr]:helplink := Trim(sv->FIELD_NAME)    // Hilfsvariable fr ::SymbolAusrichten()
            IF sv->TAB_STOP = .T.
               ::TextZeile[nTZNr]:RBDown := { |mp1, mp2, obj| ;
                  oEdit:XbpObjekt(oEdit:SubMenu,obj:caption):PopUp( obj, mp1, 2 , ; 
                  XBPMENU_PU_DEFAULT + XBPMENU_PU_MOUSE_RBDOWN  ) } 
            ELSE
               ::TextZeile[nTZNr]:LBDown := { |mp1, mp2, obj| ;
                  oEdit:XbpObjekt(oEdit:SubMenu,obj:caption):PopUp( obj, mp1, 2 , ; 
                  XBPMENU_PU_DEFAULT + XBPMENU_PU_MOUSE_LBDOWN  ) }
            ENDIF
         ELSE                       // erzeugt ein Untermen in einer MenuBar
            AAdd( ::SubMenu, XbpMenu():new(::MenuBar):CREATE() )
            ++::SMNr
            ::SubMenu[::SMNr]:title := IIf(SET(43)==0,ConvToAnsiCP(Trim(sv->TEXT)),Trim(sv->TEXT))
            ::MenuBar:addItem( {::SubMenu[::SMNr],NIL} )
         ENDIF
       CASE sv->FIELD_TYPE = "u"    // kleines "u" - erzeugt MenuEintr„ge
         cU := IIf(SET(43)==0,ConvToAnsiCP(Trim(sv->Text)),Trim(sv->Text))
         ::SubMenu[::SMNr]:addItem( &cU )
       CASE sv->FIELD_TYPE = "B"    // erzeugt den Browser-Rahmen
// ACHTUNG:18.10.2006 11:31 *nV eingefgt bei aPosT[2] !!!
         aPosT := {Int(sv->SpaT*nH),Int(sv->ZeiT*nV)}    //*; aSizeT := {Int(sv->BrT*nH),Int(sv->HoT*nV)}
       //* 12.07.2008 18:45 damit der Browser genau reinpasst: wenn sv->HoT<0, dann vorige ::BEArea beachten
         aSizeT := {(sv->BrT*nH),IIf(sv->HoT<0, ;
                  ::BEArea[::BENr+1+sv->HoT]:currentsize()[2]-aPosT[2], sv->HoT*nV)}   //*12.07.2008 18:45
         IF "BROWS"$Upper(sv->FIELD_NAME)
            nDA_Height := 0      //+07.06.2009 10:44 soll keine Wirkung haben
            AAdd( ::BrowseFeld, MBrowse():new( ::LastArea, oOwner, aPosT, aSizeT, aPP,, nA ) )
            ++::BFNr
            ::BrowseFeld[::BFNr]:caption := IIf(SET(43)==0,ConvToAnsiCP(Trim(sv->Text)),Trim(sv->Text))
            ::BrowseFeld[::BFNr]:hScroll := .T.
            ::BrowseFeld[::BFNr]:CREATE(::BEArea[::BENr], oOwner, aPosT, aSizeT, aPP)
            ::BrowseFeld[::BFNr]:softTrack := .F.
//////         ELSEIF "COLCOL"$Upper(sv->FIELD_NAME)
//////            FOR i := 1 TO ::BrowseFeld[::BFNr]:colcount
//////               ::BrowseFeld[::BFNr]:getColumn(i):colorblock := {|value| IIf(Eval(oEdit:BrowseFeld[1]:phyposblock)%4=0,{3,13},{2,12} ) }
//////            NEXT
         ELSE
            // ArrayBrowse verwendet diese Parameter:
            // sv->FIELD_NAME - Array-Variable
            // sv->FIELD_LEN  - Spaltenbreite in Buchstaben
            // sv->SPAF - 18, ist das CellFrameLayout
            // sv->ZEIF - Tausenderstelle gibt an, wieviele Spalten LFrozen sind
            // sv->ZEIF - Einerstelle sollte die Zeilenh”he sein, besser aber durch die Schriftgr”áe
            // sv->ZEIF - Einerstelle wird jetzt der Schriftgr”áen-Verkleinerer 26.01.2010 17:53
            // sv->BrF  - H”he des Spalten-Fuáes
            // sv->HoF  - H”he des Spaltenkopfes
            // sv->TAB_STOP  - SoftTrack - Scrolling wirkt sofort sichtbar bei .F.
            // sv->ZAHL_FORM - die Schriftfarbe.Hintergrundfarbe
            IF "."$sv->ZAHL_FORM
               nFGCol := Int(Val(sv->ZAHL_FORM))
               nBGCol := GraMakeRGBColor( &("{"+Trim(SubStr(sv->ZAHL_FORM, At(".",sv->ZAHL_FORM)+1))+"}") )
            ENDIF
            nLFrozen := Int(sv->ZEIF/1000)
            nDA_Height := IIf(sv->ZEIF>1000,sv->ZEIF-Int(sv->ZEIF/1000)*1000,sv->ZEIF) //+07.06.2009 10:16
            cBrowFt := IIf(nDA_Height<5,Stuff(cBFont,1,At(".",cBFont)-1,Str(Val(cBFont)-nDA_Height,2,0)),cBFont)  //+26.01.2010 18:05
            cF := Trim(sv->FIELD_NAME)
            IF IsMemberVar(self,"&cF")
               nSpaltenBreite := ::BEArea[::BENr]:currentsize()[1]/(Len(oEdit:&cF[1])*15)
            ELSE
               nSpaltenBreite := ::BEArea[::BENr]:currentsize()[1]/(Len(&cF[1])*15)
            ENDIF
            aPPB :=  { ;       // Presentation Parameter fuer den Browser
               {XBP_PP_COL_HA_FGCLR             , Max(nFGCol,XBPSYSCLR_WINDOWSTATICTEXT)}, ;
               {XBP_PP_COL_HA_BGCLR             , Max(nBGCol,XBPSYSCLR_DIALOGBACKGROUND)   }, ;
               {XBP_PP_COL_HA_COMPOUNDNAME      , cBrowFt                       }, ;      //+26.01.2010 18:06 aus: cBFont
               {XBP_PP_COL_HA_HEIGHT            , IIf(!Empty(sv->HoF),sv->HoF*nV,nBz) }, ;
               {XBP_PP_COL_DA_FGCLR             , XBPSYSCLR_WINDOWSTATICTEXT   }, ;
               {XBP_PP_COL_DA_BGCLR             , XBPSYSCLR_WINDOW             }, ;
               {XBP_PP_COL_DA_HILITE_FGCLR      , XBPSYSCLR_HILITEFOREGROUND   }, ;
               {XBP_PP_COL_DA_HILITE_BGCLR      , XBPSYSCLR_HILITEBACKGROUND   }, ;
               {XBP_PP_COL_DA_COMPOUNDNAME      , cBrowFt                       }, ;      //+26.01.2010 18:06 aus: cBFont
               {XBP_PP_COL_DA_CHARWIDTH         , nSpaltenBreite                }, ;
             {XBP_PP_COL_DA_ROWHEIGHT         , IIf(nDA_Height>10,nDA_Height*nV,NIL) }, ;  //+07.06.2009 10:18
               {XBP_PP_COL_DA_CELLALIGNMENT     , XBPALIGN_RIGHT+XBPALIGN_VCENTER }, ;
               {XBP_PP_COL_DA_CELLFRAMELAYOUT   , IIf(!Empty(sv->SPAF),sv->SPAF,XBPFRAME_BOX+XBPFRAME_RAISED) }, ; //XBPFRAME_BOX + XBPFRAME_RECT}   , ; //+ _RECT bringt Zeilen!  //
               {XBP_PP_COL_DA_FRAMELAYOUT       , XBPFRAME_BOX                 }, ;
               {XBP_PP_COL_DA_HILITEFRAMELAYOUT , XBPFRAME_BOX + XBPFRAME_RECT + XBPFRAME_DOTTED }, ;
               {XBP_PP_COL_DA_ROWSEPARATOR      , XBPCOL_SEP_LINE +XBPCOL_SEP_DOTTED }, ;
               {XBP_PP_COL_DA_COLSEPARATOR      , XBPCOL_SEP_LINE +XBPCOL_SEP_DOTTED }, ;
               {XBP_PP_COL_FA_FGCLR             , Max(nFGCol,XBPSYSCLR_WINDOWSTATICTEXT)   }, ;
               {XBP_PP_COL_FA_BGCLR             , Max(nBGCol,XBPSYSCLR_3DFACE)             }, ;
               {XBP_PP_COL_FA_COMPOUNDNAME      , cBrowFt                       }, ;      //+26.01.2010 18:06 aus: cBFont
               {XBP_PP_COL_FA_FRAMELAYOUT       , XBPFRAME_BOX + XBPFRAME_RECT }, ;
               {XBP_PP_COL_FA_HEIGHT            , IIf(!Empty(sv->BrF),sv->BrF*nV,nBz) }, ;
               {XBP_PP_COL_FA_CAPTION           , ""                           } }
//+ besser die Zeilen/Zellenh”he automatisch aus der Schriftgr”áe entstehen lassen:
//               {XBP_PP_COL_DA_ROWHEIGHT         , IIf(!Empty(sv->ZEIF),sv->ZEIF*nV,nBz) }, ;
//               {XBP_PP_COL_DA_CELLHEIGHT        , IIf(!Empty(sv->ZEIF),sv->ZEIF*nV,nBz) }, ;
//               {XBP_PP_COL_HA_CAPTION           , Trim( sv->Text )             }, ;
            AAdd( ::BrowseFeld, ABrowse():new( ::BEArea[::BENr], oOwner, aPosT, aSizeT, aPPB ) )
            ++::BFNr
            ::BrowseFeld[::BFNr]:caption := IIf(SET(43)==0,ConvToAnsiCP(Trim(sv->Text)),Trim(sv->Text))
            cF := Trim(sv->FIELD_NAME)
            IF IsMemberVar(self,"&cF")
               ::BrowseFeld[::BFNr]:setArray( oEdit:&cF, sv->HoF )
            ELSE
               ::BrowseFeld[::BFNr]:setArray( &cF )
            ENDIF
            ::BrowseFeld[::BFNr]:CREATE(::BEArea[::BENr], oOwner, aPosT, aSizeT, aPPB)
//+klappt noch nicht...
//            IF sv->HoT < 0    //+23.08.2008 20:35 passt Browser genau ein
//               ::BEArea[1]:resize := {|mp1,mp2,oj| ::BrowseFeld[::BFNr]:setsize(mp2) }
//               ::BEArea[::BENr]:configure()
//            ENDIF
            ::BrowseFeld[::BFNr]:softTrack := sv->TAB_STOP     //+23.08.2008 20:26
            IF sv->FIELD_LEN > 0
               FOR i := 1 to Len(::BrowseFeld[::BFNr]:aArray[1])
                 ::BrowseFeld[::BFNr]:addColumns( ::BrowseFeld[::BFNr], oOwner, i, sv->FIELD_LEN, ;
                                          IIf(i == 1,"","Termin"+StrZero(i-1,2,0)),,aPPB)
               NEXT
               ::BrowseFeld[::BFNr]:setLeftFrozen( {nLFrozen} )   //+24.08.2008 18:24
               ::BrowseFeld[::BFNr]:show()
            ENDIF
//////            ::BEArea[::BENr]:setsize( ::BEArea[::BENr]:currentsize() )
            nFGCol := nBGCol := -255      //+ wieder zurckstellen
         ENDIF
//////       CASE sv->FIELD_TYPE = "S"    // erzeugt die Browse-Spalte
//////            IF IsMemberVar( ::BrowseFeld[::BFNr],"aArray")    // kein Array- sondern Datei-Browser
//////               //+ Feld=Array-Zelle ist ja bereits bei ABrowse gesetzt worden
//////               //+ hier geht es um die weiteren Parameter:
//////               //+ in sv->HoF steht die Column-Nr:
//////               y := sv->HoF
//////               cF := Trim(sv->Text)
////////                 ::BrowseFeld[::BFNr]:addColumns( ::BrowseFeld[::BFNr], oOwner, y, sv->FIELD_LEN, ;
////////                                          IIf(i == 1,"","Termin"+StrZero(i-1,2,0)),,aPPB)
//////            
//////            ELSE
//////               cFeld := Trim( sv->FIELD_NAME )
//////               cFeld := IIf( cFeld="&", &(substr( cFeld,2,len(cFeld)-1 )), cFeld )
//////               y := (nA)->(FieldPos( cFeld ))         // y : Feld-Position in best.dbf
//////               cF := Trim(sv->Text)
//////               cF := IIf(cF[1]="&",::aBeschreib[(nA)->(FieldPos(&(SubStr(cF,2))))],cF)
//////            ENDIF
//////               IF "."$sv->ZAHL_FORM
//////                  nFGCol := Int(Val(sv->ZAHL_FORM))
//////                  nBGCol := GraMakeRGBColor( &("{"+Trim(SubStr(sv->ZAHL_FORM, At(".",sv->ZAHL_FORM)+1))+"}") )
//////               ENDIF
//////               aPPB :=  { ;       // Presentation Parameter fuer den Browser
//////                  {XBP_PP_COL_HA_CAPTION           , Trim( sv->Text )             }, ;
//////                  {XBP_PP_COL_HA_FGCLR             , Max(nFGCol,XBPSYSCLR_WINDOWSTATICTEXT)}, ;
//////                  {XBP_PP_COL_HA_BGCLR             , Max(nBGCol,XBPSYSCLR_DIALOGBACKGROUND)   }, ;
//////                  {XBP_PP_COL_HA_COMPOUNDNAME      , cBFont                       }, ;
//////                  {XBP_PP_COL_HA_HEIGHT            , IIf(!Empty(sv->HoF),sv->HoF*nV,nBz) }, ;
//////                  {XBP_PP_COL_DA_FGCLR             , XBPSYSCLR_WINDOWSTATICTEXT   }, ;
//////                  {XBP_PP_COL_DA_BGCLR             , XBPSYSCLR_WINDOW             }, ;
//////                  {XBP_PP_COL_DA_HILITE_FGCLR      , XBPSYSCLR_HILITEFOREGROUND   }, ;
//////                  {XBP_PP_COL_DA_HILITE_BGCLR      , XBPSYSCLR_HILITEBACKGROUND   }, ;
//////                  {XBP_PP_COL_DA_COMPOUNDNAME      , cBFont                       }, ;
//////                  {XBP_PP_COL_DA_CHARWIDTH         , sv->FIELD_LEN                 }, ;
//////                  {XBP_PP_COL_DA_CELLALIGNMENT     , XBPALIGN_RIGHT+XBPALIGN_VCENTER }, ;
//////                  {XBP_PP_COL_DA_CELLFRAMELAYOUT   , IIf(!Empty(sv->SPAF),sv->SPAF,XBPFRAME_BOX+XBPFRAME_RAISED) }, ; //XBPFRAME_BOX + XBPFRAME_RECT}   , ; //+ _RECT bringt Zeilen!  //
//////                  {XBP_PP_COL_DA_FRAMELAYOUT       , XBPFRAME_BOX                 }, ;
//////                  {XBP_PP_COL_DA_HILITEFRAMELAYOUT , XBPFRAME_BOX + XBPFRAME_RECT + XBPFRAME_DOTTED }, ;
//////                  {XBP_PP_COL_DA_ROWSEPARATOR      , XBPCOL_SEP_LINE +XBPCOL_SEP_DOTTED }, ;
//////                  {XBP_PP_COL_DA_COLSEPARATOR      , XBPCOL_SEP_LINE +XBPCOL_SEP_DOTTED }, ;
//////                  {XBP_PP_COL_FA_FGCLR             , Max(nFGCol,XBPSYSCLR_WINDOWSTATICTEXT)   }, ;
//////                  {XBP_PP_COL_FA_BGCLR             , Max(nBGCol,XBPSYSCLR_3DFACE)             }, ;
//////                  {XBP_PP_COL_FA_COMPOUNDNAME      , cBFont                       }, ;
//////                  {XBP_PP_COL_FA_FRAMELAYOUT       , XBPFRAME_BOX + XBPFRAME_RECT }, ;
//////                  {XBP_PP_COL_FA_HEIGHT            , IIf(!Empty(sv->BrF),sv->BrF*nV,nBz) }, ;
//////                  {XBP_PP_COL_FA_CAPTION           , ""                           } }
//////   //+ besser die Zeilen/Zellenh”he automatisch aus der Schriftgr”áe entstehen lassen:
//////   //               {XBP_PP_COL_DA_ROWHEIGHT         , IIf(!Empty(sv->ZEIF),sv->ZEIF*nV,nBz) }, ;
//////   //               {XBP_PP_COL_DA_CELLHEIGHT        , IIf(!Empty(sv->ZEIF),sv->ZEIF*nV,nBz) }, ;
//////               ::BrowseFeld[::BFNr]:addColumns( ::BrowseFeld[::BFNr],, y, sv->FIELD_LEN, ;
//////                                    IIf(SET(43)==0,ConvToAnsiCP(cF),cF), nA, aPP ) //23.03.2008 18:20
//////               IF Abs(sv->BrF)>1
//////                  ::BrowseFeld[::BFNr]:getColumn(::BrowseFeld[::BFNr]:colcount):colorBlock := {|x| IIf( x < 0, {GRA_CLR_RED,}, ) }
//////               ENDIF
//////   // 25.06.2007 22:28 Test              ::BrowseFeld[::BFNr]:show()
//////               IF sv->BrF<0
//////                  ::BrowseFeld[::BFNr]:show()
//////               ENDIF
//////               ::BrowseFeld[::BFNr]:cargo := " "
//////               ::BrowseFeld[::BFNr]:getColumn(::BrowseFeld[::BFNr]:colcount):helpLink := MagicHelpLabel():New(sv->FIELD_DEC)
//////////       CASE sv->FIELD_TYPE = "B"    // erzeugt den Browser-Rahmen
//////////// ACHTUNG:18.10.2006 11:31 *nV eingefgt bei aPosT[2] !!!
//////////         aPosT := {Int(sv->SpaT*nH),Int(sv->ZeiT*nV)}    //*; aSizeT := {Int(sv->BrT*nH),Int(sv->HoT*nV)}
//////////       //* 12.07.2008 18:45 damit der Browser genau reinpasst: wenn sv->HoT<0, dann vorige ::BEArea beachten
//////////         aSizeT := {(sv->BrT*nH),IIf(sv->HoT<0, ;
//////////                  ::BEArea[::BENr+1+sv->HoT]:currentsize()[2]-aPosT[2], sv->HoT*nV)}   //*12.07.2008 18:45
//////////         IF "BROWS"$Upper(sv->FIELD_NAME)
//////////            AAdd( ::BrowseFeld, MBrowse():new( ::LastArea, oOwner, aPosT, aSizeT, aPP,, nA ) )
//////////            ++::BFNr
//////////            ::BrowseFeld[::BFNr]:caption := IIf(SET(43)==0,ConvToAnsiCP(Trim(sv->Text)),Trim(sv->Text))
//////////            ::BrowseFeld[::BFNr]:hScroll := .T.
//////////            ::BrowseFeld[::BFNr]:CREATE(::BEArea[::BENr], oOwner, aPosT, aSizeT, aPP)
//////////            ::BrowseFeld[::BFNr]:softTrack := .F.
////////////////         ELSEIF "COLCOL"$Upper(sv->FIELD_NAME)
////////////////            FOR i := 1 TO ::BrowseFeld[::BFNr]:colcount
////////////////               ::BrowseFeld[::BFNr]:getColumn(i):colorblock := {|value| IIf(Eval(oEdit:BrowseFeld[1]:phyposblock)%4=0,{3,13},{2,12} ) }
////////////////            NEXT
//////////         ELSE
//////////            // ArrayBrowse verwendet diese Parameter:
//////////            // sv->FIELD_NAME - Array-Variable
//////////            // sv->FIELD_LEN  - Spaltenbreite in Buchstaben
//////////            // sv->SPAF - 18, ist das CellFrameLayout
//////////            // veraltet: sv->ZEIF - Tausenderstelle gibt an, wieviele Spalten LFrozen sind
//////////            // sv->ZEIF - Einerstelle sollte die Zeilenh”he sein, besser aber durch die Schriftgr”áe
//////////            // sv->BrF  - H”he des Spalten-Fuáes
//////////            // sv->HoF  - H”he des Spaltenkopfes
//////////            // sv->TAB_STOP  - SoftTrack - Scrolling wirkt sofort sichtbar bei .F.
//////////            // sv->ZAHL_FORM - die Schriftfarbe.Hintergrundfarbe
//////////            // sv->BrT - Anzahl der Spalten, die LFrozen sind
//////////            IF "."$sv->ZAHL_FORM
//////////               nFGCol := Int(Val(sv->ZAHL_FORM))
//////////               nBGCol := GraMakeRGBColor( &("{"+Trim(SubStr(sv->ZAHL_FORM, At(".",sv->ZAHL_FORM)+1))+"}") )
//////////            ENDIF
//////////            nLFrozen := IIf(sv->BrT>0, sv->BrT, Int(sv->ZEIF/1000) ) //wg kompatibel zu frher
////////////            sv->ZEIF := sv->ZEIF-Int(sv->ZEIF/1000)*1000
//////////            cF := Trim(sv->FIELD_NAME)
//////////            IF IsMemberVar(self,"&cF")
//////////               nSpaltenBreite := ::BEArea[::BENr]:currentsize()[1]/(Len(oEdit:&cF[1])*15)
//////////            ELSE
//////////               nSpaltenBreite := ::BEArea[::BENr]:currentsize()[1]/(Len(&cF[1])*15)
//////////            ENDIF
//////////            aPPB :=  { ;       // Presentation Parameter fuer den Browser
//////////               {XBP_PP_COL_HA_FGCLR             , Max(nFGCol,XBPSYSCLR_WINDOWSTATICTEXT)}, ;
//////////               {XBP_PP_COL_HA_BGCLR             , Max(nBGCol,XBPSYSCLR_DIALOGBACKGROUND)   }, ;
//////////               {XBP_PP_COL_HA_COMPOUNDNAME      , cBFont                       }, ;
//////////               {XBP_PP_COL_HA_HEIGHT            , IIf(!Empty(sv->HoF),sv->HoF*nV,NIL) }, ;
//////////               {XBP_PP_COL_DA_FGCLR             , XBPSYSCLR_WINDOWSTATICTEXT   }, ;
//////////               {XBP_PP_COL_DA_BGCLR             , XBPSYSCLR_WINDOW             }, ;
//////////               {XBP_PP_COL_DA_HILITE_FGCLR      , XBPSYSCLR_HILITEFOREGROUND   }, ;
//////////               {XBP_PP_COL_DA_HILITE_BGCLR      , XBPSYSCLR_HILITEBACKGROUND   }, ;
//////////               {XBP_PP_COL_DA_COMPOUNDNAME      , cBFont                       }, ;
//////////               {XBP_PP_COL_DA_CHARWIDTH         , nSpaltenBreite                }, ;
//////////               {XBP_PP_COL_DA_CELLALIGNMENT     , XBPALIGN_RIGHT+XBPALIGN_VCENTER }, ;
//////////               {XBP_PP_COL_DA_CELLFRAMELAYOUT   , IIf(!Empty(sv->SPAF),sv->SPAF,XBPFRAME_BOX+XBPFRAME_RAISED) }, ; //XBPFRAME_BOX + XBPFRAME_RECT}   , ; //+ _RECT bringt Zeilen!  //
//////////               {XBP_PP_COL_DA_FRAMELAYOUT       , XBPFRAME_BOX                 }, ;
//////////               {XBP_PP_COL_DA_HILITEFRAMELAYOUT , XBPFRAME_BOX + XBPFRAME_RECT + XBPFRAME_DOTTED }, ;
//////////               {XBP_PP_COL_DA_ROWSEPARATOR      , XBPCOL_SEP_LINE +XBPCOL_SEP_DOTTED }, ;
//////////               {XBP_PP_COL_DA_COLSEPARATOR      , XBPCOL_SEP_LINE +XBPCOL_SEP_DOTTED }, ;
//////////               {XBP_PP_COL_FA_FGCLR             , Max(nFGCol,XBPSYSCLR_WINDOWSTATICTEXT)   }, ;
//////////               {XBP_PP_COL_FA_BGCLR             , Max(nBGCol,XBPSYSCLR_3DFACE)             }, ;
//////////               {XBP_PP_COL_FA_COMPOUNDNAME      , cBFont                       }, ;
//////////               {XBP_PP_COL_FA_FRAMELAYOUT       , XBPFRAME_BOX + XBPFRAME_RECT }, ;
//////////               {XBP_PP_COL_FA_HEIGHT            , IIf(!Empty(sv->BrF),sv->BrF*nV,NIL) }, ;
//////////               {XBP_PP_COL_FA_CAPTION           , ""                           } }
////////////+ besser die Zeilen/Zellenh”he automatisch aus der Schriftgr”áe entstehen lassen:
////////////+ nZeiF ist ja jetzt LeftFrozen!
////////////               {XBP_PP_COL_DA_ROWHEIGHT         , IIf(!Empty(sv->ZEIF),sv->ZEIF*nV,nBz) }, ;
////////////               {XBP_PP_COL_DA_CELLHEIGHT        , IIf(!Empty(sv->ZEIF),sv->ZEIF*nV,nBz) }, ;
////////////               {XBP_PP_COL_HA_CAPTION           , Trim( sv->Text )             }, ;
//////////            AAdd( ::BrowseFeld, ABrowse():new( ::BEArea[::BENr], oOwner, aPosT, aSizeT, aPPB ) )
//////////            ++::BFNr
//////////            cF := Trim(sv->FIELD_NAME)
//////////            IF IsMemberVar(self,"&cF")
//////////               ::BrowseFeld[::BFNr]:setArray( oEdit:&cF, sv->HoF )
//////////            ELSE
//////////               ::BrowseFeld[::BFNr]:setArray( &cF )
//////////            ENDIF
//////////            ::BrowseFeld[::BFNr]:CREATE(::BEArea[::BENr], oOwner, aPosT, aSizeT, aPPB)
////////////+klappt noch nicht...
//////////            IF sv->HoT < 0    //+23.08.2008 20:35 passt Browser genau ein
//////////               ::BEArea[1]:resize := {|mp1,mp2,oj| ::BrowseFeld[::BFNr]:setsize(mp2) }
////////////               ::BEArea[::BENr]:configure()
//////////            ENDIF
//////////            ::BrowseFeld[::BFNr]:softTrack := sv->TAB_STOP     //+23.08.2008 20:26
//////////            IF sv->FIELD_LEN > 0
//////////               FOR i := 1 to Len(::BrowseFeld[::BFNr]:aArray[1])
//////////                 ::BrowseFeld[::BFNr]:addColumns( ::BrowseFeld[::BFNr], oOwner, i, sv->FIELD_LEN, ;
//////////                                          IIf(i == 1,"","Termin"+StrZero(i-1,2,0)),,aPPB)
//////////               NEXT
//////////               ::BrowseFeld[::BFNr]:setLeftFrozen( {nLFrozen} )   //+24.08.2008 18:24
//////////               ::BrowseFeld[::BFNr]:show()
//////////            ENDIF
////////////////            ::BEArea[::BENr]:setsize( ::BEArea[::BENr]:currentsize() )
//////////            nFGCol := nBGCol := -255      //+ wieder zurckstellen
//////////         ENDIF
       CASE sv->FIELD_TYPE = "S"    // erzeugt die Browse-Spalte
         IF ValType(::BrowseFeld) == "A" .AND. Len(::BrowseFeld)>0   //+30.09.2012 21:10
//            IF IsMemberVar( ::BrowseFeld[::BFNr],"aArray")
//               // ArrayBrowse verwendet diese Parameter:
//               // sv->FIELD_NAME - Array-Variable
//               // sv->FIELD_LEN  - Spaltenbreite in Buchstaben
//               // sv->SPAF - 18, ist das CellFrameLayout
//               // sv->ZEIF - 07.06.2009 10:30:stimmt nicht mehr->Tausenderstelle gibt an, wieviele Spalten LFrozen sind
//               // sv->ZEIF - Einerstelle sollte die Zeilenh”he sein, besser aber durch die Schriftgr”áe
//               // sv->BrF  - in der ersten Spalte: H”he des Spalten-Fuáes fr alle Spalten
//               //            in der letzten Spalte: Browser:show() etc.
//               // sv->HoF  - in der ersten Spalte: H”he des Spaltenkopfes 
//               //            in allen Spalten:  <0: -ZahlenRot
//               // sv->TAB_STOP  - SoftTrack - Scrolling wirkt sofort sichtbar bei .F.
//               // sv->ZAHL_FORM - die Schriftfarbe.Hintergrundfarbe
//               //+ Feld=Array-Zelle ist ja bereits bei ABrowse gesetzt worden
//               //+ hier geht es um die weiteren Parameter:
//               // sv->FIELD_DEC  - HelpLink
//               // sv->SpaT  - Spaltennummer dieses Eintrags (im Array)
//               //+            in sv->SpaT steht die Column-Nr: (08.11.2008 16:23ge„ndert aus sv->HoF
//               //+ sv->ZeiT - Ausrichtung des Textes dieser Spalte XBPALIGN_~
//               //+ sv->BrT - Anzahl der Spalten, die lFrozen sind (nur in der letzten Spalte!)
//               y := IIf( sv->SpaT <= Len(::BrowseFeld[::BFNr]:aArray[1]), sv->SpaT, 0 )
//               cF := Trim(sv->Text)
//               //+07.06.2009 10:51 H”he der DataArea richtet sich nach ->ZEIF, wenn in der ersten Spalte >0
//               nDA_Height := IIf(sv->ZEIF>1000,sv->ZEIF-Int(sv->ZEIF/1000)*1000,sv->ZEIF)*nV
////               IIf( ::BrowseFeld[::BFNr]:colcount>0,::BrowseFeld[::BFNr]:getColumn(1):dataArea:currentsize()[2]/::BrowseFeld[::BFNr]:getColumn(1):rowCount(), ;
////                              IIf(sv->ZEIF>1000,sv->ZEIF-Int(sv->ZEIF/1000)*1000,sv->ZEIF)*nV)
//            
//            ELSE                                    // kein Array- sondern Datei-Browser
//               cFeld := Trim( sv->FIELD_NAME )
//               cFeld := IIf( cFeld="&", &(substr( cFeld,2,len(cFeld)-1 )), cFeld )
//               y := (nA)->(FieldPos( cFeld ))         // y : Feld-Position in best.dbf
//               cF := Trim(sv->Text)
//               cF := IIf(cF[1]="&",::aBeschreib[(nA)->(FieldPos(&(SubStr(cF,2))))],cF)
//               nDA_Height := 0
//            ENDIF
//            IF "."$sv->ZAHL_FORM
//               nFGCol := Int(Val(sv->ZAHL_FORM))
//               nBGCol := GraMakeRGBColor( &("{"+Trim(SubStr(sv->ZAHL_FORM, At(".",sv->ZAHL_FORM)+1))+"}") )
//            ENDIF
//            IF y > 0    //+11.11.2008 13:12 wenn die Spaltenvariable gefunden wurde 
//               //+07.06.2009 10:56 H”he von Header und Footer richten sich nach der ersten Spalte: (dort nach dem Abs() von HoF/BrF)
//               nHA_Height := IIf( ::BrowseFeld[::BFNr]:colcount>0,::BrowseFeld[::BFNr]:getColumn(1):heading:currentsize()[2],Abs(sv->HoF)*nV)
//               nFA_Height := IIf( ::BrowseFeld[::BFNr]:colcount>0,::BrowseFeld[::BFNr]:getColumn(1):footing:currentsize()[2],Abs(sv->BrF)*nV)
//               aPPB :=  { ;       // Presentation Parameter fuer den Browser
//                  {XBP_PP_COL_HA_CAPTION           , Trim( IIf( sv->Text="&", &(substr( sv->Text,2,len(sv->Text)-1 )),sv->Text) )             }, ;
//                  {XBP_PP_COL_HA_FGCLR             , Max(nFGCol,XBPSYSCLR_WINDOWSTATICTEXT)}, ;
//                  {XBP_PP_COL_HA_BGCLR             , Max(nBGCol,XBPSYSCLR_DIALOGBACKGROUND)   }, ;
//                  {XBP_PP_COL_HA_COMPOUNDNAME      , cBFont                       }, ;
//                  {XBP_PP_COL_HA_HEIGHT            , IIf(nHA_Height>2,nHA_Height,NIL)   }, ;  //IIf(Abs(sv->HoF)>2,Abs(sv->HoF)*nV,nBz) }, ;
//                  {XBP_PP_COL_DA_FGCLR             , XBPSYSCLR_WINDOWSTATICTEXT   }, ;
//                  {XBP_PP_COL_DA_BGCLR             , XBPSYSCLR_WINDOW             }, ;
//                  {XBP_PP_COL_DA_HILITE_FGCLR      , XBPSYSCLR_HILITEFOREGROUND   }, ;
//                  {XBP_PP_COL_DA_HILITE_BGCLR      , XBPSYSCLR_HILITEBACKGROUND   }, ;
//                  {XBP_PP_COL_DA_COMPOUNDNAME      , cBFont                       }, ;
//                {XBP_PP_COL_DA_ROWHEIGHT         , IIf(nDA_Height>0,nDA_Height,NIL) }, ;
//                  {XBP_PP_COL_DA_CHARWIDTH         , IIf(sv->FIELD_LEN!=0,sv->FIELD_LEN,nSB)},;  //::aI3[y])}, ;   //+09.11.2008 20:56 Hilfsvariable zum Spaltenver„ndern
//                {XBP_PP_COL_DA_CELLALIGNMENT     , IIf(sv->ZeiT<0, - sv->ZeiT,XBPALIGN_RIGHT+XBPALIGN_VCENTER )}, ;  //+13.06.2009 13:40
//                  {XBP_PP_COL_DA_CELLFRAMELAYOUT   , IIf(!Empty(sv->SPAF),sv->SPAF,XBPFRAME_BOX+XBPFRAME_RAISED) }, ; //XBPFRAME_BOX + XBPFRAME_RECT}   , ; //+ _RECT bringt Zeilen!  //
//                  {XBP_PP_COL_DA_FRAMELAYOUT       , XBPFRAME_BOX                 }, ;
//                  {XBP_PP_COL_DA_HILITEFRAMELAYOUT , XBPFRAME_BOX + XBPFRAME_RECT + XBPFRAME_DOTTED }, ;
//                  {XBP_PP_COL_DA_ROWSEPARATOR      , XBPCOL_SEP_LINE +XBPCOL_SEP_DOTTED }, ;
//                  {XBP_PP_COL_DA_COLSEPARATOR      , XBPCOL_SEP_LINE +XBPCOL_SEP_DOTTED }, ;
//                  {XBP_PP_COL_FA_FGCLR             , Max(nFGCol,XBPSYSCLR_WINDOWSTATICTEXT)   }, ;
//                  {XBP_PP_COL_FA_BGCLR             , Max(nBGCol,XBPSYSCLR_3DFACE)             }, ;
//                  {XBP_PP_COL_FA_COMPOUNDNAME      , cBFont                       }, ;
//                  {XBP_PP_COL_FA_FRAMELAYOUT       , XBPFRAME_BOX + XBPFRAME_RECT }, ;
//                  {XBP_PP_COL_FA_HEIGHT            , IIf(IsMemVar("xCF").AND.ValType(xCF)=="N", xCF, ;
//                                                      IIf(nFA_HEIGHT>2,nFA_HEIGHT,NIL)) }, ;  //IIf(Abs(sv->BrF)>2,Abs(sv->BrF)*nV,nBz) }, ;
//                  {XBP_PP_COL_FA_CAPTION           , ""                           } }
//   //+ besser die Zeilen/Zellenh”he automatisch aus der Schriftgr”áe entstehen lassen:
//   //               {XBP_PP_COL_DA_ROWHEIGHT         , IIf(!Empty(sv->ZEIF),sv->ZEIF*nV,nBz) }, ;
//   //               {XBP_PP_COL_DA_CELLHEIGHT        , IIf(!Empty(sv->ZEIF),sv->ZEIF*nV,nBz) }, ;
//               ::BrowseFeld[::BFNr]:addColumns( ::BrowseFeld[::BFNr],, y, IIf(sv->FIELD_LEN!=0,sv->FIELD_LEN,nSB), ;
//                                    IIf(SET(43)==0,ConvToAnsiCP(cF),cF), nA, aPPB ) //23.03.2008 18:20
//               IF sv->HoF < 0 //+ 08.11.2008 17:52 ge„ndert aus Abs(sv->BrF)>0 !! siehe s_vv !!
//                  ::BrowseFeld[::BFNr]:getColumn(::BrowseFeld[::BFNr]:colcount):colorBlock := {|x| IIf( x < 0, {GRA_CLR_RED,}, ) }
//               ENDIF
//               IF sv->BrF<0
////+07.06.2009 18:05 wird schon bei "B" gesetzt                  nLFrozen := sv->BrT           //+08.11.2008 17:03
//                  ::BrowseFeld[::BFNr]:setLeftFrozen( {nLFrozen} )   //+08.11.2008 17:03
//                  ::BrowseFeld[::BFNr]:show()
//               ENDIF
//               ::BrowseFeld[::BFNr]:cargo := " "
//               ::BrowseFeld[::BFNr]:getColumn(::BrowseFeld[::BFNr]:colcount):helpLink := MagicHelpLabel():New(sv->FIELD_DEC)
//            ENDIF
            IF IsMemberVar( ::BrowseFeld[::BFNr],"aArray")
               // ArrayBrowse verwendet diese Parameter:
               // sv->FIELD_NAME - Array-Variable
               // sv->FIELD_LEN  - Spaltenbreite in Buchstaben
               // sv->SPAF - 18, ist das CellFrameLayout
               // sv->ZEIF - Tausenderstelle gibt an, wieviele Spalten LFrozen sind
               // sv->ZEIF - Einerstelle sollte die Zeilenh”he sein, besser aber durch die Schriftgr”áe
               // sv->BrF  - H”he des Spalten-Fuáes + <0: Browser:show()
               // sv->HoF  - H”he des Spaltenkopfes + <0: -ZahlenRot
               // sv->TAB_STOP  - SoftTrack - Scrolling wirkt sofort sichtbar bei .F.
               // sv->ZAHL_FORM - die Schriftfarbe.Hintergrundfarbe
               //+ Feld=Array-Zelle ist ja bereits bei ABrowse gesetzt worden
               //+ hier geht es um die weiteren Parameter:
               // sv->FIELD_DEC  - HelpLink
               // sv->BrT - Anzahl der Spalten, die lFrozen sind
               // sv->SpaT  - Spaltennummer dieses Eintrags
               //+            in sv->SpaT steht die Column-Nr: (08.11.2008 16:23ge„ndert aus sv->HoF
               y := IIf( sv->SpaT <= Len(::BrowseFeld[::BFNr]:aArray[1]), sv->SpaT, 0 )
               cF := Trim(sv->Text)
            
            ELSE                                    // kein Array- sondern Datei-Browser
               cFeld := Trim( sv->FIELD_NAME )
               cFeld := IIf( cFeld="&", &(substr( cFeld,2,len(cFeld)-1 )), cFeld )
               y := (nA)->(FieldPos( cFeld ))         // y : Feld-Position in best.dbf
               cF := Trim(sv->Text)
               cF := IIf(cF[1]="&",::aBeschreib[(nA)->(FieldPos(&(SubStr(cF,2))))],cF)
            ENDIF
            IF "."$sv->ZAHL_FORM
               nFGCol := Int(Val(sv->ZAHL_FORM))
               nBGCol := GraMakeRGBColor( &("{"+Trim(SubStr(sv->ZAHL_FORM, At(".",sv->ZAHL_FORM)+1))+"}") )
            ENDIF
            IF y > 0    //+11.11.2008 13:12 wenn die Spaltenvariable gefunden wurde 
               //+08.11.2008 18:11 H”he von Header und Footer richten sich nach der ersten Spalte:
               nHA_Height := IIf( ::BrowseFeld[::BFNr]:colcount>0,::BrowseFeld[::BFNr]:getColumn(1):heading:currentsize()[2],sv->HoF*nV)
               nFA_Height := IIf( ::BrowseFeld[::BFNr]:colcount>0,::BrowseFeld[::BFNr]:getColumn(1):footing:currentsize()[2],sv->BrF*nV)
               nDA_Height := IIf(sv->ZEIF>1000,sv->ZEIF-Int(sv->ZEIF/1000)*1000,sv->ZEIF) //+07.06.2009 10:16
               cBrowFt := IIf(nDA_Height<5 .AND. nDA_Height>0, ;
                           Stuff(cBFont,1,At(".",cBFont)-1,Str(Val(cBFont)-nDA_Height,2,0)), ;
                           ::BrowseFeld[::BFNr]:setFontCompoundName())  //+26.01.2010 18:05
               aPPB :=  { ;       // Presentation Parameter fuer den Browser
                  {XBP_PP_COL_HA_CAPTION           , IIf(sv->Text[1]="&",cF,Trim( sv->Text ))   }, ;     //+03.08.2009 16:56
                  {XBP_PP_COL_HA_FGCLR             , Max(nFGCol,XBPSYSCLR_WINDOWSTATICTEXT)}, ;
                  {XBP_PP_COL_HA_BGCLR             , Max(nBGCol,XBPSYSCLR_DIALOGBACKGROUND)   }, ;
                  {XBP_PP_COL_HA_COMPOUNDNAME      , cBrowFt                       }, ;
                  {XBP_PP_COL_HA_HEIGHT            , IIf(nHA_Height>2,nHA_Height,NIL)   }, ;  //IIf(Abs(sv->HoF)>2,Abs(sv->HoF)*nV,nBz) }, ;
                  {XBP_PP_COL_DA_FGCLR             , XBPSYSCLR_WINDOWSTATICTEXT   }, ;
                  {XBP_PP_COL_DA_BGCLR             , XBPSYSCLR_WINDOW             }, ;
                  {XBP_PP_COL_DA_HILITE_FGCLR      , XBPSYSCLR_HILITEFOREGROUND   }, ;
                  {XBP_PP_COL_DA_HILITE_BGCLR      , XBPSYSCLR_HILITEBACKGROUND   }, ;
                  {XBP_PP_COL_DA_COMPOUNDNAME      , cBrowFt                       }, ;
                {XBP_PP_COL_DA_ROWHEIGHT         , IIf(nDA_Height>0,nDA_Height,NIL) }, ;
                  {XBP_PP_COL_DA_CHARWIDTH         , IIf(sv->FIELD_LEN!=0,sv->FIELD_LEN,nSB)},;  //+09.11.2008 20:56 Hilfsvariable zum Spaltenver„ndern
                  {XBP_PP_COL_DA_CELLFRAMELAYOUT   , IIf(!Empty(sv->SPAF),sv->SPAF,XBPFRAME_BOX+XBPFRAME_RAISED) }, ; //XBPFRAME_BOX + XBPFRAME_RECT}   , ; //+ _RECT bringt Zeilen!  //
                  {XBP_PP_COL_DA_FRAMELAYOUT       , XBPFRAME_BOX                 }, ;
                  {XBP_PP_COL_DA_HILITEFRAMELAYOUT , XBPFRAME_BOX + XBPFRAME_RECT + XBPFRAME_DOTTED }, ;
                  {XBP_PP_COL_DA_ROWSEPARATOR      , XBPCOL_SEP_LINE +XBPCOL_SEP_DOTTED }, ;
                  {XBP_PP_COL_DA_COLSEPARATOR      , XBPCOL_SEP_LINE +XBPCOL_SEP_DOTTED }, ;
                  {XBP_PP_COL_FA_FGCLR             , Max(nFGCol,XBPSYSCLR_WINDOWSTATICTEXT)   }, ;
                  {XBP_PP_COL_FA_BGCLR             , Max(nBGCol,XBPSYSCLR_3DFACE)             }, ;
                  {XBP_PP_COL_FA_COMPOUNDNAME      , cBrowFt                       }, ;
                  {XBP_PP_COL_FA_FRAMELAYOUT       , XBPFRAME_BOX + XBPFRAME_RECT }, ;
                  {XBP_PP_COL_FA_HEIGHT            , IIf(IsMemVar("xCF").AND.ValType(xCF)=="N", xCF, ;
                                                      IIf(nFA_HEIGHT>2,nFA_HEIGHT,NIL)) }, ;  //IIf(Abs(sv->BrF)>2,Abs(sv->BrF)*nV,nBz) }, ;
                  {XBP_PP_COL_FA_CAPTION           , ""                           } }
//                {XBP_PP_COL_DA_CELLALIGNMENT     , IIf(sv->ZeiT<0, - sv->ZeiT,XBPALIGN_RIGHT+XBPALIGN_VCENTER )}, ;  //+13.06.2009 13:40 siehe darunter XBPALIGN...
   //+ besser die Zeilen/Zellenh”he automatisch aus der Schriftgr”áe entstehen lassen:
   //               {XBP_PP_COL_DA_ROWHEIGHT         , IIf(!Empty(sv->ZEIF),sv->ZEIF*nV,nBz) }, ;
   //               {XBP_PP_COL_DA_CELLHEIGHT        , IIf(!Empty(sv->ZEIF),sv->ZEIF*nV,nBz) }, ;
//                  {XBP_PP_COL_DA_CELLALIGNMENT     , XBPALIGN_VCENTER             }, ;
               IF sv->HoT > 0    //+ 10.07.2009 21:41 nur 1 SpaltenEintrag erzeugt Len(aArray) Spalten
                                 //+                  mit Hilfe von ::aI2 (sp„ter viell. aArray2 ?
                  FOR i := 1 to Len(::BrowseFeld[::BFNr]:aArray[1])
                    ::BrowseFeld[::BFNr]:addColumns( ::BrowseFeld[::BFNr], oOwner, ;
                              i, IIf(i=1.AND.sv->FIELD_LEN!=0,sv->FIELD_LEN,nSB), ;
                              IIf(ValType(::aI2)=="A" .AND. Len(::aI2)>=i .AND. ValType(::aI2[i])=="C", ::aI2[i], ;
                              IIf(i == 1,"","Termin"+StrZero(i-1,2,0))),,aPPB)
                  NEXT
//                  FOR i := 1 to Len(::aI2)   //Len(::BrowseFeld[::BFNr]:aArray[1])
//                    ::BrowseFeld[::BFNr]:addColumns( ::BrowseFeld[::BFNr], oOwner, ;
//                              i, IIf(i=1.AND.sv->FIELD_LEN!=0,sv->FIELD_LEN,nSB), ;
//                              ::aI2[i],,aPPB)
//                  NEXT
                  ::BrowseFeld[::BFNr]:setLeftFrozen( {sv->BrT} )   //+09.07.2009 21:49
                  ::BrowseFeld[::BFNr]:show()
               ELSE
                  ::BrowseFeld[::BFNr]:addColumns( ::BrowseFeld[::BFNr],, y, IIf(sv->FIELD_LEN!=0,sv->FIELD_LEN,nSB), ;
                                    IIf(SET(43)==0,ConvToAnsiCP(cF),cF), nA, aPPB ) //23.03.2008 18:20
               ENDIF
               IF sv->HoF < 0 //+ 08.11.2008 17:52 ge„ndert aus Abs(sv->BrF)>0 !! siehe s_vv !!
                  ::BrowseFeld[::BFNr]:getColumn(::BrowseFeld[::BFNr]:colcount):colorBlock := {|x| IIf( x < 0, {GRA_CLR_RED,}, ) }
               ENDIF
               ::BrowseFeld[::BFNr]:getColumn(::BrowseFeld[::BFNr]:colcount):helpLink := MagicHelpLabel():New(sv->FIELD_DEC)
            ENDIF
            IF sv->BrF<0
               nLFrozen := sv->BrT           //+08.11.2008 17:03
               ::BrowseFeld[::BFNr]:setLeftFrozen( {nLFrozen} )   //+08.11.2008 17:03
               ::BrowseFeld[::BFNr]:show()
            ENDIF
            ::BrowseFeld[::BFNr]:cargo := " "
          ENDIF   //+30.09.2012 21:10
       CASE sv->FIELD_TYPE = "s"    // erzeugt die Browse-Spalte
         IF ValType(::BrowseFeld) == "A" .AND. Len(::BrowseFeld)>0   //+30.09.2012 21:11
            IF IsMemberVar( ::BrowseFeld[::BFNr],"aArray")
               // ArrayBrowse verwendet diese Parameter:
               // sv->FIELD_NAME - Array-Variable
               // sv->FIELD_LEN  - Spaltenbreite in Buchstaben
               // sv->SPAF - 18, ist das CellFrameLayout
               // sv->ZEIF - 07.06.2009 10:30:stimmt nicht mehr->Tausenderstelle gibt an, wieviele Spalten LFrozen sind
               // sv->ZEIF - Einerstelle sollte die Zeilenh”he sein, besser aber durch die Schriftgr”áe
               // sv->BrF  - in der ersten Spalte: H”he des Spalten-Fuáes fr alle Spalten
               //            in der letzten Spalte: Browser:show() etc.
               // sv->HoF  - in der ersten Spalte: H”he des Spaltenkopfes 
               //            in allen Spalten:  <0: -ZahlenRot
               // sv->TAB_STOP  - SoftTrack - Scrolling wirkt sofort sichtbar bei .F.
               // sv->ZAHL_FORM - die Schriftfarbe.Hintergrundfarbe
               //+ Feld=Array-Zelle ist ja bereits bei ABrowse gesetzt worden
               //+ hier geht es um die weiteren Parameter:
               // sv->FIELD_DEC  - HelpLink
               // sv->SpaT  - Spaltennummer dieses Eintrags (im Array)
               //+            in sv->SpaT steht die Column-Nr: (08.11.2008 16:23ge„ndert aus sv->HoF
               //+ sv->ZeiT - Ausrichtung des Textes dieser Spalte XBPALIGN_~
               //+ sv->BrT - Anzahl der Spalten, die lFrozen sind (nur in der letzten Spalte!)
               y := IIf( sv->SpaT <= Len(::BrowseFeld[::BFNr]:aArray[1]), sv->SpaT, 0 )
               cF := Trim(sv->Text)
               //+07.06.2009 10:51 H”he der DataArea richtet sich nach ->ZEIF, wenn in der ersten Spalte >0
               nDA_Height := IIf(sv->ZEIF>1000,sv->ZEIF-Int(sv->ZEIF/1000)*1000,sv->ZEIF)*nV
//               IIf( ::BrowseFeld[::BFNr]:colcount>0,::BrowseFeld[::BFNr]:getColumn(1):dataArea:currentsize()[2]/::BrowseFeld[::BFNr]:getColumn(1):rowCount(), ;
//                              IIf(sv->ZEIF>1000,sv->ZEIF-Int(sv->ZEIF/1000)*1000,sv->ZEIF)*nV)
            
            ELSE                                    // kein Array- sondern Datei-Browser
               cFeld := Trim( sv->FIELD_NAME )
               cFeld := IIf( cFeld="&", &(substr( cFeld,2,len(cFeld)-1 )), cFeld )
               y := (nA)->(FieldPos( cFeld ))         // y : Feld-Position in best.dbf
               cF := Trim(sv->Text)
               cF := IIf(cF[1]="&",::aBeschreib[(nA)->(FieldPos(&(SubStr(cF,2))))],cF)
               nDA_Height := 0
            ENDIF
            IF "."$sv->ZAHL_FORM .AND. !"99"$sv->ZAHL_FORM  //+07.06.2009 19:23
               nFGCol := Int(Val(sv->ZAHL_FORM))
               nBGCol := GraMakeRGBColor( &("{"+Trim(SubStr(sv->ZAHL_FORM, At(".",sv->ZAHL_FORM)+1))+"}") )
            ENDIF
            IF y > 0    //+11.11.2008 13:12 wenn die Spaltenvariable gefunden wurde 
               //+07.06.2009 10:56 H”he von Header und Footer richten sich nach der ersten Spalte: (dort nach dem Abs() von HoF/BrF)
               nHA_Height := IIf( ::BrowseFeld[::BFNr]:colcount>0,::BrowseFeld[::BFNr]:getColumn(1):heading:currentsize()[2],Abs(sv->HoF)*nV)
               nFA_Height := IIf( ::BrowseFeld[::BFNr]:colcount>0,::BrowseFeld[::BFNr]:getColumn(1):footing:currentsize()[2],Abs(sv->BrF)*nV)
               aPPB :=  { ;       // Presentation Parameter fuer den Browser
                  {XBP_PP_COL_HA_CAPTION           , Trim( IIf( sv->Text="&", &(substr( sv->Text,2,len(sv->Text)-1 )),sv->Text) ) }, ;
                  {XBP_PP_COL_HA_FGCLR             , Max(nFGCol,XBPSYSCLR_WINDOWSTATICTEXT)}, ;
                  {XBP_PP_COL_HA_BGCLR             , Max(nBGCol,XBPSYSCLR_DIALOGBACKGROUND)   }, ;
                  {XBP_PP_COL_HA_COMPOUNDNAME      , cBFont                       }, ;
                  {XBP_PP_COL_HA_HEIGHT            , IIf(nHA_Height>2,nHA_Height,NIL)   }, ;  //IIf(Abs(sv->HoF)>2,Abs(sv->HoF)*nV,nBz) }, ;
                  {XBP_PP_COL_DA_FGCLR             , XBPSYSCLR_WINDOWSTATICTEXT   }, ;
                  {XBP_PP_COL_DA_BGCLR             , XBPSYSCLR_WINDOW             }, ;
                  {XBP_PP_COL_DA_HILITE_FGCLR      , XBPSYSCLR_HILITEFOREGROUND   }, ;
                  {XBP_PP_COL_DA_HILITE_BGCLR      , XBPSYSCLR_HILITEBACKGROUND   }, ;
                  {XBP_PP_COL_DA_COMPOUNDNAME      , cBFont                       }, ;
                {XBP_PP_COL_DA_ROWHEIGHT         , IIf(nDA_Height>0,nDA_Height,NIL) }, ;
                  {XBP_PP_COL_DA_CHARWIDTH         , IIf(sv->FIELD_LEN!=0,sv->FIELD_LEN,nSB)},;  //::aI3[y])}, ;   //+09.11.2008 20:56 Hilfsvariable zum Spaltenver„ndern
                {XBP_PP_COL_DA_CELLALIGNMENT     , IIf(sv->ZeiT<0, - sv->ZeiT,XBPALIGN_RIGHT+XBPALIGN_VCENTER )}, ;  //+13.06.2009 13:40 siehe darunter XBPALIGN...
                  {XBP_PP_COL_DA_CELLFRAMELAYOUT   , IIf(!Empty(sv->SPAF),sv->SPAF,XBPFRAME_BOX+XBPFRAME_RAISED) }, ; //XBPFRAME_BOX + XBPFRAME_RECT}   , ; //+ _RECT bringt Zeilen!  //
                  {XBP_PP_COL_DA_FRAMELAYOUT       , XBPFRAME_BOX                 }, ;
                  {XBP_PP_COL_DA_HILITEFRAMELAYOUT , XBPFRAME_BOX + XBPFRAME_RECT + XBPFRAME_DOTTED }, ;
                  {XBP_PP_COL_DA_ROWSEPARATOR      , XBPCOL_SEP_LINE +XBPCOL_SEP_DOTTED }, ;
                  {XBP_PP_COL_DA_COLSEPARATOR      , XBPCOL_SEP_LINE +XBPCOL_SEP_DOTTED }, ;
                  {XBP_PP_COL_FA_FGCLR             , Max(nFGCol,XBPSYSCLR_WINDOWSTATICTEXT)   }, ;
                  {XBP_PP_COL_FA_BGCLR             , Max(nBGCol,XBPSYSCLR_3DFACE)             }, ;
                  {XBP_PP_COL_FA_COMPOUNDNAME      , cBFont                       }, ;
                  {XBP_PP_COL_FA_FRAMELAYOUT       , XBPFRAME_BOX + XBPFRAME_RECT }, ;
                  {XBP_PP_COL_FA_HEIGHT            , IIf(IsMemVar("xCF").AND.ValType(xCF)=="N", xCF, ;
                                                      IIf(nFA_HEIGHT>2,nFA_HEIGHT,NIL)) }, ;  //IIf(Abs(sv->BrF)>2,Abs(sv->BrF)*nV,nBz) }, ;
                  {XBP_PP_COL_FA_CAPTION           , ""                           } }
   //+ besser die Zeilen/Zellenh”he automatisch aus der Schriftgr”áe entstehen lassen:
   //               {XBP_PP_COL_DA_ROWHEIGHT         , IIf(!Empty(sv->ZEIF),sv->ZEIF*nV,nBz) }, ;
   //               {XBP_PP_COL_DA_CELLHEIGHT        , IIf(!Empty(sv->ZEIF),sv->ZEIF*nV,nBz) }, ;
/*
#define XBPALIGN_TOP                   0
#define XBPALIGN_LEFT                  0
#define XBPALIGN_BOTTOM                8
#define XBPALIGN_RIGHT                 2
#define XBPALIGN_HCENTER               1
#define XBPALIGN_VCENTER               4
#define XBPALIGN_WORDBREAK            16
#endif
// Frame Layout Einstellungen
#define XBPFRAME_NONE                  0
#define XBPFRAME_RECT                  1
#define XBPFRAME_BOX                   2
#define XBPFRAME_RAISED               16
#define XBPFRAME_RECESSED             32
#define XBPFRAME_THICK               128
#define XBPFRAME_DASHED              256
#define XBPFRAME_DOTTED              512
// Linien Layout Einstellungen
#define XBPLINE_NONE                   1
#define XBPLINE_NORMAL                 2
#define XBPLINE_DASHED                 4
#define XBPLINE_DOTTED                 8
*/
               IF IsMemberVar( ::BrowseFeld[::BFNr],"aArray")
                  ::BrowseFeld[::BFNr]:addGetColumns( ::BrowseFeld[::BFNr],, y, IIf(sv->FIELD_LEN!=0,sv->FIELD_LEN,nSB), ;
                                    IIf(SET(43)==0,ConvToAnsiCP(cF),cF), nA, aPPB, Trim(sv->ZAHL_FORM) ) //23.03.2008 18:20
               ELSEIF (nA)->(IsFieldVar( cFeld ))
                  ::BrowseFeld[::BFNr]:addGetColumns( ::BrowseFeld[::BFNr],, @(nA)->&cFeld, sv->FIELD_LEN, ;
                                    IIf(SET(43)==0,ConvToAnsiCP(Trim(cF)),Trim(cF)), nA, aPPB, Trim(sv->ZAHL_FORM) ) //26.06.2008 12:07
               ELSEIF IsMemVar( cFeld )
                  ::BrowseFeld[::BFNr]:addGetColumns( ::BrowseFeld[::BFNr],, @&cFeld, ;
                                                         sv->FIELD_LEN, Trim(cF), nA, aPPB, Trim(sv->ZAHL_FORM) ) //26.06.2008 12:07
               ENDIF
               IF sv->HoF < 0 //+ 08.11.2008 17:52 ge„ndert aus Abs(sv->BrF)>0 !! siehe s_vv !!
                  ::BrowseFeld[::BFNr]:getColumn(::BrowseFeld[::BFNr]:colcount):colorBlock := {|x| IIf( x < 0, {GRA_CLR_RED,}, ) }
               ENDIF
               IF sv->BrF<0
//+07.06.2009 18:05 wird schon bei "B" gesetzt                  nLFrozen := sv->BrT           //+08.11.2008 17:03
                  ::BrowseFeld[::BFNr]:setLeftFrozen( {nLFrozen} )   //+08.11.2008 17:03
                  ::BrowseFeld[::BFNr]:show()
               ENDIF
               ::BrowseFeld[::BFNr]:cargo := " "
               ::BrowseFeld[::BFNr]:getColumn(::BrowseFeld[::BFNr]:colcount):helpLink := MagicHelpLabel():New(sv->FIELD_DEC)
            ENDIF
         ENDIF //+30.09.2012 21:11
//       CASE sv->FIELD_TYPE = "s"    // erzeugt die Browse-Spalte zum Editieren
//            IF IsMemberVar( ::BrowseFeld[::BFNr],"aArray")    // kein Array- sondern Datei-Browser
//               //+ Feld=Array-Zelle ist ja bereits bei ABrowse gesetzt worden
//               //+ hier geht es um die weiteren Parameter:
//               //+ in sv->HoF steht die Column-Nr:
//               y := sv->HoF
//               cF := Trim(sv->Text)
//               IF y != 0
//                 ::BrowseFeld[::BFNr]:addGetColumns( ::BrowseFeld[::BFNr], oOwner, y, sv->FIELD_LEN, ;
//                                          cF,,aPPB, Trim(sv->ZAHL_FORM) )
//               ENDIF
//            ELSE
//               cFeld := Trim( sv->FIELD_NAME )
//               cFeld := IIf( cFeld="&", &(substr( cFeld,2,len(cFeld)-1 )), cFeld )
//               y := (nA)->(FieldPos( cFeld ))         // y : Feld-Position in best.dbf
//               cT := sv->text  //20.09.2007 11:36  // ConvCP findet bei MStatic() statt 03.12.2006 16:37
//               cT := IIf( cT="&",&(SubStr(cT,2)),cT)  //20.09.2007 11:36
//               IF (nA)->(IsFieldVar( cFeld ))
//                  ::BrowseFeld[::BFNr]:addGetColumns( ::BrowseFeld[::BFNr],, @(nA)->&cFeld, sv->FIELD_LEN, ;
//                                    IIf(SET(43)==0,ConvToAnsiCP(Trim(cT)),Trim(cT)), nA, aPPB, Trim(sv->ZAHL_FORM) ) //26.06.2008 12:07
//               ELSEIF IsMemVar( cFeld )
//                  ::BrowseFeld[::BFNr]:addGetColumns( ::BrowseFeld[::BFNr],, @&cFeld, ;
//                                                         sv->FIELD_LEN, Trim(cT), nA, aPPB, Trim(sv->ZAHL_FORM) ) //26.06.2008 12:07
//               ENDIF
//            ENDIF
//            IF Abs(sv->BrF)>1
//               ::BrowseFeld[::BFNr]:getColumn(::BrowseFeld[::BFNr]:colcount):colorBlock := {|x| IIf( x < 0, {GRA_CLR_RED,}, ) }
//            ENDIF
//// 25.06.2007 22:28 Test              ::BrowseFeld[::BFNr]:show()
//            IF sv->BrF<0
//               ::BrowseFeld[::BFNr]:show()
//            ENDIF
//            ::BrowseFeld[::BFNr]:getColumn(::BrowseFeld[::BFNr]:colcount):editable := !sv->TAB_STOP //20.06.2007 12:51
//            ::BrowseFeld[::BFNr]:cargo := " "
//            ::BrowseFeld[::BFNr]:getColumn(::BrowseFeld[::BFNr]:colcount):helpLink := MagicHelpLabel():New(sv->FIELD_DEC)
       CASE sv->FIELD_TYPE = "T"    // erzeugt eine Textzeile
        //+25.09.2008 19:06 damit Text auch direkt auf einer TabSeite gezeigt werden kann:
         IF ::LastArea:IsDerivedFrom("XbpTabPage")
            ::ActArea := ::TabSeite[IIf( sv->BrF<0 .AND. Abs(sv->BrF)<Len(::TabSeite), ;
                                       ::TSNr + sv->BrF + 1, ;
                  IIf( sv->BrF>0 .AND. Abs(sv->BrF)<Len(::TabSeite), ;
                                       sv->FIELD_DEC, ::TSNr ) )]    //26.11.2006 10:43
         ELSE
            ::ActArea := ::BEArea[IIf( sv->BrF<0 .AND. Abs(sv->BrF)<Len(::BEArea), ;
                                          ::BENr + sv->BrF + 1, ;
                     IIf( sv->BrF>0 .AND. Abs(sv->BrF)<Len(::BEArea), ;
                                          sv->FIELD_DEC, ::BENr ) )]    //26.11.2006 10:43
         ENDIF
//         nBENr := IIf( sv->BrF<0 .AND. Abs(sv->BrF)<Len(::BEArea), ;
//                                       ::BENr + sv->BrF + 1, ;
//                  IIf( sv->BrF>0 .AND. Abs(sv->BrF)<Len(::BEArea), ;
//                                       sv->FIELD_DEC, ::BENr ) )    //26.11.2006 10:43
//+22.07.2008 12:08 ersetzt
//         nBo := ::BEArea[nBENr]:currentSize()[2] - IIf(!Empty(::Menubar),(HoT+2),25)*nV
//         nZeiT := IIf( sv->ZeiT < 1, nZeiT+nBz*sv->ZeiT, nBo+nBz-nBz*sv->ZeiT )
//         aPosT := {Int(sv->SpaT*nH), nZeiT} ; aSizeT := {Int(sv->BrT*nH),Int(sv->HoT*nV)}
         IF sv->HoT < 1    //* 09.07.2008 14:24 fr Einbau in ~bars
            aPosT := {Int(sv->SpaT*nH),0}
//            aSizeT := {Int(sv->BrT*nH),::BEArea[::BENr]:currentSize()[2]}
            aSizeT := {Int(sv->BrT*nH),::ActArea:currentSize()[2]}
         ELSE
//            nBo := ::BEArea[::BENr]:currentSize()[2] - IIf(!Empty(::Menubar),(HoT+2),HoT+2)*nV
            nBo := ::ActArea:currentSize()[2] - IIf(!Empty(::Menubar),(HoT+2),HoT+2)*nV
//+22.07.2008 12:06            nBo := ::BEArea[::BENr]:currentSize()[2] - IIf(!Empty(::Menubar),(HoT+2/nV),35)*nV     //14.04.2008 15:57 testhalber 2/nV
            nZeiT := IIf( sv->ZeiT < 1, nZeiT+nBz*sv->ZeiT, nBo+nBz-nBz*sv->ZeiT )
            aPosT := {Int(sv->SpaT*nH), nZeiT} ; aSizeT := {Int(sv->BrT*nH),Int(sv->HoT*nV)}
         ENDIF
         cT := sv->text  //03.12.2006 15:31  // ConvCP findet bei MStatic() statt 03.12.2006 16:37
         cT := IIf( cT="&",&(SubStr(cT,2)),cT)  //
//         AAdd( ::TextZeile, MStatic():new( ::BEArea[nBENr], oOwner, aPosT, aSizeT, aPPTxt,, ;
         AAdd( ::TextZeile, MStatic():new( ::ActArea, oOwner, aPosT, aSizeT, aPPTxt,, ;
                                             XBPSTATIC_TYPE_TEXT, Trim(cT) ) )   // 31.10.2006 12:18
         ++::TZNr
/*22.06.2008 10:44         IIf( nV<=1, ::TextZeile[::TZNr]:setFontCompoundName( "8.Arial" ), )  */
         IF sv->TAB_STOP==.T. .AND. sv->HoF<0  //11.11.2006 17:18
            ::TextZeile[::TZNr]:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_CENTER
         ELSEIF sv->TAB_STOP==.T.
            ::TextZeile[::TZNr]:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_LEFT
         ELSE
            ::TextZeile[::TZNr]:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT
         ENDIF
         ::TextZeile[::TZNr]:create()
         ::TextZeile[::TZNr]:helpLink := MagicHelpLabel():New( sv->FIELD_DEC) //*12.07.2008 17:45
         ::TextZeile[::TZNr]:cargo := Trim(sv->FIELD_NAME)
          IF Val(sv->ZAHL_FORM)>0 .AND. Val(sv->ZAHL_FORM)<16 .OR. ","$sv->ZAHL_FORM
               ::TextZeile[::TZNr]:setColorFG( IIf("."$sv->ZAHL_FORM, ;
                     Val(SubStr(sv->ZAHL_FORM, 1, At(".",sv->ZAHL_FORM)-1)), GRA_CLR_BLACK ))
               ::TextZeile[::TZNr]:setColorBG( IIf("."$sv->ZAHL_FORM .AND. .NOT. ","$sv->ZAHL_FORM, ;
                     Val(SubStr(sv->ZAHL_FORM, At(".",sv->ZAHL_FORM)+1,2)), ;
                     IIf(","$sv->ZAHL_FORM, GraMakeRGBColor( ;
                     IIf("."$sv->ZAHL_FORM, &("{"+Trim(SubStr(sv->ZAHL_FORM, At(".",sv->ZAHL_FORM)+1))+"}"), ;
                     &("{"+Trim(sv->ZAHL_FORM)+"}") )), ;
                     XBPSYSCLR_DIALOGBACKGROUND ) ))
          ENDIF
       CASE sv->FIELD_TYPE = "P"    // erzeugt die PushButtons
//         nBo := ::BEArea[::BENr]:currentSize()[2] - IIf(!Empty(::Menubar),(HoT+2),HoT+2)*nV
         nBo := ::LastArea:currentSize()[2] - IIf(!Empty(::Menubar),(HoT+2),HoT+2)*nV
         nZeiT := IIf( sv->ZeiT < 1, nZeiT+nBz*sv->ZeiT, nBo+nBz-nBz*sv->ZeiT )
         aPosT := {sv->SpaT*nH, nZeiT } 
//         aSizeT := {sv->BrT*nH,IIf(sv->HoT<1,::BEArea[::BENr]:currentSize()[2],sv->HoT*nV)}
         aSizeT := {sv->BrT*nH,IIf(sv->HoT<1,::LastArea:currentSize()[2],sv->HoT*nV)}
//         AAdd( ::DruckKnopf, MPButton():new( ::BEArea[::BENr], oOwner, aPosT, aSizeT,,,Trim(sv->TEXT), ;
         AAdd( ::DruckKnopf, MPButton():new( ::LastArea, oOwner, aPosT, aSizeT,,,Trim(sv->TEXT), ;
                            IIf(SET(43)==0,ConvToAnsiCP(Trim(sv->FIELD_NAME)),Trim(sv->FIELD_NAME)), ;
                                             @aData1, nFontR, nA, sv->TAB_STOP ) )  //03.12.2006 16:44
         ++::DKNr
         Sleep(1)    //+20.08.2012 18:16 Win7-Effekt?? damit keine verschwundenen Kn”pfe mehr!
         ::DruckKnopf[::DKNr]:CREATE()
         ::DruckKnopf[::DKNr]:helpLink := MagicHelpLabel():New(sv->FIELD_DEC)
         ::DruckKnopf[::DKNr]:cargo := Trim( sv->FIELD_NAME )
       CASE sv->FIELD_TYPE = "p"    // erzeugt die PushButtons mit eigenem Window
/*        oPBParent := IIf( sv->BrF<0, IIf(Abs(sv->BrF)<=Len(::BEArea),::BEArea[::BENr + sv->BrF + 1], ;
                     {AppDeskTop(),oBEDA:cargo:oLabel,oBEDA:cargo:oIconBar}[sv->BrF+100]), ;
                     IIf( sv->BrF>0, ::BEArea[sv->BrF], ::BEArea[::BENr] ) )
//                     {AppDeskTop(),oBEDA:cargo:oLabel,oBEDA:cargo:oIconBar}[sv->BrF+100]), ;
//         nBo := ::BEArea[1]:cargo:currentSize()[2]-60// - IIf(!Empty(::Menubar),(HoT+2),25)*nV
////         nZeiT := IIf( sv->ZeiT < 1, nZeiT+nBz*sv->ZeiT, nBo+nBz-nBz*sv->ZeiT )
//         aPosT := {Int(sv->SpaT*nH), nBo } ; aSizeT := {Int(sv->BrT*nH),Int(sv->HoT*nV)}

         nBo := oPBParent:currentPos()[2]    // - IIf(!Empty(::Menubar),(HoT+2),25)*nV
//         nZeiT := IIf( sv->ZeiT < 1, nZeiT+sv->ZeiT, nBo-sv->ZeiT )
      // bei diesen PushButtons z„hlt ZeiT von unten aus, wie bei Grafik 
         aPosT := {Int(sv->SpaT*nH), IIf( sv->ZeiT < 1, oPBParent:currentPos()[2], nBo+sv->ZeiT*nV)}
         aSizeT := {Int(sv->BrT*nH),IIf(sv->HoT < 1,oPBParent:currentSize()[2],Int(sv->HoT*nV))}
//            oXbpD := XbpDialog():new( ::BEArea[1], ::BEArea[1]:cargo, aPosT, aSizeT, aPPTxt,, )
//            oXbpD := XbpDialog():new( AppDeskTop(), oPBParent, aPosT, aSizeT, aPPTxt,, )   
            oXbpD := AKDialog():new( AppDeskTop(), oPBParent, aPosT, aSizeT, aPPTxt,, )
            oXbpD:minButton := .F.
            oXbpD:maxButton := .F.
            oXbpD:sysMenu   := .F.
            oXbpD:titleBar  := .F.
            oXbpD:border    := sv->FIELD_LEN + 3    // 3 = XBPDLG_THINBORDER, 1 = XBPDLG_NO_BORDER
            oXbpD:CREATE()
            * Shortcuts initialisieren
            ::BEArea[1]:cargo:InitShortCuts( oXbpD )
         AAdd( ::DruckKnopf, MPButton():new( oXbpD:drawingArea, oOwner, {0,0}, aSizeT,,,Trim(sv->TEXT), ;
                            IIf(SET(43)==0,ConvToAnsiCP(Trim(sv->FIELD_NAME)),Trim(sv->FIELD_NAME)), ;
                                             @aData1, nFontR, nA, sv->TAB_STOP ) )  //03.12.2006 16:44
*/
         nBo := ::BEArea[::BENr]:currentSize()[2] - IIf(!Empty(::Menubar),(HoT+2),35)*nV
         nZeiT := IIf( sv->ZeiT < 1, nZeiT+nBz*sv->ZeiT, nBo+nBz-nBz*sv->ZeiT )
         aPosT := {Int(sv->SpaT*nH), nZeiT } ; aSizeT := {Int(sv->BrT*nH),Int(sv->HoT*nV)}
            oXbpD := XbpDialog():new( ::BEArea[::BENr], ::BEArea[1]:cargo, aPosT, aSizeT, aPPTxt,, )
            oXbpD:minButton := .F.
            oXbpD:maxButton := .F.
            oXbpD:sysMenu   := .F.
            oXbpD:titleBar  := .F.
            oXbpD:border    := sv->FIELD_LEN + 3    // 3 = XBPDLG_THINBORDER, 1 = XBPDLG_NO_BORDER
            oXbpD:CREATE()
         AAdd( ::DruckKnopf, MPButton():new( oXbpD:drawingArea, oOwner, ;
                            {sv->SpaF*nH,sv->ZeiF*nV}, {sv->BrF*nH,sv->HoF*nV},,,Trim(sv->TEXT), ;
                            IIf(SET(43)==0,ConvToAnsiCP(Trim(sv->FIELD_NAME)),Trim(sv->FIELD_NAME)), ;
                            @aData1, nFontR, nA, sv->TAB_STOP ) )  //05.01.2008 09:07
  
         ++::DKNr
         ::DruckKnopf[::DKNr]:CREATE()
         ::DruckKnopf[::DKNr]:helpLink := MagicHelpLabel():New(sv->FIELD_DEC)
         ::DruckKnopf[::DKNr]:cargo := Trim( sv->FIELD_NAME )
       CASE sv->FIELD_TYPE = "X"    // erzeugt die ListBox-Objekte   // 10.3.2004
//         IF "TABSEITE"$Upper(sv->ZAHL_FORM)
//            nBo := ::TabSeite[::TSNr]:currentSize()[2] - IIf(!Empty(::Menubar),(HoT+2),35)*nV
//            nZeiF := IIf( sv->ZeiF < 1, nZeiF+nBz*sv->ZeiF, nBo+nBz-nBz*sv->ZeiF )
//            aPosF := {Int(sv->SpaF*nH), nZeiF} ; aSizeF := {Int(sv->BrF*nH),Int(sv->HoF*nV)}
//            AAdd( ::ListBox, XbpListBox():new( ::TabSeite[::TSNr], oOwner, aPosF, aSizeF, aPPSle ))
//         ELSE
////            nBo := ::BEArea[::BENr]:currentSize()[2] - IIf(!Empty(::Menubar),(HoT+2),35)*nV
            nBo := ::LastArea:currentSize()[2] - IIf(!Empty(::Menubar),(HoT+2),35)*nV
            nZeiF := IIf( sv->ZeiF < 1, nZeiF+nBz*sv->ZeiF, nBo+nBz-nBz*sv->ZeiF )
            aPosF := {Int(sv->SpaF*nH), nZeiF} ; aSizeF := {Int(sv->BrF*nH),Int(sv->HoF*nV)}
////            AAdd( ::ListBox, XbpListBox():new( ::BEArea[::BENr], oOwner, aPosF, aSizeF, aPPSle ))
            AAdd( ::ListBox, XbpListBox():new( ::LastArea, oOwner, aPosF, aSizeF, aPPSle ))
//         ENDIF
         ++::LBNr
         ::ListBox[::LBNr]:tabstop := sv->TAB_STOP    //24.10.2007 09:30
         ::ListBox[::LBNr]:create()
         ::ListBox[::LBNr]:helpLink := MagicHelpLabel():New(sv->FIELD_DEC)
         IF !Empty( sv->FIELD_LEN )    // 20.08.2006 15:52
            ::ListBox[::LBNr]:setItemsHeight( sv->FIELD_LEN * nV * 1.02 )
         ENDIF
         ::ListBox[::LBNr]:cargo := Trim( sv->FIELD_NAME )
       CASE sv->FIELD_TYPE = "x"    /*20.06.2008 12:03 erzeugt die ListBox-Objekte als ComboBox */
         cFeld := Trim( sv->FIELD_NAME )
//         nBo := ::BEArea[::BENr]:currentSize()[2] - IIf(!Empty(::Menubar),(HoT+2),35)*nV
         nBo := ::LastArea:currentSize()[2] - IIf(!Empty(::Menubar),(HoT+2),HoT+2)*nV
         nZeiF := IIf( sv->ZeiF < 1, nZeiF+nBz*sv->ZeiF, nBo+nBz-nBz*sv->ZeiF )
//         nZeiT := IIf( sv->ZeiT < 1, nZeiT+nBz*sv->ZeiT, nBo+nBz-nBz*sv->ZeiT )
         aPosF := {Int(sv->SpaF*nH), nZeiF} ; aSizeF := {Int(sv->BrF*nH),Int(sv->HoF*nV)}
//         aPosT := {Int(sv->SpaT*nV), nZeiT} ; aSizeT := {Int(sv->BrT*nV),Int(sv->HoT*nV)}
         cPic := IIf( sv->FIELD_TYPE != "C", Trim(sv->ZAHL_FORM), NIL )
            y := (nA)->(FieldPos( cFeld ))         // y : Feld-Position in WorkArea nA
         cF := Trim(sv->TEXT)
//         AAdd( ::ListBox, MComboBox():new( ::BEArea[::BENr], oOwner, aPosF, aSizeF, aPPSle,, ;
         AAdd( ::ListBox, MComboBox():new( ::LastArea, oOwner, aPosF, aSizeF, aPPSle,, ;
                                             @(nA)->&cFeld, sv->FIELD_LEN, sv->TAB_STOP, cPic, ;
                                             &cF ))
         ++::LBNr
         ::ListBox[::LBNr]:tabstop := sv->TAB_STOP    //24.10.2007 09:30
////         ::ListBox[::LBNr]:clipchildren := .F.
         ::ListBox[::LBNr]:create(::BEArea[::BENr], oOwner, aPosF, aSizeF, aPPSle,, ;
                                             @(nA)->&cFeld, sv->FIELD_LEN, sv->TAB_STOP, cPic, ;
                                             &cF )
         ::ListBox[::LBNr]:helpLink := MagicHelpLabel():New(sv->FIELD_DEC)
//         IF !Empty( sv->FIELD_LEN )    // 20.08.2006 15:52
//            ::ListBox[::LBNr]:setItemsHeight( sv->FIELD_LEN * nV * 1.02 )
//         ENDIF
         ::ListBox[::LBNr]:setName( y )
         ::ListBox[::LBNr]:cargo := Trim( sv->FIELD_NAME )
         ::ListBox[::LBNr]:XbpGet:cargo := Trim( sv->FIELD_NAME )
         ::addEditControl( ::ListBox[::LBNr]:XbpGet )
       CASE sv->FIELD_TYPE = "M"    // erzeugt die Mle-Objekte
//         nBo := ::BEArea[::BENr]:currentSize()[2] - IIf(!Empty(::Menubar),(HoT+2),35)*nV
         nBo := ::LastArea:currentSize()[2] - IIf(!Empty(::Menubar),(HoT+2),35)*nV
         nZeiF := IIf( sv->ZeiF < 1, nZeiF+nBz*sv->ZeiF, nBo+nBz-nBz*sv->ZeiF )
         nZeiT := IIf( sv->ZeiT < 1, nZeiT+nBz*sv->ZeiT, nBo+nBz-nBz*sv->ZeiT )
         aPosF := {Int(sv->SpaF*nH), nZeiF} ; aSizeF := {Int(sv->BrF*nH),Int(sv->HoF*nV)}
         aPosT := {Int(sv->SpaT*nH), nZeiT} ; aSizeT := {Int(sv->BrT*nH),Int(sv->HoT*nV)}
         cFeld := Trim( sv->FIELD_NAME )
         cPic := IIf( sv->FIELD_TYPE != "C", Trim(sv->ZAHL_FORM), NIL )
         IF (nA)->(IsFieldVar( cFeld ))   // 26.4.03
            y := (nA)->(FieldPos( cFeld ))         // y : Feld-Position in best.dbf/vv.dbf ...
//            AAdd( ::MultiZeile, MMleXR():new( ::BEArea[::BENr], oOwner, aPosF, aSizeF, aPPSle,, ;
            AAdd( ::MultiZeile, MMleXR():new( ::LastArea, oOwner, aPosF, aSizeF, aPPSle,, ;
                                                @(nA)->&cFeld, sv->FIELD_LEN, sv->TAB_STOP, cPic, ;
                                                Trim(sv->TEXT), aPosT, aSizeT, aPPTxt, nA ) )
            ++::MZNr
           //+30.08.2008 14:33 bringt den Prompttext als ::cargo mit:
            IF ValType(::MultiZeile[::MZNr]:cargo) == "O"
               AAdd( ::TextZeile, ::MultiZeile[::MZNr]:cargo )
               ++::TZNr
               ::TextZeile[::TZNr]:cargo := Trim( sv->FIELD_NAME )
            ENDIF
            ::MultiZeile[::MZNr]:cargo := Trim( sv->FIELD_NAME )
            ::MultiZeile[::MZNr]:CREATE()   //1.1.2005###################:setData()
            ::MultiZeile[::MZNr]:helpLink := MagicHelpLabel():New(sv->FIELD_DEC)
            ::MultiZeile[::MZNr]:setName( y )
            ::addEditControl( ::MultiZeile[::MZNr] )
//         ELSEIF IsMemberVar( self, cFeld )
         ELSEIF IsMemberVar( self, IIf("["$cFeld,SubStr(cFeld,1,At("[",cFeld)-1), cFeld ) )  //19.08.2006 21:09
            cF := ("oEdit:"+cFeld)
//            AAdd( ::MultiZeile, MMleXR():new( ::BEArea[::BENr], oOwner, aPosF, aSizeF, aPPSle,, ;
            AAdd( ::MultiZeile, MMleXR():new( ::LastArea, oOwner, aPosF, aSizeF, aPPSle,, ;
                                                @&cF, sv->FIELD_LEN, sv->TAB_STOP, cPic, ;
                                                Trim(sv->TEXT), aPosT, aSizeT, aPPTxt, nA ) )
//                                                @oEdit:&cfeld, sv->FIELD_LEN, sv->TAB_STOP, cPic, ;
//                                                Trim(sv->TEXT), aPosT, aSizeT, aPPTxt, nA ) )
            ++::MZNr
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
            //+30.07.2009 20:49++++++++++++++++++++++++++++++++++++++++++
            //+ die bisherige Version von ::datalink war offensichtlich falsch!
            //+ mit dieser Version klappt es beim Žndern der Felder problemlos!
            //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
            ::MultiZeile[::MZNr]:dataLink := &("{|x| IIf( PCOUNT()==0, "+cF+", "+cF+" := x ) }")
            //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
           //+30.08.2008 14:33 bringt den Prompttext als ::cargo mit:
            IF ValType(::MultiZeile[::MZNr]:cargo) == "O"
               AAdd( ::TextZeile, ::MultiZeile[::MZNr]:cargo )
               ++::TZNr
               ::TextZeile[::TZNr]:cargo := Trim( sv->FIELD_NAME )
            ENDIF
            ::MultiZeile[::MZNr]:cargo := Trim( sv->FIELD_NAME )
            ::MultiZeile[::MZNr]:CREATE()   //1.1.2005###################:setData()
            ::MultiZeile[::MZNr]:helpLink := MagicHelpLabel():New(sv->FIELD_DEC)
            ::MultiZeile[::MZNr]:setName( ++::aFNr )    // oberhalb der y-Werte
            ::addEditControl( ::MultiZeile[::MZNr] )
         ELSEIF IsMemVar( cFeld )
//            AAdd( ::MultiZeile, MMleXR():new( ::BEArea[::BENr], oOwner, aPosF, aSizeF, aPPSle,, ;
            AAdd( ::MultiZeile, MMleXR():new( ::LastArea, oOwner, aPosF, aSizeF, aPPSle,, ;
                                                @&cFeld, sv->FIELD_LEN, sv->TAB_STOP, cPic, ;
                                                Trim(sv->TEXT), aPosT, aSizeT, aPPTxt, nA ) )
            ++::MZNr
           //+30.08.2008 14:33 bringt den Prompttext als ::cargo mit:
            IF ValType(::MultiZeile[::MZNr]:cargo) == "O"
               AAdd( ::TextZeile, ::MultiZeile[::MZNr]:cargo )
               ++::TZNr
               ::TextZeile[::TZNr]:cargo := Trim( sv->FIELD_NAME )
            ENDIF
            ::MultiZeile[::MZNr]:cargo := Trim( sv->FIELD_NAME )
            ::MultiZeile[::MZNr]:CREATE()   //1.1.2005###################:setData()
            ::MultiZeile[::MZNr]:helpLink := MagicHelpLabel():New(sv->FIELD_DEC)
            ::MultiZeile[::MZNr]:setName( ++::aFNr )    // oberhalb der y-Werte
            ::addEditControl( ::MultiZeile[::MZNr] )
         ENDIF
       CASE sv->FIELD_TYPE = "C" .OR. sv->FIELD_TYPE = "N" .OR. sv->FIELD_TYPE = "D" ;
                               .OR. sv->FIELD_TYPE = "L" // erzeugt Sle mit MGETXR
         IF sv->HoF < 1    //* 09.07.2008 14:24 fr Einbau in ~bars
            aPosF := {Int(sv->SpaF*nH),0} ; aPosT := {Int(sv->SpaT*nH),0}
//            aSizeF := {Int(sv->BrF*nH),::BEArea[::BENr]:currentSize()[2]}
//            aSizeT := {Int(sv->BrT*nH),::BEArea[::BENr]:currentSize()[2]}
            aSizeF := {Int(sv->BrF*nH),::LastArea:currentSize()[2]}
            aSizeT := {Int(sv->BrT*nH),::LastArea:currentSize()[2]}
         ELSE
//            nBo := ::BEArea[::BENr]:currentSize()[2] - IIf(!Empty(::Menubar),(HoT+2),HoT+2)*nV
            nBo := ::LastArea:currentSize()[2] - IIf(!Empty(::Menubar),(HoT+2),HoT+2)*nV
//+22.07.2008 12:06            nBo := ::BEArea[::BENr]:currentSize()[2] - IIf(!Empty(::Menubar),(HoT+2/nV),35)*nV     //14.04.2008 15:57 testhalber 2/nV
            nZeiF := IIf( sv->ZeiF < 1, nZeiF+nBz*sv->ZeiF, nBo+nBz-nBz*sv->ZeiF )
            nZeiT := IIf( sv->ZeiT < 1, nZeiT+nBz*sv->ZeiT, nBo+nBz-nBz*sv->ZeiT )
            aPosF := {Int(sv->SpaF*nH), nZeiF} ; aSizeF := {Int(sv->BrF*nH),Int(sv->HoF*nV)}
            aPosT := {Int(sv->SpaT*nH), nZeiT} ; aSizeT := {Int(sv->BrT*nH),Int(sv->HoT*nV)}
         ENDIF
         cFeld := Trim( sv->FIELD_NAME )
         cFeld := IIf( cFeld="&", &(substr( cFeld,2,len(cFeld)-1 )), cFeld )
         cPic := IIf( sv->FIELD_TYPE != "C", Trim(sv->ZAHL_FORM), NIL )
         IF (nA)->(IsFieldVar( cFeld ))   // 26.4.03
            cF := "("+AllTrim(Str(nA))+")->"+cFeld    //04.01.2008 18:29
            y := (nA)->(FieldPos( cFeld ))         // y : Feld-Position in WorkArea nA
//            AAdd( ::SingleZeile, MGetXR():new( ::BEArea[::BENr], oOwner, aPosF, aSizeF, aPPSle,, ;
            AAdd( ::SingleZeile, MGetXR():new( ::LastArea, oOwner, aPosF, aSizeF, aPPSle,, ;
                                                @(nA)->&cFeld, sv->FIELD_LEN, sv->TAB_STOP, cPic, ;
                                                Trim(sv->TEXT), aPosT, aSizeT, aPPTxt, nA ) )
            ++::SZNr
           //+30.08.2008 14:33 bringt den Prompttext als ::cargo mit:
            IF ValType(::SingleZeile[::SZNr]:cargo) == "O"
               AAdd( ::TextZeile, ::SingleZeile[::SZNr]:cargo )
               ++::TZNr
               ::TextZeile[::TZNr]:cargo := Trim( sv->FIELD_NAME )
            ENDIF
            ::SingleZeile[::SZNr]:unreadable := IIf( sv->ZAHL_FORM="****", .T., .F. )  //06.04.2007 22:38
            ::SingleZeile[::SZNr]:CREATE()   //1.1.2005###################:setdata()
            ::SingleZeile[::SZNr]:helpLink := MagicHelpLabel():New(sv->FIELD_DEC)
            ::SingleZeile[::SZNr]:setName( y )
            ::SingleZeile[::SZNr]:cargo := Trim( sv->FIELD_NAME )
            ::addEditControl( ::SingleZeile[::SZNr] )
            ::StartFocus := IIf( sv->ZAHL_FORM[1]="F", sv->ZAHL_FORM[2], ::StartFocus )
         ELSEIF IsMemberVar( self, IIf("["$cFeld,SubStr(cFeld,1,At("[",cFeld)-1), cFeld ) )  //19.08.2006 21:09
            cF := ("oEdit:"+cFeld)
            IF ValType( &cF ) == "C"       //24.08.2006 19:06
               &cF := PadR( &cF, sv->FIELD_LEN )
            ENDIF
//            AAdd( ::SingleZeile, MGetXR():new( ::BEArea[::BENr], oOwner, aPosF, aSizeF, aPPSle,, ;
            AAdd( ::SingleZeile, MGetXR():new( ::LastArea, oOwner, aPosF, aSizeF, aPPSle,, ;
                                                @&cf, sv->FIELD_LEN, sv->TAB_STOP, cPic, ;
                                                Trim(sv->TEXT), aPosT, aSizeT, aPPTxt, nA ) )
            ++::SZNr
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
            //+30.07.2009 20:49++++++++++++++++++++++++++++++++++++++++++
            //+ die bisherige Version von ::datalink war offensichtlich falsch!
            //+ mit dieser Version klappt es beim Žndern der Felder problemlos!
            //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
            ::SingleZeile[::SZNr]:dataLink := &("{|x| IIf( PCOUNT()==0, "+cF+", "+cF+" := x ) }")
            //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
           //+30.08.2008 14:33 bringt den Prompttext als ::cargo mit:
            IF ValType(::SingleZeile[::SZNr]:cargo) == "O"
               AAdd( ::TextZeile, ::SingleZeile[::SZNr]:cargo )
               ++::TZNr
               ::TextZeile[::TZNr]:cargo := Trim( sv->FIELD_NAME )
            ENDIF
            ::SingleZeile[::SZNr]:unreadable := IIf( sv->ZAHL_FORM="****", .T., .F. )  //06.04.2007 22:38
            ::SingleZeile[::SZNr]:CREATE()   //1.1.2005###################:setdata()
            ::SingleZeile[::SZNr]:helpLink := MagicHelpLabel():New(sv->FIELD_DEC)
            ::SingleZeile[::SZNr]:setName( ++::aFNr )    // oberhalb der y-Werte
            ::SingleZeile[::SZNr]:cargo := Trim( sv->FIELD_NAME )
//õõõõ%%25.06.2009 10:27%%õõõõ//            ::SingleZeile[::SZNr]:dataLink := {|x| IIf( PCOUNT()==0, &("oEdit:"+self:cargo), &("oEdit:"+self:cargo) := x ) }
            ::addEditControl( ::SingleZeile[::SZNr] )
            ::StartFocus := IIf( sv->ZAHL_FORM[1]="F", sv->ZAHL_FORM[2], ::StartFocus )
         ELSEIF IsMemVar( cFeld )
            cF := cFeld    //04.01.2008 18:28
            IF ValType( &cFeld ) == "C"      //24.08.2006 19:06
               &cFeld := PadR( &cFeld, sv->FIELD_LEN )
            ENDIF
//            AAdd( ::SingleZeile, MGetXR():new( ::BEArea[::BENr], oOwner, aPosF, aSizeF, aPPSle,, ;
            AAdd( ::SingleZeile, MGetXR():new( ::LastArea, oOwner, aPosF, aSizeF, aPPSle,, ;
                                                @&cFeld, sv->FIELD_LEN, sv->TAB_STOP, cPic, ;
                                                Trim(sv->TEXT), aPosT, aSizeT, aPPTxt, nA ) )
            ++::SZNr
           //+30.08.2008 14:33 bringt den Prompttext als ::cargo mit:
            IF ValType(::SingleZeile[::SZNr]:cargo) == "O"
               AAdd( ::TextZeile, ::SingleZeile[::SZNr]:cargo )
               ++::TZNr
               ::TextZeile[::TZNr]:cargo := Trim( sv->FIELD_NAME )
            ENDIF
            ::SingleZeile[::SZNr]:unreadable := IIf( sv->ZAHL_FORM="****", .T., .F. )  //06.04.2007 22:38
            ::SingleZeile[::SZNr]:CREATE()   //1.1.2005###################:setdata()
            ::SingleZeile[::SZNr]:helpLink := MagicHelpLabel():New(sv->FIELD_DEC)
            ::SingleZeile[::SZNr]:setName( ++::aFNr )    // oberhalb der y-Werte
            ::SingleZeile[::SZNr]:cargo := Trim( sv->FIELD_NAME )
            ::addEditControl( ::SingleZeile[::SZNr] )
            ::StartFocus := IIf( sv->ZAHL_FORM[1]="F", sv->ZAHL_FORM[2], ::StartFocus )
         ELSE
            cF := "lLogBook"     //+26.09.2008 10:29 Dummy fr nicht vorhandene Felder, sonst Fehler in 2 Zeilen:
         ENDIF
         IF ValType( &cF ) == "D"       //04.01.2008 16:58 erm”glicht ClickDate()
            ::SingleZeile[::SZNr]:lbDblClick := ;
                     {| MP1, uNIL, o| clickdate(CtoD(o:editbuffer()),oEdit:BEArea[1]:cargo,@o)}
         ELSEIF ValType( &cF ) == "N"       //+06.10.2008 20:36 erm”glicht ClickCalc()
            ::SingleZeile[::SZNr]:lbDblClick := ;
                     {| MP1, uNIL, o| clickcalc(o)}  // Referenz auf o wrde Wert zurckgeben k”nnen...
//                     {| MP1, uNIL, o| oBest:oCalcThrd := Thread():new(), oBest:oCalcThrd:start("Clickcalc",o) }  // Referenz auf o wrde Wert zurckgeben k”nnen...
         ENDIF
// die Variablen mit kleinem c,n,d,l sind nur fr XbpSle-Anzeige-Felder gedacht:
       CASE sv->FIELD_TYPE = "c" .OR. sv->FIELD_TYPE = "n" .OR. sv->FIELD_TYPE = "d" ;
                               .OR. sv->FIELD_TYPE = "l" // erzeugt Sle
         IF sv->HoF < 1    //* 09.07.2008 14:24 fr Einbau in ~bars
            aPosF := {Int(sv->SpaF*nH),0} ; aPosT := {Int(sv->SpaT*nH),0}
//            aSizeF := {Int(sv->BrF*nH),::BEArea[::BENr]:currentSize()[2]}
//            aSizeT := {Int(sv->BrT*nH),::BEArea[::BENr]:currentSize()[2]}
            aSizeF := {Int(sv->BrF*nH),::LastArea:currentSize()[2]}
            aSizeT := {Int(sv->BrT*nH),::LastArea:currentSize()[2]}
         ELSE
//            nBo := ::BEArea[::BENr]:currentSize()[2] - IIf(!Empty(::Menubar),(HoT+2),35)*nV
            nBo := ::LastArea:currentSize()[2] - IIf(!Empty(::Menubar),(HoT+2),35)*nV
            nZeiF := IIf( sv->ZeiF < 1, nZeiF+nBz*sv->ZeiF, nBo+nBz-nBz*sv->ZeiF )
            nZeiT := IIf( sv->ZeiT < 1, nZeiT+nBz*sv->ZeiT, nBo+nBz-nBz*sv->ZeiT )
            aPosF := {Int(sv->SpaF*nH), nZeiF} ; aSizeF := {Int(sv->BrF*nH),Int(sv->HoF*nV)}
            aPosT := {Int(sv->SpaT*nH), nZeiT} ; aSizeT := {Int(sv->BrT*nH),Int(sv->HoT*nV)}
         ENDIF
         cFeld := Trim( sv->FIELD_NAME )
         cFeld := IIf( cFeld="&", &(substr( cFeld,2,len(cFeld)-1 )), cFeld )
         cPic := IIf( sv->FIELD_TYPE != "c".OR.sv->ZAHL_FORM[1]="@", Trim(sv->ZAHL_FORM), NIL )
         IF (nA)->(IsFieldVar( cFeld ))   // 26.4.03
            cF := "("+AllTrim(Str(nA))+")->"+cFeld    //04.01.2008 18:28
            y := (nA)->(FieldPos( cFeld ))         // y : Feld-Position in WorkArea nA
//            AAdd( ::SingleZeile, MGet():new( ::BEArea[::BENr], oOwner, aPosF, aSizeF, aPPSle,, ;
            AAdd( ::SingleZeile, MGet():new( ::LastArea, oOwner, aPosF, aSizeF, aPPSle,, ;
                                                @(nA)->&cFeld, sv->FIELD_LEN, sv->TAB_STOP, cPic, ;
                                                Trim(sv->TEXT), aPosT, aSizeT, aPPTxt, nA ) )
            ++::SZNr
            ::SingleZeile[::SZNr]:CREATE()   //1.1.2005###################:setdata()
            ::SingleZeile[::SZNr]:helpLink := MagicHelpLabel():New(sv->FIELD_DEC)
            ::SingleZeile[::SZNr]:setName( y )
            ::SingleZeile[::SZNr]:cargo := Trim( sv->FIELD_NAME )
            ::addEditControl( ::SingleZeile[::SZNr] )
            ::StartFocus := IIf( sv->ZAHL_FORM[1]="F", sv->ZAHL_FORM[2], ::StartFocus )
         ELSEIF IsMemberVar( self, cFeld )
            cF := ("oEdit:"+cFeld)     //04.01.2008 18:28
//            IF ValType( &cF ) == "C"       //24.08.2006 19:06
//               &cF := PadR( &cF, sv->FIELD_LEN )
//            ENDIF
//            AAdd( ::SingleZeile, MGet():new( ::BEArea[::BENr], oOwner, aPosF, aSizeF, aPPSle,, ;
//                                                @oEdit:&cfeld, sv->FIELD_LEN, sv->TAB_STOP, cPic, ;
//                                                Trim(sv->TEXT), aPosT, aSizeT, aPPTxt, nA ) )
//            AAdd( ::SingleZeile, MGet():new( ::BEArea[::BENr], oOwner, aPosF, aSizeF, aPPSle,, ;
            AAdd( ::SingleZeile, MGet():new( ::LastArea, oOwner, aPosF, aSizeF, aPPSle,, ;
                                                @&cf, sv->FIELD_LEN, sv->TAB_STOP, cPic, ;
                                                Trim(sv->TEXT), aPosT, aSizeT, aPPTxt, nA ) )
            ++::SZNr
            ::SingleZeile[::SZNr]:CREATE()   //1.1.2005###################:setdata()
            ::SingleZeile[::SZNr]:helpLink := MagicHelpLabel():New(sv->FIELD_DEC)
            ::SingleZeile[::SZNr]:setName( ++::aFNr )    // oberhalb der y-Werte
            ::SingleZeile[::SZNr]:cargo := Trim( sv->FIELD_NAME )
            ::addEditControl( ::SingleZeile[::SZNr] )
            ::StartFocus := IIf( sv->ZAHL_FORM[1]="F", sv->ZAHL_FORM[2], ::StartFocus )
         ELSEIF IsMemVar( cFeld )
            cF := cFeld    //04.01.2008 18:28
//            AAdd( ::SingleZeile, MGet():new( ::BEArea[::BENr], oOwner, aPosF, aSizeF, aPPSle,, ;
            AAdd( ::SingleZeile, MGet():new( ::LastArea, oOwner, aPosF, aSizeF, aPPSle,, ;
                                                @&cFeld, sv->FIELD_LEN, sv->TAB_STOP, cPic, ;
                                                Trim(sv->TEXT), aPosT, aSizeT, aPPTxt, nA ) )
            ++::SZNr
            ::SingleZeile[::SZNr]:CREATE()   //1.1.2005###################:setdata()
            ::SingleZeile[::SZNr]:helpLink := MagicHelpLabel():New(sv->FIELD_DEC)
            ::SingleZeile[::SZNr]:setName( ++::aFNr )    // oberhalb der y-Werte
            ::SingleZeile[::SZNr]:cargo := Trim( sv->FIELD_NAME )
            ::addEditControl( ::SingleZeile[::SZNr] )
            ::StartFocus := IIf( sv->ZAHL_FORM[1]="F", sv->ZAHL_FORM[2], ::StartFocus )
         ELSE
            cF := "lLogBook"     //+26.09.2008 10:29 Dummy fr nicht vorhandene Felder, sonst Fehler in 2 Zeilen:
         ENDIF
         IF ValType( &cF ) == "D"       //04.01.2008 16:58 erm”glicht ClickDate()
            ::SingleZeile[::SZNr]:lbDblClick := ;
                     {| MP1, uNIL, o| clickdate(CtoD(o:editbuffer()),oEdit:BEArea[1]:cargo,@o)}
         ELSEIF ValType( &cF ) == "N"       //+06.10.2008 20:36 erm”glicht ClickCalc()
            ::SingleZeile[::SZNr]:lbDblClick := ;
                     {| MP1, uNIL, o| clickcalc(o)}  // Referenz auf o wrde Wert zurckgeben k”nnen...
         ENDIF
       CASE sv->FIELD_TYPE = "o"       // fr XbpCheckBox
//         nBo := ::BEArea[::BENr]:currentSize()[2] - IIf(!Empty(::Menubar),(HoT+2),25)*nV
         nBo := ::LastArea:currentSize()[2] - IIf(!Empty(::Menubar),(HoT+2),25)*nV
         nZeiF := IIf( sv->ZeiF < 1, nZeiF+nBz*sv->ZeiF, nBo+nBz-nBz*sv->ZeiF )
         nZeiT := IIf( sv->ZeiT < 1, nZeiT+nBz*sv->ZeiT, nBo+nBz-nBz*sv->ZeiT )
         aPosF := {Int(sv->SpaF*nH), nZeiF} ; aSizeF := {Int(sv->BrF*nH),Int(sv->HoF*nV)}
         aPosT := {Int(sv->SpaT*nH), nZeiT} ; aSizeT := {Int(sv->BrT*nH),Int(sv->HoT*nV)}
         cFeld := Trim( sv->FIELD_NAME )
         cFeld := IIf( cFeld="&", &(substr( cFeld,2,len(cFeld)-1 )), cFeld )
         cPic := IIf( sv->FIELD_TYPE != "c", Trim(sv->ZAHL_FORM), NIL )
         IF (nA)->(IsFieldVar( cFeld ))   // 26.4.03
            y := (nA)->(FieldPos( cFeld ))         // y : Feld-Position in WorkArea nA
//            AAdd( ::LogikKnopf, MCheck():new( ::BEArea[::BENr], oOwner, aPosF, aSizeF,       ,, ;
            AAdd( ::LogikKnopf, MCheck():new( ::LastArea, oOwner, aPosF, aSizeF,       ,, ;
                                             y, sv->FIELD_LEN, sv->TAB_STOP,;
                                             Trim(sv->TEXT), aPosT, aSizeT,       , nA ) )
            ++::LKNr
            ::LogikKnopf[::LKNr]:CREATE()
//            ::LogikKnopf[::LKNr]:helpLink := MagicHelpLabel():New(sv->FIELD_DEC)
            ::LogikKnopf[::LKNr]:setName( y )
            ::LogikKnopf[::LKNr]:cargo := Trim( sv->FIELD_NAME )
            ::addEditControl( ::LogikKnopf[::LKNr] )
         ELSEIF IsMemberVar( self, cFeld )
//            AAdd( ::LogikKnopf, XbpCheckBox():new( ::BEArea[::BENr], oOwner, aPosF, aSizeF, aPPSle) )
            AAdd( ::LogikKnopf, XbpCheckBox():new( ::LastArea, oOwner, aPosF, aSizeF, aPPSle) )
            ++::LKNr
            ::LogikKnopf[::LKNr]:dataLink := {|x| IIf( PCOUNT()==0, ;
                        oEdit:&cFeld, oEdit:&cFeld := x ) }
            ::LogikKnopf[::LKNr]:caption := sv->Text
            ::LogikKnopf[::LKNr]:CREATE()
//            ::LogikKnopf[::LKNr]:helpLink := MagicHelpLabel():New(sv->FIELD_DEC)
            ::LogikKnopf[::LKNr]:setName( ++::aFNr )
            ::LogikKnopf[::LKNr]:cargo := Trim( sv->FIELD_NAME )
            ::addEditControl( ::LogikKnopf[::LKNr] )
         ELSEIF IsMemVar( cFeld )
//            AAdd( ::LogikKnopf, XbpCheckBox():new( ::BEArea[::BENr], oOwner, aPosF, aSizeF, aPPSle) )
            AAdd( ::LogikKnopf, XbpCheckBox():new( ::LastArea, oOwner, aPosF, aSizeF, aPPSle) )
            ++::LKNr
            ::LogikKnopf[::LKNr]:dataLink := {|x| IIf( PCOUNT()==0, ;
                        &cFeld, &cFeld := x ) }
            ::LogikKnopf[::LKNr]:caption := sv->Text
            ::LogikKnopf[::LKNr]:CREATE()
//            ::LogikKnopf[::LKNr]:helpLink := MagicHelpLabel():New(sv->FIELD_DEC)
            ::LogikKnopf[::LKNr]:setName( ++::aFNr )
            ::LogikKnopf[::LKNr]:cargo := Trim( sv->FIELD_NAME )
            ::addEditControl( ::LogikKnopf[::LKNr] )
         ENDIF
       CASE sv->FIELD_TYPE = "i"       // fr XbpSpinButton
//         nBo := ::BEArea[::BENr]:currentSize()[2] - IIf(!Empty(::Menubar),(HoT+2),35)*nV
         nBo := ::LastArea:currentSize()[2] - IIf(!Empty(::Menubar),(HoT+2),35)*nV
         nZeiF := IIf( sv->ZeiF < 1, nZeiF+nBz*sv->ZeiF, nBo+nBz-nBz*sv->ZeiF )
         nZeiT := IIf( sv->ZeiT < 1, nZeiT+nBz*sv->ZeiT, nBo+nBz-nBz*sv->ZeiT )
         aPosF := {Int(sv->SpaF*nH), nZeiF} ; aSizeF := {Int(sv->BrF*nH),Int(sv->HoF*nV)}
         aPosT := {Int(sv->SpaT*nH), nZeiT} ; aSizeT := {Int(sv->BrT*nH),Int(sv->HoT*nV)}
         cFeld := Trim( sv->FIELD_NAME )
         cFeld := IIf( cFeld="&", &(substr( cFeld,2,len(cFeld)-1 )), cFeld )
//         AAdd( ::TextZeile, MStatic():new( ::BEArea[::BENr], oOwner, aPosT, aSizeT, aPPTxt,, ;
         AAdd( ::TextZeile, MStatic():new( ::LastArea, oOwner, aPosT, aSizeT, aPPTxt,, ;
                                             XBPSTATIC_TYPE_TEXT, Trim(sv->TEXT) ) )
         ++::TZNr
         IIf( nV<=1, ::TextZeile[::TZNr]:setFontCompoundName( "8.Arial" ), )
         ::TextZeile[::TZNr]:create()
         ::TextZeile[::TZNr]:helpLink := MagicHelpLabel():New(sv->FIELD_DEC)
//         AAdd( ::SpinKnopf, XbpSpinButton():new( ::BEArea[::BENr], oOwner, aPosF, aSizeF, aPPSle) )
         AAdd( ::SpinKnopf, XbpSpinButton():new( ::LastArea, oOwner, aPosF, aSizeF, aPPSle) )
         ++::SKNr
         ::SpinKnopf[::SKNr]:datalink := {|x| IIf( PCOUNT()==0, ;
                        &(cFeld), &(cFeld) := x ) }
         ::SpinKnopf[::SKNr]:CREATE()     //:setData(&cFeld)
         ::SpinKnopf[::SKNr]:setNumLimits( Val(SubStr(sv->zahl_form,1,At(",",sv->zahl_form)-1)), ;
                                          Val(SubStr(sv->zahl_form,At(",",sv->zahl_form)+1)))
         ::SpinKnopf[::SKNr]:cargo := Trim( sv->FIELD_NAME )
         ::SpinKnopf[::SKNr]:setName( ++::aFNr )
         ::addEditControl( ::SpinKnopf[::SKNr] )
       CASE sv->FIELD_TYPE = "k"       // erzeugt die killInputFocus-Bl”cke
         cFeld := Trim( sv->FIELD_NAME )
//***11.4.04         cFeld := IIf( cFeld="&", &(substr( cFeld,2,len(cFeld)-1 )), cFeld )
         y := ::XbpNummer( ::SingleZeile, cFeld )        // ergibt die Nummer aus :setName()
         IF y > 0
//   der CodeBlock-TEIL (in sv->Text) wird an das Objekt gebunden und als &cT ausgefhrt:
//    (mehrere Funktionen hintereinander mssen in sv->TEXT zu einem Array gebunden werden)
            ::SingleZeile[y]:killer := Trim( sv->TEXT )
            ::SingleZeile[y]:killInputFocus := ;
                     {|mp1,mp2,obj,cA| DeHiliteSle( obj ), ;
                     IIf(obj:changed, {oCB:cargo:writeData(), ;
                     cT := obj:killer, &cT, ;
                     oCB:cargo:readData()},)  }  // oCB gibt es in allen Masken!
////                     IIf(obj:changed, { bT := obj:killer, &bT },)  }
//            ::SingleZeile[y]:editable := sv->TAB_STOP       //14.10.2007 19:15
            ::SingleZeile[y]:helpLink := MagicHelpLabel():New(sv->FIELD_DEC)
         ELSE
            y := ::XbpNummer( ::MultiZeile, cFeld )        // ergibt die Nummer aus :setName()
            IF y > 0
   //   der CodeBlock-TEIL (in sv->Text) wird an das Objekt gebunden und als &cT ausgefhrt:
   //    (mehrere Funktionen hintereinander mssen in sv->TEXT zu einem Array gebunden werden)
               ::MultiZeile[y]:killer := Trim( sv->TEXT )
               ::MultiZeile[y]:killInputFocus := ;
                        {|mp1,mp2,obj,cA| DeHiliteSle( obj ), ;
                        IIf(obj:changed, {oCB:cargo:writeData(), ;
                        cT := obj:killer, &cT, ;
                        oCB:cargo:readData()},)  }  // oCB gibt es in allen Masken!
   ////                     IIf(obj:changed, { bT := obj:killer, &bT },)  }
               ::MultiZeile[y]:helpLink := MagicHelpLabel():New(sv->FIELD_DEC)
            ENDIF
         ENDIF
       CASE sv->FIELD_TYPE = "K"  // erzeugt die killInputFocus-Bl”cke im Edit-Browser 18.1.2004
//            IF IsMemberVar( ::BrowseFeld[::BFNr],"aArray")
//               cFeld := Val( sv->FIELD_NAME )
//            ELSE
               cFeld := Trim( sv->FIELD_NAME )
//            ENDIF
//***11.4.04         cFeld := IIf( cFeld="&", &(substr( cFeld,2,len(cFeld)-1 )), cFeld )
         y := ::BrowseSpalte( ::BrowseFeld[1], cFeld )        // ergibt die Nummer aus :setName()
         IF y > 0
//   der CodeBlock (in sv->Text) wird an das Objekt gebunden und als &bT ausgefhrt:
            bT := Trim( sv->TEXT )
            ::BrowseFeld[1]:getcolumn(y):killer := &bT
//// die n„chsten Zeilen werden nicht gebraucht: write() und read() passiert automatisch !
////            ::BrowseFeld[1]:getcolumn(y):killInputFocusSle := ;
////                     {|mp1,mp2,obj,cA| ;
////                     IIf(obj:changed, {oCB:cargo:writeData(), cA := SELECT(), ;
////                     bT := oEdit:BrowseFeld[1]:getcolumn(4):killer, &bT, ;
////                     DbSelectArea( cA ), oCB:cargo:readData()},)  }  // oBEDA gilt nur fr Hauptmaske!
         ENDIF
       CASE sv->FIELD_TYPE = "e"       // erzeugt die editable-Variablen
         cFeld := Trim( sv->FIELD_NAME )
// ! 3.4.04        cFeld := IIf( cFeld="&", &(substr( cFeld,2,len(cFeld)-1 )), cFeld )
         y := ::XbpNummer( ::SingleZeile, cFeld )        // ergibt die Nummer aus :setName()
         IF y > 0
            ::SingleZeile[y]:editable := sv->TAB_STOP
            ::SingleZeile[y]:helpLink := MagicHelpLabel():New(sv->FIELD_DEC)
         ELSE
            y := ::XbpNummer( ::MultiZeile, cFeld )        // ergibt die Nummer aus :setName()
            IF y > 0
               ::MultiZeile[y]:editable := sv->TAB_STOP
               ::MultiZeile[y]:helpLink := MagicHelpLabel():New(sv->FIELD_DEC)
            ENDIF
         ENDIF
//         IF (nA)->(IsFieldVar( cFeld ))   // 26.4.03
//            oParent:childFromName( 1->(FieldPos( cFeld )) ):editable := sv->TAB_STOP
//         ENDIF
//         oParent:childFromName( 1->(FieldPos( cFeld )) ):helpLink := MagicHelpLabel():New(sv->FIELD_DEC)
       CASE sv->FIELD_TYPE = "v"       // Makro: erzeugt Variable, ggf. mit Inhalt
         cFeld := Trim( sv->TEXT )
         cFeld := IIf( cFeld="&", &(substr( cFeld,2,len(cFeld)-1 )), &cFeld )
      ENDCASE
      sv->(DbSkip())
   ENDDO
   sv->(DbCloseArea())
   ::startFocus := IIf( Empty(::startFocus), "5", ::startFocus )
   IF Len(::singleZeile) >= Val(::startFocus) .AND. Val(::startFocus) > 0  // 19.12.2004
      ::oFocLFSle := ::singleZeile[Val(::startFocus)]
   ENDIF
   SELECT &nOldArea
//????
   IIf(!Empty(Alias()),DBRegisterClient(self),) //+09.03.2010 11:25
      IF cSystem == "S" .AND. "MENG"$Upper(AppName())      // 14.2.2005: bei Menge, wenn mit s-t-a gestartet wird 
         QOut("DialogFF-Ende:"+Time())
      ENDIF
//????
RETURN self


//26.10.2007 11:21 zum Aufbau aus String-Array, aufgerufen aus ::CREATE()
// (aufgerufen aus einer FOR...NEXT-Schleife: wird also jeweils nur einmal durchlaufen!)
METHOD DialogFF:CREATEfromARRAY( oParent, oOwner, aPos, ASize, aPP, lVisible, nBz, cFF, nAnf, nEnd, nA, ;
                        nBo, aPosT, aSizeT, aPosF, aSizeF, nZeiF, nZeiT, aCfA, nCfA )  //31.05.2008 19:24
   LOCAL oXbp
   LOCAL aPPSle := { { XBP_PP_FGCLR       , GRA_CLR_BLACK    } , ;
                     { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } }
   LOCAL aPPTxt := {{ XBP_PP_COMPOUNDNAME, IIf(nV>1.5,"12.Arial",IIf(nV>1,"10.Arial","8.Arial")) }}
   LOCAL i, y, cFeld, cPic, nBzStd := nBz, nBENr, oPSX, oBitmapX
   // aCfA und nCfA sind PRIVATEs aus der aufrufenden Methode   
   LOCAL xA_FIELD_NAME := aCfA[nCfA,1]    //C,10,0 
   LOCAL xA_FIELD_TYPE := aCfA[nCfA,2]    //C,1,0
   LOCAL xA_FIELD_LEN  := aCfA[nCfA,3]    //N,5,0
   LOCAL xA_FIELD_DEC  := aCfA[nCfA,4]    //N,4,0
   LOCAL xA_FIELD_POS  := aCfA[nCfA,5]    //N,3,0
   LOCAL xA_SPAF       := aCfA[nCfA,6]    //N,4,0
   LOCAL xA_ZEIF       := aCfA[nCfA,7]    //N,4,0
   LOCAL xA_BRF        := aCfA[nCfA,8]    //N,3,0
   LOCAL xA_HOF        := aCfA[nCfA,9]    //N,3,0
   LOCAL xA_TAB_STOP   := aCfA[nCfA,10]    //L,1,0
   LOCAL xA_ZAHL_FORM  := aCfA[nCfA,11]    //C,15,0
   LOCAL xA_TEXT       := aCfA[nCfA,12]    //C,250,0
   LOCAL xA_SPAT       := aCfA[nCfA,13]    //N,4,0
   LOCAL xA_ZEIT       := aCfA[nCfA,14]    //N,4,0
   LOCAL xA_BRT        := aCfA[nCfA,15]    //N,3,0
   LOCAL xA_HOT        := aCfA[nCfA,16]    //N,3,0

   PRIVATE bT, cT
//**23.03.2008 12:16://///////////////////////////////////
   IF cBfont != NIL
      IIf(Val(cBfont)>5, aPPTxt := {{ XBP_PP_COMPOUNDNAME, Trim(cBfont) }}, ;
                           cBfont := IIf(nV>1.5,"12.Arial",IIf(nV>1,"10.Arial","8.Arial")) ) 
   ENDIF
   DEFAULT aPP TO aPPTxt
//**

// 17.04.2005:
      IF Len(::aBeschreib)>0 .AND. xA_FIELD_TYPE $ "CNDM"    //17.4.2005 fr die "sortiert nach"-ToolTips
         cN := IIf( xA_FIELD_NAME[1]=="&", &(SubStr(xA_FIELD_NAME,2)), xA_FIELD_NAME )
         nN := AScan(::aFelder,Trim(cN))
         IF nN != 0
            ::aBeschreib[nN] := IIf(!Empty(xA_Text),Trim(xA_TEXT),Trim(xA_FIELD_NAME))
         ENDIF
      ENDIF
//
      DO CASE
       CASE xA_FIELD_TYPE $ "AWGawg"    // erzeugt Browse/Edit - Areas
         nBz := IIf( !Empty(xA_HoF), xA_HoF*nV, nBzStd )
         aPosT := {Int(xA_SpaT*nH),Int(xA_ZeiT*nV)} ; aSizeT := {Int(xA_BrT*nH),Int(xA_HoT*nV)}
// DrawingArea bekommt FarbVariablen von einem Dummy-"A" (Gr”áe 0) in der Position 1 der s_*.dbf
         IF ::BENr = 1 .AND. cFarbeBG != "0"
            IF Val(xA_ZAHL_FORM) >= 1000

   // 10.09.2006 13:42 Resourcen aus DLL laden (Muster.dll fr alle Bestatter gleich)
               oPSX := XbpPresSpace():New()   //10.09.2006 13:42
               oPSX:create( ::BEArea[::BENr]:windevice(), ::BEArea[::BENr]:currentsize(), GRA_PU_LOMETRIC )
               oBitmapX    := XbpBitmap():new():create( oPSX )

               ::BEArea[::BENr]:setColorFG( IIf("."$xA_ZAHL_FORM, Val(SubStr(xA_ZAHL_FORM, ;
                                                   At(".",xA_ZAHL_FORM)+1,2)), GRA_CLR_BLACK ))
//               ::BEArea[::BENr]:bitmap := Val( xA_Zahl_Form )
               oBitmapX:load( "MUSTER.DLL", Val( xA_Zahl_Form ) )   //10.09.2006 13:41
               ::BEArea[::BENr]:bitmap := oBitmapX                   //10.09.2006 13:42
               ::BEArea[::BENr]:configure()
            ELSEIF Val(xA_ZAHL_FORM)>0 .AND. Val(xA_ZAHL_FORM)<16  // 31.10.2005 wie weiter unten
               ::BEArea[::BENr]:setColorFG( IIf("."$xA_ZAHL_FORM, ;
                     Val(SubStr(xA_ZAHL_FORM, 1, At(".",xA_ZAHL_FORM)-1)), GRA_CLR_BLACK ))
               ::BEArea[::BENr]:setColorBG( IIf("."$xA_ZAHL_FORM .AND. .NOT. ","$xA_ZAHL_FORM, ;
                     Val(SubStr(xA_ZAHL_FORM, At(".",xA_ZAHL_FORM)+1,2)), ;
                     IIf(","$xA_ZAHL_FORM, GraMakeRGBColor( ;
                     IIf("."$xA_ZAHL_FORM, &("{"+Trim(SubStr(xA_ZAHL_FORM, At(".",xA_ZAHL_FORM)+1))+"}"), ;
                     &("{"+Trim(xA_ZAHL_FORM)+"}") )), ;
                     XBPSYSCLR_DIALOGBACKGROUND ) ))
            ELSE
               ::BEArea[::BENr]:setColorFG( GRA_CLR_BLACK )
               ::BEArea[::BENr]:setColorBG( XBPSYSCLR_DIALOGBACKGROUND )
            ENDIF
         ELSEIF ::BENr = 1
            ::BEArea[::BENr]:setColorFG( GRA_CLR_BLACK )
            ::BEArea[::BENr]:setColorBG( IIf(!Empty(::Menubar), GRA_CLR_DARKGREEN, ;
                                                               XBPSYSCLR_DIALOGBACKGROUND ) )
         ENDIF
//
// "A" macht ein Textfeld und "W" macht ein Fenster ohne Titelzeile
         IF xA_FIELD_TYPE ="A"
            AAdd( ::BEArea, MStatic():new( oParent, oOwner, aPosT, aSizeT, aPPTxt,, ;
                                             XBPSTATIC_TYPE_BITMAP ) )
            ++::BENr
            ::BEArea[::BENr]:CREATE()
            ::BEArea[::BENr]:helpLink := MagicHelpLabel():New(xA_FIELD_DEC)
         ELSEIF xA_FIELD_TYPE ="a" //18.10.2006 16:35 fr Datei-Bitmaps, z.B. Artikelbilder
            nBENr := IIf( xA_BrF<0, ::BENr + xA_BrF + 1, ;
                     IIf( xA_BrF>0, xA_BrF, ::BENr ) )
            cFeld := Trim( xA_FIELD_NAME )
            IF (nA)->(IsFieldVar( cFeld ))   // 18.10.2006 17:03  XbpStatic mit Bitmap aus Feld
               y := (nA)->(FieldPos( cFeld ))         // y : Feld-Position in WorkArea nA
               AAdd( ::BEArea, BitView():new( ::BEArea[nBENr], ::BEArea[nBENr], aPosT, aSizeT, aPPTxt,, ;
                                             XBPSTATIC_TYPE_BITMAP, @(nA)->&cFeld, y, nA ) )
               ++::BENr
               ::BEArea[::BENr]:CREATE( ::BEArea[nBENr], ::BEArea[nBENr], aPosT, aSizeT, aPPTxt,, ;
                                             XBPSTATIC_TYPE_BITMAP, @(nA)->&cFeld )
               ::BEArea[::BENr]:setData()
               ::BEArea[::BENr]:helpLink := MagicHelpLabel():New(xA_FIELD_DEC)
               ::BEArea[::BENr]:setName( y )
               ::BEArea[::BENr]:cargo := Trim( xA_FIELD_NAME )
               ::addEditControl( ::BEArea[::BENr] )
            ELSE
               AAdd( ::BEArea, MStatic():new( ::BEArea[nBENr], ::BEArea[nBENr], aPosT, aSizeT, aPPTxt,, ;
                                             XBPSTATIC_TYPE_BITMAP ) )
               ++::BENr
               ::BEArea[::BENr]:CREATE()
               ::BEArea[::BENr]:helpLink := MagicHelpLabel():New(xA_FIELD_DEC)
            ENDIF
         ELSEIF xA_FIELD_TYPE = "G"    // erzeugt eine Gruppenbox  //*** noch testen !!!!!!!
// s.o.           aPosT := {Int(xA_SpaT*nV),Int(xA_ZeiT*nV)} ; aSizeT := {Int(xA_BrT*nV),Int(xA_HoT*nV)}
            AAdd( ::GruppenBox, MStatic():new( ::BEArea[::BENr], oOwner, aPosT, aSizeT, aPP,, ;
                                       XBPSTATIC_TYPE_GROUPBOX, ;
                                       IIf(SET(43)==0,ConvToAnsiCP(Trim(xA_TEXT)),Trim(xA_TEXT)) ) )   //03.12.2006 15:26
            ++::GBNr
            IIf( nV<=1, ::GruppenBox[::GBNr]:setFontCompoundName( "6.Arial" ), )
            ::GruppenBox[::GBNr]:create()
            ::GruppenBox[::GBNr]:helpLink := MagicHelpLabel():New(xA_FIELD_DEC)
         ELSEIF xA_FIELD_TYPE ="W"    // Fenster direkt auf der DrawingArea
            oXbp := XbpDialog():new( ::BEArea[1], ::BEArea[1], aPosT, aSizeT, aPPTxt,, )
            oXbp:minButton := .F.
            oXbp:maxButton := .F.
            oXbp:sysMenu   := .F.
            oXbp:titleBar  := .F.
            oXbp:border    := xA_FIELD_LEN + 3    // 3 = XBPDLG_THINBORDER, 1 = XBPDLG_NO_BORDER
            oXbp:CREATE()
            AAdd( ::BEArea, oXbp:drawingArea )     // die DrawingArea des Fensters
            ++::BENr
            ::BEArea[::BENr]:cargo := oXbp         // das XbpDialog-Objekt = Fenster
            ::BEArea[::BENr]:helpLink := MagicHelpLabel():New(xA_FIELD_DEC)
            ::BEArea[::BENr]:clipSiblings := .T.
            ::BEArea[::BENr]:setColorBG( XBPSYSCLR_TRANSPARENT )  // damit Farbe durchscheint
         ELSEIF xA_FIELD_TYPE ="w"   // Fenster auf einem bereits eingegebenen Fenster
            nBENr := IIf( xA_BrF<0, ::BENr + xA_BrF + 1, ;
                     IIf( xA_BrF>0, xA_BrF, ::BENr ) )
            oXbp := XbpDialog():new( ::BEArea[nBENr], ::BEArea[nBENr], aPosT, aSizeT, aPPTxt,, )
            oXbp:minButton := .F.
            oXbp:maxButton := .F.
            oXbp:sysMenu   := .F.
            oXbp:titleBar  := .F.
            oXbp:border    := xA_FIELD_LEN + 3    // 3 = XBPDLG_THINBORDER, 1 = XBPDLG_NO_BORDER
            oXbp:CREATE()
            AAdd( ::BEArea, oXbp:drawingArea )     // die DrawingArea des Fensters
            ++::BENr
            ::BEArea[::BENr]:cargo := oXbp         // das Xbp_Dialog-Objekt = Fenster
            ::BEArea[::BENr]:helpLink := MagicHelpLabel():New(xA_FIELD_DEC)
            ::BEArea[::BENr]:clipSiblings := .T.
            ::BEArea[::BENr]:setColorBG( XBPSYSCLR_TRANSPARENT )  // damit Farbe durchscheint
         ELSEIF  xA_FIELD_TYPE = "g"    // kleines "g" - erzeugt eine TabPage auf oDlg:drawingArea
            nBENr := IIf( xA_BrF<0, ::BENr + xA_BrF + 1, ;
                     IIf( xA_BrF>0, xA_BrF, ::BENr ) )
            aPosT := {Int(xA_SpaT*nH),Int(xA_ZeiT*nV)} ; aSizeT := {Int(xA_BrT*nH),Int(xA_HoT*nV)}
            AAdd( ::BEArea, XbpTabPage():new( ::BEArea[nBENr], ::BEArea[nBENr], aPosT, aSizeT, aPPTxt, lVisible ) )
            ::BEArea[++::BENr]:caption   := IIf(SET(43)==0,ConvToAnsiCP(xA_FIELD_NAME),xA_FIELD_NAME)  //03.12.2006 15:27
            ::BEArea[::BENr]:clipSiblings  := .T.
            ::BEArea[::BENr]:tabStop  := .T.
            ::BEArea[::BENr]:preOffset  := xA_SpaF
            ::BEArea[::BENr]:postOffset := xA_ZeiF
//#define XBPTABPAGE_TAB_BOTTOM              2
//#define XBPTABPAGE_TAB_TOP                 4
            ::BEArea[::BENr]:TYPE := IIf(xA_HoF=2,2,4)  //22.04.2007 19:05
            ::BEArea[::BENr]:create()
            ::BEArea[::BENr]:helpLink := MagicHelpLabel():New(xA_FIELD_DEC)
            ::BEArea[::BENr]:minimized := xA_TAB_STOP
            IIf(xA_TAB_STOP,::BEArea[::BENr]:minimize(), ;
                              {::BEArea[::BENr]:maximize(),::thistab:=::BEArea[::BENr]} ) //11.11.2006 19:10
            ::BEArea[::BENr]:TabActivate := &(xA_TEXT)     // CodeBlock
            ::BEArea[::BENr]:cargo   := Trim(xA_FIELD_NAME)
         ENDIF
         IF cFarbeBG != "0"
            IF ::BEArea[::BENr]:isDerivedfrom( "BitView" )
               // Farbe ist schon als Grafik eingestellt !
            ELSEIF Val(xA_ZAHL_FORM) >= 1000 .AND. IsMemberVar( ::BEArea[::BENr], "bitmap" )
   // 10.09.2006 13:42 Resourcen aus DLL laden (Muster.dll fr alle Bestatter gleich)
               oPSX := XbpPresSpace():New()   //10.09.2006 13:42
               oPSX:create( ::BEArea[::BENr]:windevice(), ::BEArea[::BENr]:currentsize(), GRA_PU_LOMETRIC )
               oBitmapX    := XbpBitmap():new():create( oPSX )

               // Umschaltung der Mandantenfarben  09.09.2006 14:03 :
               IF "," $ xA_ZAHL_FORM .AND. (cDatver = cNetver2 .OR. IIf( IsMemVar("cDru"), ;
                                 Upper(cDru) = Trim(xA_TEXT), .F. )) //04.02.2007 09:54
                  cZF2 := SubStr( xA_ZAHL_FORM, At( ",", xA_ZAHL_FORM)+1 )
                  ::BEArea[::BENr]:setColorFG( IIf("."$cZF2, Val(SubStr( cZF2, ;
                                                      At(".",cZF2)+1,2)), GRA_CLR_BLACK ))
                  oBitmapX:load( "MUSTER.DLL", Val( cZF2 ) )
                  ::BEArea[::BENr]:bitmap := oBitmapX
                  ::BEArea[::BENr]:configure()
               ELSE
                  ::BEArea[::BENr]:setColorFG( IIf("."$xA_ZAHL_FORM, Val(SubStr(xA_ZAHL_FORM, ;
                                                      At(".",xA_ZAHL_FORM)+1,2)), GRA_CLR_BLACK ))
                  oBitmapX:load( "MUSTER.DLL", Val( xA_Zahl_Form ) )   //10.09.2006 13:41
                  ::BEArea[::BENr]:bitmap := oBitmapX                   //10.09.2006 13:42
                  ::BEArea[::BENr]:configure()
               ENDIF
            ELSEIF Val(xA_ZAHL_FORM)>0 .AND. Val(xA_ZAHL_FORM)<16 .OR. ","$xA_ZAHL_FORM
               ::BEArea[::BENr]:setColorFG( IIf("."$xA_ZAHL_FORM, ;
                     Val(SubStr(xA_ZAHL_FORM, 1, At(".",xA_ZAHL_FORM)-1)), GRA_CLR_BLACK ))
               ::BEArea[::BENr]:setColorBG( IIf("."$xA_ZAHL_FORM .AND. .NOT. ","$xA_ZAHL_FORM, ;
                     Val(SubStr(xA_ZAHL_FORM, At(".",xA_ZAHL_FORM)+1,2)), ;
                     IIf(","$xA_ZAHL_FORM, GraMakeRGBColor( ;
                     IIf("."$xA_ZAHL_FORM, &("{"+Trim(SubStr(xA_ZAHL_FORM, At(".",xA_ZAHL_FORM)+1))+"}"), ;
                     &("{"+Trim(xA_ZAHL_FORM)+"}") )), ;
                     XBPSYSCLR_DIALOGBACKGROUND ) ))
            ELSE
               ::BEArea[::BENr]:setColorFG( GRA_CLR_BLACK )
               ::BEArea[::BENr]:setColorBG( XBPSYSCLR_DIALOGBACKGROUND )
            ENDIF
         ELSE
            ::BEArea[::BENr]:setColorFG( GRA_CLR_BLACK )
            ::BEArea[::BENr]:setColorBG( XBPSYSCLR_DIALOGBACKGROUND )
         ENDIF
         IF ((".BMP"$Upper( xA_TEXT ) .OR. ".JPG"$Upper( xA_TEXT ) .AND. ::Fancy != "0") .OR. ;
               (nA)->(IsFieldVar(Trim(xA_FIELD_NAME))))    // 26.02.2006 fr Artikelbilder
            ::BEArea[::BENr]:cargo := BitView():new( ::BEArea[::BENr] )
            IF !Empty(xA_text)
               ::BEArea[::BENr]:cargo:load( Trim(::Fancy) + Trim(xA_TEXT) )
               ::BEArea[::BENr]:paint := {|x,y,obj| x:=obj:currentSize(), ;
                                          ::BEArea[::BENr]:cargo:DISPLAY( {0,0,x[1],x[2]} ) }
               ::BEArea[::BENr]:cargo:CREATE()
            ELSEIF (nA)->(IsFieldVar(Trim(xA_FIELD_NAME))) .AND. xA_FIELD_TYPE != "a"// fr Artikelbilder
               cFeld := Trim( xA_FIELD_NAME )
               y := (nA)->(FieldPos( cFeld ))         // y : Feld-Position in WorkArea nA
               ::BEArea[::BENr]:cargo:datalink := {|x| IIf( PCOUNT()==0,(nA)->&cFeld,(nA)->&cFeld:=x ) }
               ::BEArea[::BENr]:cargo:CREATE():setdata()
               ::BEArea[::BENr]:cargo:setname( y )
               ::addEditControl( ::BEArea[::BENr]:cargo )
            ENDIF
         ENDIF
***********************************************
       CASE xA_FIELD_TYPE = "m"    // kleines "m" - erzeugt eine MenuBar
//         ::MenuBar := IIf(::BENr>2,::BEArea[::BENr]:setParent():menubar(),::BEArea[1]:cargo:menuBar())
         ::MenuBar := ::BEArea[1]:cargo:menuBar()
       CASE xA_FIELD_TYPE = "t"    // kleines "t" - erzeugt MenuTitel
         IF xA_FIELD_DEC <>0       // 06.11.2006 17:47 erzeugt ein Kontextmen
            nTZNr := IIf( xA_FIELD_DEC<0, ::TZNr + xA_FIELD_DEC + 1, ;
                     IIf( xA_FIELD_DEC>0, xA_FIELD_DEC, ::TZNr ) )
            AAdd( ::SubMenu, XbpMenu():new(::TextZeile[nTZNr]):CREATE() )
            ++::SMNr
            ::SubMenu[::SMNr]:title := IIf(SET(43)==0,ConvToAnsiCP(Trim(xA_TEXT)),Trim(xA_TEXT))
            ::SubMenu[::SMNr]:cargo := IIf(SET(43)==0,ConvToAnsiCP(Trim(xA_TEXT)),Trim(xA_TEXT))
            IF xA_TAB_STOP = .T.
               ::TextZeile[nTZNr]:RBDown := { |mp1, mp2, obj| ;
                  oEdit:XbpObjekt(oEdit:SubMenu,obj:caption):PopUp( obj, mp1, 2 , ; 
                  XBPMENU_PU_DEFAULT + XBPMENU_PU_MOUSE_RBDOWN  ) } 
            ELSE
               ::TextZeile[nTZNr]:LBDown := { |mp1, mp2, obj| ;
                  oEdit:XbpObjekt(oEdit:SubMenu,obj:caption):PopUp( obj, mp1, 2 , ; 
                  XBPMENU_PU_DEFAULT + XBPMENU_PU_MOUSE_LBDOWN  ) }
            ENDIF
         ELSE                       // erzeugt ein Untermen in einer MenuBar
            AAdd( ::SubMenu, XbpMenu():new(::MenuBar):CREATE() )
            ++::SMNr
            ::SubMenu[::SMNr]:title := IIf(SET(43)==0,ConvToAnsiCP(Trim(xA_TEXT)),Trim(xA_TEXT))
            ::MenuBar:addItem( {::SubMenu[::SMNr],NIL} )
         ENDIF
       CASE xA_FIELD_TYPE = "u"    // kleines "u" - erzeugt MenuEintr„ge
         cU := IIf(SET(43)==0,ConvToAnsiCP(Trim(xA_Text)),Trim(xA_Text))
         ::SubMenu[::SMNr]:addItem( &cU )
       CASE xA_FIELD_TYPE = "B"    // erzeugt den Browser-Rahmen
// ACHTUNG:18.10.2006 11:31 *nV eingefgt bei aPosT[2] !!!
         aPosT := {Int(xA_SpaT*nH),Int(xA_ZeiT*nV)} ; aSizeT := {Int(xA_BrT*nH),Int(xA_HoT*nV)}
         AAdd( ::BrowseFeld, MBrowse():new( ::BEArea[::BENr], oOwner, aPosT, aSizeT, aPP,, nA ) )
         ++::BFNr
         ::BrowseFeld[::BFNr]:caption := IIf(SET(43)==0,ConvToAnsiCP(Trim(xA_Text)),Trim(xA_Text))
         ::BrowseFeld[::BFNr]:hScroll := .T.
         ::BrowseFeld[::BFNr]:CREATE()
         ::BrowseFeld[::BFNr]:softTrack := .F.
       CASE xA_FIELD_TYPE = "S"    // erzeugt die Browse-Spalte
            cFeld := Trim( xA_FIELD_NAME )
            cFeld := IIf( cFeld="&", &(substr( cFeld,2,len(cFeld)-1 )), cFeld )
            y := (nA)->(FieldPos( cFeld ))         // y : Feld-Position in best.dbf
            ::BrowseFeld[::BFNr]:addColumns( ::BrowseFeld[::BFNr],, y, xA_FIELD_LEN, ;
                                 IIf(SET(43)==0,ConvToAnsiCP(Trim(xA_Text)),Trim(xA_Text)), nA, aPP ) //23.03.2008 18:21
            IF Abs(xA_FIELD_DEC)>1
               ::BrowseFeld[::BFNr]:getColumn(::BrowseFeld[::BFNr]:colcount):colorBlock := {|x| IIf( x < 0, {GRA_CLR_RED,}, ) }
            ENDIF
            IF xA_FIELD_DEC<0
               ::BrowseFeld[::BFNr]:show()
            ENDIF
            ::BrowseFeld[::BFNr]:cargo := " "
            ::BrowseFeld[::BFNr]:getColumn(::BrowseFeld[::BFNr]:colcount):helpLink := MagicHelpLabel():New(xA_FIELD_DEC)
       CASE xA_FIELD_TYPE = "s"    // erzeugt die Browse-Spalte zum Editieren
            cFeld := Trim( xA_FIELD_NAME )
            cFeld := IIf( cFeld="&", &(substr( cFeld,2,len(cFeld)-1 )), cFeld )
            y := (nA)->(FieldPos( cFeld ))         // y : Feld-Position in best.dbf
            cT := xA_text  //20.09.2007 11:36  // ConvCP findet bei MStatic() statt 03.12.2006 16:37
            cT := IIf( cT="&",&(SubStr(cT,2)),cT)  //20.09.2007 11:36
            IF (nA)->(IsFieldVar( cFeld ))
               ::BrowseFeld[::BFNr]:addGetColumns( ::BrowseFeld[::BFNr],, @(nA)->&cFeld, xA_FIELD_LEN, ;
                                 IIf(SET(43)==0,ConvToAnsiCP(Trim(cT)),Trim(cT)), nA, aPP ) //23.03.2008 18:03
            ELSEIF IsMemVar( cFeld )
               ::BrowseFeld[::BFNr]:addGetColumns( ::BrowseFeld[::BFNr],, @&cFeld, ;
                                                      xA_FIELD_LEN, Trim(cT), nA, aPP )   //23.03.2008 18:03
            ENDIF
            IF Abs(xA_FIELD_DEC)>1
               ::BrowseFeld[::BFNr]:getColumn(::BrowseFeld[::BFNr]:colcount):colorBlock := {|x| IIf( x < 0, {GRA_CLR_RED,}, ) }
            ENDIF
            IF xA_FIELD_DEC<0
               ::BrowseFeld[::BFNr]:show()
            ENDIF
            ::BrowseFeld[::BFNr]:getColumn(::BrowseFeld[::BFNr]:colcount):editable := !xA_TAB_STOP //20.06.2007 12:51
            ::BrowseFeld[::BFNr]:cargo := " "
            ::BrowseFeld[::BFNr]:getColumn(::BrowseFeld[::BFNr]:colcount):helpLink := MagicHelpLabel():New(xA_FIELD_DEC)
       CASE xA_FIELD_TYPE = "T"    // erzeugt eine Textzeile
         nBENr := IIf( xA_BrF<0 .AND. Abs(xA_BrF)<Len(::BEArea), ;
                                       ::BENr + xA_BrF + 1, ;
                  IIf( xA_BrF>0 .AND. Abs(xA_BrF)<Len(::BEArea), ;
                                       xA_BrF, ::BENr ) )    //26.11.2006 10:43
         nBo := ::BEArea[nBENr]:currentSize()[2] - IIf(!Empty(::Menubar),(xA_HoT+2),35)*nV
         nZeiT := IIf( xA_ZeiT < 1, nZeiT+nBz*xA_ZeiT, nBo+nBz-nBz*xA_ZeiT )
         aPosT := {Int(xA_SpaT*nH), nZeiT} ; aSizeT := {Int(xA_BrT*nH),Int(xA_HoT*nV)}
         cT := IIf(IsMemberVar(self,Trim(xA_FIELD_NAME)),xA_FIELD_NAME,xA_text)  //13.12.2007 21:55  // ConvCP findet bei MStatic() statt 03.12.2006 16:37
         cT := IIf( cT="&",&(SubStr(cT,2)),cT)  //
         AAdd( ::TextZeile, MStatic():new( ::BEArea[nBENr], oOwner, aPosT, aSizeT, aPPTxt,, ;
                                             XBPSTATIC_TYPE_TEXT, Trim(cT) ) )   // 31.10.2006 12:18
         ++::TZNr
         IIf( nV<=1, ::TextZeile[::TZNr]:setFontCompoundName( "8.Arial" ), )
         IF xA_TAB_STOP==.T. .AND. xA_HoF<0  //11.11.2006 17:18
            ::TextZeile[::TZNr]:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_CENTER
         ELSEIF xA_TAB_STOP==.T.
            ::TextZeile[::TZNr]:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_LEFT
         ENDIF
         ::TextZeile[::TZNr]:create()
         ::TextZeile[::TZNr]:helpLink := MagicHelpLabel():New( xA_FIELD_DEC ) //26.11.2006 10:37
         ::TextZeile[::TZNr]:cargo := Trim(xA_FIELD_NAME)
          IF Val(xA_ZAHL_FORM)>0 .AND. Val(xA_ZAHL_FORM)<16 .OR. ","$xA_ZAHL_FORM
               ::TextZeile[::TZNr]:setColorFG( IIf("."$xA_ZAHL_FORM, ;
                     Val(SubStr(xA_ZAHL_FORM, 1, At(".",xA_ZAHL_FORM)-1)), GRA_CLR_BLACK ))
               ::TextZeile[::TZNr]:setColorBG( IIf("."$xA_ZAHL_FORM .AND. .NOT. ","$xA_ZAHL_FORM, ;
                     Val(SubStr(xA_ZAHL_FORM, At(".",xA_ZAHL_FORM)+1,2)), ;
                     IIf(","$xA_ZAHL_FORM, GraMakeRGBColor( ;
                     IIf("."$xA_ZAHL_FORM, &("{"+Trim(SubStr(xA_ZAHL_FORM, At(".",xA_ZAHL_FORM)+1))+"}"), ;
                     &("{"+Trim(xA_ZAHL_FORM)+"}") )), ;
                     XBPSYSCLR_DIALOGBACKGROUND ) ))
          ENDIF
       CASE xA_FIELD_TYPE = "P"    // erzeugt die PushButtons
         nBo := ::BEArea[::BENr]:currentSize()[2] - IIf(!Empty(::Menubar),(HoT+2),35)*nV
         nZeiT := IIf( xA_ZeiT < 1, nZeiT+nBz*xA_ZeiT, nBo+nBz-nBz*xA_ZeiT )
         aPosT := {Int(xA_SpaT*nH), nZeiT } ; aSizeT := {Int(xA_BrT*nH),Int(xA_HoT*nV)}
         AAdd( ::DruckKnopf, MPButton():new( ::BEArea[::BENr], oOwner, aPosT, aSizeT,,,Trim(xA_TEXT), ;
                            IIf(SET(43)==0,ConvToAnsiCP(Trim(xA_FIELD_NAME)),Trim(xA_FIELD_NAME)), ;
                                             @aData1, nFontR, nA, xA_TAB_STOP ) )  //03.12.2006 16:44
         ++::DKNr
         ::DruckKnopf[::DKNr]:CREATE()
         ::DruckKnopf[::DKNr]:helpLink := MagicHelpLabel():New(xA_FIELD_DEC)
         ::DruckKnopf[::DKNr]:cargo := Trim( xA_FIELD_NAME )
       CASE xA_FIELD_TYPE = "p"    // erzeugt die PushButtons mit eigenem Window
         nBo := ::BEArea[1]:cargo:currentSize()[2]-60// - IIf(!Empty(::Menubar),(HoT+2),25)*nV
//         nZeiT := IIf( xA_ZeiT < 1, nZeiT+nBz*xA_ZeiT, nBo+nBz-nBz*xA_ZeiT )
         aPosT := {Int(xA_SpaT*nH), nBo } ; aSizeT := {Int(xA_BrT*nH),Int(xA_HoT*nV)}
            oXbpD := XbpDialog():new( ::BEArea[1], ::BEArea[1]:cargo, aPosT, aSizeT, aPPTxt,, )
            oXbpD:minButton := .F.
            oXbpD:maxButton := .F.
            oXbpD:sysMenu   := .F.
            oXbpD:titleBar  := .F.
            oXbpD:border    := xA_FIELD_LEN + 3    // 3 = XBPDLG_THINBORDER, 1 = XBPDLG_NO_BORDER
            oXbpD:CREATE()
         AAdd( ::DruckKnopf, MPButton():new( oXbpD:drawingArea, oOwner, {0,0}, aSizeT,,,Trim(xA_TEXT), ;
                            IIf(SET(43)==0,ConvToAnsiCP(Trim(xA_FIELD_NAME)),Trim(xA_FIELD_NAME)), ;
                                             @aData1, nFontR, nA, xA_TAB_STOP ) )  //03.12.2006 16:44
         ++::DKNr
         ::DruckKnopf[::DKNr]:CREATE()
         ::DruckKnopf[::DKNr]:helpLink := MagicHelpLabel():New(xA_FIELD_DEC)
         ::DruckKnopf[::DKNr]:cargo := Trim( xA_FIELD_NAME )
       CASE xA_FIELD_TYPE = "X"    // erzeugt die ListBox-Objekte   // 10.3.2004
         nBo := ::BEArea[::BENr]:currentSize()[2] - IIf(!Empty(::Menubar),(HoT+2),35)*nV
         nZeiF := IIf( xA_ZeiF < 1, nZeiF+nBz*xA_ZeiF, nBo+nBz-nBz*xA_ZeiF )
//         nZeiT := IIf( xA_ZeiT < 1, nZeiT+nBz*xA_ZeiT, nBo+nBz-nBz*xA_ZeiT )
         aPosF := {Int(xA_SpaF*nH), nZeiF} ; aSizeF := {Int(xA_BrF*nH),Int(xA_HoF*nV)}
//         aPosT := {Int(xA_SpaT*nV), nZeiT} ; aSizeT := {Int(xA_BrT*nV),Int(xA_HoT*nV)}
         AAdd( ::ListBox, XbpListBox():new( ::BEArea[::BENr], oOwner, aPosF, aSizeF, aPPSle ))
         ++::LBNr
         ::ListBox[::LBNr]:tabstop := xA_TAB_STOP    //24.10.2007 09:30
         ::ListBox[::LBNr]:create()
         ::ListBox[::LBNr]:helpLink := MagicHelpLabel():New(xA_FIELD_DEC)
         IF !Empty( xA_FIELD_LEN )    // 20.08.2006 15:52
            ::ListBox[::LBNr]:setItemsHeight( xA_FIELD_LEN * nV * 1.02 )
         ENDIF
         ::ListBox[::LBNr]:cargo := Trim( xA_FIELD_NAME )
       CASE xA_FIELD_TYPE = "M"    // erzeugt die Mle-Objekte
         nBo := ::BEArea[::BENr]:currentSize()[2] - IIf(!Empty(::Menubar),(HoT+2),35)*nV
         nZeiF := IIf( xA_ZeiF < 1, nZeiF+nBz*xA_ZeiF, nBo+nBz-nBz*xA_ZeiF )
         nZeiT := IIf( xA_ZeiT < 1, nZeiT+nBz*xA_ZeiT, nBo+nBz-nBz*xA_ZeiT )
         aPosF := {Int(xA_SpaF*nH), nZeiF} ; aSizeF := {Int(xA_BrF*nH),Int(xA_HoF*nV)}
         aPosT := {Int(xA_SpaT*nH), nZeiT} ; aSizeT := {Int(xA_BrT*nH),Int(xA_HoT*nV)}
         cFeld := Trim( xA_FIELD_NAME )
         cPic := IIf( xA_FIELD_TYPE != "C", Trim(xA_ZAHL_FORM), NIL )
         IF (nA)->(IsFieldVar( cFeld ))   // 26.4.03
            y := (nA)->(FieldPos( cFeld ))         // y : Feld-Position in best.dbf/vv.dbf ...
            AAdd( ::MultiZeile, MMleXR():new( ::BEArea[::BENr], oOwner, aPosF, aSizeF, aPPSle,, ;
                                                @(nA)->&cFeld, xA_FIELD_LEN, xA_TAB_STOP, cPic, ;
                                                Trim(xA_TEXT), aPosT, aSizeT, aPPTxt, nA ) )
            ++::MZNr
            ::MultiZeile[::MZNr]:cargo := Trim( xA_FIELD_NAME )
            ::MultiZeile[::MZNr]:CREATE()   //1.1.2005###################:setData()
            ::MultiZeile[::MZNr]:helpLink := MagicHelpLabel():New(xA_FIELD_DEC)
            ::MultiZeile[::MZNr]:setName( y )
            ::addEditControl( ::MultiZeile[::MZNr] )
         ELSEIF IsMemberVar( self, IIf("["$cFeld,SubStr(cFeld,1,At("[",cFeld)-1), cFeld ) ) ;  //19.08.2006 21:09
                     .OR. ":"$cFeld    //18.11.2007 22:20
            cF := IIf( "oEdit:"$cFeld, cFeld, "oEdit:"+cFeld )
            AAdd( ::MultiZeile, MMleXR():new( ::BEArea[::BENr], oOwner, aPosF, aSizeF, aPPSle,, ;
                                                @&cf, xA_FIELD_LEN, xA_TAB_STOP, cPic, ;
                                                Trim(xA_TEXT), aPosT, aSizeT, aPPTxt, nA ) )
            ++::MZNr
            ::MultiZeile[::MZNr]:cargo := Trim( xA_FIELD_NAME )
            ::MultiZeile[::MZNr]:CREATE()   //1.1.2005###################:setData()
            ::MultiZeile[::MZNr]:helpLink := MagicHelpLabel():New(xA_FIELD_DEC)
            ::MultiZeile[::MZNr]:setName( ++::aFNr )    // oberhalb der y-Werte
            ::addEditControl( ::MultiZeile[::MZNr] )
         ELSEIF IsMemVar( cFeld )
            AAdd( ::MultiZeile, MMleXR():new( ::BEArea[::BENr], oOwner, aPosF, aSizeF, aPPSle,, ;
                                                @&cFeld, xA_FIELD_LEN, xA_TAB_STOP, cPic, ;
                                                Trim(xA_TEXT), aPosT, aSizeT, aPPTxt, nA ) )
            ++::MZNr
            ::MultiZeile[::MZNr]:cargo := Trim( xA_FIELD_NAME )
            ::MultiZeile[::MZNr]:CREATE()   //1.1.2005###################:setData()
            ::MultiZeile[::MZNr]:helpLink := MagicHelpLabel():New(xA_FIELD_DEC)
            ::MultiZeile[::MZNr]:setName( ++::aFNr )    // oberhalb der y-Werte
            ::addEditControl( ::MultiZeile[::MZNr] )
         ENDIF
       CASE xA_FIELD_TYPE = "C" .OR. xA_FIELD_TYPE = "N" .OR. xA_FIELD_TYPE = "D" ;
                               .OR. xA_FIELD_TYPE = "L" // erzeugt Sle mit MGETXR
         nBo := ::BEArea[::BENr]:currentSize()[2] - IIf(!Empty(::Menubar),(HoT+2),35)*nV
         nZeiF := IIf( xA_ZeiF < 1, nZeiF+nBz*xA_ZeiF, nBo+nBz-nBz*xA_ZeiF )
         nZeiT := IIf( xA_ZeiT < 1, nZeiT+nBz*xA_ZeiT, nBo+nBz-nBz*xA_ZeiT )
         aPosF := {Int(xA_SpaF*nH), nZeiF} ; aSizeF := {Int(xA_BrF*nH),Int(xA_HoF*nV)}
         aPosT := {Int(xA_SpaT*nH), nZeiT} ; aSizeT := {Int(xA_BrT*nH),Int(xA_HoT*nV)}
         cFeld := Trim( xA_FIELD_NAME )
         cFeld := IIf( cFeld="&", &(substr( cFeld,2,len(cFeld)-1 )), cFeld )
         cPic := IIf( xA_FIELD_TYPE != "C", Trim(xA_ZAHL_FORM), NIL )
         IF (nA)->(IsFieldVar( cFeld ))   // 26.4.03
            cF := cFeld
            y := (nA)->(FieldPos( cFeld ))         // y : Feld-Position in WorkArea nA
            AAdd( ::SingleZeile, MGetXR():new( ::BEArea[::BENr], oOwner, aPosF, aSizeF, aPPSle,, ;
                                                @(nA)->&cFeld, xA_FIELD_LEN, xA_TAB_STOP, cPic, ;
                                                Trim(xA_TEXT), aPosT, aSizeT, aPPTxt, nA ) )
            ++::SZNr
            ::SingleZeile[::SZNr]:CREATE()   //1.1.2005###################:setdata()
            ::SingleZeile[::SZNr]:helpLink := MagicHelpLabel():New(xA_FIELD_DEC)
            ::SingleZeile[::SZNr]:setName( y )
            ::SingleZeile[::SZNr]:cargo := Trim( xA_FIELD_NAME )
            ::addEditControl( ::SingleZeile[::SZNr] )
            ::StartFocus := IIf( xA_ZAHL_FORM[1]="F", xA_ZAHL_FORM[2], ::StartFocus )
         ELSEIF IsMemberVar( self, IIf("["$cFeld,SubStr(cFeld,1,At("[",cFeld)-1), cFeld ) ) ;  //19.08.2006 21:09
                     .OR. ":"$cFeld    //18.11.2007 22:20
            cF := IIf( "oEdit:"$cFeld, cFeld, "oEdit:"+cFeld )
            IF ValType( &cF ) == "C"       //24.08.2006 19:06 bestimmt die L„nge des EingabePuffers
               &cF := PadR( &cF, xA_FIELD_LEN )
            ENDIF
            AAdd( ::SingleZeile, MGetXR():new( ::BEArea[::BENr], oOwner, aPosF, aSizeF, aPPSle,, ;
                                                @&cf, xA_FIELD_LEN, xA_TAB_STOP, cPic, ;
                                                Trim(xA_TEXT), aPosT, aSizeT, aPPTxt, nA ) )
            ++::SZNr
            ::SingleZeile[::SZNr]:CREATE()   //1.1.2005###################:setdata()
            ::SingleZeile[::SZNr]:helpLink := MagicHelpLabel():New(xA_FIELD_DEC)
            ::SingleZeile[::SZNr]:setName( ++::aFNr )    // oberhalb der y-Werte
            ::SingleZeile[::SZNr]:cargo := Trim( xA_FIELD_NAME )
            ::addEditControl( ::SingleZeile[::SZNr] )
            ::StartFocus := IIf( xA_ZAHL_FORM!="".AND.xA_ZAHL_FORM[1]="F", xA_ZAHL_FORM[2], ::StartFocus )
         ELSEIF IsMemVar( cFeld )
            cF := cFeld
            IF ValType( &cFeld ) == "C"      //24.08.2006 19:06
               &cFeld := PadR( &cFeld, xA_FIELD_LEN )
            ENDIF
            AAdd( ::SingleZeile, MGetXR():new( ::BEArea[::BENr], oOwner, aPosF, aSizeF, aPPSle,, ;
                                                @&cFeld, xA_FIELD_LEN, xA_TAB_STOP, cPic, ;
                                                Trim(xA_TEXT), aPosT, aSizeT, aPPTxt, nA ) )
            ++::SZNr
            ::SingleZeile[::SZNr]:unreadable := IIf( xA_ZAHL_FORM="****", .T., .F. )  //06.04.2007 22:38
            ::SingleZeile[::SZNr]:CREATE()   //1.1.2005###################:setdata()
            ::SingleZeile[::SZNr]:helpLink := MagicHelpLabel():New(xA_FIELD_DEC)
            ::SingleZeile[::SZNr]:setName( ++::aFNr )    // oberhalb der y-Werte
            ::SingleZeile[::SZNr]:cargo := Trim( xA_FIELD_NAME )
            ::addEditControl( ::SingleZeile[::SZNr] )
            ::StartFocus := IIf( xA_ZAHL_FORM[1]="F", xA_ZAHL_FORM[2], ::StartFocus )
         ENDIF
         IF ValType( &cF ) == "D"       //04.01.2008 16:58 erm”glicht ClickDate()
            ::SingleZeile[::SZNr]:lbDblClick := ;
                     {| MP1, uNIL, o| clickdate(CtoD(o:editbuffer()),oEdit:BEArea[1]:cargo,@o)}
         ENDIF
// die Variablen mit kleinem c,n,d,l sind nur fr XbpSle-Anzeige-Felder gedacht:
       CASE xA_FIELD_TYPE = "c" .OR. xA_FIELD_TYPE = "n" .OR. xA_FIELD_TYPE = "d" ;
                               .OR. xA_FIELD_TYPE = "l" // erzeugt Sle
         nBo := ::BEArea[::BENr]:currentSize()[2] - IIf(!Empty(::Menubar),(HoT+2),35)*nV
         nZeiF := IIf( xA_ZeiF < 1, nZeiF+nBz*xA_ZeiF, nBo+nBz-nBz*xA_ZeiF )
         nZeiT := IIf( xA_ZeiT < 1, nZeiT+nBz*xA_ZeiT, nBo+nBz-nBz*xA_ZeiT )
         aPosF := {Int(xA_SpaF*nH), nZeiF} ; aSizeF := {Int(xA_BrF*nH),Int(xA_HoF*nV)}
         aPosT := {Int(xA_SpaT*nH), nZeiT} ; aSizeT := {Int(xA_BrT*nH),Int(xA_HoT*nV)}
         cFeld := Trim( xA_FIELD_NAME )
         cFeld := IIf( cFeld="&", &(substr( cFeld,2,len(cFeld)-1 )), cFeld )
         cPic := IIf( xA_FIELD_TYPE != "c".OR.xA_ZAHL_FORM[1]="@", Trim(xA_ZAHL_FORM), NIL )
         IF (nA)->(IsFieldVar( cFeld ))   // 26.4.03
            y := (nA)->(FieldPos( cFeld ))         // y : Feld-Position in WorkArea nA
            AAdd( ::SingleZeile, MGet():new( ::BEArea[::BENr], oOwner, aPosF, aSizeF, aPPSle,, ;
                                                @(nA)->&cFeld, xA_FIELD_LEN, xA_TAB_STOP, cPic, ;
                                                Trim(xA_TEXT), aPosT, aSizeT, aPPTxt, nA ) )
            ++::SZNr
            ::SingleZeile[::SZNr]:CREATE()   //1.1.2005###################:setdata()
            ::SingleZeile[::SZNr]:helpLink := MagicHelpLabel():New(xA_FIELD_DEC)
            ::SingleZeile[::SZNr]:setName( y )
            ::SingleZeile[::SZNr]:cargo := Trim( xA_FIELD_NAME )
            ::addEditControl( ::SingleZeile[::SZNr] )
            ::StartFocus := IIf( xA_ZAHL_FORM[1]="F", xA_ZAHL_FORM[2], ::StartFocus )
         ELSEIF IsMemberVar( self, cFeld )
            selfeld := cFeld
            AAdd( ::SingleZeile, MGet():new( ::BEArea[::BENr], oOwner, aPosF, aSizeF, aPPSle,, ;
                                                @oEdit:&cfeld, xA_FIELD_LEN, xA_TAB_STOP, cPic, ;
                                                Trim(xA_TEXT), aPosT, aSizeT, aPPTxt, nA ) )
            ++::SZNr
            ::SingleZeile[::SZNr]:CREATE()   //1.1.2005###################:setdata()
            ::SingleZeile[::SZNr]:helpLink := MagicHelpLabel():New(xA_FIELD_DEC)
            ::SingleZeile[::SZNr]:setName( ++::aFNr )    // oberhalb der y-Werte
            ::SingleZeile[::SZNr]:cargo := Trim( xA_FIELD_NAME )
            ::addEditControl( ::SingleZeile[::SZNr] )
            ::StartFocus := IIf( xA_ZAHL_FORM[1]="F", xA_ZAHL_FORM[2], ::StartFocus )
         ELSEIF IsMemVar( cFeld )
            AAdd( ::SingleZeile, MGet():new( ::BEArea[::BENr], oOwner, aPosF, aSizeF, aPPSle,, ;
                                                @&cFeld, xA_FIELD_LEN, xA_TAB_STOP, cPic, ;
                                                Trim(xA_TEXT), aPosT, aSizeT, aPPTxt, nA ) )
            ++::SZNr
            ::SingleZeile[::SZNr]:CREATE()   //1.1.2005###################:setdata()
            ::SingleZeile[::SZNr]:helpLink := MagicHelpLabel():New(xA_FIELD_DEC)
            ::SingleZeile[::SZNr]:setName( ++::aFNr )    // oberhalb der y-Werte
            ::SingleZeile[::SZNr]:cargo := Trim( xA_FIELD_NAME )
            ::addEditControl( ::SingleZeile[::SZNr] )
            ::StartFocus := IIf( xA_ZAHL_FORM[1]="F", xA_ZAHL_FORM[2], ::StartFocus )
         ENDIF
       CASE xA_FIELD_TYPE = "o"       // fr XbpCheckBox
         nBo := ::BEArea[::BENr]:currentSize()[2] - IIf(!Empty(::Menubar),(HoT+2),35)*nV
         nZeiF := IIf( xA_ZeiF < 1, nZeiF+nBz*xA_ZeiF, nBo+nBz-nBz*xA_ZeiF )
         nZeiT := IIf( xA_ZeiT < 1, nZeiT+nBz*xA_ZeiT, nBo+nBz-nBz*xA_ZeiT )
         aPosF := {Int(xA_SpaF*nH), nZeiF} ; aSizeF := {Int(xA_BrF*nH),Int(xA_HoF*nV)}
         aPosT := {Int(xA_SpaT*nH), nZeiT} ; aSizeT := {Int(xA_BrT*nH),Int(xA_HoT*nV)}
         cFeld := Trim( xA_FIELD_NAME )
         cFeld := IIf( cFeld="&", &(substr( cFeld,2,len(cFeld)-1 )), cFeld )
         cPic := IIf( xA_FIELD_TYPE != "c", Trim(xA_ZAHL_FORM), NIL )
         IF (nA)->(IsFieldVar( cFeld ))   // 26.4.03
            y := (nA)->(FieldPos( cFeld ))         // y : Feld-Position in WorkArea nA
            AAdd( ::LogikKnopf, MCheck():new( ::BEArea[::BENr], oOwner, aPosF, aSizeF, aPPSle,, ;
                                             y, xA_FIELD_LEN, xA_TAB_STOP,;
                                             Trim(xA_TEXT), aPosT, aSizeT, aPPTxt, nA ) )
            ++::LKNr
            ::LogikKnopf[::LKNr]:CREATE()
//            ::LogikKnopf[::LKNr]:helpLink := MagicHelpLabel():New(xA_FIELD_DEC)
            ::LogikKnopf[::LKNr]:setName( y )
            ::LogikKnopf[::LKNr]:cargo := Trim( xA_FIELD_NAME )
            ::addEditControl( ::LogikKnopf[::LKNr] )
         ELSEIF IsMemberVar( self, cFeld )
            AAdd( ::LogikKnopf, XbpCheckBox():new( ::BEArea[::BENr], oOwner, aPosF, aSizeF, aPPSle) )
            ++::LKNr
            ::LogikKnopf[::LKNr]:dataLink := {|x| IIf( PCOUNT()==0, ;
                        oEdit:&cFeld, oEdit:&cFeld := x ) }
            ::LogikKnopf[::LKNr]:caption := xA_Text
            ::LogikKnopf[::LKNr]:CREATE()
//            ::LogikKnopf[::LKNr]:helpLink := MagicHelpLabel():New(xA_FIELD_DEC)
            ::LogikKnopf[::LKNr]:setName( ++::aFNr )
            ::LogikKnopf[::LKNr]:cargo := Trim( xA_FIELD_NAME )
            ::addEditControl( ::LogikKnopf[::LKNr] )
         ELSEIF IsMemVar( cFeld )
            AAdd( ::LogikKnopf, XbpCheckBox():new( ::BEArea[::BENr], oOwner, aPosF, aSizeF, aPPSle) )
            ++::LKNr
            ::LogikKnopf[::LKNr]:dataLink := {|x| IIf( PCOUNT()==0, ;
                        &cFeld, &cFeld := x ) }
            ::LogikKnopf[::LKNr]:caption := xA_Text
            ::LogikKnopf[::LKNr]:CREATE()
//            ::LogikKnopf[::LKNr]:helpLink := MagicHelpLabel():New(xA_FIELD_DEC)
            ::LogikKnopf[::LKNr]:setName( ++::aFNr )
            ::LogikKnopf[::LKNr]:cargo := Trim( xA_FIELD_NAME )
            ::addEditControl( ::LogikKnopf[::LKNr] )
         ENDIF
       CASE xA_FIELD_TYPE = "i"       // fr XbpSpinButton
         nBo := ::BEArea[::BENr]:currentSize()[2] - IIf(!Empty(::Menubar),(HoT+2),35)*nV
         nZeiF := IIf( xA_ZeiF < 1, nZeiF+nBz*xA_ZeiF, nBo+nBz-nBz*xA_ZeiF )
         nZeiT := IIf( xA_ZeiT < 1, nZeiT+nBz*xA_ZeiT, nBo+nBz-nBz*xA_ZeiT )
         aPosF := {Int(xA_SpaF*nH), nZeiF} ; aSizeF := {Int(xA_BrF*nH),Int(xA_HoF*nV)}
         aPosT := {Int(xA_SpaT*nH), nZeiT} ; aSizeT := {Int(xA_BrT*nH),Int(xA_HoT*nV)}
         cFeld := Trim( xA_FIELD_NAME )
         cFeld := IIf( cFeld="&", &(substr( cFeld,2,len(cFeld)-1 )), cFeld )
         AAdd( ::TextZeile, MStatic():new( ::BEArea[::BENr], oOwner, aPosT, aSizeT, aPPTxt,, ;
                                             XBPSTATIC_TYPE_TEXT, Trim(xA_TEXT) ) )
         ++::TZNr
         IIf( nV<=1, ::TextZeile[::TZNr]:setFontCompoundName( "8.Arial" ), )
         ::TextZeile[::TZNr]:create()
         ::TextZeile[::TZNr]:helpLink := MagicHelpLabel():New(xA_FIELD_DEC)
         AAdd( ::SpinKnopf, XbpSpinButton():new( ::BEArea[::BENr], oOwner, aPosF, aSizeF, aPPSle) )
         ++::SKNr
         ::SpinKnopf[::SKNr]:datalink := {|x| IIf( PCOUNT()==0, ;
                        &(cFeld), &(cFeld) := x ) }
         ::SpinKnopf[::SKNr]:CREATE()     //:setData(&cFeld)
         ::SpinKnopf[::SKNr]:setNumLimits( Val(SubStr(xA_zahl_form,1,At(",",xA_zahl_form)-1)), ;
                                          Val(SubStr(xA_zahl_form,At(",",xA_zahl_form)+1)))
         ::SpinKnopf[::SKNr]:cargo := Trim( xA_FIELD_NAME )
         ::SpinKnopf[::SKNr]:setName( ++::aFNr )
         ::addEditControl( ::SpinKnopf[::SKNr] )
       CASE xA_FIELD_TYPE = "k"       // erzeugt die killInputFocus-Bl”cke
         cFeld := Trim( xA_FIELD_NAME )
         y := ::XbpNummer( ::SingleZeile, cFeld )        // ergibt die Nummer aus :setName()
         IF y > 0
//   der CodeBlock-TEIL (in xA_Text) wird an das Objekt gebunden und als &cT ausgefhrt:
//    (mehrere Funktionen hintereinander mssen in xA_TEXT zu einem Array gebunden werden)
            ::SingleZeile[y]:killer := Trim( xA_TEXT )
            ::SingleZeile[y]:killInputFocus := ;
                     {|mp1,mp2,obj,cA| DeHiliteSle( obj ), ;
                     IIf(obj:changed, {oCB:cargo:writeData(), ;
                     cT := obj:killer, &cT, ;
                     oCB:cargo:readData()},)  }  // oCB gibt es in allen Masken!
            ::SingleZeile[y]:helpLink := MagicHelpLabel():New(xA_FIELD_DEC)
         ELSE
            y := ::XbpNummer( ::MultiZeile, cFeld )        // ergibt die Nummer aus :setName()
            IF y > 0
   //   der CodeBlock-TEIL (in xA_Text) wird an das Objekt gebunden und als &cT ausgefhrt:
   //    (mehrere Funktionen hintereinander mssen in xA_TEXT zu einem Array gebunden werden)
               ::MultiZeile[y]:killer := Trim( xA_TEXT )
               ::MultiZeile[y]:killInputFocus := ;
                        {|mp1,mp2,obj,cA| DeHiliteSle( obj ), ;
                        IIf(obj:changed, {oCB:cargo:writeData(), ;
                        cT := obj:killer, &cT, ;
                        oCB:cargo:readData()},)  }  // oCB gibt es in allen Masken!
               ::MultiZeile[y]:helpLink := MagicHelpLabel():New(xA_FIELD_DEC)
            ENDIF
         ENDIF
       CASE xA_FIELD_TYPE = "K"  // erzeugt die killInputFocus-Bl”cke im Edit-Browser 18.1.2004
         cFeld := Trim( xA_FIELD_NAME )
         y := ::BrowseSpalte( ::BrowseFeld[1], cFeld )        // ergibt die Nummer aus :setName()
         IF y > 0
//   der CodeBlock (in xA_Text) wird an das Objekt gebunden und als &bT ausgefhrt:
            bT := Trim( xA_TEXT )
            ::BrowseFeld[1]:getcolumn(y):killer := &bT
//// die n„chsten Zeilen werden nicht gebraucht: write() und read() passiert automatisch !
////            ::BrowseFeld[1]:getcolumn(y):killInputFocusSle := ;
////                     {|mp1,mp2,obj,cA| ;
////                     IIf(obj:changed, {oCB:cargo:writeData(), cA := SELECT(), ;
////                     bT := oEdit:BrowseFeld[1]:getcolumn(4):killer, &bT, ;
////                     DbSelectArea( cA ), oCB:cargo:readData()},)  }  // oBEDA gilt nur fr Hauptmaske!
         ENDIF
       CASE xA_FIELD_TYPE = "e"       // erzeugt die editable-Variablen
         cFeld := Trim( xA_FIELD_NAME )
         y := ::XbpNummer( ::SingleZeile, cFeld )        // ergibt die Nummer aus :setName()
         IF y > 0
            ::SingleZeile[y]:editable := xA_TAB_STOP
            ::SingleZeile[y]:helpLink := MagicHelpLabel():New(xA_FIELD_DEC)
         ENDIF
       CASE xA_FIELD_TYPE = "v"       // Makro: erzeugt Variable, ggf. mit Inhalt
         cFeld := Trim( xA_TEXT )
         cFeld := IIf( cFeld="&", &(substr( cFeld,2,len(cFeld)-1 )), &cFeld )
      ENDCASE
   ::startFocus := IIf( Empty(::startFocus), "5", ::startFocus )
   IF Len(::singleZeile) >= Val(::startFocus) .AND. Val(::startFocus) > 0  // 19.12.2004
      ::oFocLFSle := ::singleZeile[Val(::startFocus)]
   ENDIF
   IF Alias() != ""           //01.06.2008 11:57
      DBRegisterClient(self)
   ENDIF
RETURN self

METHOD DialogFF:destroy( nA )
//??????   (nA)->(DbDeregisterClient())
   ::killTip()                // 04.08.2004
   ASize( ::BEArea, 0 )
   ::BENr := 0
   ASize( ::BrowseFeld, 0 )
   ::BFNr := 0
//   ASize( ::BVariable, 0 )
//   ::BVNr := 0
   ASize( ::GruppenBox, 0 )
   ::GBNr := 0
   ASize( ::TextZeile, 0 )
   ::TZNr := 0
   ASize( ::DruckKnopf, 0 )
   ::DKNr := 0
   ASize( ::MultiZeile, 0 )
   ::MZNr := 0
   ASize( ::SingleZeile, 0 )
   ::SZNr := 0
   ASize( ::editControls, 0 )
   ASize( ::appendControls, 0 )
   ASize( ::keyControls, 0 )
   ::keyboardBlock   := {|nKey,x,obj| 0 }
RETURN self

METHOD DialogFF:addEditcontrol( oXbp )
   IF AScan( ::editControls, oXbp ) == 0
      AAdd(  ::editControls, oXbp )
      ::addKeyControl( oXbp )
   ENDIF
RETURN self

METHOD DialogFF:addAppendControl( oXbp )
   IF AScan( ::appendControls, oXbp ) == 0
      AAdd(  ::appendControls, oXbp )
      ::addKeyControl( oXbp )
   ENDIF
RETURN self

METHOD DialogFF:addKeyControl( oXbp )
   IF AScan( ::keyControls, oXbp ) == 0
      AAdd(  ::keyControls, oXbp )
      oXbp:keyBoard := ::keyboardBlock
   ENDIF
RETURN self

//METHOD DialogFF:notify( nEvent, mp1, mp2 )
//      ::AKDialog():notify( nEvent, mp1, mp2 )
//RETURN self

/*28.06.2008 18:10 liest den aktuellen Datensatz in die ::aData0 ... ::aDataD ein   */
METHOD DialogFF:SatzLesen(nData,aStruktur)
   DEFAULT aStruktur TO ::aStructure
   PRIVATE cDataArray := {"aData0","aData1","aData2","aData3","aDataD"}[nData+1]
RETURN AEval( aStruktur, {|a,i,c| c:=a[1], self:&(cDataArray)[i] := &c  } )

/*28.06.2008 18:10 schreibt den aktuellen Datensatz mit der ::aData0 ... ::aDataD   */
METHOD DialogFF:SatzSchreiben(nData, aStruktur)
   DEFAULT aStruktur TO ::aStructure
   PRIVATE cDataArray := {"aData0","aData1","aData2","aData3","aDataD"}[nData+1]
   Satzsp(::oDrawArea)
   AEval( aStruktur, {|a,i,c| c:=a[1], (self:VArea)->&c := self:&(cDataArray)[i] } )
   (::VArea)->(DbCommit())
RETURN DbRUnlock()

METHOD DialogFF:XbpNummer( aObj, cVarName )     // ergibt die Nummer aus :setName()
   LOCAL y := 0
   DEFAULT aObj TO ::singleZeile    //03.06.2007 17:37
   AEval( aObj, {|x,i| y := IIf( Upper(x:cargo)==Upper(cVarName), i, y ) } )
RETURN y

//+03.08.2008 11:22 jetzt auch fr Ww-Objekte, deren :cargo ein Fenster mit Title ist
METHOD DialogFF:XbpObjekt( aObj, cVarName, lUL )     // ergibt das Object
   LOCAL o := NIL
   DEFAULT aObj TO ::singleZeile    //03.06.2007 17:37
   DEFAULT lUL TO .T.   //03.03.2008 14:14 damit man gleichnamige Felder verschieden angehen kann
   IF lUL      // 03.03.2008 14:15 wenn es egal ist, ob groá oder klein geschrieben (NOTIZ==notiz)
      AEval( aObj, {|x,i| o := IIf( ValType(x:cargo)="C" .AND. Upper(x:cargo)==Upper(cVarName), x, ;
                      IIf( ValType(x:cargo)="O" .AND. IsMemberVar(x:cargo,"title") .AND. ;
                      Upper(x:cargo:title)==Upper(cVarName), x, o )) } )
   ELSE
      AEval( aObj, {|x,i| o := IIf( ValType(x:cargo)="C" .AND. x:cargo==cVarName, x, ;
                                 IIf( ValType(x:cargo)="O" .AND. x:cargo:title==cVarName, x, o )) } )
   ENDIF
RETURN o

METHOD DialogFF:XbpObjektSet( aObj, cVarName, cVal )     // setData in alle Objects mit cVarName
   LOCAL o := NIL, xVal
   DEFAULT aObj TO ::singleZeile    //03.06.2007 17:37
   AEval( aObj, {|x,i| IIf( ValType(x:cargo)="C" .AND. Upper(x:cargo)==Upper(cVarName), ;
                       xVal:=IIf(cVal=NIL,x:setData(),x:setData(cVal)), ) } )  //05.11.2006 13:30 mehrere Sles fr eine Variable
RETURN xVal

METHOD DialogFF:XbpObjektGet( aObj, cVarName )     // getData aus allen Objects mit cVarName
   LOCAL o := NIL
   DEFAULT aObj TO ::singleZeile    //03.06.2007 17:37
   PRIVATE xVar
   AEval( aObj, {|x,i| IIf( ValType(x:cargo)="C" .AND. Upper(x:cargo)==Upper(cVarName), ;
                              xVar := x:getData(), ) } )  //05.11.2006 13:30 mehrere Sles fr eine Variable
RETURN xVar

METHOD DialogFF:BrowseSpalte( oBrow, cVarName )     // ergibt die Spalte des Sle im Browser
   LOCAL y := 0
   FOR y := 1 TO oBrow:colCount
      IF oBrow:getcolumn(y):cargo == cVarName
         RETURN y
      ENDIF
   NEXT
RETURN 0

/*07.07.2008 17:02 berarbeitet, in aFeld stehen Vorbelegungen, z.B. {"anummer", "123456"} */
//+16.08.2008 10:26 wenn in aFeld etwas steht, dann muss das Erste der kontrollierende Index sein
METHOD DialogFF:Neu( aFeld, nA )
   LOCAL aScope
   DEFAULT nA TO ::VArea      //+14.08.2008 09:43
   IF ValType(aFeld) == "A" .AND. ValType(aFeld[1]) == "A"
      IF (nA)->(IsFieldVar(aFeld[1,1])) .AND. (nA)->(DbScope())
         aScope := (nA)->(DbScope(SCOPE_BOTH))
         (nA)->(DbClearScope())
      ENDIF
      //+ SPEZIELL NUR fr SCRAPX:
      //+18.09.2012 16:06 cleart benutzer-Feld des aktuellen Datensatzes:
         /* damit ein Benutzer den Auftrag automatisch wieder entsperrt: */
         IF (nA)->(IsFieldVar("benutzer")) .AND. (nA)->benutzer == cBK .AND. oBest:lUser	//wenn es Dein Anlieferer ist
            Satzsp(oCB)
            oBest:XbpObjektSet(,"BENUTZER",(nA)->benutzer := "  ")
            DbRUnlock()
            DbCommit()     //+20.08.2012 19:36  vorsichtshalber
            oBest:lUser := .F.                     //+20.08.2012 14:25
         ENDIF
      (nA)->(DbAppend())
      AEval( aFeld, {|f,i| v := f[1], (nA)->&v := f[2] } )  /* Feldvariablen fllen */
      IF ValType(aScope) == "A"
         (nA)->(DbSetScope(SCOPE_TOP,aScope[1]))
         (nA)->(DbSetScope(SCOPE_BOTTOM,aScope[1]))
         (nA)->(DbGobottom())          //+ 25.08.2008 21:40 weil dieser Satz der neueste ist
      ENDIF
   ELSEIF aFeld == NIL
      (nA)->(DbAppend())
   ENDIF
   (nA)->(DbSkip(0))
RETURN self

/*07.07.2008 16:55 berarbeitet, entfernt Datens„tze in der ::VArea (der WorkArea des Moduls)  */
METHOD DialogFF:Entf( )
   IF AlertBox( , "<JA> = Datensatz soll gel”scht werden;"        + ;
              ";", ;
              { "JA" , "_NEIN" }  , ;
              XBPSTATIC_SYSICON_ICONWARNING    , ;
              "Datensatz l”schen?" ) = 1
//   IF ConfirmBox( ::oDrawArea, "Soll der Datensatz gel”scht werden?", ;
//                        "Datensatz l”schen", ;
//                        XBPMB_YESNO, ;
//                        XBPMB_QUESTION ) == XBPMB_RET_YES
      (::VArea)->(Satzsp( ::oDrawArea ))
      (::VArea)->(DbDelete())
      (::VArea)->(DbSkip(-1))              // 21.6.2005 zum Test ->07.07.2008 16:57 bestanden: ok
      RETURN self
   ENDIF
RETURN self

// vor Aufruf von ::Such in die nA-Area wechseln! :
METHOD DialogFF:Such( oDlg1, cProg, nAnf, nEnd, nA, nRec, aPos, ASize, aPP, cTitel, cS )  //16.04.2006 12:56
   LOCAL oDlg, nEvent, mp1, mp2, oBrowse           //, cArtLei := Trim(" ")
   LOCAL nOldArea := Select(), oFocus := SetAppFocus(), oFoc
   LOCAL lFlucht := .F.    // 3.2.2005
   LOCAL cSuchWort := IIf(Empty(cS), "", "" )
   /*
                           IIf((OrdKey()="ADRSCHL + TXNAME + DtoS(DATUM)" .OR. ;
                                OrdKey()="N1 + TXNAME + ADRSCHL").AND. RecNo()>1,cS, ;
                           IIf(cS[1]="!",PadR(cS,10),"")))   // 16.04.2006 21:20          */
   PRIVATE oCB
   DEFAULT aPos TO {10*nH,30*nV} , ASize TO {int(330*nH),int(250*nV)}
   DEFAULT cTitel TO "Suchwort tippen/ausw„hlen <ENTER> (<ESC> = zurck) :"
///*14.04.2008 20:01*/
//      aPos[1] += oDlg1:cargo:currentpos()[1]
//      aPos[2] := oDlg1:cargo:currentpos()[2]
///**/
   //+23.09.2012 14:27 damit die Werte aus s_.tak gelten bleiben:
   IF Empty(aPos) .AND. Empty(ASize)
//+20.06.2009 17:51++++++++++++++++++++++++++++++++++++++++++++++++
      aPos := {oDlg1:currentPos()[1],oDlg1:currentPos()[2]+30} //+ ganz links unten in der Parent-Tab:
      ASize := {oDlg1:currentsize()[1],oDlg1:currentsize()[2] - ;
                  IIf( oDlg1:isderivedfrom("XbpTabPage"), oDlg1:tabheight, 28 ) }  //08.07.2008 18:19
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
   ENDIF
   oDlg := AKDialog():new( AppDesktop(), oDlg1:cargo )
   oDlg:tasklist := .T.
   oDlg:title := cTitel
   oDlg:maxButton := .F.
   oDlg:border := XBPDLG_RAISEDBORDERTHIN_FIXED
   oDlg:create(,, aPos, ASize )

   oDlg:drawingArea:setColorBG( GRA_CLR_DARKCYAN )
   oCB := oDlg:drawingArea
   oCB:cargo := oDlg

// jetzt folgt die Erzeugung der Eingabefelder
   oBrowse := DialogFF():new( oCB,oDlg, , ,,, nBz, cProg, nAnf, nEnd, nA )
   oBrowse:Fancy := ""
   oBrowse:VArea := nA
   oBrowse:BEArea := {}
   AAdd( oBrowse:BEArea, oCB )
   oBrowse:BENr := Len( oBrowse:BEArea )
   oBrowse:CREATE( oCB,oDlg, , ,aPP,, nBz, cProg, nAnf, nEnd, nA )
// bis hierhin geht die Erzeugung der Eingabefelder
   AEval( oBrowse:editControls, {|x| oDlg:addEditControl( x ) } ) // 28.02.2006

   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 == xbeBRW_ItemSelected
            PostAppEvent( xbeP_Close,,, oDlg )
      ENDIF
      IF nEvent == xbeP_Keyboard
      DO CASE
         CASE mp1 >= Asc(" ") .and. mp1 <= Asc("z") .AND. "tippen"$cTitel   // 29.04.2007 15:41
            cSuchWort += Chr(mp1)
            DbSeek( Upper(cSuchWort), .T. )
            IF !Found()
               DbSkip(-1)
            ENDIF
            oBrowse:BrowseFeld[1]:refreshAll()
         CASE mp1 == xbeK_RETURN .or. mp1 == xbeK_F10 .OR. mp1 == xbeK_TAB //02.09.2006 17:30
            PostAppEvent( xbeP_Close,,, oDlg )
         CASE mp1 == xbeK_ESC
            lFlucht := .T.
            PostAppEvent( xbeP_Close,,, oDlg )
         CASE mp1 == xbeK_CTRL_DEL .AND. nAnf != 930  //+23.09.2012 18:22 nicht bei Neuanlage alte Anlieferer l”schen!
            oFoc := SetAppFocus()
            IF ConfirmBox( oDlg1, "Soll der Datensatz wirklich gel”scht werden?", ;
                                 "Datensatz l”schen!", ;
                                 XBPMB_YESNO, ;
                                 XBPMB_QUESTION, ;
                                 XBPMB_DEFBUTTON2 ) == XBPMB_RET_YES
               Satzsp( oCB )
               (nA)->(DbDelete())
               IF !(nA)->(Bof())
                  (nA)->(DbSkip(-1))              // 21.6.2005 zum Test
               ENDIF
               nRec := RecNo()
               oBrowse:BrowseFeld[1]:refreshAll()
            ENDIF
            SetAppFocus(oFoc)
      ENDCASE
      ENDIF
      oXbp:handleEvent( nEvent, mp1, mp2 )
   ENDDO
   oDlg:setModalState( XBP_DISP_MODELESS )
   oDlg:destroy()    ///
   IF lFlucht = .T.
      (nA)->(DbGoto(nRec))
   ENDIF
   (nA)->(DbSkip(0))
   SetAppFocus( oFocus )
RETURN lFlucht

// wurde bis heute (06.04.2007 15:00) nirgends verwendet!
// wird jetzt fr die Passwort-Eingabe bei cAc aktiviert
// vor Aufruf von ::Eingabe in die nA-Area wechseln! :
METHOD DialogFF:Eingabe( oDlg1, cProg, nAnf, nEnd, cDatei, nA, nRec, aPos, ASize, aPP, cTitel )   //06.04.2007 13:43
   LOCAL oDlg, nEvent, mp1, mp2
   LOCAL nOldArea := Select(), oFocus := SetAppFocus()
   LOCAL lFlucht := .F.
   DEFAULT cTitel TO "Codewort tippen <ENTER> (<ESC> = zurck) :"   //06.04.2007 13:43
   PRIVATE oCB, oEdit    // fr alle F„lle
   DEFAULT aPos TO {230*nH,32*nV} , ASize TO {int(197*nH),int(150*nV)}

// Arbeitsbereich ausw„hlen, wenn noch nicht passiert und wenn n”tig:
   IF nA > 0 .AND. nA != SELECT()
      SELECT (nA)
   ENDIF
// Datei ”ffnen, wenn noch nicht passiert und wenn n”tig:
   IF !Empty(cDatei)
      DbUseArea( , , cDatei )
   ENDIF
// Satzzeiger positionieren, wenn noch nicht passiert und wenn n”tig:
   IF !Empty(nRec)
      DbGoto(nRec)
   ENDIF
   
   oDlg := AKDialog():new( AppDesktop(), oDlg1:cargo )
   oDlg:tasklist := .T.
   oDlg:title := cTitel
   oDlg:maxButton := .F.
   oDlg:border := XBPDLG_RAISEDBORDERTHIN_FIXED
   oDlg:create(,, aPos, ASize )

   oDlg:drawingArea:setColorBG( GRA_CLR_DARKCYAN )
   oCB := oDlg:drawingArea
   oCB:cargo := oDlg

//   (nA)->(DbSuspendNotifications())
// jetzt folgt die Erzeugung der Eingabefelder
   oEdit := DialogFF():new( oCB,oDlg, , ,,, nBz, cProg, nAnf, nEnd, nA )
   oEdit:Fancy := ""
   oEdit:VArea := nA
   oEdit:BEArea := {}
   AAdd( oEdit:BEArea, oCB )        // weil direkt mit DialogFF gearbeitet wird!
   oEdit:BENr := Len( oEdit:BEArea )
   oEdit:CREATE( oCB,oDlg, , ,aPP,, nBz, cProg, nAnf, nEnd, nA )
// bis hierhin geht die Erzeugung der Eingabefelder

   oDlg:setModalState( XBP_DISP_APPMODAL )

   oCtrl := XbpGetController():new( oDlg )
   oCtrl:create()
//   oCtrl:LastXbp := oBest:XbpObjekt( oBest:singleZeile,"name") --- irgendwie verwendbar??
   oCtrl:READ( , .F. )

   nEvent := xbeP_None
   DO WHILE nEvent <> xbeP_Close
      nEvent := AppEvent( @mp1, @mp2, @oXbp )
      IF nEvent == xbeP_Keyboard
         DO CASE
            CASE mp1 == xbeK_ESC
               lFlucht := .T.
               PostAppEvent( xbeP_Close,,,oDlg)
         ENDCASE
      ENDIF
      oXbp:handleEvent( nEvent, mp1, mp2 )
   ENDDO
   oDlg:setModalState( XBP_DISP_MODELESS )
   oDlg:destroy()
   IF lFlucht = .T.  // wenn <ESC> gedrckt wurde
// Satzzeiger zurck-positionieren, wenn noch nicht passiert und wenn n”tig:
      IF !Empty(nRec)
         DbGoto(nRec)
      ENDIF
   ENDIF
// Datei schlieáen, wenn noch nicht passiert und wenn n”tig:
   IF !Empty(cDatei)
      DbCloseArea()
   ENDIF
// Arbeitsbereich zurckstellen, wenn noch nicht passiert und wenn n”tig:
   IF nOldArea > 0
      SELECT (nOldArea)
   ENDIF
   SetAppFocus( oFocus )
RETURN lFlucht

METHOD DialogFF:Erlaubnis( oDlg1, oXbp, cAltWert, nZugang )    //27.12.2007 11:03
   LOCAL cFeld
   DEFAULT nZugang TO 3
   IF !Empty(oXbp)   //02.09.2007 09:49 Erlaubnis auf Feldebene
      cFeld := ::aBeschreib[AScan(::aFelder, Upper( ;
         IIf(oXbp:cargo[1]="&",&(SubStr(Trim(oXbp:cargo),2)),Trim(oXbp:cargo))))]
      IF Val(cRS) < nZugang      //27.12.2007 11:03
         ConfirmBox( oDlg1, "Sie haben dazu NICHT die Berechtigung!", ;
                           IIf(SET(43)==0,ConvToAnsiCP("Inhalt des Felds "+cFeld+" „ndern?"), ;
                           "Inhalt des Feldes "+cFeld+" „ndern?"), ;
                           XBPMB_OK, ;
                           XBPMB_WARNING )
            IF cAltWert!=NIL .AND. IsMemberVar(oXbp,"value")
               oXbp:setData( cAltWert )
               oXbp:getData( )
            ENDIF
         RETURN .F.
      ELSE
         IF oEdit:Codewort( oDlg1, "s_best", 840, 859, cDatver+"param", 9, , ;
                  {300*nH,200*nV}, {300*nH,300*nV}, , "Mit Codewort best„tigen:" ) ;
                  < Str(nZugang,1,0)         //27.12.2007 11:03
            IF cAltWert!=NIL .AND. IsMemberVar(oXbp,"value")
               oXbp:setData( cAltWert )
               oXbp:getData( )
               oXbp:vorigerwert := cAltWert
            ENDIF
            ConfirmBox( oDlg1, "Sie haben dazu NICHT die Berechtigung!", ;
                           IIf(SET(43)==0,ConvToAnsiCP("Inhalt des Felds "+cFeld+" „ndern?"), ;
                           "Inhalt des Feldes "+cFeld+" „ndern?"), ;
                           XBPMB_OK, ;
                           XBPMB_WARNING )
            RETURN .F.
         ENDIF
      ENDIF
   ELSE           //02.09.2007 09:49 Erlaubnis auf Satzebene
      IF Val(cRS) < nZugang      //27.12.2007 11:06
         ConfirmBox( oDlg1, "Sie haben dazu NICHT die Berechtigung!", ;
                           IIf(SET(43)==0,ConvToAnsiCP("Inhalt dieses Datensatzes „ndern?"), ;
                           "Inhalt dieses Datensatzes „ndern?"), ;
                           XBPMB_OK, ;
                           XBPMB_WARNING )
         RETURN .F.
      ELSE
         IF oEdit:Codewort( oDlg1, "s_best", 840, 859, cDatver+"param", 9, , ;
                  {300*nH,200*nV}, {300*nH,300*nV}, , "Mit Codewort best„tigen:" ) ;
                  < Str(nZugang,1,0)         //27.12.2007 11:03
            RETURN .F.
         ELSEIF oBest == oEdit      //03.04.2008 18:33
            AEval( oEdit:singlezeile, {|a,i| a:editable := .T. } )
         ENDIF
      ENDIF
   ENDIF
RETURN .T.

// CodeWort „ndern darf jeder k”nnen
// Benutzernummer und RechteStufe darf nur der Admin „ndern k”nnen, also wenn cRS=="9" ist
METHOD DialogFF:CodeWort( oDlg1, cProg, nAnf, nEnd, cDatei, nA, nRec, aPos, ASize, aPP, cTitel )
   LOCAL lFlucht := .F.
   PRIVATE cCodeAlt := ""           // gelten nur innerhalb ::CodeWort+::BenutzerAendern+BenutzerSuche
   PRIVATE cBenutzer := IIf("nutzer"$cTitel,cBK,"")  // Public, wird beim Einloggen generiert
   PRIVATE cBenutzNr := IIf("nutzer"$cTitel,cBNr,"") // Public, wird beim Einloggen generiert
   PRIVATE cRechtStuf := IIf("nutzer"$cTitel,cRS,"") // Public, wird beim Einloggen generiert
   PRIVATE cCodeNeu1 := ""
   PRIVATE cCodeNeu2 := ""
   nEnd := IIf(cRS="9",Max(819,nEnd-10),nEnd)   // Admin darf alle Felder editieren
   lFlucht := ::Eingabe( oDlg1, cProg, nAnf, nEnd, cDatei, nA, nRec, aPos, ASize, aPP, cTitel )
   
RETURN IIf("SuperweiseR"$cCodeAlt,"9",IIf(lFlucht,"-",cRechtStuf))

METHOD DialogFF:BenutzerAendern()
   IF cCodeNeu1!=" " .AND. cCodeNeu1 == cCodeNeu2
      param->(Satzsp(oCB))
      param->&("PW"+cBenutzNr) := VerKey(cCodeNeu1)    // VerKey() ist in EuroV.prg
      param->&("BK"+cBenutzNr) := PadR(cBenutzer,2)    // BenutzerKurzname         
      IF cRS = "9"     // wenn der Admin das macht
         param->&("RS"+cBenutzNr) := PadR(cRechtStuf,1) // Rechtestufe (kann nur der Admin „ndern)
      ENDIF
      param->(DbRUnlock())
   ELSE
      IF cRS = "9"     // wenn der Admin das macht 17.11.2007 21:54
         param->(Satzsp(oCB))
         param->&("BK"+cBenutzNr) := PadR(cBenutzer,2)    // BenutzerKurzname         
         param->&("RS"+cBenutzNr) := PadR(cRechtStuf,1) // Rechtestufe (kann nur der Admin „ndern)
         param->(DbRUnlock())
         RETURN .T.  // Žndern vom Admin gelungen //17.11.2007 21:54
      ENDIF
      RETURN .F.     // Žndern misslungen
   ENDIF
RETURN .T.           // Žndern gelungen

METHOD DialogFF:BenutzerSuche(cBNum) //14.10.2007 18:16  
   cBenutzNr := "-"
   cRechtStuf := "-"                                  // EntKey() ist in EuroV.prg
   IF Empty(cBNum)
      FOR n := 0 TO 9                                    // 10 m”gliche Passw”rter/User 
         cPW := EntKey( param->&("PW"+Str(n,1)) )      // Passwort in Datei lesen
         IF AllTrim(cPW) == AllTrim(cCodeAlt)            // ist PW in der Eingabe enthalten?
            cRechtStuf := param->&("RS"+Str(n,1))      // Rechtestufe aus Datei lesen
            cBenutzer := param->&("BK"+Str(n,1))       // BenutzerKurzname        
            cBenutzNr := Str(n,1)                        // BenutzerNr
            EXIT                                         // gefunden!
         ENDIF
      NEXT
   ELSE        //14.10.2007 18:20
      cRechtStuf := param->&("RS"+cBNum)      // Rechtestufe aus Datei lesen
      cBenutzer := param->&("BK"+cBNum)       // BenutzerKurzname        
      cBenutzNr := cBNum                            // BenutzerNr
   ENDIF
   ::XbpObjektSet(::SingleZeile,"cRechtStuf",cRechtStuf)
   ::XbpObjektSet(::SingleZeile,"cBenutzNr",cBenutzNr)
   ::XbpObjektSet(::SingleZeile,"cBenutzer",cBenutzer)
   IF Val(cBenutzNr) = 0 .OR. (Val(cBenutzNr)!=Val(cBNr).AND. cRS!="9")  //29.04.2007 13:46 keine Žnderungen durch Gast
      SetAppFocus(::XbpObjekt(::SingleZeile,"cCodeAlt"))
   ENDIF
RETURN cRechtStuf

//* 10.07.2008 11:54
// nOrientierung = 1 (Portrait) oder = 2 (Landscape):
METHOD DialogFF:ABVorschau( aBlattG, oDlg1, cCP, aSchrift, aParamG, nOrientierung )
   LOCAL oDlg  //, oXbpD1, oXbpDA, oXbpEoD, oXbpU, oXbpE, oXbpG, oXbpK
   LOCAL oVorSchau  //, oFocus := SetAppFocus()
   LOCAL hp := 1, vp := 1, nBo, nBz := 20*nV, aVOSize
   LOCAL aPos := {10,30*nV}, ASize := {790*nH,570*nV}
//   LOCAL aZoom := IIf(cDruckerName!="Microsoft" .OR. !"."$cZoom,&cZoom,{ 1.13, 40, 50 }) // damit beim Start die Vorschau vergr”áert wird
   LOCAL aZoom := IIf(ValType(aAusschnitt)="A".AND.len(aAusschnitt)=4, ;
                           ADel(AClone(aAusschnitt),1),{1,0,0})   //20.10.2007 18:19
   PRIVATE oFocSle, oVODA  //, cBriefkopf := ""
   IF Len(aParamG) = 0
      aParamG := { {"P","t","Anzahl Drucke:","1",0,"","cAnz",0,1,0} }
   ENDIF
   IF ::ABVorschau != NIL     //22.10.2006 18:33
      ::ABVorschau:destroy()
   ENDIF

   oVODA := oDlg1
   oDlg := oVODA:setParent()     //* weil in :cargo schon mal was Anderes steht!
   aVOSize := oVODA:currentSize()
   
   ::ABVorschau := XbpPreview():new( oVODA, oDlg, {0,0}, {aVOSize[1],aVOSize[2]},,, nOrientierung )
   ::ABVorschau:aBlatt := aBlattG
   ::ABVorschau:aParam := aParamG
   ::ABVorschau:cCP := cCP
   ::ABVorschau:aSchrift := aSchrift
      ::ABVorschau:drawBlock := {|oPS, nPageNo, nNumRows, aSegment, aBlatt, cCP, aSchrift, nO| ;
                              Vorschau_Ausgabe( oPS, aSegment, aBlatt, cCP, aSchrift, nO )}
   ::ABVorschau:create()
      ::ABVorschau:zoomfactor := aZoom[1]
      ::ABVorschau:hScroll:setData( aZoom[2] )
      ::ABVorschau:vScroll:setData( aZoom[3] )
      ::ABVorschau:zoom( ::ABVorschau:zoomfactor )
RETURN self

//+08.07.2009 14:56 FileDialog erzeugen als Explorer:
METHOD DialogFF:Explorator( oParent, cFile, aFilters, cExt, cTitel, lRestDir, aPos, ASize )
   LOCAL oDlgE
   DEFAULT oParent TO AppDeskTop()
   DEFAULT cFile TO "*.*", aFilters TO {}, cExt TO "*"
   DEFAULT cTitel TO "TDX-Explorator - Dateien managen", lRestDir TO .T.
   DEFAULT aPos TO {0,0}, ASize TO oParent:currentsize()
   AAdd( aFilters, {"~.alle Typen",SubStr(aFilters[1,1],1,At("*",aFilters[1,1]))+"*.*"} )
   AAdd( aFilters, {"alle.dieser Typ","*"+SubStr(aFilters[1,2],At(".",aFilters[1,2]))} )
   AAdd( aFilters, {"alle Dateien","*.*"} )
   oDlgE:=XbpFileDialog():new()
   oDlgE:title := cTitel
   oDlgE:restoreDir := lRestDir
   oDlgE:fileFilters := aFilters
   oDlgE:create(oParent,,aPos,ASize)
//   IF "*"$cFile
      cFile := oDlgE:open( cFile,,.T. )   //+ lallowMultiple = .T.
//   ELSE
//      oDlgE:saveas( cFile )
//   ENDIF
RETURN cFile


METHOD DialogFF:PaintTip(cTip,aTipPos)
   LOCAL aAreaAttr, aStringAttr
   LOCAL oPS
   LOCAL aPoints
   LOCAL aTipSize := {0,0}
   DEFAULT cTip TO "*******"
   aTipPos[1] := aTipPos[1]*nH + nBestP1     //13.04.2008 17:13
   aTipPos[2] := aTipPos[2]*nV + nBestP2     //13.04.2008 17:13

   IF ::oTip != NIL
      ::KillTip()
   ENDIF
   
   ::oTip := XbpStatic():new()
//   ::oTip:options := XBPSTATIC_TYPE_FGNDFRAME
   ::oTip:create(AppDesktop(),AppDesktop(), aTipPos, { 0 , 0 })

   oPS := ::oTip:lockPS()
   aPoints := GraQueryTextBox( oPS, cTip)
   ::oTip:unlockPS()

   aTipSize[1] := (aPoints[3,1] - aPoints[1,1]) + 8
   aTipSize[2] := (aPoints[1,2] - aPoints[2,2]) + 4

   ::oTip:setSize(aTipSize,.F.)
   oPS := ::oTip:lockPS()

   aAreaAttr := Array( GRA_AA_COUNT )
   aAreaAttr [ GRA_AA_COLOR ] := XBPSYSCLR_INFOBACKGROUND
   GraSetAttrArea( oPS, aAreaAttr )
   GraBox( oPS, { 0, 0}, {aTipSize[1]-1, aTipSize[2]-1}, GRA_OUTLINEFILL)

   aStringAttr := Array( GRA_AS_COUNT )
   aStringAttr [ GRA_AS_COLOR ] := XBPSYSCLR_INFOTEXT
   GraSetAttrString( oPS, aStringAttr )
   GraStringAt( oPS, {4,4}, cTip)

   ::oTip:unLockPS( oPS)
   ::oTip:cargo := .T.
   ::cTipTime := Time("+1")  //13.04.2008 16:46 setzt auf 1 Minute sp„ter
RETURN(SELF)

METHOD DialogFF:KillTip()
   IF ::oTip!=NIL .AND. ::oTip:IsDerivedFrom("XbpStatic")         // 6.8.2004
      IF ::oTip:cargo != NIL
         ::oTip:destroy()
         ::oTip:cargo := NIL
      ENDIF
   ENDIF
RETURN self

METHOD DialogFF:TabMax(o,aTab)
   LOCAL n := AScan(::TabSeite,o)
   AEval(aTab, {|x,i| ::TabSeite[n+x]:minimize()}, 1, Len(aTab)-1 )
   ::thisTab := ::TabSeite[n+ATail(aTab)]
   ::thisTab:maximize()
RETURN self      

// neue Felder in einer Datei anfgen:
METHOD DialogFF:StrukturErweiterung( cDatei, aNeuFeld, nA )
   LOCAL nOldArea := SELECT(), i, aFeld
   cDatei := cDatver + cDatei
   SELECT (nA)
      DbUseArea( , , cDatei )           // Datei ”ffnen
      DbCopyExtStruct( "Struct" )         // Struktur bertragen 
 
      DbUseArea( , , "Struct" )           // strukturerweiterte Datei 
      FOR i := 1 TO Len(aNeuFeld)
         aFeld := aNeuFeld[i]
         DbAppend()                          // ”ffnen und neue 
         FIELD->Field_Name := aFeld[1]        // Felddefinition eintragen 
         FIELD->Field_Type := aFeld[2]           
         FIELD->Field_Len  := aFeld[3]            
         FIELD->Field_Dec  := aFeld[4]
      NEXT 
      DbCloseArea() 
                                          // Sicherungskopie fr 
      IF FILE(cDatver+"Temp.dbf")
         COPY FILE ( cDatei+".dbf" ) TO ( cDatver+"Temp.dbf" ) //  - DBF-Datei  
         COPY FILE ( cDatei+".dbt" ) TO ( cDatver+"Temp.dbt" ) //  - Memo-Datei 
      ELSE
         FRename( cDatei+".dbf", cDatver+"Temp.dbf" ) //  - DBF-Datei  
         Frename( cDatei+".dbt", cDatver+"Temp.dbt" ) //  - Memo-Datei 
      ENDIF
 
      DbCreateFrom( cDatei,, "Struct" ) // Neue Datei erzeugen 
      DbUseArea( , , cDatei )           // Datei ”ffnen 

 
      DbImport( cDatver+"Temp" )                  // Datens„tze aus Sicherungskopie bernehmen 
      DbCloseArea()
                                           // Dateien umbenennen 
      IF FILE(cDatei+".bkf")
         COPY FILE ( cDatver+"Temp.dbf" ) TO ( cDatei+".bkf" ) //  - DBF-Datei  
         COPY FILE ( cDatver+"Temp.dbt" ) TO ( cDatei+".bkt" ) //  - Memo-Datei 
      ELSE
         FRename( cDatver+"Temp.dbf", cDatei+".bkf" ) //  - DBF-Datei  
         FRename( cDatver+"Temp.dbt", cDatei+".bkt" ) //  - Memo-Datei 
      ENDIF
      FErase( "Struct.dbf" )              // Strukturerweiterte Datei l”schen
   SELECT (nOldArea) 
RETURN self

// wird fr das Korrespondenzmodul gebraucht und in bl_quit/bl_alb2 verwendet:
// cKey: (nA=5)->verskz => wird in Adressdatei gesucht
//       (nA=1)->"Sehr geehrte"/"Liebe" o.„. => Brief-Anrede wird komplettiert
// nA: die Workarea der Adressdaten
// aD: (nA=5)->{"name1","name2","strasse","plz_ort"} => Adresse fr bl_quit
//     (nA=1)->@oBest:aBP  => Anrede fr bl_alb2/Brief an Angeh”rige
METHOD DialogFF:AdrDaten( cKey, nA, aD )  // fllt aE z.B. mit Adressen aus Area5
   LOCAL nRec := (nA)->(RecNo()), i, aE := {}
   PRIVATE cD
   IF nA == 5
      (nA)->(DbSuspendNotifications())
      (nA)->(DbSeek(cKey,.F.))
      FOR i:=1 TO Len(aD)
         cD := aD[i]
         AAdd( aE, (nA)->&cD )
      NEXT
      (nA)->(DbGoto(nRec))
      (nA)->(DbResumeNotifications())
   ELSEIF nA == 1                      // erg„nzt fr bl_alb2 (o.„.): 02.07.2006 15:53
      DO CASE                          // hAN1 := oBest:AdrDaten("Sehr geehrte",1)[8]
         CASE aD[1] = "Herr"
            AAdd(aD,cKey+"r Herr "+Trim(aD[3])+",")   // 8.Glied des Arrays
         CASE aD[1] = "Frau"
            AAdd(aD,cKey+" Frau "+Trim(aD[3])+",")
         OTHERWISE
            AAdd(aD,cKey+" Damen und Herren,")
      ENDCASE
      aE := aD
   ENDIF
RETURN aE  

// Eingabehilfe, z.B. fr Anrede    19.05.2007 22:38
// aD wird gefllt z.B. mit {"Herr","Frau","Kind"}
// cKey ist der Eingabewert im Anredefeld, z.B. "h"
// cD = aD[i] wird zurckgegeben, wenn cKey mit dem Anfang von aD[i] bereinstimmt:
METHOD DialogFF:AutoDaten(cKey,aD)
   LOCAL cD := cKey
   AEval( aD, {|x,i| cD := IIf(Upper(x)=Upper(Trim(cKey)),x,cD) } )
RETURN cD

// Suche in Gesamtdeutschland nach der PLZ oder dem Ort
// Indizierung in IneuX.prg:
//////OrdCreate( "PLZDE", "w", "WERT" )         // PLZ
//////OrdCreate( "PLZDE", "o", "ORT" )          // Ort ohne PLZ
//////OrdCreate( "PLZDE", "po", "WERT_ORT" )    // PLZ + " " + Ort
METHOD DialogFF:PlzDE(cKey)
   LOCAL cD, nOldArea := SELECT()
   DO CASE
      CASE Trim(cKey) == Str(Val(cKey),5,0)  // Eingabe = PLZ
         DbUseArea(.T.,"FOXCDX","PlzDe","plz")
         OrdListAdd("PlzDE","w")
         DbSeek(Trim(cKey))
      CASE Val(cKey) = 0                    // Eingabe = Ort
         DbUseArea(.T.,"FOXCDX","PlzDe","plz")
         OrdListAdd("PlzDE","o")
         DbSeek(Trim(cKey))
      CASE Len(cKey)>6 .AND. cKey[6] = " "
         DbUseArea(.T.,"FOXCDX","PlzDe","plz")
         OrdListAdd("PlzDE","po")
         DbSeek(Trim(cKey))
      OTHERWISE
         SELECT (nOldArea)
         RETURN cKey + " -> PLZ oder Ort eingeben!"
   ENDCASE
   IF !Eof()
      cD := plz->wert_ort
   ELSE
      cD := cKey +" -> PLZ oder Ort eingeben!)"
   ENDIF
   DbCloseArea()
   SELECT (nOldArea)
RETURN cD

//+16.11.2013 12:18 berechnet IBAN+BIC aus BLZ und KtoNr.
METHOD DialogFF:IbanBic(cKtonr0,cBlz0,cIban0,cBic0,nA,lStrgI)
   LOCAL n, n1, n2, n3, cI, cB, nOldArea, cBlz, cKtnr
   PRIVATE cIban_m := cIban0, cBic_m := cBic0
   PRIVATE cKtonr_m := cKtonr0, cBlz_m := cBlz0
   DEFAULT lStrgI TO .F.

   IF (Empty((nA)->(&cKtonr_m)) .OR. Empty((nA)->(&cBlz_m)) .AND. !Empty((nA)->(&cIban_m))) .AND. !lStrgI
      IF AlertBox(::oOwner, "M”chten Sie BLZ und KtoNr aus der IBAN berechnen?;", ;
                 { "JA" , "_NEIN" }  , ;
                 XBPSTATIC_SYSICON_ICONWARNING    , ;
                 "IBAN als Quelle fr BLZ und Ktonr?" ) = 2
      ELSE
         cI := SubStr((nA)->(&cIban_m),13,10)
         cB := SubStr((nA)->(&cIban_m),5,8)
         (nA)->(Satzsp(oCB))
         ::XbpObjekt(,cKtonr_m):setData( (nA)->(&cKtonr_m) := cI )
         ::XbpObjekt(,cKtonr_m):getData()
         ::XbpObjekt(,cBlz_m):setData( (nA)->(&cBlz_m) := cB )
         ::XbpObjekt(,cBlz_m):getData()
         (nA)->(DbRUnlock())
      ENDIF
      RETURN self
   ELSEIF Empty((nA)->(&cKtonr_m)) .OR. Empty((nA)->(&cBlz_m))
      RETURN self
   ENDIF
   
   // zuerst BLZ formatieren:
   cBlz := AllTrim((nA)->(&cBlz_m))
   n := (n:=At(" ",cBlz))
   DO WHILE n>0
      cBlz := Stuff(cBlz,n,1,"")
      n := (n:=At(" ",cBlz))
   ENDDO
   
   // und Ktonr formatieren:
   cKtonr := AllTrim((nA)->(&cKtonr_m))
   n := (n:=At(" ",cKtonr))
   DO WHILE n>0
      cKtonr := Stuff(cKtonr,n,1,"")
      n := (n:=At(" ",cKtonr))
   ENDDO
   cKtonr := PadL(cKtonr,10,"0")
   
   //Prfziffern fr IBAN berechnen:
   n1 := cBlz+cKtonr+"131400"
   n  := Val(SubStr(n1,1,9))%97
   n2 := LTrim(Str(n)+SubStr(n1,10))
   n  := Val(SubStr(n2,1,9))%97
   n2 := LTrim(Str(n)+SubStr(n2,10))
   n  := Val(SubStr(n2,1,9))%97
   IF Len(n2) > 9
      n2 := LTrim(Str(n)+SubStr(n2,10))
      n  := Val(SubStr(n2,1,9))%97
      n3 := 98-n
   ELSE
      n3 := 98-n
   ENDIF
   cI := "DE"+StrZero(n3,2)+SubStr(n1,1,18)

   //IBAN abspeichern:
   IF Empty((nA)->(&cIban_m))
      (nA)->(Satzsp(oCB))
      ::XbpObjekt(,cIban_m):setData( (nA)->(&cIban_m) := cI )
      ::XbpObjekt(,cIban_m):getData()
      (nA)->(DbRUnlock())
   ELSEIF cI == (nA)->(&cIban_m)
      MsgBox("Die vorhandene IBAN ist korrekt")
   ELSE
      IF AlertBox(::oOwner, "Die bisherige IBAN passt nicht zu BLZ und KtoNr!;"+;
                  "Wollen Sie die IBAN auf den neuen Wert "+cI+" korrigieren?;", ;
                 { "JA" , "_NEIN" }  , ;
                 XBPSTATIC_SYSICON_ICONWARNING    , ;
                 "IBAN falsch?" ) = 2
         RETURN self
      ELSE
         (nA)->(Satzsp(oCB))
         ::XbpObjekt(,cIban_m):setData( (nA)->(&cIban_m) := cI )
         ::XbpObjekt(,cIban_m):getData()
         (nA)->(DbRUnlock())
      ENDIF
   ENDIF
   
   // BIC aus BLZ und Bankendatei ermitteln:
   IF !FILE( cDatver+"BLZ_BIC.tak" )
      MsgBox("Die BLZ_BIC-Datei fehlt!")
      RETURN self
   ELSEIF Empty( cBlz )
      MsgBox("Die BLZ fehlt!")
      RETURN self
   ELSE
      nOldArea := SELECT()
      IF !FILE( cDatver+"xBlzBic.ntx" )
         DbUseArea( .T.,"SDFNTX", cDatver+"BLZ_BIC.tak", "bic", .F. )   // .T./.F. bedeutet : NEW Area/exclusive
         OrdCreate( "xBlzBic",, "blz" )
      ELSE
         DbUseArea( .T.,"SDFNTX", cDatver+"BLZ_BIC.tak", "bic", .T. )   // .T./.T. bedeutet : NEW Area/shared
         OrdListAdd(cDatver+"xBlzBic")
      ENDIF

      // BIC abspeichern:
      IF DbSeek(cBlz, .F.)
         cB := bic->bic
         bic->(DbCloseArea())
         SELECT &nOldArea
         IF Empty((nA)->(&cBic_m))
            (nA)->(Satzsp(oCB))
            ::XbpObjekt(,cBic_m):setData( (nA)->(&cBic_m) := cB )
            ::XbpObjekt(,cBic_m):getData()
            (nA)->(DbRUnlock())
         ELSEIF cB == (nA)->(&cBic_m)
            MsgBox("Die vorhandene BIC ist korrekt")
         ELSE
            IF AlertBox(::oOwner, "Die bisherige BIC passt nicht zur BLZ!;"+ ;
                        "Wollen Sie die BIC auf den neuen Wert "+cB+" korrigieren?;", ;
                       { "JA" , "_NEIN" }  , ;
                       XBPSTATIC_SYSICON_ICONWARNING    , ;
                       "BIC falsch?" ) = 2
               RETURN self
            ELSE
               (nA)->(Satzsp(oCB))
               ::XbpObjekt(,cBic_m):setData( (nA)->(&cBic_m) := cB )
               ::XbpObjekt(,cBic_m):getData()
               (nA)->(DbRUnlock())
            ENDIF
         ENDIF
      ELSE
         MsgBox("Ihre Blz kann in der BLZ_BIC-Datei nicht gefunden werden!")
         bic->(DbCloseArea())
         SELECT &nOldArea
      ENDIF
   ENDIF
RETURN self


// Texte fr Briefe oder Trauerdrucke suchen (10 Texte/Bilder pro Druck m”glich):
// (FOXCDX kann statt eines Textes auch etwas Bin„res, z.B. ein Bild, speichern)
// cTagName und cSuch bestimmen in welcher Sortierung und wonach gesucht wird
// wenn cSuch[1]=="!", dann wird nach eindeutigem Standardtext gesucht (z.B. in bl_v)
// 13.12.2007 09:18: nA ist jetzt variabel 
METHOD DialogFF:TextSuchen( oDlg1, cDatei, cProg, nAnf, nEnd, cTagName, cSuch, aPos, ASize, aPP, cTitel, nA )
   LOCAL nOldArea := SELECT(), nRec, nNL := Len(5->name1)
   DEFAULT cDatei TO "TEXTE", nA TO 10    //13.12.2007 09:19: nA kann jetzt bergeben werden
   cSuch := IIf(cTagName="at", IIf( oBest:aBP[7]=3, Stuff(PadR(cSuch,18),E+1,1,4->P_PERSKZ), ;
                                                      PadR(cSuch,18) ), ;
                              IIf(cTagName="nt",cSuch,PadR(cSuch,18)))  // 06.06.2006 18:15
   DbSuspendNotifications()
   SELECT (nA)
   DbUseArea(,"FOXCDX",cDatei)
   OrdListAdd(cDatei,cTagName)
//   IF Upper(cDatei) = "ABRECH-ANGEBOT-MAHNUNG" .OR. cSuch="!" // 12.02.2006
//      IF !DbSeek(cSuch,.F.)   // HardSeek, weil der individuelle Text gesucht wird
//         DbSeek(SubStr(cSuch,1,10),.F.)   // wenn kein individueller Text, dann Standardtext
//      ENDIF
//   ELSE        // fr Standardbriefe/"TEXTE"
//      DbSeek(cSuch,.T.)    // Softseek, weil das Auge sucht mit...
//      IIf(SubStr(cSuch,1,10)!=(nA)->txname,(nA)->(DbSkip(-1)),)   // wenn nicht gefunden
//   ENDIF

//** Beispiele:      // 06.04.2006
// Textkrzel ist vorgegeben:
// cSuch = "!VERSICH  123456" - einmaligen, auftragsunabh„ngigen Standardtext suchen, oder Leertext
// cSuch = "!versich  123456" - auftragsbezogenen, individuellen Text suchen
//                      wenn nicht gefunden: Standardtext suchen, oder Leertext
// cSuch = "versich   123456" - auftragsbezogenen, individuellen Text suchen
//                      wenn nicht gefunden: ein Schritt zurck
// Textkrzel ist nicht vorgegeben, wird ggf. vom Anwender selbst vergeben/gesucht:
// cSuch = "          " - Suchtabelle auf Leertext positionieren und Textname eingeben oder w„hlen
**//
   IF cSuch[1]="!" .AND. Upper(cSuch[2])=cSuch[2] // 06.04.2006, obligatorischer Standardtext
      IF !DbSeek(SubStr(cSuch,1,IIf(cTagName="ta",10,8)),.F.)   // HardSeek, weil der Standardtext gesucht wird
         DbGotop()   // wenn kein Standardtext, dann Leertext
      ENDIF
   ELSEIF cSuch[1]="!"  // auftragsbezogener Standardtext
      IF !DbSeek(cSuch,.F.)   // HardSeek, weil der individuelle Text gesucht wird
         IF !DbSeek(SubStr(cSuch,1,IIf(cTagName="ta",10,8)),.F.)   // wenn kein individueller Text, dann Standardtext
            DbGotop()   // wenn kein Standardtext, dann Leertext
         ENDIF
      ENDIF
   ELSE        // fr freie Briefe/"TEXTE" o.„.    !!06.06.2006 19:11!! cSuch justiert
      IF cTagName == "ta"  // 16.04.2006
         cSuch := IIf(cSuch="          ", "", cSuch ) 
         DbSeek(cSuch,.T.)    // Softseek, weil das Auge sucht mit...
         IIf(SubStr(cSuch,1,10)!=(nA)->txname,(nA)->(DbSkip(-1)),)   // wenn nicht gefunden, voriger
      ELSEIF cTagName == "at"  // 16.04.2006
         cSuch := Trim(cSuch)
         cSuch := IIf(Len(cSuch)<8,PadR(cSuch,8),cSuch)
         DbSeek(cSuch,.T.)    // Softseek, weil das Auge sucht mit...
         IIf(Val(SubStr(cSuch,1,8))!=Val((nA)->adrschl),(nA)->(DbGotop()),)   // wenn nicht gefunden, Anfang
      ELSEIF cTagName == "nt"  // 16.04.2006
         cSuch := IIf(nNL<40,PadR(SubStr(cSuch,1,nNL),40)+SubStr(cSuch,nNL+1),cSuch)   //19.06.2006 22:07
         cSuch := IIf( Len(cSuch)>(nNL+9).AND.SubStr(cSuch,(nNL+1),10)=Space(10), PadR(cSuch,40), cSuch )
         DbSeek(cSuch,.T.)    // Softseek, weil das Auge sucht mit...
         IIf(cSuch!=(nA)->n1,(nA)->(DbSkip(-1)),)   // wenn nicht gefunden, voriger
      ENDIF
   ENDIF
   nRec := RecNo()   // damit die Suchtabelle positioniert wird
// aPos, aSize, aPP, cTitel drfen NIL sein -> werden in ::such() DEFAULT gesetzt:
   IF cSuch != "!"
      IF ::Such( oDlg1, cProg, nAnf, nEnd, nA, nRec, aPos, ASize, aPP, cTitel, cSuch ) //16.04.2006 12:55
         ::aTxBd := {"          ",PadR(StrX(1->auftrnr,E,0)+IIf(oBest:aBP[7]=3 .AND. oBest:PvPERSKZ!="@", ;
                                    oBest:PvPERSKZ," "),8),"","","","",CtoD(""),"","","",""}
      ELSE  // wenn gefunden/ausgew„hlt ( ==> lFlucht=.F. !!!)
         ::aTxBd := {(nA)->TXNAME, PadR(StrX(1->auftrnr,E,0)+IIf(oBest:aBP[7]=3 .AND. oBest:PvPERSKZ!="@", ;
                                    oBest:PvPERSKZ," "),8), (nA)->N1, (nA)->N2, (nA)->STR, (nA)->ORT, ;
                                    (nA)->DATUM, (nA)->KENNZ, (nA)->BETRZ, (nA)->BETRV, (nA)->ANR }
         ::TxBd0 := IIf(SET(43)==0, ConvToAnsiCPak((nA)->TEXTBILD0),(nA)->TEXTBILD0)
         ::TxBd1 := IIf(SET(43)==0, ConvToAnsiCPak((nA)->TEXTBILD1),(nA)->TEXTBILD1)
         ::TxBd2 := IIf(SET(43)==0, ConvToAnsiCPak((nA)->TEXTBILD2),(nA)->TEXTBILD2)
         ::TxBd3 := IIf(SET(43)==0, ConvToAnsiCPak((nA)->TEXTBILD3),(nA)->TEXTBILD3)
         ::TxBd4 := IIf(SET(43)==0, ConvToAnsiCPak((nA)->TEXTBILD4),(nA)->TEXTBILD4)
         ::TxBd5 := IIf(SET(43)==0, ConvToAnsiCPak((nA)->TEXTBILD5),(nA)->TEXTBILD5)
         ::TxBd6 := IIf(SET(43)==0, ConvToAnsiCPak((nA)->TEXTBILD6),(nA)->TEXTBILD6)
         ::TxBd7 := IIf(SET(43)==0, ConvToAnsiCPak((nA)->TEXTBILD7),(nA)->TEXTBILD7)
         ::TxBd8 := IIf(SET(43)==0, ConvToAnsiCPak((nA)->TEXTBILD8),(nA)->TEXTBILD8)
         ::TxBd9 := IIf(SET(43)==0, ConvToAnsiCPak((nA)->TEXTBILD9),(nA)->TEXTBILD9)
      ENDIF
   ELSE     // 06.04.2006  wenn eindeutige Standardtexte gesucht werden, muss cSuch[1]=="!" sein
      // wenn z.B. cSuch = "!versicher"
      IF cSuch = "!versicher"   //17.04.2006 ohne Suchfenster, weil sonst s_.tak 2x ge”ffnet!!!
         ::aTxBd := {SubStr(cSuch,1,10),PadR(StrX(1->auftrnr,E,0)+IIf(oBest:aBP[7]=3 .AND. oBest:PvPERSKZ!="@", ;
                                    oBest:PvPERSKZ," "),8),"","","","",CtoD(""),"", ;
                                    (nA)->BETRZ, (nA)->BETRV, (nA)->ANR}
      ELSEIF Upper(cSuch[2]) != cSuch[2] .AND. ;
               !::Such( oDlg1, cProg, nAnf, nEnd, nA, nRec, aPos, ASize, aPP, cTitel, cSuch )   //16.04.2006 21:24
         ::aTxBd := {SubStr(cSuch,1,10),PadR(StrX(1->auftrnr,E,0)+IIf(oBest:aBP[7]=3 .AND. oBest:PvPERSKZ!="@", ;
                                    oBest:PvPERSKZ," "),8),"","","","",CtoD(""),"", ;
                                    (nA)->BETRZ, (nA)->BETRV, (nA)->ANR}
      ELSE  // wenn z.B. cSuch = "!LEER"
         ::aTxBd := { SubStr(cSuch,1,10), Space(8), "", "", "", "", CtoD(""), "", ;
                     (nA)->BETRZ, (nA)->BETRV, (nA)->ANR }  // Betreff + Anrede kann im Standard sein 
      ENDIF
      ::TxBd0 := IIf(SET(43)==0, ConvToAnsiCPak((nA)->TEXTBILD0),(nA)->TEXTBILD0)
      ::TxBd1 := IIf(SET(43)==0, ConvToAnsiCPak((nA)->TEXTBILD1),(nA)->TEXTBILD1)
      ::TxBd2 := IIf(SET(43)==0, ConvToAnsiCPak((nA)->TEXTBILD2),(nA)->TEXTBILD2)
      ::TxBd3 := IIf(SET(43)==0, ConvToAnsiCPak((nA)->TEXTBILD3),(nA)->TEXTBILD3)
      ::TxBd4 := IIf(SET(43)==0, ConvToAnsiCPak((nA)->TEXTBILD4),(nA)->TEXTBILD4)
      ::TxBd5 := IIf(SET(43)==0, ConvToAnsiCPak((nA)->TEXTBILD5),(nA)->TEXTBILD5)
      ::TxBd6 := IIf(SET(43)==0, ConvToAnsiCPak((nA)->TEXTBILD6),(nA)->TEXTBILD6)
      ::TxBd7 := IIf(SET(43)==0, ConvToAnsiCPak((nA)->TEXTBILD7),(nA)->TEXTBILD7)
      ::TxBd8 := IIf(SET(43)==0, ConvToAnsiCPak((nA)->TEXTBILD8),(nA)->TEXTBILD8)
      ::TxBd9 := IIf(SET(43)==0, ConvToAnsiCPak((nA)->TEXTBILD9),(nA)->TEXTBILD9)
   ENDIF
   DbCloseArea()
   SELECT(nOldArea)
   DbResumeNotifications()
RETURN self

METHOD DialogFF:TextSpeichern(cDatei,cTagName, cSuch, aBrDaten)
   LOCAL nOldArea := SELECT(), nA := 10
   DEFAULT cDatei TO "TEXTE"
   IF aBrDaten[1] = "!LEER"
      RETURN self
   ENDIF
   ::aTxBd := AClone(aBrDaten)
   cSuch := IIf( cTagName="nt", PadR(::aTxBd[3],40)+cSuch, cSuch )   //16.08.2006 16:08
   DbSuspendNotifications()
   SELECT (nA)
   DbUseArea(,"FOXCDX",cDatei)
   OrdListAdd(cDatei,cTagName)
   DbSeek(cSuch,.F.) // Hardseek, damit nur der richtige Fall ge„ndert wird!
   IF (nA)->(Eof())
      (nA)->(DbAppend())
      (nA)->txname := ::aTxBd[1]
   ELSE
//04.09.2007 10:31 damit jede Adresse ihren eigenen Eintrag fr diesen Auftrag+diesen Zweck bekommt
      DO WHILE (nA)->adrschl = ::aTxBd[2] .AND. (nA)->txname = ::aTxBd[1] .AND. !Eof() //04.09.2007 10:25
         IF (nA)->n1 = ::aTxBd[3]
            (nA)->(Satzsp(oCB))
            EXIT
         ENDIF
         DbSkip()
      ENDDO
      IF (nA)->adrschl != ::aTxBd[2] .OR. (nA)->txname != ::aTxBd[1]
         (nA)->(DbAppend())
         (nA)->txname := ::aTxBd[1]
      ENDIF
   ENDIF
   (nA)->adrschl := ::aTxBd[2]
   (nA)->n1 := ::aTxBd[3]
   (nA)->n2 := ::aTxBd[4]
   (nA)->str := ::aTxBd[5]
   (nA)->ort := ::aTxBd[6]
   (nA)->datum := ::aTxBd[7]
   (nA)->kennz := ::aTxBd[8]
   (nA)->betrz := ::aTxBd[9]
   (nA)->betrv := ::aTxBd[10]
   (nA)->anr := ::aTxBd[11]
   (nA)->TEXTBILD0 := IIf(SET(43)==0,ConvToOEMCPak(::TxBd0),::TxBd0)
   (nA)->TEXTBILD1 := IIf(SET(43)==0,ConvToOEMCPak(::TxBd1),::TxBd1)
   (nA)->TEXTBILD2 := IIf(SET(43)==0,ConvToOEMCPak(::TxBd2),::TxBd2)
   (nA)->TEXTBILD3 := IIf(SET(43)==0,ConvToOEMCPak(::TxBd3),::TxBd3)
   (nA)->TEXTBILD4 := IIf(SET(43)==0,ConvToOEMCPak(::TxBd4),::TxBd4)
   (nA)->TEXTBILD5 := IIf(SET(43)==0,ConvToOEMCPak(::TxBd5),::TxBd5)
   (nA)->TEXTBILD6 := IIf(SET(43)==0,ConvToOEMCPak(::TxBd6),::TxBd6)
   (nA)->TEXTBILD7 := IIf(SET(43)==0,ConvToOEMCPak(::TxBd7),::TxBd7)
   (nA)->TEXTBILD8 := IIf(SET(43)==0,ConvToOEMCPak(::TxBd8),::TxBd8)
   (nA)->TEXTBILD9 := IIf(SET(43)==0,ConvToAnsiCP(ConvToOEMCPak(::TxBd9)),::TxBd9)  // 14.12.2007 14:55speziell fr Trauerdruck eingefhrt
   DbCloseArea()
   SELECT(nOldArea)
   DbResumeNotifications()
RETURN self

METHOD DialogFF:HilfeFilm( oDlg1, cFileName, oVideo )
LOCAL oDlg, aPos:=oDlg1:currentpos(), ASize:=oDlg1:currentsize()
LOCAL ASizeV:=AClone(ASize) 
LOCAL nEvent, mp1, mp2, oXbp
   aSizeV[2]:=aSizeV[2]-30       // Titelleiste abziehen
   oDlg := XbpDialog():new( oDlg1, oDlg1, aPos, ASize )
   oDlg:taskList := .T.
   oDlg:title := "Hilfefilm "+cFileName+" - >>>>> Fenster schlieáen mit ESC <<<<<"
//   oDlg:titlebar := .F.
   oDlg:visible  := .T.
   oDlg:create()
//   oDlg:setModalState( XBP_DISP_APPMODAL )
   oDlg:show()

   oVideo := BDVideo():new(oDlg:drawingArea,,aPos,ASizeV):create()
   oVideo:cargo := oDlg
   oVideo:loadFile(cFileName)
   oVideo:play()

//////   DO WHILE .T.   //nEvent <> xbeP_Keyboard //Close
//////     nEvent := AppEvent( @mp1, @mp2, @oXbp )
//////      IF nEvent >= xbeP_Keyboard .AND. nEvent <= xbeM_RbDblClick   //.OR. nEvent == xbeM_RbDown .OR. nEvent == xbeM_LbDown
////////         IF mp1 == xbeK_ESC
//////            oVideo:stop()
//////            oVideo:destroy()
//////            EXIT
//////         ELSE
//////            oXbp:handleEvent( nEvent, mp1, mp2 )
////////            PostAppEvent( xbeP_Close, .T.,, oXbp )
////////         ENDIF
//////      ENDIF
////////     oXbp:handleEvent( nEvent, mp1, mp2 )
//////   ENDDO
//////   oDlg:setModalState( XBP_DISP_MODELESS )
//////   oDlg:destroy()

RETURN self

// setzt das Datum in einem Datumfeld mit # auf das Sterbedatum, mit "'" auf date() 
//    oder erh”ht/vermindert es mit +/- um jeweils 1 bzw. mit */_ um jeweils 7 Tage
METHOD DialogFF:DatumSet(oXbp,nPM)    //03.06.2007 15:27 nPM = +1/-1 (+7/-7), je nach Taste +/- (*/_)
   LOCAL dDat := oXbp:value
   DEFAULT nPM TO 0                    //
   IF oXbp:value = CtoD("  ") .AND. nPM != 0
      dDat := DATE()          //+12.08.2009 10:18  1->gestorben
   ELSEIF nPM == 0
      dDat := DATE()
   ENDIF
   oXbp:setData( dDat + nPM )
   oXbp:getData()
//   oXbp:original := CtoD("  .  .    ")
RETURN self

/*31.05.2008 19:45 */
METHOD DialogFF:TextFenster( oParent, oOwner, aPos, ASize, aPP, lVisible, nBz, cFF, nAnf, nEnd, nA, ;
                        xCfA, nSpa, nZei, nBrT, nHoT )
   STATIC aPosT[2], aSizeT[2], aPosF[2], aSizeF[2], nZeiF:=0, nZeiT:=0
   LOCAL i, cLine
   cBFont := IIf( !IsMemVar("cBFont") .OR. ValType(cBfont)!="C", "10.Arial", cBFont )
   DEFAULT oParent TO AppDesktop(), oOwner TO SetAppWindow(), ;
            aPos TO {AppDeskTop():currentsize()[1]/4,AppDeskTop():currentsize()[2]/4}, ;
            ASize TO {AppDeskTop():currentsize()[1]/2,AppDeskTop():currentsize()[2]/2}, ;
            aPP TO { { XBP_PP_FGCLR       , GRA_CLR_BLACK    } , ;
                     { XBP_PP_COMPOUNDNAME, cBFont} , ;
                     { XBP_PP_BGCLR       , XBPSYSCLR_DIALOGBACKGROUND } }

   IF ValType(xCfA) == "C" //+ der auszugebende Text
      IF CRLF $ xCfA
         FOR i := 1 TO MlCount(xCfA)
            cLine := MyMemoLine( xCfA, , i )   //21.10.2006 11:26 s.o nZeiLen=
            ::TextFenster( , , , , , , nBz, , , , , cLine, nSpa, nZei, nBrT, nHoT )
         NEXT
         RETURN self
      ENDIF
      aPosF:={0,0}; aSizeF:={0,0}
      IF nSpa==NIL .OR. nZei==NIL .OR. nBrT==NIL .OR. nHoT==NIL 
         nZeiT := (::BEArea[::BENr]:currentSize()[2] - nZeiT)/nBz + 1
         aPosT:=IIf(aPosT[1]==NIL,{0,1},{aPosT[1],nZeiT})
      ELSE
         aPosT := {nSpa,nZei}
         aSizeT := {nBrT,nHoT}
      ENDIF
      aSizeT:=IIf(aSizeT[1]==NIL,{Len(aCfA)*10,20},{aSizeT[1]/nH,aSizeT[2]/nV})
      aCfA := {{'','T',Len(xCfA),-751,1,aPosF[1],aPosF[2],aSizeF[1],aSizeF[2], ;
                  .F.,'',xCfA,aPosT[1],aPosT[2],aSizeT[1],aSizeT[2]}}
   ELSEIF ValType(xCfA) == "A"
      aCfA := AClone(xCfA)
   ELSE
      aCfA := xCfA
   ENDIF
   
   IF xCfA == NIL .AND. ::oTextFenster:isderivedfrom("XbpDialog")
      ::oTextFenster:destroy()
      ASize( ::BEArea, Len(::BEArea)-1 )
      --::BENr //+23.03.2010 10:29
   ENDIF
   IF lVisible == .T.
      ::oTextFenster := XbpDialog():new( oParent, ::BEArea[1]:cargo, aPos, ASize, aPP )
      ::oTextFenster:minButton := .F.
      ::oTextFenster:maxButton := .F.
      ::oTextFenster:sysMenu   := .F.
      ::oTextFenster:titleBar  := .F.
//      ::oTextFenster:border    := sv->FIELD_LEN + 3    // 3 = XBPDLG_THINBORDER, 1 = XBPDLG_NO_BORDER
      ::oTextFenster:CREATE()
      AAdd( ::BEArea, ::oTextFenster:drawingArea )     // die DrawingArea des Fensters
      ++::BENr
      ::BEArea[::BENr]:cargo := ::oTextFenster         // das Xbp_Dialog-Objekt = Fenster
//      ::BEArea[::BENr]:helpLink := MagicHelpLabel():New(xA_FIELD_DEC)
      ::BEArea[::BENr]:clipSiblings := .T.
      ::BEArea[::BENr]:setColorBG( XBPSYSCLR_TRANSPARENT )  // damit Farbe durchscheint
   ENDIF
   IF ValType(aCfA) == "A"
      FOR nCfA := 1 TO Len(aCfA)
         ::CREATEfromARRAY( , , , , , , nBz, , , , , ;
                     , @aPosT, @aSizeT, @aPosF, @aSizeF, @nZeiF, @nZeiT, aCfA, nCfA )
      NEXT
   ENDIF
RETURN self

//+17.08.2008 16:04 kopiert eine ganze Reihe Datenfelder (in aFelderI/E) von nAI nach nAE:
METHOD DialogFF:swapInachE( aFelderI, nAI, nAE, aFelderE )
   LOCAL nOldArea := SELECT()
   PRIVATE cI, cE
   DEFAULT aFelderI TO ::aFelder    

   SELECT (nAE)          //+15.08.2008 21:51 damit in XbpGetn automatisches SatzSp() 
   IF Empty(aFelderE)
      (nAE)->(DbRLock())
      FOR i := 1 TO Len(aFelderI)    // aFelderE darf mehr Felder haben als aFelderI
         cI := aFelderI[i]
         (nAE)->&cI := (nAI)->&cI
      NEXT
      (nAE)->(DbRUnLock())
   ELSE
      (nAE)->(DbRLock())
      FOR i := 1 TO Len(aFelderI)
         cI := aFelderI[i]
         cE := aFelderE[i]
         (nAE)->&cE := (nAI)->&cI
      NEXT
      (nAE)->(DbRUnLock())
   ENDIF
   SELECT &nOldArea
RETURN self

//+23.09.2008 21:03 holt die PLZ zu Straáe+Ort, bzw. den Ort zur PLZ
METHOD DialogFF:PLZ( cStrasse, cOrtX, cPLZX, cStrRef )
   LOCAL cPLZoderORT := cOrtX, nOldArea := SELECT(), cPLZ2     //+24.09.2008 09:44
   LOCAL cHausnr := Hausnummer(@cStrasse) //+ dabei wird cStrasse um die Nummer gekrzt
   LOCAL cPLZ := Trim(IIf(!Empty(cPLZX), cPLZX, IIf(Val(cOrtX)=0,"",Str(Val(cOrtX),5,0)) )) //+23.09.2008 21:17
   LOCAL cOrt := ORTohnePLZ(cOrtX)  //+23.09.2008 21:21
   LOCAL cNeueStrasse := IIf(cStrRef="!","j","")   //+23.09.2008 21:38
   LOCAL cPLZneu := cPLZ            //+23.09.2008 22:02 damit cPLZ gerettet wird
   LOCAL lDieserOrt := .F.
//   DbSuspendNotifications()
   IF cNeueStrasse == "j" .AND. !Empty(cStrRef)    //+23.09.2008 21:37
      cStrasse := SubStr(cStrasse,2)
      cStrRef := cStrasse + " " + cHausnr
      SKIP(0)
   ENDIF
   IF "traáe"$cStrasse
      cStrasse := Stuff(cStrasse,At("aáe",cStrasse),3,".")      //+26.08.2008 21:04
   ELSEIF "trasse"$cStrasse
      cStrasse := Stuff(cStrasse,At("asse",cStrasse),4,".")      //+23.09.2008 21:03
   ENDIF
  //+ Fall 1: PLZ suchen:
  //+    entweder: PLZ ist leer
  //+        oder: Straáe wurde ver„ndert, bzw. aus der Straáe wurde Ctrl-F4 aufgerufen,
  //+                 aber die Straáe hat NICHT das cNeueStrasse-Zeichen "!"
  //+        oder: Ort wurde ver„ndert, bzw. aus dem Ort wurde Ctrl-F4 aufgerufen,
  //+                 UND die Straáe hat das cNeueStrasse-Zeichen "!"
   IF Val(cPLZ)==0 .OR. ("STR"$Upper(oFocSle:cargo) .AND. cNeueStrasse != "j") ;
                  .OR. ("ORT"$Upper(oFocSle:cargo) .AND. cNeueStrasse == "j")   //+24.09.2008 09:39
      DbUseArea( .T., "FOXCDX", "PlzOrt", "po" )   //+ selektiert auch gleich die neue Area!
      OrdListAdd( "PlzOrt" )                       // ..
      OrdSetFocus( "o" )                           // ..
      DbSeek(cOrt,.F.,"o")                         //+ ..deshalb ist hier Area-> entbehrlich! 
      cPLZ := Trim(po->plz)
      DbSkip()
      IF Trim(cOrt) == Trim(po->ort)      //+ Ort hat mehrere PLZ
         DO WHILE Trim(cOrt) == Trim(po->ort) .AND. !po->(Eof())  //+24.09.2008 09:41
            DbSkip()
            IF SubStr(cPLZ,1,2) != SubStr(po->plz,1,2)   //+03.10.2008 10:28
               IF Trim(cOrt) != Trim(po->ort) .OR. lDieserOrt    //+lDieserOrt=>im Suchdialog ausgesuchter Ort mit mehreren PLZ
                  DbSkip(-1)
                  cPLZ2 := Trim(po->plz)
                  EXIT
              //+ 03.10.2008 12:05: Suchroutine
               ELSE
                  DbSkip(-1)
                  IF ::Such( oCB, "s_best", 990, 999, SELECT(), RecNo(),{10*nH,30*nV},{425*nH,200*nV},, ;
                              "Ort ausw„hlen! <Esc>=abbrechen" ) //+03.10.2008 10:41
                    //+ wenn mit Esc abgebrochen: (also kein Ort ausgew„hlt)
                     po->(DbCloseArea())
                     SELECT &nOldArea
                     RETURN IIf(Upper(AppName())$"SCRAPX.EXE", ;
                                 IIf("STR"$Upper(oFocSle:cargo) .OR. ;
                                 "ORT"$Upper(oFocSle:cargo), cPLZX, cOrtX ), ;
                                 cOrtX )     // berprfen, ob das so geht!
                  ELSE  //+ d.h., wenn ein Ort ausgew„hlt:     //+03.10.2008 12:05
                     IF po->plz_str == "1"
                        cPLZ := Trim(po->plz)
                        cOrt := po->ort
                        po->(DbCloseArea())
                        SELECT &nOldArea
                        RETURN IIf(Upper(AppName())$"SCRAPX.EXE", ;
                                 IIf("STR"$Upper(oFocSle:cargo) .OR. ;
                                 "ORT"$Upper(oFocSle:cargo), cPLZ, cOrt ), ;
                                 cPLZ + " " + cOrt )    // berprfen, ob das so geht!
                     ELSE           //SubStr(po->plz,1,2) != SubStr(cPLZ,1,2)  // wenn anderer Ort mit demselben Namen
                        IF SubStr(cPLZ,1,2) == SubStr(po->plz,1,2)   //+ der ursprngliche Ort
                           po->(DbSeek(cPLZ,.F.,"p"))
                           DbSkip()
                           lDieserOrt := .T.    //+im Suchdialog ausgesuchter Ort mit mehreren PLZ
                           LOOP
                        ELSE                    //+ anderer als der ursprngliche Ort
                           cPLZ := Trim(po->plz)
                           po->(DbSeek(cPLZ,.F.,"p"))
                           DbSkip()
                           lDieserOrt := .T.    //+im Suchdialog ausgesuchter Ort mit mehreren PLZ
                           LOOP
                        ENDIF
                     ENDIF
                     EXIT
                  ENDIF
               ENDIF
            ENDIF
         ENDDO
         IIf(Empty(cPLZ2), cPLZ2 := cPLZ, )     //+24.09.2008 09:45
         DbUseArea( .T., "FOXCDX", "PlzStr", "pr" )
         OrdListAdd( "PlzStr" )
         OrdSetFocus( "ps" )
         DbSetScope( SCOPE_TOP, cPLZ )                //+ erste PLZ dieses Ortes
         DbSetScope( SCOPE_BOTTOM, cPLZ2+"zzzzz" )    //+ letzte PLZ dieses Ortes
         SetLexRule({ {"", "ue"}, ;        //   -> ue 
                      {"”", "oe"}, ;        // ”  -> oe 
                      {"„", "ae"}, ;        // „  -> ae 
                      {"š", "UE"}, ;        // š  -> UE 
                      {"™", "OE"}, ;        // ™  -> OE 
                      {"Ž", "AE"}, ;        // Ž  -> AE 
                      {"á", "SS"}, ;        // á  -> ss groá, weil in der PLZSTR alles groá ist !!
                      { "." , ""}, ;        // Punkt       -> "" 
                      { "-" , ""}, ;        // Bindestrich -> "" 
                      {" " , "" }  } )      // Leerzeichen -> "" 
         SET LEXICAL ON
        //+23.09.2008 21:46 neue Straáe anlegen:
         IF cNeueStrasse = "j"   // 29.10.2004
//            FIND &cStrasse           // 04.09.2007 11:49 damit Strassen nicht doppelt neu angelegt werden
            //+ statt FIND hier LOCATE, weil nach PLZ+Str indiziert
            LOCATE FOR Trim(Upper(cstrasse)) = Trim(pr->str_such)
            DO WHILE Trim(Upper(cstrasse)) = Trim(pr->str_such) .AND. !pr->(Eof())  //+24.09.2008 09:42
               IF pr->plz = cPLZneu          //+ wenn schon mit richtiger PLZ angelegt
                  EXIT
               ENDIF
               DbSkip()
            ENDDO
            IF pr->plz != cPLZneu .OR. pr->str_such != cStrasse  //+ wenn noch nicht mit richtiger PLZ angelegt
               APPEND BLANK
               pr->plz := cPLZneu
               pr->str_such := cStrasse
               pr->hnr_typ := "N"
            ENDIF
         ELSEIF cStrasse[1] != "!"  //+24.09.2008 09:54
        //+ Straáe suchen und dabei PLZ finden (wenn nicht dann mit !vorStraáe suchen = NeueStraáe)
            LOCATE FOR Trim(Upper(cstrasse)) = Trim(pr->str_such)
            IF pr->hnr_typ == "N"
               cPLZoderORT := Trim(pr->plz) + IIf(Upper(AppName())$"SCRAPX.EXE",""," " + cOrt)     //+ Straáe hat nur eine PLZ  //+23.09.2008 21:53
            ELSEIF Trim(Upper(cstrasse)) = Trim(pr->str_such)
               DO WHILE Trim(Upper(cstrasse)) = Trim(pr->str_such) .AND. !pr->(Eof())  //+24.09.2008 09:42
                  IF Int(Val(cHausnr)/2)*2 != Val(cHausnr)  //+ ungerade Hausnr
                     IF pr->hnr_typ == "U"
                        IF Val(pr->hnr_von)<=Val(cHausnr) .AND. Val(pr->hnr_bis)>=Val(cHausnr)
                           cPLZoderOrt := pr->plz + IIf(Upper(AppName())$"SCRAPX.EXE",""," " + cOrt)    //+23.09.2008 21:53
                           EXIT
                        ELSE
                           pr->(DbContinue())
                           LOOP
                        ENDIF
                     ELSEIF pr->hnr_typ == "G"
                        pr->(DbContinue())
                        LOOP
                     ENDIF
                  ELSEIF Int(Val(cHausnr)/2)*2 = Val(cHausnr)  //+ gerade Hausnr
                     IF pr->hnr_typ == "G"
                        IF Val(pr->hnr_von)<=Val(cHausnr) .AND. Val(pr->hnr_bis)>=Val(cHausnr)
                           cPLZoderOrt := pr->plz + IIf(Upper(AppName())$"SCRAPX.EXE",""," " + cOrt)
                           EXIT
                        ELSE
                           pr->(DbContinue())
                           LOOP
                        ENDIF
                     ELSEIF pr->hnr_typ == "U"
                        pr->(DbContinue())
                        LOOP
                     ENDIF
                  ENDIF
               ENDDO
            ELSE
               cPLZoderOrt := "?????" + IIf(Upper(AppName())$"SCRAPX.EXE",""," " + cOrt)     //+ PLZ nicht gefunden //+23.09.2008 21:53
            ENDIF
           //**//
         ENDIF
         pr->(DbCloseArea())
         po->(DbCloseArea())
         SET LEXICAL OFF
      ELSE
         cPLZoderORT := cPLZ + IIf(Upper(AppName())$"SCRAPX.EXE",""," " + cOrt)     //+ Ort hat nur eine PLZ     //+23.09.2008 21:54
         po->(DbCloseArea())
      ENDIF
  //+ Fall 2: ORT suchen zu gegebener PLZ:
   ELSEIF Len(Trim(cPLZ)) == 5
      DbUseArea( .T., "FOXCDX", "PlzOrt", "po" )
      OrdListAdd( "PlzOrt" )
      OrdSetFocus( "p" )
      DbSeek(cPlz,.F.,"p")
      IF Eof()
//+15.11.2009 17:53         MsgBox( "Ist das ein neuer Ortsteil?", "PLZ ist nicht verzeichnet!" )
         AlertBox( , "Ist das ein neuer Ortsteil"        + ;
              ";", ;
              { "_OK" }  , ;
              XBPSTATIC_SYSICON_ICONWARNING    , ;
              "PLZ ist nicht verzeichnet!" )    //+15.11.2009 17:41
      ELSEIF po->plz_str == "1"
         cPLZ := Trim(po->plz)
         cOrt := po->ort
         DbSkip()
         IF cPLZ != Trim(po->plz)   // PLZ ist eindeutig dem Ort zugewiesen
            DbSkip(-1)
            cPLZoderORT := IIf(Upper(AppName())$"SCRAPX.EXE", ;
                           IIf("STR"$Upper(oFocSle:cargo) .OR. ;
                           "ORT"$Upper(oFocSle:cargo), cPLZ, cOrt ), ;
                           cPLZ + " " + cOrt )
            po->(DbCloseArea())
         ELSEIF cOrt != po->ort //PLZ nicht eindeutig, d.h. n„chster Ort hat dieselbe PLZ
//            DbSkip(-1) 
//            po->(DbCloseArea())
//            SELECT &nOldArea
//            RETURN IIf(Upper(AppName())$"SCRAPX.EXE", ;
//                     IIf("STR"$Upper(oFocSle:cargo) .OR. ;
//                     "ORT"$Upper(oFocSle:cargo), cPLZ, cOrt ), ;
//                     cPLZ + " " + cOrt )    // berprfen, ob das so geht!
//         ELSE  //+ es gibt mehrere Orte mit derselben PLZ:
//            OrdSetFocus( "p" )
//            DbSeek(cPLZ,.F.,"p") 
            IF ::Such( oCB, "s_best", 990, 999, SELECT(), RecNo(),{10*nH,30*nV},{425*nH,200*nV},, ;
                        "Ort ausw„hlen! <Esc>=abbrechen" ) //+03.10.2008 10:41
              //+ wenn mit Esc abgebrochen: (also kein Ort ausgew„hlt)
               po->(DbCloseArea())
               SELECT &nOldArea
               RETURN IIf(Upper(AppName())$"SCRAPX.EXE", ;
                           IIf("STR"$Upper(oFocSle:cargo) .OR. ;
                           "ORT"$Upper(oFocSle:cargo), cPLZX, cOrtX ), ;
                           cOrtX )     // berprfen, ob das so geht!
            ELSE
               cPLZ := Trim(po->plz)
               cOrt := po->ort
               po->(DbCloseArea())
               SELECT &nOldArea
               RETURN IIf(Upper(AppName())$"SCRAPX.EXE", ;
                        IIf("STR"$Upper(oFocSle:cargo) .OR. ;
                        "ORT"$Upper(oFocSle:cargo), cPLZ, cOrt ), ;
                        cPLZ + " " + cOrt )    // berprfen, ob das so geht!
            ENDIF
         ENDIF
      ELSE //+ Ort mit mehreren PLZ, also eindeutige Zuordnung zu dieser PLZ: (Straáe prfen!)
         DbUseArea( .T., "FOXCDX", "PlzStr", "pr" )
         OrdListAdd( "PlzStr" )
         OrdSetFocus( "ps" )
         DbSetScope( SCOPE_BOTH, cPLZ )                //+ erste PLZ dieses Ortes
        //+ Straáe suchen 
         LOCATE FOR Trim(Upper(cstrasse)) = Trim(pr->str_such)
         IF Eof()
//+15.11.2009 17:54            MsgBox( "Ist das eine neue Straáe?", "Straáe passt nicht zur PLZ !" )
            AlertBox( , "Ist das eine neue Straáe?"        + ;
              ";", ;
              { "_OK" }  , ;
              XBPSTATIC_SYSICON_ICONWARNING    , ;
              "Straáe passt nicht zur PLZ!" )    //+15.11.2009 17:41
         ELSEIF Int(Val(cHausnr)/2)*2 != Val(cHausnr) .AND. pr->hnr_typ == "G"
//+15.11.2009 17:55            MsgBox( "PLZ passt nicht zur Hausnummer !", "Ist das eine neue Straáe?" )
            AlertBox( , "PLZ passt nicht zur Hausnummer!"        + ;
              ";", ;
              { "_OK" }  , ;
              XBPSTATIC_SYSICON_ICONWARNING    , ;
              "Ist das eine neue Straáe?" )    //+15.11.2009 17:41
         ELSEIF Int(Val(cHausnr)/2)*2 == Val(cHausnr) .AND. pr->hnr_typ == "U"
//+15.11.2009 17:56            MsgBox( "PLZ passt nicht zur Hausnummer !", "Ist das eine neue Straáe?" )
            AlertBox( , "PLZ passt nicht zur Hausnummer!"        + ;
              ";", ;
              { "_OK" }  , ;
              XBPSTATIC_SYSICON_ICONWARNING    , ;
              "Ist das eine neue Straáe?" )    //+15.11.2009 17:41
         ELSEIF Int(Val(cHausnr)/2)*2 != Val(cHausnr) .AND. pr->hnr_typ == "U"
            IF Val(pr->hnr_von)>=Val(cHausnr) .OR. Val(pr->hnr_bis)<=Val(cHausnr)
//+15.11.2009 17:56            MsgBox( "PLZ passt nicht zur Hausnummer !", "Ist das eine neue Straáe?" )
            AlertBox( , "PLZ passt nicht zur Hausnummer!"        + ;
              ";", ;
              { "_OK" }  , ;
              XBPSTATIC_SYSICON_ICONWARNING    , ;
              "Ist das eine neue Straáe?" )    //+15.11.2009 17:41
            ENDIF
         ELSEIF Int(Val(cHausnr)/2)*2 == Val(cHausnr) .AND. pr->hnr_typ == "G"
            IF Val(pr->hnr_von)>=Val(cHausnr) .OR. Val(pr->hnr_bis)<=Val(cHausnr)
//+15.11.2009 17:57            MsgBox( "PLZ passt nicht zur Hausnummer !", "Ist das eine neue Straáe?" )
            AlertBox( , "PLZ passt nicht zur Hausnummer!"        + ;
              ";", ;
              { "_OK" }  , ;
              XBPSTATIC_SYSICON_ICONWARNING    , ;
              "Ist das eine neue Straáe?" )    //+15.11.2009 17:41
            ENDIF
         ENDIF
//+ da msste die Scope aufgemacht werden und von cPLZ bis cPLZ2 neu er”ffnet werden! :
//////            DO WHILE !Eof()
//////               CONTINUE
//////               IF ( pr->hnr_typ == "U" .AND. ;
//////                        Val(pr->hnr_von)<=Val(cHausnr) .AND. Val(pr->hnr_bis)>=Val(cHausnr) ) .OR. ;
//////                  ( pr->hnr_typ == "G" .AND. ;
//////                        Val(pr->hnr_von)<=Val(cHausnr) .AND. Val(pr->hnr_bis)>=Val(cHausnr) )
//////                  MsgBox( "Sollte es "+pr-plz+" sein?", "PLZ passt nicht zur Hausnummer !" )
//////               ENDIF
//////            ENDDO
         cPLZoderORT := IIf(Upper(AppName())$"SCRAPX.EXE",po->ort,cPLZ + " " + po->ort)    //+23.09.2008 21:54
         pr->(DbCloseArea())
         po->(DbCloseArea())
      ENDIF
  //+ Fall 3: unbestimmt, also keine Suche m”glich:
   ELSE
      cPLZoderORT := IIf(Upper(AppName())$"SCRAPX.EXE", ;
                           IIf("STR"$Upper(oFocSle:cargo) .OR. ;
                           "ORT"$Upper(oFocSle:cargo), cPLZX, cOrtX ), ;
                           cOrtX )     // berprfen, ob das so geht!
   ENDIF
      SELECT &nOldArea
      Satzsp(oCB)
RETURN cPLZoderORT      //+gibt je nach Eingang PLZ oder Ort zurck //+23.09.2008 22:07: oder PLZ+Ort

////+28.07.2008 20:30 holt die PLZ zu Straáe+Ort, bzw. den Ort zur PLZ
//METHOD DialogFF:PLZ( cStrasse, cOrt, cPLZ )
//   LOCAL cPLZoderORT, nOldArea := SELECT()
//   LOCAL cHausnr := Hausnummer(@cStrasse) //+ dabei wird cStrasse um die Nummer gekrzt
//   IF "traáe"$cStrasse
//      cStrasse := Stuff(cStrasse,At("aáe",cStrasse),3,".")      //+26.08.2008 21:04
//   ENDIF
//   IF Empty(cPLZ)
//      DbUseArea( .T., "FOXCDX", "PlzOrt", "po" )
//      OrdListAdd( "PlzOrt" )
//      OrdSetFocus( "o" )
//      DbSeek(cOrt,.F.,"o")
//      cPLZ := po->plz
//      DbSkip()
//      IF Trim(cOrt) == Trim(po->ort)      //+ Ort hat mehrere PLZ
//         DO WHILE Trim(cOrt) == Trim(po->ort)
//            DbSkip()
//            IF Trim(cOrt) != Trim(po->ort)
//               DbSkip(-1)
//               cPLZ2 := po->plz
//               EXIT
//            ENDIF
//         ENDDO
//         DbUseArea( .T., "FOXCDX", "PlzStr", "pr" )
//         OrdListAdd( "PlzStr" )
//         OrdSetFocus( "ps" )
//         DbSetScope( SCOPE_TOP, cPLZ )
//         DbSetScope( SCOPE_BOTTOM, cPLZ2+"zzzzz" )
//         SetLexRule({ {"", "ue"}, ;        //   -> ue 
//                      {"”", "oe"}, ;        // ”  -> oe 
//                      {"„", "ae"}, ;        // „  -> ae 
//                      {"š", "UE"}, ;        // š  -> UE 
//                      {"™", "OE"}, ;        // ™  -> OE 
//                      {"Ž", "AE"}, ;        // Ž  -> AE 
//                      {"á", "ss"}, ;        // á  -> ss 
//                      { "." , ""}, ;        // Punkt       -> "" 
//                      { "-" , ""}, ;        // Bindestrich -> "" 
//                      {" " , "" }  } )      // Leerzeichen -> "" 
//         SET LEXICAL ON
//         LOCATE FOR Trim(Upper(cstrasse)) = Trim(pr->str_such)
//         IF pr->hnr_typ == "N"
//            cPLZoderORT := pr->plz     //+ Straáe hat nur eine PLZ
//         ELSEIF Trim(Upper(cstrasse)) = Trim(pr->str_such)
//            OrdSetFocus("ss")
//            DO WHILE Trim(Upper(cstrasse)) = Trim(pr->str_such)
//               IF Int(Val(cHausnr)/2)*2 != Val(cHausnr)  //+ ungerade Hausnr
//                  IF pr->hnr_typ == "U"
//                     IF Val(pr->hnr_von)<=Val(cHausnr) .AND. Val(pr->hnr_bis)>=Val(cHausnr)
//                        cPLZoderOrt := pr->plz
//                        EXIT
//                     ELSE
//                        pr->(DbSkip())
//                        LOOP
//                     ENDIF
//                  ELSEIF pr->hnr_typ == "G"
//                     pr->(DbSkip())
//                     LOOP
//                  ENDIF
//               ELSEIF Int(Val(cHausnr)/2)*2 = Val(cHausnr)  //+ gerade Hausnr
//                  IF pr->hnr_typ == "G"
//                     IF Val(pr->hnr_von)<=Val(cHausnr) .AND. Val(pr->hnr_bis)>=Val(cHausnr)
//                        cPLZoderOrt := pr->plz
//                        EXIT
//                     ELSE
//                        pr->(DbSkip())
//                        LOOP
//                     ENDIF
//                  ELSEIF pr->hnr_typ == "U"
//                     pr->(DbSkip())
//                     LOOP
//                  ENDIF
//               ENDIF
//            ENDDO
//         ELSE
//            cPLZoderOrt := "?????"     //+ PLZ nicht gefunden
//         ENDIF
//         pr->(DbCloseArea())
//         po->(DbCloseArea())
//         SET LEXICAL OFF
//      ELSE
//         cPLZoderORT := cPLZ     //+ Ort hat nur eine PLZ
//         DbCloseArea()
//      ENDIF
//   ELSE
//      DbUseArea( .T., "FOXCDX", "PlzOrt", "po" )
//      OrdListAdd( "PlzOrt" )
//      OrdSetFocus( "p" )
//      DbSeek(cPlz,.F.,"p")
//      cPLZoderORT := po->ort
//      DbCloseArea()
//   ENDIF
//      SELECT &nOldArea
//RETURN cPLZoderORT      //+gibt je nach Eingang PLZ oder Ort zurck
//------------------------------------------
//+28.07.2008 21:44 wenn cStrasse als Referenz bergeben wird, wird sie auch korrigiert
FUNCTION Hausnummer(cStrasse)
   LOCAL cHausnr := "", i
   FOR i := 1 TO Len(cStrasse)
      IF Val(cStrasse[i]) > 0
         cHausnr := SubStr(cStrasse,i)
         cStrasse := Trim(SubStr(cStrasse,1,i-1))
         EXIT
      ENDIF
   NEXT
RETURN cHausnr
//------------------------------------------
//------------------------------------------

CLASS BlattFA
   PROTECTED:
     VAR appendMode              // Wird ein neuer Datensatz angelegt?
     VAR appendControls          // XBPs, die nur bei APPEND
                                 // aktiv sind
     VAR keyControls             // Liste von XBPs fr Tastaturnavigation
     VAR keyboardBlock           // Codeblock fr xbeP_Keyboard Ereignisse
   EXPORTED:
     VAR editControls            // XBPs, die Daten „ndern
     VAR LeditC                  // L„nge des Arrays editControls
   VAR BEArea
   VAR BENr
////   VAR BrowseFeld
////   VAR BFNr
//////   VAR BVariable
//////   VAR BVNr
   VAR GruppenBox
   VAR GBNr
   VAR TextZeile
   VAR TZNr
   VAR DruckKnopf
   VAR DKNr
   VAR MultiZeile
   VAR MZNr
   VAR SingleZeile
   VAR SZNr
   VAR aBlatt                    // Array, in dem die Blatt-Aufbau-Information steckt
   VAR aBlattZ
   VAR aSeite
   VAR aNa
   VAR aPrompt
   VAR aText
   VAR aTFont
   VAR aBereich
   VAR aFeld
   VAR aFFont
   VAR aZei
   VAR aSpa
   VAR aParam                    // Array, in dem die Blatt-Aufbau-Information steckt
   VAR aSeiteP
   VAR aNaP
   VAR aPromptP
   VAR aTextP
   VAR aTFontP
   VAR aBereichP
   VAR aFeldP
   VAR aFFontP
   VAR aZeiP
   VAR aSpaP
   VAR Vorschau
   METHOD INIT
   METHOD CREATE
   METHOD destroy
     METHOD addEditControl       // XBP fr Edit registrieren
     METHOD addAppendControl     // XBP fr Append registrieren
     METHOD addKeyControl        // XBP fr Keyboard handling registrieren
//     METHOD notify
   METHOD Such                   // „hnlich :Such() bei DialogFF  16.07.2006 10:12
ENDCLASS

METHOD BlattFA:INIT( oParent, oOwner, aPos, ASize, aPP, lVisible, nBz, aBlattG, aParamG )
   LOCAL aPPTxt := { { XBP_PP_FGCLR       , GRA_CLR_BLACK    } , ;
                     { XBP_PP_BGCLR       , XBPSYSCLR_DIALOGBACKGROUND } }
   DEFAULT aPP TO {{ XBP_PP_COMPOUNDNAME, IIf(nV>1.5,"12.Arial",IIf(nV>1,"10.Arial","8.Arial")) }}
   AEval( aPP, {|a,x| AAdd(aPPTxt,a) } ) //23.03.2008 18:05
   
   ::BEArea := {}
   ::BENr := 0
   AAdd( ::BEArea, oParent )
   ::BENr := Len( ::BEArea )
      // Erste TabPage ist maximiert
   AAdd( ::BEArea, XbpTabPage():new( oParent, oOwner, aPos, aSize, aPPTxt, lVisible ) )
   ::BEArea[++::BENr]:caption   := "~Parameter"
   ::BEArea[::BENr]:clipSiblings  := .T.
   ::BEArea[::BENr]:tabStop  := .T.
   ::BEArea[::BENr]:tabHeight  := 20*nV   //07.04.2008 18:30
   ::BEArea[::BENr]:preOffset  := 0
   ::BEArea[::BENr]:postOffset := 80
   ::BEArea[::BENr]:create()
   ::BEArea[::BENr]:helpLink := MagicHelpLabel():New(707)
   ::BEArea[::BENr]:maximize()
   ::BEArea[::BENr]:minimize()
   ::BEArea[::BENr]:maximize()
   ::BEArea[::BENr]:minimized := .F.
   ::BEArea[::BENr]:TabActivate := {|m,n,o| n := AScan(::BEArea,o), ;
                                    ::BEArea[n+1]:minimize(), ::BEArea[n+2]:minimize(),;
                                    o:maximize(), IIf(Empty(o:childList()), SetAppFocus(o), ;
                                    SetAppFocus(o:childList()[1])) }

      // Zweite TabPage ist minimiert
   AAdd( ::BEArea, XbpTabPage():new( oParent, oOwner, aPos, aSize, aPPTxt, lVisible ) )
   ::BEArea[++::BENr]:caption    := "Da~ten-1"
   ::BEArea[::BENr]:clipSiblings  := .T.
   ::BEArea[::BENr]:tabStop  := .T.
   ::BEArea[::BENr]:tabHeight  := 20*nV   //07.04.2008 18:30
   ::BEArea[::BENr]:preOffset  := 20
   ::BEArea[::BENr]:postOffset := 60
   ::BEArea[::BENr]:create()
   ::BEArea[::BENr]:helpLink := MagicHelpLabel():New(708)
   ::BEArea[::BENr]:maximize()
   ::BEArea[::BENr]:minimize()
//   ::BEArea[::BENr]:TabActivate := {|| ::BEArea[::BENr-1]:minimize(), ::BEArea[::BENr+1]:minimize(),;
//                                       ::BEArea[::BENr]:maximize(), SetAppFocus(::BEArea[::BENr]) }
   ::BEArea[::BENr]:TabActivate := {|m,n,o| n := AScan(::BEArea,o), ;
                                    ::BEArea[n-1]:minimize(), ::BEArea[n+1]:minimize(),;
                                    o:maximize(), IIf(Empty(o:childList()), SetAppFocus(o), ;
                                    SetAppFocus(o:childList()[1])) }

      // Dritte TabPage ist minimiert
   AAdd( ::BEArea, XbpTabPage():new( oParent, oOwner, aPos, aSize, aPPTxt, lVisible ) )
   ::BEArea[++::BENr]:caption    := "Para~meter-2"
   ::BEArea[::BENr]:clipSiblings  := .T.
   ::BEArea[::BENr]:tabStop  := .T.
   ::BEArea[::BENr]:tabHeight  := 20*nV   //07.04.2008 18:30
   ::BEArea[::BENr]:preOffset  := 40
   ::BEArea[::BENr]:postOffset := 40
   ::BEArea[::BENr]:create()
   ::BEArea[::BENr]:helpLink := MagicHelpLabel():New(709)
   ::BEArea[::BENr]:maximize()
   ::BEArea[::BENr]:minimize()
//   ::BEArea[::BENr]:TabActivate := {|| ::BEArea[::BENr-2]:minimize(), ::BEArea[::BENr-1]:minimize(),;
//                                       ::BEArea[::BENr]:maximize(), SetAppFocus(::BEArea[::BENr]) }
   ::BEArea[::BENr]:TabActivate := {|m,n,o| n := AScan(::BEArea,o), ;
                                    ::BEArea[n-2]:minimize(), ::BEArea[n-1]:minimize(),;
                                    o:maximize(), IIf(Empty(o:childList()), SetAppFocus(o), ;
                                    SetAppFocus(o:childList()[1])) }

////   ::BrowseFeld := {}
////   ::BFNr := 0
//////   ::BVariable  := {}
//////   ::BVNr := 0
   ::GruppenBox := {}
   ::GBNr := 0
   ::TextZeile := {}
   ::TZNr := 0
   ::DruckKnopf := {}
   ::DKNr := 0
   ::MultiZeile := {}
   ::MZNr := 0
   ::SingleZeile := {}
   ::SZNr := 0
   ::editControls    := {}
   ::appendControls  := {}
   ::keyControls     := {}
   ::keyboardBlock   := {|nKey,x,obj| ::keyHandler( nKey, obj ) }
   ::aBlatt := aBlattG
   ::aBlattZ := {}
   ::aSeite := {}
   ::aNa    := {}
   ::aPrompt := {}
   ::aText  := {}
   ::aTFont := {}
   ::aBereich := {}
   ::aFeld  := {}
   ::aFFont := {}
   ::aZei   := {}
   ::aSpa   := {}
   ::aParam := aParamG
   ::aSeiteP := {}
   ::aNaP    := {}
   ::aPromptP := {}
   ::aTextP  := {}
   ::aTFontP := {}
   ::aBereichP := {}
   ::aFeldP  := {}
   ::aFFontP := {}
   ::aZeiP   := {}
   ::aSpaP   := {}
RETURN self

//METHOD DialogFF:CREATE( oParent, oOwner, aPos, ASize, aPP, lVisible, nBz, cFF, nAnf, nEnd, nA )
METHOD BlattFA:CREATE( oParent, oOwner, aPos, ASize, aPP, lVisible, nBz )
   LOCAL oXbp  //nH, nV := AppDesktop():currentSize()[1]/800, [2]/600 waagrecht:nH, senkrecht:nV
   LOCAL nBo := ( AppDesktop():currentSize()[2]-60*nV), nBr := 7, nHv := nBz, nHt := nBz //*0.8
   LOCAL nZeiF := nBo, nZeiT := nBo, aPosT, aSizeT, aPosF, aSizeF
   LOCAL aPPSle := { { XBP_PP_FGCLR       , GRA_CLR_BLACK    } , ;
                     { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } }     //24.03.2008 17:02, ;
//                     { XBP_PP_COMPOUNDNAME, IIf(nV>1.5,"12.Arial",IIf(nV>1,"10.Arial","8.Arial")) } }
//   LOCAL aPPTxt := { { XBP_PP_FGCLR       , GRA_CLR_BLACK    } , ;
//                     { XBP_PP_BGCLR       , XBPSYSCLR_DIALOGBACKGROUND } , ;
//                     { XBP_PP_COMPOUNDNAME, IIf(nV>1.5,"12.Arial",IIf(nV>1,"10.Arial","8.Arial")) } }
   LOCAL nOldArea := SELECT(), i, j, y, cFeld, cText, nSpa, nZei // !TEST
   LOCAL nFA := IIf(Upper(AppName())$"BERGX.EXE",70,100), nZ4:=0
   LOCAL aPPTxt := { { XBP_PP_FGCLR       , GRA_CLR_BLACK    } , ;
                     { XBP_PP_BGCLR       , XBPSYSCLR_DIALOGBACKGROUND } }
   PRIVATE bT, cB, cF, xF

   DEFAULT aPP TO {{ XBP_PP_COMPOUNDNAME, IIf(nV>1.5,"12.Arial",IIf(nV>1,"10.Arial","8.Arial")) }}
   AEval( aPP, {|a,x| AAdd(aPPTxt,a) } ) //23.03.2008 18:05
   AEval( aPP, {|a,x| AAdd(aPPSle,a) } ) //24.03.2008 17:02

////////**23.03.2008 12:16://///////////////////////////////////
//////   IF cBfont != NIL
//////      IIf(Val(cBfont)>5, aPPTxt := {{ XBP_PP_COMPOUNDNAME, Trim(cBfont) }}, ;
//////                           cBfont := IIf(nV>1.5,"12.Arial",IIf(nV>1,"10.Arial","8.Arial")) ) 
//////   ENDIF
//////   DEFAULT aPP TO aPPTxt
////////**

////   ::aParam := aParamG
   FOR j := 1 TO Len(::aParam)
      ::aBlattZ := ::aParam[j]
      AAdd( ::aSeiteP, ::aBlattZ[1], j )
      AAdd( ::aNaP, ::aBlattZ[2], j )
      AAdd( ::aPromptP, ::aBlattZ[3], j )
      AAdd( ::aTextP, ::aBlattZ[4], j )
      AAdd( ::aTFontP, ::aBlattZ[5], j )
      AAdd( ::aBereichP, ::aBlattZ[6], j )
      AAdd( ::aFeldP, ::aBlattZ[7], j )         // Feldbezeichnung
      AAdd( ::aFFontP, ::aBlattZ[8], j )
      AAdd( ::aZeiP, ::aBlattZ[9], j )
      AAdd( ::aSpaP, ::aBlattZ[10], j )
      IF j > 1
          nZei := IIf( ::aZeiP[j] < -1, -1, IIf(::aZeiP[j]=0, -1, ::aZeiP[j] ) )
                  //IIf( ::aBlattZ[9]<1, nZei - ::aBlattZ[9], ::aBlattZ[9] )
          nSpa := IIf( ::aBlattZ[10]<1, (nSpa + Len(Trim(::aTextP[j-1])) ;
                               + Len(Trim(::aFeldP[j-1])) - ::aBlattZ[10]), ::aBlattZ[10] )
      ELSE
         nZei := IIf( ::aZeiP[j] > 2, 2, IIf( ::aZeiP[j] < 1, 1, ::aZeiP[j]) )
         nSpa := ::aSpaP[j]
      ENDIF
      IF Upper( ::aSeiteP[j] ) = "P" .AND. ::aZeiP[j] > 0
//    zuerst kommt der Prompt-Text :
         aSizeT := ::BEArea[2]:currentSize()
         nZeiF := IIf( nZei < 1, nZeiF+nHv*nZei, aSizeT[2]-nHv-IIf(Len(::aParam)>20,1,1.5)*nHv*nZei )
         aPosF := {Int(0), nZeiF} ; aSizeF := {aSizeT[1]*.2,Int(nHv)}
         AAdd( ::TextZeile, MStatic():new( ::BEArea[2], , aPosF, aSizeF, aPPTxt,, ;
                                             XBPSTATIC_TYPE_TEXT, Trim(::aPromptP[j]) ) )
         ++::TZNr
         IIf( nV<=1, ::TextZeile[::TZNr]:setFontCompoundName( "8.Arial" ), )
//         ::XbpStatic:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_LEFT
         ::TextZeile[::TZNr]:create(::BEArea[2], , aPosF, aSizeF, aPPTxt,, ;
                                             XBPSTATIC_TYPE_TEXT, Trim(::aPromptP[j]) ) //23.03.2008 22:53
//    ...und dann der Eingabe-Sle :
////            ::aTextP[j] := IIf(SET(43)==0,ConvToAnsiCP(::aTextP[j]),::aTextP[j])
            ::aTextP[j] := PadR( ::aTextP[j], nFA )
         aPosF := {aSizeT[1]*.2, nZeiF} ; aSizeF := {aSizeT[1]*.78,Int(nHv)}
//         AAdd( ::SingleZeile, MGetX():new( ::BEArea[2], , aPosF, aSizeF, aPPSle,, ;
//                                             0, nFA, , , ;
//                                             , , , ::aTextP, j ) )
            AAdd( ::SingleZeile, MGetXR():new( ::BEArea[2], , aPosF, aSizeF, aPPSle,, ;
                                                @::aTextP[j], nFa, .T.,  , ;
                                                , , , , nA ) )
         ++::SZNr
         ::SingleZeile[::SZNr]:cargo := Trim(::aFeldP[j])
         ::SingleZeile[::SZNr]:clipSiblings := .F.
         ::SingleZeile[::SZNr]:trigger := ::aSpaP[j]  // normalerweise=0 - 16.07.2006 10:41
// >>>>>>>>>> Variable p wird erzeugt, wenn ParameterUpdate erfolgt ist.
///////////////////////////////////////////////////////////////////////////////////////////////
// bisher war ::aSpaP[j] IMMER Null ! Wenn :trigger!=0 , dann existiert auch oBest:TxBdX 
// wenn :changed() und :trigger>0, dann suche Text zu der neuen Eingabe: 
         ::SingleZeile[::SZNr]:killInputFocus := {|mp1,mp2,obj| DeHiliteSle( obj ), ;
               IIf( obj:changed(), ;
               {IIf(obj:trigger > 0, ; 
                  &( "oEdit:TxBd" + Str(obj:trigger-1,IIf(obj:trigger<11,1,2))):=::Such(obj),), ;
               ::Vorschau:ParUpdate(), p:=1, ::Vorschau:UPDATE()}, ;
               ) }  // ::Such neu 15.07.2006 22:43 
//////////////////////////////////////////////////////////////////////////////////////////////
         ::SingleZeile[::SZNr]:CREATE(::BEArea[2], , aPosF, aSizeF, aPPSle,, ;
                                                @::aTextP[j], nFa, .T.,  , ;
                                                , , , , nA ):setdata()
         ::addEditControl( ::SingleZeile[::SZNr] )
      ELSE
         nZei := ++nZ4
//    zuerst kommt der Prompt-Text :
         aSizeT := ::BEArea[2]:currentSize()
         nZeiF := IIf( nZei < 1, nZeiF+nHv*nZei, aSizeT[2]-nHv-IIf(Len(::aParam)>20,1,1.5)*nHv*nZei )
         aPosF := {Int(0), nZeiF} ; aSizeF := {aSizeT[1]*.2,Int(nHv)}
         AAdd( ::TextZeile, MStatic():new( ::BEArea[4], , aPosF, aSizeF, aPPTxt,, ;
                                             XBPSTATIC_TYPE_TEXT, Trim(::aPromptP[j]) ) )
         ++::TZNr
         IIf( nV<=1, ::TextZeile[::TZNr]:setFontCompoundName( "8.Arial" ), )
//         ::XbpStatic:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_LEFT
         ::TextZeile[::TZNr]:create( ::BEArea[4], , aPosF, aSizeF, aPPTxt,, ;
                                             XBPSTATIC_TYPE_TEXT, Trim(::aPromptP[j]) )
//    ...und dann der Eingabe-Sle :
////            ::aTextP[j] := IIf(SET(43)==0,ConvToAnsiCP(::aTextP[j]),::aTextP[j])
            ::aTextP[j] := PadR( ::aTextP[j], nFA )
         aPosF := {aSizeT[1]*.2, nZeiF} ; aSizeF := {aSizeT[1]*.78,Int(nHv)}
//         AAdd( ::SingleZeile, MGetX():new( ::BEArea[4], , aPosF, aSizeF, aPPSle,, ;
//                                             0, nFA, , , ;
//                                             , , , ::aTextP, j ) )
            AAdd( ::SingleZeile, MGetXR():new( ::BEArea[4], , aPosF, aSizeF, aPPSle,, ;
                                                @::aTextP[j], nFa, .T.,  , ;
                                                , , , , nA ) )
         ++::SZNr
         ::SingleZeile[::SZNr]:clipSiblings := .F.
         ::SingleZeile[::SZNr]:killInputFocus := {|mp1,mp2,obj| DeHiliteSle( obj ), IIf( obj:changed(), ;
                                       {::Vorschau:ParUpdate(), p:=1, ::Vorschau:UPDATE()},) }  //12.05.2006 19:02
         ::SingleZeile[::SZNr]:CREATE( ::BEArea[4], , aPosF, aSizeF, aPPSle,, ;
                                                @::aTextP[j], nFa, .T.,  , ;
                                                , , , , nA ):setdata()
         ::addEditControl( ::SingleZeile[::SZNr] )
      ENDIF
   NEXT
   ::LeditC := Len(::editControls)
   nZeiF := nBo   // 24.08.2004, nZeiT wird hier gar nicht gebraucht
//   ::aBlatt := aBlattG
   FOR i := 1 TO Len(::aBlatt)
      ::aBlattZ := ::aBlatt[i]
      AAdd( ::aSeite, ::aBlattZ[1], i )
      AAdd( ::aNa, ::aBlattZ[2], i )
      AAdd( ::aPrompt, ::aBlattZ[3], i )
      AAdd( ::aText, ::aBlattZ[4], i )
      AAdd( ::aTFont, ::aBlattZ[5], i )
      AAdd( ::aBereich, ::aBlattZ[6], i )
      AAdd( ::aFeld, ::aBlattZ[7], i )         // Feldbezeichnung
      AAdd( ::aFFont, ::aBlattZ[8], i )
      AAdd( ::aZei, ::aBlattZ[9], i )
      AAdd( ::aSpa, ::aBlattZ[10], i )
      IF i > 1 .AND. nZeiF!=nBo // 24.8.2004
         nZei := IIf( ::aZei[i] < 0, -1, IIf(::aZei[i]=0, -1, ::aZei[i]) )
////// 24.08.2004   nSpa := IIf( ::aBlattZ[10]<1, (nSpa + Len(Trim(::aText[i-1])) ;
//////                               + Len(Trim(::aFeld[i-1])) - ::aBlattZ[10]), ::aBlattZ[10] )
      ELSE
         nZei := IIf( ::aZei[i] > 1, 1, ::aZei[i] )
//////         nSpa := ::aSpa[i]
      ENDIF
      DO CASE
       CASE Upper( ::aSeite[i] ) = "R" .OR. Upper( ::aSeite[i] ) = "V" .OR. ::aSeite[i] = "2" ;
                        .OR. Upper( ::aSeite[i] ) = "K"
//      keine Žnderungen, wenn es sich um "Rechnungszeilen" handelt
         ::addEditControl( ::aFeld[i] )
       CASE ::aNa[i] = "t"    // erzeugt ein Sle fr eine Textzeile
//    zuerst kommt der Prompt-Text :
         aSizeT := ::BEArea[3]:currentSize()
         nZeiF := IIf( nZei < 1, nZeiF+nHt*nZei, aSizeT[2]-nHt-1.5*nHt*nZei )
         aPosF := {Int(0), nZeiF} ; aSizeF := {aSizeT[1]*.2,Int(nHt)}
         AAdd( ::TextZeile, MStatic():new( ::BEArea[3], oOwner, aPosF, aSizeF, aPPTxt,, ;
                                             XBPSTATIC_TYPE_TEXT, Trim(::aPrompt[i]) ) )
         ++::TZNr
         IIf( nV<=1, ::TextZeile[::TZNr]:setFontCompoundName( "8.Arial" ), )
//         ::XbpStatic:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_LEFT
         ::TextZeile[::TZNr]:create( ::BEArea[3], oOwner, aPosF, aSizeF, aPPTxt,, ;
                                             XBPSTATIC_TYPE_TEXT, Trim(::aPrompt[i]) )

//////         aSizeT := ::BEArea[3]:currentSize()
//////         nZeiF := IIf( nZei < 1, nZeiF+nHv*nZei, aSizeT[2]-nHv-1.5*nHv*nZei )
         aPosF := {aSizeT[1]*.2, nZeiF} ; aSizeF := {aSizeT[1]*.78,Int(nHt)}

////         ::aText[i] := IIf(SET(43)==0,ConvToAnsiCP(::aText[i]),::aText[i])
         ::aText[i] := PadR( ::aText[i], nFA )
//         nZeiF := IIf( nZei < 1, nZeiF+nHv*nZei, nBo+nHv-nHv*nZei )
//         aPosF := {Int(nSpa*nBr*nV), nZeiF} ; aSizeF := {Int(Len(xF:=::aText[i])*nBr),Int(15*nV)}
//         AAdd( ::SingleZeile, MGetX():new( ::BEArea[3], oOwner, aPosF, aSizeF, aPPSle,, ;
//                                             0, nFA, , , ;
//                                             , , , ::aText, i ) )
            AAdd( ::SingleZeile, MGetXR():new( ::BEArea[3], , aPosF, aSizeF, aPPSle,, ;
                                                @::aText[i], nFa, .T.,  , ;
                                                , , , , nA ) )
         ++::SZNr
         ::SingleZeile[::SZNr]:clipSiblings := .F.
         ::SingleZeile[::SZNr]:cargo := ::vorschau
         ::SingleZeile[::SZNr]:killInputFocus := {|mp1,mp2,obj| DeHiliteSle( obj ), ;
                                                obj:getData(), obj:cargo:UPDATE() }
         ::SingleZeile[::SZNr]:CREATE( ::BEArea[3], , aPosF, aSizeF, aPPSle,, ;
                                                @::aText[i], nFa, .T.,  , ;
                                                , , , , nA ):setdata()
         ::addEditControl( ::SingleZeile[::SZNr] )
       CASE ::aNa[i] = "f"    // erzeugt ein Sle fr eine Feldzeile
//    zuerst kommt der Prompt-Text :
         aSizeT := ::BEArea[3]:currentSize()
         nZeiF := IIf( nZei < 1, nZeiF+nHt*nZei, aSizeT[2]-nHt-1.5*nHt*nZei )
         aPosF := {Int(0), nZeiF} ; aSizeF := {aSizeT[1]*.2,Int(nHt)}
         AAdd( ::TextZeile, MStatic():new( ::BEArea[3], oOwner, aPosF, aSizeF, aPPTxt,, ;
                                             XBPSTATIC_TYPE_TEXT, Trim(::aPrompt[i]) ) )
         ++::TZNr
         IIf( nV<=1, ::TextZeile[::TZNr]:setFontCompoundName( "8.Arial" ), )
//         ::XbpStatic:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_LEFT
         ::TextZeile[::TZNr]:create( ::BEArea[3], oOwner, aPosF, aSizeF, aPPTxt,, ;
                                             XBPSTATIC_TYPE_TEXT, Trim(::aPrompt[i]) )
//////         cB := ::aBereich[i] ; cF := ::aFeld[i]
//////         xF := ( (&cB)->(&cF) )      //Feldinhalt
//////         DO CASE
//////            CASE Valtype( xF ) == "C"
//////               ::aFeld[i] := xF
//////            CASE ValType( xF ) == "N"
//////               ::aFeld[i] := Str( xF )
//////            CASE ValType( xF ) == "D"
//////               ::aFeld[i] := DtoC( xF )
//////         ENDCASE
//         nZeiF := IIf( nZei < 1, nZeiF+nHt*nZei, nBo+nHv-nHv*nZei )
//         aPosF := {Int(nSpa*nBr*nV), nZeiF} ; aSizeF := {Int(Len(xF:=::aFeld[i])*nBr),Int(15*nV)}
         ::aFeld[i] := PadR( ::aFeld[i], nFA )
         aPosF := {aSizeT[1]*.2, nZeiF} ; aSizeF := {aSizeT[1]*.78,Int(nHt)}
            AAdd( ::SingleZeile, MGetXR():new( ::BEArea[3], , aPosF, aSizeF, aPPSle,, ;
                                                @::aFeld[i], nFa, .T.,  , ;
                                                , , , , nA ) )
         ++::SZNr
         ::SingleZeile[::SZNr]:clipSiblings := .F.
         ::SingleZeile[::SZNr]:cargo := ::vorschau
         ::SingleZeile[::SZNr]:killInputFocus := {|mp1,mp2,obj| DeHiliteSle( obj ), ;
                                                obj:getData(), obj:cargo:UPDATE() }
         ::SingleZeile[::SZNr]:CREATE( ::BEArea[3], , aPosF, aSizeF, aPPSle,, ;
                                                @::aFeld[i], nFa, .T.,  , ;
                                                , , , , nA ):setdata()
         ::addEditControl( ::SingleZeile[::SZNr] )
//------------
       CASE ::aNa[i] = "M"    // erzeugt ein Mle fr einen Text
//    zuerst kommt der Prompt-Text :
         aSizeT := ::BEArea[3]:currentSize()
         nZeiF := IIf( nZei < 1, nZeiF+nHt*nZei, aSizeT[2]-nHt-1.5*nHt*nZei )
         aPosF := {Int(0), nZeiF} ; aSizeF := {aSizeT[1]*.2,Int(nHt)}
         AAdd( ::TextZeile, MStatic():new( ::BEArea[3], oOwner, aPosF, aSizeF, aPPTxt,, ;
                                             XBPSTATIC_TYPE_TEXT, Trim(::aPrompt[i]) ) )
         ++::TZNr
         IIf( nV<=1, ::TextZeile[::TZNr]:setFontCompoundName( "8.Arial" ), )
         ::TextZeile[::TZNr]:create( ::BEArea[3], oOwner, aPosF, aSizeF, aPPTxt,, ;
                                             XBPSTATIC_TYPE_TEXT, Trim(::aPrompt[i]) )

         ::aFeld[i] := PadR( ::aFeld[i], nFA )
         cF := ::aFeld[i]
         nZeiF := nZeiF+(::aTFont[i]-1)*nHt*nZei
         aPosF := {aSizeT[1]*.2, nZeiF} ; aSizeF := {aSizeT[1]*.78,::aTFont[i]*Int(nHt)}
            AAdd( ::MultiZeile, MMleXR():new( ::BEArea[3], , aPosF, aSizeF, aPPSle,, ;
                                                @&cF, nFa, .T., , ;
                                                , , , , nA ) )
            ++::MZNr
            ::MultiZeile[::MZNr]:cargo := ::vorschau
            ::MultiZeile[::MZNr]:killInputFocus := {|mp1,mp2,obj| DeHiliteSle( obj ), ;
                                                obj:getData(), obj:cargo:UPDATE() }
            ::MultiZeile[::MZNr]:CREATE( ::BEArea[3], , aPosF, aSizeF, aPPSle,, ;
                                                @&cF, nFa, .T., , ;
                                                , , , , nA )   //1.1.2005###################:setData()
//            ::MultiZeile[::MZNr]:helpLink := MagicHelpLabel():New(sv->FIELD_DEC)
//            ::MultiZeile[::MZNr]:setName( y )
            ::addEditControl( ::MultiZeile[::MZNr] )


       CASE ::aNa[i] = "v"    // erzeugt ein Sle fr eine Variablen/Feldzeile
//    zuerst kommt der Prompt-Text :
         aSizeT := ::BEArea[3]:currentSize()
         nZeiF := IIf( nZei < 1, nZeiF+nHt*nZei, aSizeT[2]-nHt-1.5*nHt*nZei )
         aPosF := {Int(0), nZeiF} ; aSizeF := {aSizeT[1]*.2,Int(nHt)}
         AAdd( ::TextZeile, MStatic():new( ::BEArea[3], oOwner, aPosF, aSizeF, aPPTxt,, ;
                                             XBPSTATIC_TYPE_TEXT, Trim(::aPrompt[i]) ) )
         ++::TZNr
         IIf( nV<=1, ::TextZeile[::TZNr]:setFontCompoundName( "8.Arial" ), )
//         ::XbpStatic:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_LEFT
         ::TextZeile[::TZNr]:create( ::BEArea[3], oOwner, aPosF, aSizeF, aPPTxt,, ;
                                             XBPSTATIC_TYPE_TEXT, Trim(::aPrompt[i]) )
////         ::aFeld[i] := IIf(SET(43)==0,ConvToAnsiCP(::aFeld[i]),::aFeld[i])
         cF := ::aFeld[i]
         xF := PadR( &(cF), nFA )      //Variableninhalt
         DO CASE
            CASE xF == NIL
               ::aFeld[i] := "&(" + cF + ")"
            CASE Valtype( xF ) == "C"
               ::aFeld[i] := xF
            CASE ValType( xF ) == "N"
               ::aFeld[i] := Str( xF )
            CASE ValType( xF ) == "D"
               ::aFeld[i] := DtoC( xF )
         ENDCASE
        IF xF != NIL
//         nZeiF := IIf( nZei < 1, nZeiF+nHv*nZei, nBo+nHv-nHv*nZei )
//         aPosF := {Int(nSpa*nBr*nV), nZeiF} ; aSizeF := {Int(Len(xF:=::aFeld[i])*nBr),Int(15*nV)}
         ::aFeld[i] := PadR( ::aFeld[i], nFA )
         aPosF := {aSizeT[1]*.2, nZeiF} ; aSizeF := {aSizeT[1]*.78,Int(nHt)}
//////            AAdd( ::SingleZeile, MGet():new( ::BEArea[3], oOwner, aPosF, aSizeF, aPPSle,, ;
//////                                                @&cF, nFA, .F., , ;
//////                                                , , , , nA ) )
//         AAdd( ::SingleZeile, MGetX():new( ::BEArea[3], oOwner, aPosF, aSizeF, aPPSle,, ;
//                                             0, nFA, , , ;
//                                             , , , ::aFeld, i ) )
            AAdd( ::SingleZeile, MGetXR():new( ::BEArea[3], , aPosF, aSizeF, aPPSle,, ;
                                                @::aFeld[i], nFa, .T.,  , ;
                                                , , , , nA ) )
         ++::SZNr
         ::SingleZeile[::SZNr]:clipSiblings := .F.
         ::SingleZeile[::SZNr]:cargo := ::vorschau
         ::SingleZeile[::SZNr]:killInputFocus := {|mp1,mp2,obj| DeHiliteSle( obj ), ;
                                                obj:getData(), obj:cargo:UPDATE() }
         ::SingleZeile[::SZNr]:CREATE( ::BEArea[3], , aPosF, aSizeF, aPPSle,, ;
                                                @::aFeld[i], nFa, .T.,  , ;
                                                , , , , nA ):setdata()
         ::addEditControl( ::SingleZeile[::SZNr] )
        ELSE
         ::addEditControl( ::aFeld[i] )
        ENDIF
       CASE !Empty( xF := ::aText[i] )
//////         nZeiF := IIf( nZei < 1, nZeiF+nHt*nZei, nBo+nHt-nHt*nZei )
//////         aPosF := {Int(nSpa*nBr*nV), nZeiF} ; aSizeF := {Int(Len(xF:=Trim(::aText[i]))*nBr),Int(15*nV)}
//////         AAdd( ::TextZeile, MStatic():new( ::BEArea[::BENr], oOwner, aPosF, aSizeF, aPPTxt,, ;
//////                                             XBPSTATIC_TYPE_TEXT, Trim(::aText[i]) ) )
//////         ++::TZNr
//////         IIf( nV<=1, ::TextZeile[::TZNr]:setFontCompoundName( "8.Arial" ), )
////////         ::XbpStatic:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_LEFT
//////         ::TextZeile[::TZNr]:create()
         ::addEditControl( ::aText[i] )
       CASE !Empty( xF := ::aFeld[i] )
         IF ::aNa[i] != "v" .AND. ::aBereich[i] = "v" // im aFeld steht Mem-Variable
            cF := ::aFeld[i]
            ::aFeld[i] := "&(" + cF + ")"
         ELSE
            cB := ::aBereich[i] ; cF := ::aFeld[i]
            ::aFeld[i] := ((&cB)->(&cF))          //Feldinhalt
         ENDIF
//////         IF ValType( ::aFeld[i] ) != "M"
//////            nZeiF := IIf( nZei < 1, nZeiF+nHt*nZei, nBo+nHt-nHt*nZei )
//////            aPosF := {Int(nSpa*nBr*nV), nZeiF} ; aSizeF := {Int(Len(xF:=Trim(::aFeld[i]))*nBr),Int(15*nV)}
//////            AAdd( ::TextZeile, MStatic():new( ::BEArea[::BENr], oOwner, aPosF, aSizeF, aPPTxt,, ;
//////                                                XBPSTATIC_TYPE_TEXT, Trim(::aFeld[i]) ) )
//////            ++::TZNr
//////            IIf( nV<=1, ::TextZeile[::TZNr]:setFontCompoundName( "8.Arial" ), )
////////            ::XbpStatic:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_LEFT
//////            ::TextZeile[::TZNr]:create()
            ::addEditControl( ::aFeld[i] )
//////         ENDIF
         OTHERWISE
            ::addEditControl( ::aFeld[i] )
      ENDCASE
      ::aBlatt[i] := { ::aSeite[i], ::aNa[i], ::aPrompt[i], ;
                  ::aText[i], ::aTFont[i], ::aBereich[i], ;
                  ::aFeld[i], ::aFFont[i], ::aZei[i], ::aSpa[i] }
   NEXT
////////////   SELECT &nOldArea  // wohl berflssig??
//????
   DBRegisterClient(self)     // wozu, wenn wir aus dem Array arbeiten?
//????
RETURN self

METHOD BlattFA:destroy( nA )
//??????   (nA)->(DbDeregisterClient())
   ASize( ::BEArea, 0 )
   ::BENr := 0
//////   ASize( ::BrowseFeld, 0 )
//////   ::BFNr := 0
//   ASize( ::BVariable, 0 )
//   ::BVNr := 0
   ASize( ::GruppenBox, 0 )
   ::GBNr := 0
   ASize( ::TextZeile, 0 )
   ::TZNr := 0
   ASize( ::DruckKnopf, 0 )
   ::DKNr := 0
//////   ASize( ::MultiZeile, 0 )
//////   ::MZNr := 0
   ASize( ::SingleZeile, 0 )
   ::SZNr := 0
   ASize( ::editControls, 0 )
   ASize( ::appendControls, 0 )
   ASize( ::keyControls, 0 )
   ::keyboardBlock   := {|nKey,x,obj| 0 }
   ASize( ::aBlatt, 0 )
   ASize( ::aParam, 0 )
   ASize( ::aBlattZ, 0 )
   ASize( ::aSeite, 0 )
   ASize( ::aNa, 0 )
   ASize( ::aPrompt, 0 )
   ASize( ::aText, 0 )
   ASize( ::aTFont, 0 )
   ASize( ::aBereich, 0 )
   ASize( ::aFeld, 0 )
   ASize( ::aFFont, 0 )
   ASize( ::aZei, 0 )
   ASize( ::aSpa, 0 )
RETURN self

METHOD BlattFA:addEditcontrol( oXbp )
   IF ValType( oXbp ) = "O"
      IF AScan( ::editControls, oXbp ) == 0

         AAdd(  ::editControls, oXbp )
         ::addKeyControl( oXbp )
      ENDIF
   ELSE
      AAdd(  ::editControls, oXbp )
   ENDIF
RETURN self

METHOD BlattFA:addAppendControl( oXbp )
   IF AScan( ::appendControls, oXbp ) == 0
      AAdd(  ::appendControls, oXbp )
      ::addKeyControl( oXbp )
   ENDIF
RETURN self

METHOD BlattFA:addKeyControl( oXbp )
   IF AScan( ::keyControls, oXbp ) == 0
      AAdd(  ::keyControls, oXbp )
      oXbp:keyBoard := ::keyboardBlock
   ENDIF
RETURN self

// zum Suchen nach Texten in der Vorschau (fr Trauerkarten-Druck)   16.07.2006 10:14
// (erweiterte Version der Spruchsuche (siehe in BlattDrVG)
METHOD BlattFA:Such( oSE, oDlg1, cProg, nAnf, nEnd, nA, nRec, aPos, ASize, aPP, cTitel, cS, cDatei )
   LOCAL oDlg, nEvent, mp1, mp2, oXbp, oBrowse, cText := ""
   LOCAL nOldArea := Select(), oFocus := SetAppFocus(), oFoc
   LOCAL lFlucht := .F.
   PRIVATE oCB
   DEFAULT oDlg1 TO oVODA
   DEFAULT cProg TO "s_dru"
   DEFAULT nAnf TO 900, nEnd TO 999, nA TO 25, nRec TO RecNo()
   DEFAULT aPos TO {10*nH,30*nV} , ASize TO {int(400*nH),int(250*nV)}
   DEFAULT cTitel TO "Text ausw„hlen <ENTER> (<ESC> = zurck) :"
   DEFAULT cS TO Upper(Trim(oSE:getData()))
   DEFAULT cDatei TO "TextSymb"

   IF cS = "-"    // 20.09.2006 17:02 damit in TKarten leere Streifen erzeugt werden k”nnen
      RETURN "-"
   ENDIF   
//   DbSuspendNotifications()
   SELECT(nA)
   IF Val(cS) = 0          // wenn nach einem Textteil gesucht wird
      (nA)->(DbSetFilter( {|| cS$Upper((nA)->text) } ))
      IIf( !(nA)->(Bof()), (nA)->(DbGotop()), )
   ELSE                    // wenn nach einer TextNr gesucht wird
      (nA)->(DbSeek( cS, .T. ))
      IF Val(cS) < Val((nA)->textnr)
         (nA)->(DbSkip(-1))
      ENDIF
   ENDIF
   
   oDlg := AKDialog():new( AppDesktop(), oDlg1:cargo )
   oDlg:tasklist := .T.
   oDlg:title := cTitel
   oDlg:maxButton := .F.
   oDlg:border := XBPDLG_RAISEDBORDERTHIN_FIXED
   oDlg:create(,, aPos, ASize )

   oDlg:drawingArea:setColorBG( GRA_CLR_DARKCYAN )
   oCB := oDlg:drawingArea
   oCB:cargo := oDlg

// jetzt folgt die Erzeugung der Eingabefelder
   oBrowse := DialogFF():new( oCB,oDlg, , ,,, nBz, cProg, nAnf, nEnd, nA )
   oBrowse:Fancy := ""
   oBrowse:VArea := nA
   oBrowse:BEArea := {}
   AAdd( oBrowse:BEArea, oCB )
   oBrowse:BENr := Len( oBrowse:BEArea )
   oBrowse:CREATE( oCB,oDlg, , ,aPP,, nBz, cProg, nAnf, nEnd, nA )
// bis hierhin geht die Erzeugung der Eingabefelder
   AEval( oBrowse:editControls, {|x| oDlg:addEditControl( x ) } )

   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 == xbeBRW_ItemSelected
            PostAppEvent( xbeP_Close)
      ENDIF
      IF nEvent == xbeP_Keyboard
      DO CASE
         CASE mp1 >= Asc(" ") .and. mp1 <= Asc("z")
            cSuchWort += Chr(mp1)
            DbSeek( Upper(cSuchWort), .T. )
            IF !Found()
               DbSkip(-1)
            ENDIF
            oBrowse:BrowseFeld[1]:refreshAll()
         CASE mp1 == xbeK_RETURN .or. mp1 == xbeK_F10
            PostAppEvent( xbeP_Close)
         CASE mp1 == xbeK_ESC
            lFlucht := .T.
            PostAppEvent( xbeP_Close)
         CASE mp1 == xbeK_CTRL_DEL
            oFoc := SetAppFocus()
            IF ConfirmBox( oDlg1, "Soll der Datensatz wirklich gel”scht werden?", ;
                                 "Datensatz l”schen!", ;
                                 XBPMB_YESNO, ;
                                 XBPMB_QUESTION, ;
                                 XBPMB_DEFBUTTON2 ) == XBPMB_RET_YES
               Satzsp( oCB )
               (nA)->(DbDelete())
               IF !(nA)->(Bof())
                  (nA)->(DbSkip(-1))              // 21.6.2005 zum Test
               ENDIF
               nRec := RecNo()
               oBrowse:BrowseFeld[1]:refreshAll()
            ENDIF
            SetAppFocus(oFoc)
      ENDCASE
      ENDIF
      oXbp:handleEvent( nEvent, mp1, mp2 )
   ENDDO
   oDlg:setModalState( XBP_DISP_MODELESS )
   oDlg:destroy()
   IF lFlucht = .F.
      oSE:setData( (nA)->textnr + "  |  " + PadR((nA)->text,40) ) // wird in Param-Tab angezeigt
      IF oSE:trigger < 11
         (nA)->(DbClearFilter())
         (nA)->(DbSetScope( SCOPE_BOTH, (nA)->textnr ))
         (nA)->(DbEval({|| cText += Trim((nA)->text+CRLF)}))   // setzt den Spruch zusammen
         (nA)->(DbClearScope())
         cText := Stuff(cText,Len(cText)-1,2,"  ")    // damit letztes CRLF verschwindet
      ELSE
         cText := (nA)->bild     //22.07.2006 16:23
      ENDIF
   ELSE
      (nA)->(DbClearFilter())
      cText := ""
   ENDIF
   SELECT (nOldArea)
//   DbResetNotifications()
//   (nA)->(DbSkip(0))
   SetAppFocus( oFocus )
RETURN cText

//------------------------------------------
//------------------------------------------
CLASS MGTStatic from XbpStatic, DataRef
   EXPORTED:
    VAR Font
    VAR Farbe
    VAR Winkel
    
    METHOD  Init
    METHOD  CREATE
    METHOD  Malen
ENDCLASS

METHOD MGTStatic:Init( oParent, oOwner, aPos, aSize, aPP, lVisible, nType, cText, nWinkel, lClip )
   //+ Textausrichtung durch ::options erzeugen:
   LOCAL nOptions := IIf( nType = NIL .OR. nType = XBPSTATIC_TYPE_TEXT, ;
                           IIf(cText="<",XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_LEFT, ;
                           IIf(cText="^",XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_CENTER, ;
                           XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT)), XBPSTATIC_FRAMETHIN ) //01.06.2008 15:06
   LOCAL aPPG := { { XBP_PP_FGCLR       , GRA_CLR_BLACK    } , ;
                   { XBP_PP_BGCLR       , XBPSYSCLR_DIALOGBACKGROUND } , ;
                   { XBP_PP_COMPOUNDNAME, cBFont } }                       //+ Public-Font
   LOCAL cFont := aPPG[3,2]   //+ wenn aPP keinen Font beinhaltet und fr GROUPBOX-Font
   DEFAULT aPos TO {0,0}, ASize TO oParent:currentsize()
   DEFAULT cText TO ""
   DEFAULT nType TO XBPSTATIC_TYPE_TEXT
   DEFAULT nWinkel TO 0    //+ fr alle F„lle: waagrecht
   DEFAULT aPP TO aPPG     //+ fr alle F„lle...
   DEFAULT lClip TO .T.    //+ fr alle F„lle

   //+ Font aus dem aPP gewinnen:
      AEval( aPP, {|a,i| ::Font := IIf(a[1]==XBP_PP_COMPOUNDNAME,a[2],::Font) } )
      ::Font := IIf( ::Font!=NIL, ::Font, aPPG[3,2] )    //+ fr alle F„lle
   //+ Farbe aus dem aPP gewinnen:
      AEval( aPP, {|a,i| ::Farbe := IIf(a[1]==XBP_PP_FGCLR,a[2],::Farbe) } )
      ::Farbe := IIf( ::Farbe!=NIL, ::Farbe, aPPG[1,2] )    //+ fr alle F„lle

////   //+ Font aus dem aPP gewinnen oder cBFont verwenden:
////      AEval( aPP, {|a,i| cFont := IIf(a[1]==XBP_PP_COMPOUNDNAME,a[2],cFont) } )
////   //+ zweiter COMPOUNDNAME berschreibt ggf. den ersten (fr GROUPBOX 2pt kleiner):
////      IIf( nType = XBPSTATIC_TYPE_GROUPBOX, AAdd ( aPP, { XBP_PP_COMPOUNDNAME, ;
////                        Stuff( cFont, 1, At(".",cFont)-1, LTrim(Str(Val(cFont)-2,2,0) ) ) } ), ;
////                        AAdd ( aPP, { XBP_PP_COMPOUNDNAME, cFont } ) )
   //+ Ausrichtungszeichen entfernen:
      cText := IIf( Len(cText)>0 .AND. cText[1]$"<^>", SubStr(cText,2), cText )
   
   //+ STATIC initialisieren:
      ::XbpStatic:init( oParent, oOwner, aPos, aSize, aPP, lVisible )
   //+ Art der STATIC: Text oder Bitmap oder GroupBox oder Fl„che (mit Rahmen):   
      ::TYPE := nType
   //+ der angezeigte Text:
      ::caption := IIf(SET(43)==0 .AND. ValType(cText)=="C",ConvToAnsiCP(cText),cText)
   //+ der Winkel, in dem der Text angezeigt wird:
      ::winkel := nWinkel
   //+ Font aus dem aPP gewinnen:
      AEval( aPP, {|a,i| IIf(a[1]==XBP_PP_COMPOUNDNAME,::Font := a[2],) } )
//      ::Font := IIf( ::Font!=NIL, ::Font, aPPG[3,2] )    //+ fr alle F„lle
   //+ Farbe aus dem aPP gewinnen:
      AEval( aPP, {|a,i| IIf(a[1]==XBP_PP_FGCLR,::Farbe := a[2],) } )
//      ::Farbe := IIf( ::Farbe!=NIL, ::Farbe, aPPG[1,2] )    //+ fr alle F„lle


   IF ::TYPE == XBPSTATIC_TYPE_BITMAP
      //+ a4Size ist {nX1,nY1,nX2,nY2}, also aPos und aSize in einem! :
      ::paint := {|a4Size,uNIL,o| o:Malen(a4Size) }   // Font+Farbe+Winkel kommen ber das self
   ELSE
      ::options := nOptions   // Textausrichtung bzw. Rahmendicke
   ENDIF
   //+ noch mal ausprobieren:
      ::clipSiblings := lClip
RETURN self

METHOD MGTStatic:CREATE( oParent, oOwner, aPos, aSize, aPP, lVisible )
   ::XbpStatic:create( oParent, oOwner, aPos, aSize, aPP, lVisible )
RETURN self



////****************************************************************************
//// Array Indizes fuer String-Attribute: GraSetAttrString()
////****************************************************************************
//#define  GRA_AS_COLOR                  1
//#define  GRA_AS_BACKCOLOR              2
//#define  GRA_AS_MIXMODE                3
//#define  GRA_AS_BGMIXMODE              4
//#define  GRA_AS_BOX                    5
//#define  GRA_AS_ANGLE                  6
//#define  GRA_AS_SHEAR                  7
//#define  GRA_AS_DIRECTION              8
//#define  GRA_AS_HORIZALIGN             9
//#define  GRA_AS_VERTALIGN             10
//#define  GRA_AS_EXTRA                 11
//#define  GRA_AS_BREAK_EXTRA           12
//
//#define  GRA_AS_COUNT                 12
////---------------------------------------------------------------------------
//// Ausgaberichtung fuer GRA_AS_DIRECTION von GraSetAttrString()
////---------------------------------------------------------------------------
//#define  GRA_CHDIRN_LEFTRIGHT          1
//#define  GRA_CHDIRN_TOPBOTTOM          2
//#define  GRA_CHDIRN_RIGHTLEFT          3
//#define  GRA_CHDIRN_BOTTOMTOP          4
//#define  GRA_CHDIRN_DEFAULT            GRA_CHDIRN_LEFTRIGHT
////---------------------------------------------------------------------------
//// Horizontale Ausrichtung fuer GRA_AS_HORIZALIGN von GraSetAttrString()
////---------------------------------------------------------------------------
//#define  GRA_HALIGN_LEFT               0
//#define  GRA_HALIGN_CENTER             6
//#define  GRA_HALIGN_RIGHT              2
//#define  GRA_HALIGN_STANDARD           GRA_HALIGN_LEFT
//#define  GRA_HALIGN_NORMAL             GRA_HALIGN_LEFT
////---------------------------------------------------------------------------
//// Vertikale Ausrichtung fuer GRA_AS_VERTALIGN von GraSetAttrString()
////---------------------------------------------------------------------------
//#define  GRA_VALIGN_TOP                0
//#define  GRA_VALIGN_HALF               -1
//#define  GRA_VALIGN_BASE               24 
//#define  GRA_VALIGN_BOTTOM             8 
//#define  GRA_VALIGN_STANDARD           GRA_VALIGN_BASE 
//#define  GRA_VALIGN_NORMAL             GRA_VALIGN_BASE

//// Allgemeine Presentation Parameter
//#define XBP_PP_FGCLR                   2
//#define XBP_PP_BGCLR                   4
//#define XBP_PP_HILITE_FGCLR            6
//#define XBP_PP_HILITE_BGCLR            8
//#define XBP_PP_DISABLED_FGCLR          10
//#define XBP_PP_DISABLED_BGCLR          12
//#define XBP_PP_BORDER_CLR              14
//#define XBP_PP_COMPOUNDNAME            15
//#define XBP_PP_FONT                    16
//#define XBP_PP_ACTIVE_CLR              19
//#define XBP_PP_INACTIVE_CLR            21
//#define XBP_PP_ACTIVETEXT_FGCLR        23
//#define XBP_PP_ACTIVETEXT_BGCLR        25
//#define XBP_PP_INACTIVETEXT_FGCLR      27
//#define XBP_PP_INACTIVETEXT_BGCLR      29
//#define XBP_PP_CAPTION                 50
//#define XBP_PP_ALIGNMENT               52
//#define XBP_PP_ORIGIN                  300


METHOD MGTStatic:Malen(a4Size)
   LOCAL oPS, oFont
   LOCAL aAttr := ARRAY( GRA_AS_COUNT )
   LOCAL nSegment, aMatrix
   LOCAL aPP := ::setPresParam()
//   DEFAULT nSpaG TO 10, nZeiG TO 10    // der Anfangspunkt
//   DEFAULT cFont TO aPP[8,2]
//   DEFAULT nFarbe TO GRA_CLR_WHITE
//   DEFAULT nWinkel TO 0                // waagrecht
   
   oPS := XbpPresSpace():new()
   oPS:CREATE( ::winDevice() )
   oFont := XbpFont():new(oPS)
   oFont:CREATE(::Font)
//   oFont:CREATE(aPP[8,2])        // COMPOUNDNAME

   GraSegDrawMode( oPS, GRA_DM_RETAIN )      //+zeichnet erst bei GraSegDraw()
   aMatrix := GraInitMatrix()

   nSegment := GraSegOpen(oPS)
   GraSetFont( oPS, oFont )
//   aAttr[GRA_AS_COLOR] := nFarbe
   aAttr[GRA_AS_COLOR] := ::Farbe      // aPP[1,2]     //+ FG-Farbe
   aAttr[GRA_AS_BACKCOLOR] := aPP[2,2]     //+ FG-Farbe
//   aAttr[GRA_AS_BOX] := {20,20}            //+bestimmt die Buchstaben-Ausmaáe, unabh„ngig von FontSize
//   aAttr[GRA_AS_ANGLE] := {20,20}
//   aAttr[GRA_AS_MIXMODE] := GRA_FGMIX_LEAVEALONE
   aAttr[GRA_AS_BGMIXMODE] := GRA_BGMIX_LEAVEALONE
   GraSetAttrString( oPS, aAttr )
   GraStringAt( oPS, {a4Size[1], a4Size[2]}, ::caption )
   GraSegClose(oPS)

   GraRotate( oPS, aMatrix, ::Winkel, {5,5}, GRA_TRANSFORM_ADD ) 
//   GraRotate( oPS, aMatrix, ::Winkel, {a4Size[4],a4Size[4]}, GRA_TRANSFORM_ADD ) 
   GraSegDraw( oPS, nSegment, aMatrix, GRA_TRANSFORM_ADD )

   oPS:destroy()
   oFont:destroy()
RETURN self
//**//
//------------------------------------------

CLASS MStatic from XbpStatic
   EXPORTED:
    METHOD  Init
    METHOD  CREATE
ENDCLASS

METHOD MStatic:Init( oParent, oOwner, aPos, aSize, aPP, lVisible, nType, cText )
   LOCAL nOptions := IIf( nType = NIL .OR. nType = XBPSTATIC_TYPE_TEXT, ;
                           IIf(cText="<",XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_LEFT, ;
                           IIf(cText="^",XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_CENTER, ;
                           XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT)), XBPSTATIC_FRAMETHIN ) //01.06.2008 15:06
   LOCAL aPPG := { { XBP_PP_FGCLR       , GRA_CLR_BLACK    } , ;
                  { XBP_PP_BGCLR       , XBPSYSCLR_DIALOGBACKGROUND    } } // 07.11.2005 bisher WHITE
   DEFAULT cText TO ""  //01.06.2008 15:11
   aPP := IIf( aPP=NIL, aPPG, aPP )
   IIf( nType = XBPSTATIC_TYPE_GROUPBOX, AAdd ( aPP, { XBP_PP_COMPOUNDNAME, "8.Arial kursiv" } ), )
   nType := IIf( nType = NIL, XBPSTATIC_TYPE_TEXT, nType )
   cText := IIf( Len(cText)>0 .AND. cText[1]$"<^", SubStr(cText,2), cText )   //01.06.2008 15:06
   ::XbpStatic:init( oParent, oOwner, aPos, aSize, aPP, lVisible )
   ::TYPE := nType
   ::caption := IIf(SET(43)==0 .AND. ValType(cText)=="C",ConvToAnsiCP(cText),cText)
   IF nType = XBPSTATIC_TYPE_TEXT .AND. cColor = "D"
      ::setColorBG( oParent:setColorBG() )
      ::setColorFG( GRA_CLR_YELLOW )
   ENDIF
   ::clipSiblings := .F.
   ::options := nOptions
RETURN self

METHOD MStatic:CREATE( oParent, oOwner, aPos, aSize, aPP, lVisible )
   ::XbpStatic:create( oParent, oOwner, aPos, aSize, aPP, lVisible )
RETURN self
//------------------------------------------
CLASS MGet FROM XbpSle           // NUR fr Anzeige! NICHT fr Eingabe!
   EXPORTED:
      VAR picture
      VAR killer
      METHOD INIT
      METHOD CREATE
      METHOD killInputFocus      // ak 22.3.04
ENDCLASS

METHOD MGet:INIT( oDlg1, oDlg2, aPos, aSize, aPP,lVisible, cVarR, nFa, lT, cPicture, ;
                           cTEXT, aPosT, aSizeT, aPPTxt, nA )
   LOCAL oXbp
   DEFAULT cPicture TO Trim(" ")
   
   IF !Empty( cText )
      oXbp := MStatic():new( oDlg1,, aPosT, aSizeT, aPPTxt,, XBPSTATIC_TYPE_TEXT, cText )
      oXbp:CREATE()
   ENDIF
   ::XbpSle:INIT( oDlg1, , aPos, aSize, aPP )
   ::clipSiblings := .T.
   ::tabStop := lT
   ::setInputFocus  := {|mp1,mp2,obj| HiliteSle( obj ) }
   ::killInputFocus := {|mp1,mp2,obj| DeHiliteSle( obj ) }
   ::group := XBP_WITHIN_GROUP
   ::bufferLength := nFa
//   ::editable := lT
   ::picture := cPicture
   DO CASE
      CASE ValType( cVarR ) == "C"
         ::dataLink := {|x| IIf( PCOUNT()==0, cVarR, cVarR := x ) }
      CASE ValType( cVarR ) == "N"
         ::dataLink := {|x| IIf( PCOUNT()==0, Transform(cVarR,cPicture), cVarR := Val(x) ) }
      CASE ValType( cVarR ) == "D"
         ::dataLink := {|x| IIf( PCOUNT()==0, DtoC(cVarR), cVarR := CtoD(x) ) }
      CASE ValType( cVarR ) == "L"
         ::dataLink := {|x| IIf( PCOUNT()==0, cVarR, cVarR := x ) }
   ENDCASE
   ::cargo := oXbp   //+30.08.2008 14:36 Prompt-Text huckepack als ::cargo
RETURN self

METHOD MGet:CREATE( oParent, oOwner, aPos, aSize, aPP, lVisible )
   ::XbpSle:CREATE( oParent, oOwner, aPos, aSize, aPP, lVisible )
RETURN self

METHOD MGet:killInputFocus()        // ak  22.3.04
   IF ::changed .AND. !Empty(::killer) .AND. ValType(&(::killer)) == "B"
      Eval(&(::killer),self)     // 9.4.2005
   ENDIF
   ::XbpSle:killinputfocus()
RETURN self

CLASS MGetX FROM XbpGet
   EXPORTED:
      VAR killer
      METHOD INIT
      METHOD CREATE
ENDCLASS

METHOD MGetX:INIT( oDlg1, oDlg2, aPos, aSize, aPP,lVisible, y, nFa, lT, cPicture, ;
                           cTEXT, aPosT, aSizeT, aPPTxt, nA )
   LOCAL oXbp
   IF !Empty( cText )
      oXbp := MStatic():new( oDlg1,, aPosT, aSizeT, aPPTxt,, XBPSTATIC_TYPE_TEXT, cText )
      oXbp:CREATE()
   ENDIF
   ::XbpGet:INIT( oDlg1, , aPos, aSize, aPP )
   ::clipSiblings := .T.
   ::tabStop := lT
   ::setInputFocus  := {|mp1,mp2,obj| HiliteSle( obj ) }
   ::killInputFocus := {|mp1,mp2,obj| DeHiliteSle( obj ) }
   ::group := XBP_WITHIN_GROUP
   ::bufferLength := nFa
   DO CASE
      CASE y == 0
         ::dataLink := {|x| IIf( PCOUNT()==0, aPPTxt[nA], aPPTxt[nA] := x ) }
      CASE (nA)->(FieldInfo( y, FLD_TYPE )) = "C" .AND. FIELD_TYPE == "U"
         ::dataLink := {|x| IIf( PCOUNT()==0, (nA)->&((nA)->(FieldName(y))), (nA)->&((nA)->(FieldName(y))) := Upper( x ) ) }
      CASE (nA)->(FieldInfo( y, FLD_TYPE )) = "C"
         ::dataLink := {|x| IIf( PCOUNT()==0, (nA)->&((nA)->(FieldName(y))), (nA)->&((nA)->(FieldName(y))) := x ) }
      CASE (nA)->(FieldInfo( y, FLD_TYPE )) = "L"
         ::dataLink := {|x| IIf( PCOUNT()==0, (nA)->&((nA)->(FieldName(y))), (nA)->&((nA)->(FieldName(y))) := x ) }
      CASE (nA)->(FieldInfo( y, FLD_TYPE )) = "N"
         ::dataLink := {|x| IIf( PCOUNT()==0, (nA)->&((nA)->(FieldName(y))), (nA)->&((nA)->(FieldName(y))) := x ) }
         IF !Empty(cPicture)
            ::picture := cPicture
         ELSE
            DO CASE
               CASE nFa == 3
                  ::picture := "999"
               CASE nFa == 5
                  ::picture := "99.99 Uhr"
               CASE nFa == 6
                  ::picture := "999999"
               CASE nFa == 8
                  ::picture := "99,999.99"
               CASE nFa == 10
                  ::picture := "9,999,999.99"
            ENDCASE
         ENDIF
      CASE (nA)->(FieldInfo( y, FLD_TYPE )) = "D"
         ::picture := IIf( !Empty(cPicture), cPicture, "DD.MM.YYYY" )
         ::dataLink := {|x| IIf( PCOUNT()==0, (nA)->&((nA)->(FieldName(y))), (nA)->&((nA)->(FieldName(y))) := x ) }
   ENDCASE
   IF y > 0
      ::cargo := (nA)->(FieldName(y))
   ELSE
      ::cargo := aPPTxt[nA]                   //******  Testen, ob das beim Drucken geht!!!!!
   ENDIF
//   ::setName( y )
   ::cargo := oXbp   //+30.08.2008 14:36 Prompt-Text huckepack als ::cargo
RETURN self

METHOD MGetX:CREATE( oParent, oOwner, aPos, aSize, aPP, lVisible )
   ::XbpGet:CREATE( oParent, oOwner, aPos, aSize, aPP, lVisible ):setdata()
//*************** steht im DialogFF:create()
//   DBRegisterClient(self)
//***************
RETURN self

//------------------------------------------

CLASS MGetXR FROM XbpGet
   EXPORTED:
      VAR   killer
      VAR   trigger        // Ausl”ser fr UDF/Methoden-Aufruf bei killinputfocus  15.07.2006 22:36
      METHOD INIT
      METHOD CREATE
ENDCLASS

METHOD MGetXR:INIT( oDlg1, oDlg2, aPos, aSize, aPP,lVisible, cVarR, nFa, lT, cPicture, ;
                           cTEXT, aPosT, aSizeT, aPPTxt, nA )
   LOCAL oXbp, y := 1000
   DEFAULT cPicture TO Trim(" ")
   IF !Empty( cText )
      oXbp := MStatic():new( oDlg1,, aPosT, aSizeT, aPPTxt,, XBPSTATIC_TYPE_TEXT, cText )
      oXbp:CREATE()
   ENDIF
   ::XbpGet:INIT( oDlg1, , aPos, aSize, aPP )
   ::clipSiblings := .T.
   ::tabStop := lT
   ::setInputFocus  := {|mp1,mp2,obj| HiliteSle( obj ) }
   ::killInputFocus := {|mp1,mp2,obj| DeHiliteSle( obj ) }
   ::group := XBP_WITHIN_GROUP
   ::bufferLength := nFa
/*   IF !Empty(cPicture)   06.07.2008 14:56*/
      ::picture := cPicture
//   ELSE
//       
/*   ENDIF*/
   ::dataLink := {|x| IIf( PCOUNT()==0, cVarR, cVarR := x ) }
//////   DO CASE
//////      CASE ValType( cVarR ) == "C"
//////         ::dataLink := {|x| IIf( PCOUNT()==0, cVarR, cVarR := x ) }
//////      CASE ValType( cVarR ) == "N"
//////         ::dataLink := {|x| IIf( PCOUNT()==0, Transform(cVarR,cPicture), cVarR := Val(x) ) }
//////      CASE ValType( cVarR ) == "D"
//////         ::dataLink := {|x| IIf( PCOUNT()==0, DtoC(cVarR), cVarR := CtoD(x) ) }
//////      CASE ValType( cVarR ) == "L"
//////         ::dataLink := {|x| IIf( PCOUNT()==0, cVarR, cVarR := x ) }
//////   ENDCASE
   ::cargo := oXbp   //+30.08.2008 14:36 Prompt-Text huckepack als ::cargo
RETURN self

METHOD MGetXR:CREATE( oParent, oOwner, aPos, aSize, aPP, lVisible )
   ::XbpGet:CREATE( oParent, oOwner, aPos, aSize, aPP, lVisible ):setdata()
//*************** steht im DialogFF:create()
//   DBRegisterClient(self)
//***************
RETURN self

//------------------------------------------

CLASS MMle FROM XbpMle
   EXPORTED:
      VAR   killer
      VAR vorigerWert      // 19.12.2004 
      VAR value      // 19.12.2004 
      METHOD INIT
      METHOD CREATE
ENDCLASS

METHOD MMle:INIT( oDlg1, oDlg2, aPos, aSize, aPP, lVisible, y, nFa, lT, ;
                        cTEXT, aPosT, aSizeT, aPPTxt, nA )
   LOCAL oXbp
   IF !Empty( cText )
      oXbp := MStatic():new( oDlg1,, aPosT, aSizeT, aPPTxt,, XBPSTATIC_TYPE_TEXT, cText )
      oXbp:CREATE()
   ENDIF
   ::XbpMle:INIT( oDlg1, , aPos, aSize, aPP )
   ::dataLink := {|x| IIf( PCOUNT()==0, (nA)->&((nA)->(FieldName(y))), ;
                                    (nA)->&((nA)->(FieldName(y))) := IIf(DbRLock(),x,x) ) }
   ::clipSiblings := .T.
   ::ignoreTab := .T.
   ::tabStop   := .F.
   ::setInputFocus  := {|mp1,mp2,obj| HiliteSle( obj ) }
   ::killInputFocus := {|mp1,mp2,obj| DeHiliteSle( obj ) }
   ::wordWrap  := .T.
   ::horizScroll := .F.
   ::group     := XBP_END_GROUP
   ::cargo := (nA)->(FieldName(y))
RETURN self

METHOD MMle:CREATE( oDlg1, oDlg2, aPos, aSize, aPP )
   ::XbpMle:CREATE( oDlg1,, aPos, aSize, aPP ):setdata()
RETURN self
//----------------
CLASS MMleXR FROM XbpMle
   EXPORTED:
      VAR   killer
      VAR vorigerWert      // 19.12.2004 
      VAR value      // 19.12.2004 
      METHOD INIT
      METHOD CREATE
ENDCLASS

METHOD MMleXR:INIT( oDlg1, oDlg2, aPos, aSize, aPP,lVisible, cVarR, nFa, lT, cPicture, ;
                           cTEXT, aPosT, aSizeT, aPPTxt, nA )
   LOCAL oXbp
   DEFAULT cPicture TO Trim(" ")
   IF !Empty( cText )
      oXbp := MStatic():new( oDlg1,, aPosT, aSizeT, aPPTxt,, XBPSTATIC_TYPE_TEXT, cText )
      oXbp:CREATE()
   ENDIF
   ::XbpMle:INIT( oDlg1, , aPos, aSize, aPP )
   ::clipSiblings := .T.
   ::ignoreTab := .T.
   ::tabStop   := .T.
   ::setInputFocus  := {|mp1,mp2,obj| HiliteSle( obj ) }
   ::killInputFocus := {|mp1,mp2,obj| DeHiliteSle( obj ) }
   ::wordWrap  := .T.
   ::horizScroll := .F.
   ::group     := XBP_END_GROUP
   ::dataLink := {|x| IIf( PCOUNT()==0, cVarR, cVarR := IIf(DbRLock(),x,x) ) }
   ::cargo := oXbp   //+30.08.2008 14:36 Prompt-Text huckepack als ::cargo
RETURN self

METHOD MMleXR:CREATE( oDlg1, oDlg2, aPos, aSize, aPP )
//   ::XbpMle:CREATE( oDlg1,, aPos, aSize, aPP ):setdata()
   ::XbpMle:CREATE( oDlg1,, aPos, aSize, aPP )  //+04.01.2011 15:04 timing?
   sleep(5) //+04.01.2011 15:04 gem„á Alaska-PDR-5346 : race-Fehler!
   ::XbpMle:setdata()                           //+04.01.2011 15:04
RETURN self

//------------------------------------------
CLASS MCheck FROM XbpCheckBox
   EXPORTED:
      VAR vorigerWert      // 19.12.2004 
      VAR value      // 19.12.2004 
      METHOD INIT
      METHOD CREATE
ENDCLASS

METHOD MCheck:INIT( oDlg1, oDlg2, aPos, aSize, aPP, lVisible, y, nFa, lT, ;
                        cTEXT, aPosT, aSizeT, aPPTxt, nA )
   LOCAL oXbp
   ::XbpCheckBox:INIT( oDlg1, , aPos, aSize, aPP )
   ::dataLink := {|x| IIf( PCOUNT()==0, (nA)->&((nA)->(FieldName(y))), ;
                                    (nA)->&((nA)->(FieldName(y))) := x ) }
//   ::clipSiblings := .T.
//   ::ignoreTab := .T.
   ::tabStop   := .T.
//   ::setInputFocus  := {|mp1,mp2,obj| HiliteSle( obj ) }
//   ::killInputFocus := {|mp1,mp2,obj| DeHiliteSle( obj ) }
//   ::wordWrap  := .T.
//   ::horizScroll := .F.
   ::caption := cText
//   ::group     := XBP_END_GROUP
//   ::cargo := (nA)->(FieldName(y))
RETURN self

METHOD MCheck:CREATE( oDlg1, oDlg2, aPos, aSize, aPP )
   ::XbpCheckBox:CREATE( oDlg1,, aPos, aSize, aPP ):setdata()
RETURN self

//------------------------------------------

CLASS MBrowse FROM XbpBrowse
   EXPORTED:
      METHOD INIT
      METHOD CREATE
      METHOD configure
      METHOD addColumns
      METHOD addGetColumns
      METHOD notify
ENDCLASS

METHOD MBrowse:INIT( oBrowseArea,oOwner, aPos, ASize, aPP, lVisible, nA )
   DEFAULT aPP TO { { XBP_PP_FGCLR       , GRA_CLR_BLACK    } , ;
                     { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } }
   ::XbpBrowse:INIT( oBrowseArea,oOwner, aPos, ASize, aPP, lVisible )
   // Navigations Codebloecke fuer den Browser
   ::skipBlock     := {|n| (nA)->(DbSkipper(n)) }
   ::goTopBlock    := {| | (nA)->(DbGoTop())    }
   ::goBottomBlock := {| | (nA)->(DbGoBottom()) }
   ::phyPosBlock   := {| | (nA)->(Recno())      }
   // Codebloecke fuer den vertikalen Scrollbar.
   // Hinweis: DbPosition() liefert Werte zwischen 0 und 100.
   ::posBlock      := {| | (nA)->(DbPosition())    }
   ::goPosBlock    := {|n| (nA)->(DbGoPosition(n)) }
   ::lastPosBlock  := {| | 100             }
   ::firstPosBlock := {| | 0               }
   ::cursorMode    := XBPBRW_CURSOR_ROW

RETURN self

METHOD MBrowse:CREATE( oBrowseArea,oOwner, aPos, ASize, aPP, lVisible )
   DEFAULT aPP TO { { XBP_PP_FGCLR       , GRA_CLR_BLACK    } , ;
                     { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } }
   ::XbpBrowse:CREATE( oBrowseArea,oOwner, aPos, ASize, aPP, lVisible )
RETURN self

METHOD MBrowse:CONFIGURE()
   ::XbpBrowse:CONFIGURE()
RETURN self

METHOD MBrowse:addColumns( oParent, oOwner, y, nBreite, cTitel, nA, aPP )
   LOCAL oColumn
   LOCAL bBlock := {|x| IIf( PCOUNT()==0, (nA)->&((nA)->(FieldName(y))), (nA)->&((nA)->(FieldName(y))) := x ) }
   LOCAL aPPB := { { XBP_PP_COL_HA_CAPTION          , Trim( sv->Text ) }, ;
            { XBP_PP_COL_DA_FGCLR            , GRA_CLR_BLACK    }, ;
            { XBP_PP_COL_DA_BGCLR            , GRA_CLR_WHITE    }, ;
            { XBP_PP_COL_DA_HILITE_FGCLR     , GRA_CLR_WHITE    }, ;
            { XBP_PP_COL_DA_HILITE_BGCLR     , GRA_CLR_DARKGRAY }, ;
            { XBP_PP_COL_DA_HILITEFRAMELAYOUT, XBPFRAME_BOX + XBPFRAME_RECT + XBPFRAME_DOTTED }, ;
            { XBP_PP_COL_DA_CELLFRAMELAYOUT  , XBPFRAME_BOX + XBPFRAME_RAISED               }, ;
            { XBP_PP_COL_DA_CHARWIDTH        , nBreite              }, ;
            { XBP_PP_COL_DA_ROWSEPARATOR     , XBPCOL_SEP_LINE            }, ;
            { XBP_PP_COL_DA_COLSEPARATOR     , XBPCOL_SEP_NONE            }, ;
            { XBP_PP_COL_DA_FRAMELAYOUT      , XBPFRAME_BOX               }, ;
            { XBP_PP_COL_DA_HILITE_BGCLR     , XBPSYSCLR_HILITEBACKGROUND }  }
//            { XBP_PP_COL_FA_CAPTION          , ""               }, ;
   DEFAULT aPP TO {{ XBP_PP_COMPOUNDNAME, FONT_DEFFIXED_MEDIUM }}
   aPPB[1,2]             := cTitel
//   aPP[2,2]             := "Leistungs-Bezeichnung"
   AEval( aPP, {|a,x| AAdd(aPPB,a) } ) //23.03.2008 18:05
   oColumn              := XbpColumn():new( oParent,,,, aPPB )
   oColumn:dataLink     := bBlock
   oColumn:cargo := (nA)->(FieldName(y))     //+14.07.2009 15:48
   oParent:addColumn( oColumn )
RETURN oParent

//METHOD MBrowse:addGetColumns( oParent, oOwner, y, nBreite, cTitel, nA )
METHOD MBrowse:addGetColumns( oParent, oOwner, cVarR, nBreite, cTitel, nA, aPP, cColArt ) //25.06.2008 21:51
   LOCAL oColumn
//   LOCAL bBlock := {|x| IIf( PCOUNT()==0, (nA)->&((nA)->(FieldName(y))), (nA)->&((nA)->(FieldName(y))) := x ) }
   LOCAL bBlock := {|x| IIf( PCOUNT()==0, cVarR, cVarR := x ) }
   LOCAL aPPB := { { XBP_PP_COL_HA_CAPTION          , Trim( sv->Text ) }, ;
            { XBP_PP_COL_DA_FGCLR            , GRA_CLR_BLACK    }, ;
            { XBP_PP_COL_DA_BGCLR            , GRA_CLR_WHITE    }, ;
            { XBP_PP_COL_DA_HILITE_FGCLR     , GRA_CLR_WHITE    }, ;
            { XBP_PP_COL_DA_HILITE_BGCLR     , GRA_CLR_DARKGRAY }, ;
            { XBP_PP_COL_DA_HILITEFRAMELAYOUT, XBPFRAME_BOX + XBPFRAME_RECT + XBPFRAME_DOTTED }, ;
            { XBP_PP_COL_DA_CELLFRAMELAYOUT  , XBPFRAME_BOX + XBPFRAME_RAISED               }, ;
            { XBP_PP_COL_DA_CHARWIDTH        , nBreite              }, ;
            { XBP_PP_COL_DA_ROWSEPARATOR     , XBPCOL_SEP_LINE            }, ;
            { XBP_PP_COL_DA_COLSEPARATOR     , XBPCOL_SEP_NONE            }, ;
            { XBP_PP_COL_DA_FRAMELAYOUT      , XBPFRAME_BOX               }, ;
            { XBP_PP_COL_DA_HILITE_BGCLR     , XBPSYSCLR_HILITEBACKGROUND }  }
//            { XBP_PP_COL_FA_CAPTION          , ""               }, ;
   DEFAULT cColArt TO "SLE"   /* 25.06.2008 21:58 */
   DEFAULT aPP TO {{ XBP_PP_COMPOUNDNAME, FONT_DEFFIXED_MEDIUM }}
   aPPB[1,2]             := cTitel
//   aPP[2,2]             := "Leistungs-Bezeichnung"
   AEval( aPP, {|a,x| AAdd(aPPB,a) } ) //23.03.2008 18:05
   IF Upper(cColArt) == "MLE"
      oColumn              := XbpMleColumn():new( oParent,,,, aPPB )
      oColumn:bufferLength := 50
   ELSEIF Upper(cColArt) == "COM"
      aTitel := &cTitel
      aPPB[1,2] := aTitel[1]
      oColumn              := XbpComboBoxColumn():new( oParent,,,, aPPB )
      oColumn:comboType := XBPCOMBO_DROPDOWN /* aufklappbar und editierbar */
      oColumn:bufferLength := 2
      oColumn:setItems ( ADel(aTitel,1) )
   ELSE  // also: Upper(cColArt) == "SLE"
      oColumn              := XbpGetColumn():new( oParent,,,, aPPB )
   ENDIF
   oColumn:cargo := Trim(sv->FIELD_NAME)
   oColumn:dataLink     := bBlock
   oParent:addColumn( oColumn )
   ::cursorMode    := XBPBRW_CURSOR_CELL
RETURN oParent

METHOD MBrowse:notify( nEvent, mp1, mp2 )
      IF nEvent == xbeDBO_Notify             // Notify-Ereignis
         IF mp1 == DBO_MOVE_DONE             // Skip ist beendet
            ::XbpBrowse:forceStable()
         ENDIF
      ENDIF
RETURN

//------------------------------------------

CLASS MPButton FROM XbpPushButton
   EXPORTED:
      METHOD INIT
      METHOD CREATE
      METHOD PButtProg     //+15.03.2009 11:13 statt Funktion jetzt Methode
ENDCLASS

//Parent ist die drawingArea und Owner ist das XbpWindow
METHOD MPButton:INIT( oDlg1, oDlg2, aPos, aSize, aPP, lVisible, ;
                           cButtProg, cCaption, aData1, nFon, nA, lT )
   ::XbpPushButton:INIT( oDlg1, , aPos, ASize )
   ::caption := cCaption
   ::clipSiblings := .T.
   ::tabstop := lT
   IF Upper( cCaption ) = "OK"
      ::activate := {|| oDlg2:writeData(), PostAppEvent( xbeP_Close ) }
// geREMt am 27.07.2006 16:59:
//   ELSEIF "<"$cCaption .OR. ">"$cCaption  // 27.02.2006 weil SKIP sowieso write macht -> OK so
//      ::activate := {|cA,oF| cA := SELECT(), ;
//                      PButtProg( oDlg1, cButtProg, cCaption, @aData1, nFontR ), ;
//                        DbSelectArea( cA ), oDlg2:readData(), ;
//                        SetAppFocus( oFocSle )} //, oFocSle:setInputFocus() }
   ELSEIF "oEdit:BrowseFeld[1]"$cButtProg     //04.01.2008 14:39
      // z.B.   PostAppEvent( xbeP_Keyboard, xbeK_UP,, oB )
//////      ::activate := {|| oF := oEdit:BrowseFeld[1], ;  //AllTrim(SubStr(cButtProg,a:=RAt(",",cButtProg)+1, Len(cButtProg)-1-a)), ;
//////                      PButtProg( oDlg1, cButtProg, cCaption, @aData1, nFontR ), ;
//////                        SetAppFocus( oF )} //, oFocSle:setInputFocus() }
      ::activate := {|oF| oF := oEdit:BrowseFeld[1], ;
                      ::PButtProg( oDlg1, cButtProg, cCaption, @aData1, nFontR ), ;
                        SetAppFocus( oF )}      //+15.03.2009 11:22
   ELSEIF !Empty( cButtProg )
      DO WHILE !IsMethod(oDlg2,"writedata")     /*28.06.2008 17:33*/
         oDlg2 := oDlg2:setparent()
      ENDDO
//////      ::activate := {|cA,oF| oDlg2:writeData(), cA := SELECT(), ;
//////                      PButtProg( oDlg1, cButtProg, cCaption, @aData1, nFontR ), ;
//////                        DbSelectArea( cA ), oDlg2:readData(), ;
//////                        SetAppFocus( oFocSle )} //, oFocSle:setInputFocus() }
      ::activate := {|cA,oF| oDlg2:writeData(), cA := SELECT(), ;
                      ::PButtProg( oDlg1, cButtProg, cCaption, @aData1, nFontR ), ;
                        DbSelectArea( cA ), oDlg2:readData(), ;
                        SetAppFocus( oFocSle )}    //+15.03.2009 11:22
   ENDIF
RETURN self

METHOD MPButton:CREATE( oDlg1, oDlg2, aPos, ASize, aPP, lVisible )
   ::XbpPushButton:CREATE( oDlg1,, aPos, ASize, aPP, lVisible )
RETURN self
//------------------------------------------

//////FUNCTION PButtProg( oDlg1, cButtProg, cCaption, aData, nFont )
METHOD MPButton:PButtProg( oDlg1, cButtProg, cCaption, aData, nFont )   //+15.03.2009 11:22
   PRIVATE cT, cB := cButtProg   //weil Makros nur mit PRIVATE funktionieren!15.03.2009 11:22
   //+15.03.2009 12:02 fgt diesen Knopf zum Gesperrt-Array
   IF AScan(oEdit:aDKGesperrt,cCaption) > 0
      RETURN self
   ELSE
      AAdd(oEdit:aDKGesperrt,cCaption)
   ENDIF
      DO CASE
//         CASE ValType(&cB) == "B"        // 20.5.2005 : soll das n„chste CASE ersetzen!
//            Eval( &cB )
         CASE SubStr( cB,1,1 ) == "{"     //+15.03.2009 11:22
            Eval( &cB )                   //+15.03.2009 11:22
         OTHERWISE
            cT := &cB       // weil Makros nur mit PRIVATE funktionieren!15.03.2009 11:22
//////            cT := &cT   /+ wird dann nicht mehr gebraucht
      ENDCASE
   ARemove(oEdit:aDKGesperrt,AScan(oEdit:aDKGesperrt,cCaption),1)   //+15.03.2009 12:00
RETURN self
//------------------------------------------

CLASS MComboBox FROM ComboBoxGet
   EXPORTED:
   VAR alias, autoFill, dataLink
   
   METHOD init, create
//   ACCESS ASSIGN METHOD dataLink
   METHOD editBuffer //, setData, getData, getAllItems
//   METHOD autoFill  , _autofill
ENDCLASS


METHOD MComboBox:init( oParent, oOwner, aPos, aSize, aPP, lVisible, cVarR, nFa, lT, cPicture, aItems )
   DEFAULT cPicture TO ""
   DEFAULT lT TO .T.
   ::ComboBoxGet:init( oParent, oOwner, aPos, aSize, , lVisible )
   ::TYPE := XBPCOMBO_DROPDOWN
   ::SLEAlignment := .F.      // neu: macht den Knopf breiter 06.07.2008 18:12
   ::clipSiblings := .T.      // soll die Listbox nach oben bringen - tuts aber nicht 06.07.2008 18:12
   ::autoFill := .T.
   ::alias    := Alias()
   ::picture( cPicture )
   ::tabstop := lT
   ::setInputFocus  := {|mp1,mp2,obj| HiliteSle( obj ) } // wird in ComboBoxGet-Klasse berladen: DrawTick()
   ::killInputFocus := {|mp1,mp2,obj| DeHiliteSle( obj ) }
   ::group := XBP_WITHIN_GROUP
   ::bufferLength := nFa
   ::XbpGet:dataLink := {|x| IIf( PCOUNT()==0, cVarR, cVarR := x ) }
   ::dataLink := {|x| IIf( PCOUNT()==0, cVarR, cVarR := x ) }
RETURN self


METHOD MComboBox:create( oParent, oOwner, aPos, aSize, aPP, lVisible, cVarR, nFa, lT, cPicture, aItems )
   ::ComboBoxGet:create( oParent, oOwner, aPos, aSize, , lVisible ):setData()

   IF ValType(aItems) == "A"
//      AEval( aItems, {|c| ::addItem(c) } )
      FOR i := 1 TO Len(aItems)
         ::addItem(aItems[i])
      NEXT
   ELSE
   /* wird hier noch nicht gebraucht
      IF ::autoFill
         ::autoFill()
      ENDIF
   */
   ENDIF
RETURN self


//////METHOD MCombobox:dataLink( bData )
//////   IF PCount() == 1
//////      ::XbpGet:datalink := bData
//////   ENDIF
//////RETURN ::XbpGet:datalink


METHOD MCombobox:editBuffer
RETURN ::XbpGet:editBuffer()


//////METHOD MCombobox:setData( xValue )
//////   IF xValue == NIL
//////      xValue := ::XbpGet:setData()
//////   ELSE
//////      xValue := ::XbpGet:setData( xValue )
//////   ENDIF
//////RETURN xValue
//////
//////
//////METHOD MCombobox:getData
//////   LOCAL cValue := ::XbpGet:getData()
//////   LOCAL aItems := ::getAllItems()
//////   LOCAL nPos
//////   ::XbpGet:getData()
//////   IF Ascan( aItems, {|c| Upper(c) == Upper(cValue) } ) == 0
//////      nPos := AScan( aItems, {|c| Upper(c) > Upper(cValue) } )
//////      IF nPos == 0
//////         ::addItem( cValue )
//////      ELSE
//////         ::insItem( nPos, cValue )
//////      ENDIF
//////   ENDIF
//////RETURN cValue
//////
//////
//////METHOD MCombobox:getAllItems
//////RETURN AEval( Array( ::numItems() ), ;
//////              {|x,i| x := ::getItem(i) },,, .T. )
//////

//METHOD MCombobox:autoFill
//   LOCAL cFileName := (::alias)->( DbInfo(DBO_FILENAME) )
//   LOCAL oThread   := Thread():new()
//
//   oThread:atStart := {|| DbUseArea(,, cFileName, ::alias ) }
//   oThread:atEnd   := {|| DbCloseArea() }
//   oThread:start( {|| ::_autoFill() } )
//   ::setData()
//RETURN self
//
//
//METHOD MCombobox:_autoFill
//   LOCAL nCount := 0
//   LOCAL nMax   := 100
//   LOCAL bData  := ::dataLink
//   LOCAL aData[ nMax ]
//   LOCAL cValue, nPos
//
//   DO WHILE ! Eof()
//      cValue := Eval ( bData )
//      nPos   := AScan( aData, cValue, 1, nCount+1 )
//      IF nPos == 0
//         nCount ++
//         IF nCount > nMax
//            nMax += 100
//            ASize( aData, nMax )
//         ENDIF
//         aData[ nCount ] := cValue
//      ENDIF
//      SKIP
//   ENDDO
//
//   ASize( aData, nCount )
//   ASort( aData,,, {|c1,c2| Upper(c1) < Upper(c2) } )
//   FOR nPos := 1 TO nCount
//      ::addItem( aData[nPos] )
//   NEXT
//RETURN self


// Eof()
//========================================================================
// Hier steht noch etwas als Ged„chtnissttze:
CLASS MWin FROM AKDialog
   EXPORTED:
      METHOD INIT
      METHOD CREATE
ENDCLASS

METHOD MWin:INIT( oDlg1, oDlg2, aPos, ASize, aPP, lVisible, cDatei, nStart, nEnd, cTitle, ;
                        aEditControls )
   LOCAL oXbp, nOldArea := SELECT()
   LOCAL aPPSle := { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } }
   LOCAL aPPTxt, y
//   LOCAL nV := AppDesktop():currentSize()[1]/800
//06.04.2008 10:16 geREMt:
//   LOCAL nBo := aSize[2] - 50
//// tats„chliche Bildschirmaufl”sung:
//   LOCAL aSizeDesktop := AppDesktop():currentSize()
//   LOCAL nBSb := aSizeDesktop[1]
//   LOCAL nBSh := aSizeDesktop[2]
//// folgende Zahlen-Werte basieren auf 800x600:
//   LOCAL n5 := 5*nV
//   LOCAL n10 := 10*nV
//06.04.2008 10:14   LOCAL nBh := int(20*nV)      // H”he des Bezeichnungsfeldes =20
//06.04.2008 10:15   LOCAL nBz := int(25*nV)      // Zeilenh”he des Bezeichnungsfeldes =25
   LOCAL nFa := 0

   ::AKDialog:INIT( oDlg1, oDlg2, aPos, ASize )
   ::title     := cTitle
   ::taskList  := .T.
   ::minButton := .F.
   ::maxButton := .F.

   oCB := ::drawingArea

   IF !Empty( cDatei )
// jetzt folgt die Erzeugung der Eingabefelder
   DbUseArea( .T.,, "s_best", "sb" )
   OrdCreate( "xFldPos",, "Str(field_pos,3,0)" )
//   INDEX ON FIELD_POS TO xFLDPOS
   DbGoTop()
   FOR i := 1 TO LastRec()
      IF sb->FIELD_POS < nStart .OR. sb->FIELD_POS > nEnd
         DbSkip()
         LOOP
      ENDIF
      IF sb->FIELD_TYPE = "S"
         aPosT := {Int(sb->SpaT*nH),Int(sb->ZeiT*nV)} ; aSizeT := {Int(sb->BrT*nH),Int(sb->HoT*nV)}
         oXbp := MStatic():new( oCB,, aPosT, aSizeT, aPP,, XBPSTATIC_TYPE_GROUPBOX, Trim(sb->TEXT) )
         IIf( nV<=1, oXbp:setFontCompoundName( "6.Arial" ), )
         oXbp:create()
      ELSEIF sb->FIELD_TYPE = "P"
         aPosT := {Int(sb->SpaT*nH),Int(sb->ZeiT*nV)} ; aSizeT := {Int(sb->BrT*nH),Int(sb->HoT*nV)}
         cDummy := ("oXbp"+LTrim(Str( sb->FIELD_DEC )))
         &cDummy := MPButton():new( oCB,, aPosT, aSizeT,,, Trim(sb->Text), Trim(sb->Field_NAME), ;
                                    @aEditControls, @aData1, nFontR )
         &cDummy:CREATE()
      ELSEIF FIELD_TYPE = "M"
      aPosT := {Int(sb->SpaT*nH),nBo+nBz-nBz*sb->ZeiT} ; aSizeT := {Int(sb->BrT*nH),Int(sb->HoT*nV)}
      aPosF := {Int(sb->SpaF*nH),nBo+nBz-nBz*sb->ZeiF} ; aSizeF := {Int(sb->BrF*nH),Int(sb->HoF*nV)}
      y := 1->(FieldPos( cFeld ))         // y : Feld-Position in best.dbf
      oXbpN := MMle():new( oCB,, aPosF, aSizeF, aPPSle,, y, nFa, sb->TAB_STOP,;
                     Trim(sb->TEXT), aPosT, aSizeT, aPPTxt )
      oXbpN:CREATE():setData()
      oXbpN:setName( y )
      AAdd ( aEditControls, oXbpN )
      ELSE
      aPosT := {Int(sb->SpaT*nH),nBo+nBz-nBz*sb->ZeiT} ; aSizeT := {Int(sb->BrT*nH),Int(sb->HoT*nV)}
      aPosF := {Int(sb->SpaF*nH),nBo+nBz-nBz*sb->ZeiF} ; aSizeF := {Int(sb->BrF*nH),Int(sb->HoF*nV)}

      cFeld := Trim( sb->FIELD_NAME )
      cFeld := IIf( cFeld="&", ;
                    &(substr( cFeld,2,len(cFeld)-1 )), ;
                    cFeld )
      y := 1->(FieldPos( cFeld ))         // y : Feld-Position in best.dbf
      nFa := sb->FIELD_LEN
      oXbp := MGetX():new( oCB,, aPosF, aSizeF, aPPSle,, y, nFa, sb->TAB_STOP, Trim( sb->ZAHL_FORM ), ;
                     Trim(sb->TEXT), aPosT, aSizeT, aPPTxt )
      oXbp:CREATE():setdata()
      oXbp:setName( y )
      AAdd ( aEditControls, oXbp )
      ENDIF
      DbSkip()
   NEXT
   DbCloseArea()
// bis hierhin geht die Erzeugung der Eingabefelder
   SELECT &nOldArea
   ELSE
      oXbpBok          := XbpPushbutton():new( oCB, , {aSize[1]/2-36,20}, {72,24} )
      oXbpBok:caption  := "OK"
      oXbpBok:activate := {|| Satzsp(), Gather( aEditControls ), DbRUnlock(), ;
                           PostAppEvent( xbeP_Close ) }
      oXbpBok:TabStop  := .T.
      oXbpBok:group := XBP_WITHIN_GROUP
      oXbpBok:create()
   ENDIF
RETURN self

METHOD MWin:CREATE( oDlg1, oDlg2, aPos, ASize, aPP, lVisible )
   ::AKDialog:CREATE( oDlg1, oDlg2, aPos, ASize, aPP, lVisible )
RETURN self
//-------------------------------------------------
   ******************************************************************************
/*
 * Spinbutton Klasse mit ueberladener :keyboard() Methode. Dadurch koennen die
 * xbeK_UP, xbeK_DOWN Tasten zur Browsernavigation verwendet werden.
 * Der Spinbutton reagiert stattdessen auf xbeK_ALT_UP, xbeK_ALT_DOWN
 */

CLASS XbpGetSpinbutton FROM XbpSpinbutton
   EXPORTED:
   VAR    controller
   METHOD keyboard
ENDCLASS


METHOD XbpGetSpinbutton:keyboard( nKey )
   DO CASE
   /*
    * Der Spinbutton reagiert bei xbeK_ALT_UP oder xbeK_ALT_DOWN genau so
    * als waere xbeK_UP oder xbeK_DOWN gedrueckt worden.
    */
   CASE nKey == xbeK_ALT_UP
      ::xbpSpinbutton:keyboard( xbeK_UP )

   CASE nKey == xbeK_ALT_DOWN
      ::xbpSpinbutton:keyboard( xbeK_DOWN )

   CASE ::controller == NIL .OR. .NOT. ::controller:keyboard( nKey )
      /*
       * xbeK_UP und xbeK_DOWN werden vom :controller Objekt
       * (XbpSpinbuttonColumn) an den Browser weitergeleitet und der
       * fuehrt bei UP/DOWN eine Navigation durch. Alle Tasten, die
       * nicht vom :controller Objekt behandelt werden, uebernimmt
       * XbpSpinbutton.
       */
      ::xbpSpinbutton:keyboard( nKey )

   ENDCASE
RETURN self
//================================================================
/*
 * Klasse zum Anzeigen von Bitmaps oder Metadateien - und jetzt auch Bitmap-Variablen (FOX-Memos)
 */
CLASS BitView FROM XbpStatic, DataRef     // 26.02.2006: DataRef siehe Beispiel MDI: CLASS BitmapRef
   PROTECTED:
   VAR oFrame   // wird nicht gebraucht
   VAR oCanvas    // ist die Parent-BEArea
   VAR HinterGrund   //+05.08.2008 09:13 Farbe des Hintergrunds der BEArea, auf der gezeichnet wird
   VAR oPS
   VAR oBitmap
   VAR oMetafile
   VAR nMode
   VAR lIsEmpty   // 26.02.2006

   EXPORTED:
   VAR autoScale
   VAR file
   METHOD init, create, load, DISPLAY
   METHOD setdata, getdata, editbuffer
ENDCLASS



/*
 * Objekt initialisieren. Self ist Parent fr zwei XbpStatic Objekte
 */
METHOD BitView:init( oParent, oOwner, aPos, aSize, aPresParam, lVisible, nType, cVarR, y, nA )
   ::dataref:INIT()  // 26.02.2006  
   IF aPos != NIL //19.10.2006 12:10
      ::xbpStatic:init( oParent, oOwner, aPos, aSize, aPresParam, lVisible )
      ::xbpStatic:type := XBPSTATIC_TYPE_RAISEDRECT
   
      ::oFrame         := XbpStatic():new( self )
      ::oFrame:type    := XBPSTATIC_TYPE_RECESSEDRECT
   
      ::oCanvas        := XbpStatic():new( self )
      ::Hintergrund    := GRA_CLR_BACKGROUND
   ELSE
      ::oCanvas        := oParent  // wenn schon als Parent erzeugt
      ::Hintergrund    := oParent:setColorBG()     //+05.08.2008 09:16 Hintergrund der BEArea
   ENDIF
   ::autoScale      := .T.
   ::nMode          := 0
   ::lIsEmpty       := .T.    // 26.02.2006  noch ist nichts zugewiesen
   ::oPS            := XbpPresSpace():new()
   ::oBitmap        := XbpBitmap():new()  // 26.02.2006  frher bei ::loadfile() erzeugt
// Test:
//   ::dataLink := {|x| IIf( PCOUNT()==0, cVarR, cVarR := x ) }     //18.10.2006 17:40
   ::dataLink := {|x| IIf( PCOUNT()==0, (nA)->&((nA)->(FieldName(y))), ;
                                    (nA)->&((nA)->(FieldName(y))) := IIf(DbRLock(),x,x) ) }
RETURN self



/*
 * Systemresourcen anfordern. Self ist der „uáere Rahmen, ::oFrame ist der
 * innere Rahmen und in ::oCanvas wird das Bild gezeichnet
 */
METHOD BitView:create( oParent, oOwner, aPos, aSize, aPresParam, lVisible )
   LOCAL aAttr[ GRA_AA_COUNT ]

   IF aPos != NIL //19.10.2006 12:10
      ::xbpStatic:create( oParent, oOwner, aPos, aSize, aPresParam, lVisible )
      aSize    := ::currentSize()
      aSize[1] -= 8
      aSize[2] -= 8
   
      ::oFrame:create(self,, {4,4}, aSize )
   
      aSize[1] -= 2
      aSize[2] -= 2
   
      ::oCanvas:create(::oFrame,, {1,1}, aSize )
   ENDIF
  /*
   * Presentation Space mit dem Device Kontext von XbpStatic verbinden
   */
   ::oPS:create( ::oCanvas:winDevice() )
   ::oBitmap:CREATE( ::oPS )     // 26.02.2006  jetzt schon hier
   aAttr[ GRA_AA_COLOR ] := ::HinterGrund       //+ 05.08.2008 09:17 GRA_CLR_BACKGROUND
   ::oPS:setAttrArea( aAttr )
   ::oCanvas:paint := {| aClip | ::display( aClip ) }

RETURN self


/*
 * Bitmapdaten aus Feld in Puffer bertragen    // 26.02.2006  aus MDI:BitmapRef
 */
METHOD BitView:setdata( cBuffer )
   IF cBuffer == NIL
      cBuffer := Eval( ::dataLink )
   ENDIF

   IF ! Empty( cBuffer )
      ::oBitmap:setBuffer( cBuffer, XBPBMP_FORMAT_WIN3X )
      ::lIsEmpty := .F.
      ::nMode := 1
   ELSE
      ::lIsEmpty := .T.
      ::nMode := 0
   ENDIF
   ::changed :=  .F.
   ::DISPLAY()
RETURN cBuffer



/*
 * Gepufferte Bitmap in Feld bertragen    // 26.02.2006  aus MDI:BitmapRef
 */
METHOD BitView:getdata()
   LOCAL cBuffer := ::oBitmap:setBuffer()

   IF Valtype( ::dataLink ) == "B" .AND. .NOT. ::lIsEmpty
      Eval( ::dataLink, cBuffer )
   ENDIF
RETURN cBuffer


METHOD BitView:editbuffer()                // 26.02.2006  aus MDI:BitmapRef
RETURN ::oBitmap:setBuffer()


/*
 * Bilddatei laden
 */
METHOD BitView:load( cFile )
   LOCAL lSuccess := .F.

   IF Valtype( cFile ) <> "C" .OR. ! File( cFile )
      RETURN lSuccess
   ENDIF

   ::nMode := 0
   ::file  := ""

   IF ".BMP" $ Upper( cFile ) .OR. ;
      ".GIF" $ Upper( cFile ) .OR. ;
      ".JPG" $ Upper( cFile ) .OR. ;
      ".PNG" $ Upper( cFile )

      IF ::oBitmap == NIL        // ist jetzt (26.02.2006) schon in ::init() erzeugt
         ::oBitmap := XbpBitmap():New():create( ::oPS )
      ENDIF

      IF ( lSuccess := ::oBitmap:loadFile( cFile ) )
         ::nMode := 1
         ::file := cFile
         ::lIsEmpty := .F.    // 26.02.2006
      ENDIF

   ELSEIF ".EMF" $ Upper( cFile ) .OR. ".MET" $ Upper( cFile )
      IF ::oMetafile == NIL
         ::oMetafile := XbpMetafile():New():create()
      ENDIF

      IF ( lSuccess := ::oMetafile:load( cFile ) )
         ::nMode := 2
         ::file := cFile
         ::lIsEmpty := .F.    // 26.02.2006
      ENDIF
   ENDIF

RETURN lSuccess



/*
 * Bilddatei anzeigen
 */
METHOD BitView:display( aClip )
   LOCAL lSuccess := .F.
   LOCAL aSize    := ::oCanvas:currentSize()
   LOCAL aTarget, aSource, nAspect

   /*
    * Clip Bereich vorbereiten
    */
   DEFAULT aClip TO { 1, 1, aSize[1]-1, aSize[2]-1 }
   GraPathBegin( ::oPS )
   GraBox( ::oPS, { aClip[1]-1, aClip[2]-1 }, { aClip[3]+1, aClip[4]+1 }, GRA_OUTLINE )
   GraPathEnd( ::oPS )
   GraPathClip( ::oPS, .T. )

   GraBox( ::oPS, {0,0}, aSize, GRA_FILL )

   DO CASE
   CASE ::nMode == 1
     /*
      * Eine Bitmap Datei ist geladen
      */
      aSource := {0,0,Max(::oBitmap:xSize,1),Max(::oBitmap:ySize,1)} // 07.09.2006 19:07  wg. '/0'
      aTarget := {1,1,aSize[1]-2,aSize[2]-2}

      IF ::autoScale
        /*
         * Bitmap wird auf die Gr”áe von ::oCanvas skaliert
         */
         nAspect    := aSource[3] / aSource[4]
//         IF nAspect > 1 
         IF nAspect > aTarget[3]/aTarget[4]     //21.10.2007 14:12
            aTarget[4] := aTarget[3] / nAspect  // ???21.10.2007 13:22    //25.11.2006 13:06 original:[4]=[3]/nA.. ist falsch!!
         ELSE
            aTarget[3] := aTarget[4] * nAspect  // ???21.10.2007 13:22    //25.11.2006 13:07 original:[3]=[4]*nA.. ist falsch!!
         ENDIF
      ELSE
         aTarget[3] := aSource[3]
         aTarget[4] := aSource[4]
      ENDIF


     /*
      * Bitmap in ::oCanvas horizontal oder vertikal zentrieren
      */
      IF aTarget[3] < aSize[1]-2
         nAspect := ( aSize[1]-2-aTarget[3] ) / 2
         aTarget[1] += nAspect
         aTarget[3] += nAspect
      ENDIF

      IF aTarget[4] < aSize[2]-2
         nAspect := ( aSize[2]-2-aTarget[4] ) / 2
         aTarget[2] += nAspect
         aTarget[4] += nAspect
      ENDIF

      ::oBitmap:draw( ::oPS, aTarget, aSource, , GRA_BLT_BBO_IGNORE )
//      ::oBitmap:draw( ::oPS, aTarget, aSource, , GRA_BLT_BBO_OR )  // 9.7.04
      Sleep(1)

   CASE ::nMode == 2
     /*
      * Eine Metadatei ist geladen
      */
      IF ::autoScale
         ::oMetafile:draw( ::oPS, XBPMETA_DRAW_SCALE )
      ELSE
         ::oMetafile:draw( ::oPS, XBPMETA_DRAW_DEFAULT )
      ENDIF

   ENDCASE

   GraPathClip( ::oPS, .F. )

RETURN lSuccess
///////////////////////////////////////////////////////////////////////////////////////////

#include "Directry.ch"
#include "Ezscan.ch"

#define  xbeDS_DirChanged           xbeP_User + 100
#define  xbeFS_FileMarked           xbeP_User + 101
#define  xbeFS_FileSelected         xbeP_User + 102

/*
 * Klasse zur Auswahl von Laufwerken und Verzeichnissen
 */
CLASS DirWahl FROM XbpStatic
   PROTECTED:
   VAR aDrives
   VAR oItem

   EXPORTED:
   VAR startDir
   VAR dirTree
   VAR driveList
   VAR oWin       //+ Window, das die Eventschleife verwaltet

   METHOD init, create, fillTree, curDir
ENDCLASS



/*
 * Objekt initialisieren
 */
METHOD DirWahl:init( oParent, oOwner, aPos, aSize, aPresParam, lVisible )

   ::xbpStatic:init( oParent, oOwner, aPos, aSize, aPresParam, lVisible )
   ::xbpStatic:type    := XBPSTATIC_TYPE_RAISEDRECT

   ::dirTree           := XbpTreeView():new( self )
   ::dirTree:tabStop   := .T.
   ::dirTree:hasLines  := .T.
   ::dirTree:hasButtons:= .T.

   ::driveList         := XbpComboBox():new( self )
   ::driveList:tabStop := .T.
   ::driveList:type    := XBPCOMBO_DROPDOWNLIST

   ::startDir          := CurDrive() + ":\" + CurDir() + "\Scans2"
   ::oWin := oParent
RETURN self



/*
 * Systemresourcen anfordern und Daten fr das aktuelle Verzeichnis
 * in die Treeview eintragen
 */
METHOD DirWahl:create( oParent, oOwner, aPos, aSize, aPresParam, lVisible )
   ::xbpStatic:create( oParent, oOwner, aPos, aSize, aPresParam, lVisible )

   aSize := ::currentSize()

  /*
   * Die Treeview erzeugt ein benutzerdefiniertes Ereignis und
   * fgt das gew„hlte Verzeichnis als ersten Message-Parameter hinzu
   */
   ::dirTree:create  (,, {4, 30}, {aSize[1]-8, aSize[2]-30-4 } )
   ::dirTree:itemSelected := {|oItem| ::fillTree( oItem ) }
   ::dirTree:itemMarked   := {|oItem| PostAppEvent( xbeDS_DirChanged, oItem:getData(),, ::oWin ) }

   ::dirTree:rootItem:setData( ::startDir )

   ::driveList:create(,, {4, 30-4-24-96}, {aSize[1]-8, 24+96 } )

   ::aDrives := AvailDrives()
//   AEval( ::aDrives, {|c| ::driveList:xbpListBox:addItem( c+":" ) } )
   FOR i := 1 TO Len(::aDrives)        //+21.01.2011 20:09  race-Effekt?
      ::driveList:xbpListBox:addItem( ::aDrives[i]+":" )
   NEXT
   IF At( ":", ::startDir ) == 2
      ::driveList:xbpListBox:setData( { AScan( ::aDrives, Left(::startDir,1) ) } )
   ELSE
      ::driveList:xbpListBox:setData( { AScan( ::aDrives, CurDrive() ) } )
   ENDIF
   ::driveList:xbpListBox:itemSelected := {|| ::fillTree() }

   ::fillTree( ::dirTree:rootItem )
RETURN self



/*
 * Treeview mit den Daten des gew„hlten Verzeichnisses aufbauen.
 * Jedes XbpTreeViewItem enth„lt eine Zeichenkette mit dem Verzeichnis,
 * das es anzeigt
 */
METHOD DirWahl:fillTree( oItem )
   LOCAL aItems    := ::dirTree:rootItem:getChildItems()
   LOCAL cDrive    := AllTrim( ::driveList:xbpSLE:getData() )
   LOCAL cDir, aDir, i, imax, nLen, oParent, oTemp, cTemp, oNewParent
//   DEFAULT oItem TO ::oItem      //+29.07.2008 22:26
   IF oItem <> NIL .AND. ::isVisible() .AND. Len( Directory( oItem:getData() + "\*.", "D" ) ) == 2
      Tone(1000)
      RETURN self
   ENDIF

   ::dirTree:LockUpdate( .T. )

   AEval( aItems, {|obj| ::dirTree:rootItem:delItem(obj) } )
   cDir    := cDrive

  /*
   * Die Treeview beginnt mit dem Laufwerksbuchstaben
   */
   oParent := ::dirTree:rootItem:addItem( cDrive, ICON_DRIVE, ICON_DRIVE, ICON_DRIVE,, cDrive )

   IF oItem == NIL
      oItem := oParent
   ENDIF

   ::oItem := oItem

  /*
   * Fr jedes Unterverzeichnis wird ein XbpTreeviewItem erzeugt
   */
   DO WHILE Upper(cDir) <> Upper(oItem:getData())
      cTemp := SubStr( oItem:getData(), Len(cDir)+2 )
      nLen := At( "\", cTemp ) - 1
      IF nLen < 0
          nLen := len(cTemp)
      ENDIF
      cTemp := SubStr( cTemp, 1, nLen)

      aDir := Directory( cDir + "\", "D" )
      imax := Len( aDir )
      FOR i:=1 TO imax
         IF "D" $ aDir[i,F_ATTR]        .AND. ;
            .NOT. aDir[i,F_NAME] == "." .AND. ;
            .NOT. aDir[i,F_NAME] == ".."
            oTemp := oParent:addItem( aDir[i,F_NAME]   , ;
                                      ICON_CLOSEDFOLDER, ;
                                      ICON_CLOSEDFOLDER, ;
                                      ICON_OPENFOLDER  , ;
                                      NIL              , ;
                                      cDir + "\" + aDir[i,F_NAME] )
            IF Upper( cDir + "\" + aDir[i,F_NAME] ) == Upper( SubStr( oItem:getData(), 1, Len(cDir + "\" + cTemp) ) )
               oNewParent := oTemp
            ENDIF
         ENDIF
      NEXT
      cDir += "\" + cTemp
      oParent:expand(.T.)
      IF oNewParent <> NIL
         oParent := oNewParent
      ENDIF
   ENDDO


  /*
   * XbpTreeViewItems fr die Dateien im untersten Verzeichnis erzeugen
   */
   aDir := Directory( cDir + "\", "D" )

   imax := Len( aDir )
   FOR i:=1 TO imax
      IF "D" $ aDir[i,F_ATTR]        .AND. ;
         .NOT. aDir[i,F_NAME] == "." .AND. ;
         .NOT. aDir[i,F_NAME] == ".."

         oParent:addItem( aDir[i,F_NAME]   , ;
                          ICON_CLOSEDFOLDER, ;
                          ICON_CLOSEDFOLDER, ;
                          ICON_OPENFOLDER  , ;
                          NIL              , ;
                          cDir + "\" + aDir[i,F_NAME] )
      ENDIF
   NEXT

   oParent:expand( .T. )
   ::dirTree:SetData( oParent )

   ::dirTree:LockUpdate( .F. )
   ::dirTree:InvalidateRect()

   PostAppEvent( xbeDS_DirChanged, oParent:getData(),, ::oWin )   
RETURN self   



/*
 * Aktuelles ausgew„hltes Verzeichnis zurckgeben
 */
METHOD DirWahl:curDir
RETURN ::oItem:getData()



/*
 * Klasse zur Auswahl von Dateien mit bestimmten Erweiterungen
 */
CLASS FileWahl FROM XbpStatic
   PROTECTED:
   VAR aFiles
   VAR aExtensions
   VAR oItem
   VAR cDir

   EXPORTED:
   VAR fileList
   VAR extList
   VAR oWin       //+ Window, das die Eventschleife verwaltet
   VAR aFileMark  //+31.07.2008 15:53  die markierte Datei
   VAR aFileExt   //+31.07.2008 15:54  die markierte Extension

   METHOD init, create, setFilesTo, fillFileList, fileMarked, fileSelected
ENDCLASS



/*
 * Objekt initialisieren
 */
METHOD FileWahl:init( oParent, oOwner, aPos, aSize, aPresParam, lVisible )

   ::xbpStatic:init( oParent, oOwner, aPos, aSize, aPresParam, lVisible )
   ::xbpStatic:type := XBPSTATIC_TYPE_RAISEDRECT

   ::fileList         := XbpListBox():new( self )
   ::fileList:tabStop := .T.
   ::extList          := XbpComboBox():new( self )
   ::extList:tabStop  := .T.
   ::extList:type     := XBPCOMBO_DROPDOWNLIST
   ::oWin := oParent
   ::aFileMark := IIf(Empty(P_aFileMark),{1},P_aFileMark)    //+31.07.2008 15:55
   ::aFileExt  := IIf(Empty(P_aFileExt),{1},P_aFileExt)     //+31.07.2008 15:55
   
RETURN self



/*
 * Systemresourcen anfordern
 */
METHOD FileWahl:create( oParent, oOwner, aPos, aSize, aPresParam, lVisible )
   ::xbpStatic:create( oParent, oOwner, aPos, aSize, aPresParam, lVisible )

   aSize := ::currentSize()
   ::fileList:create  (,, {4, 30}        , {aSize[1]-8, aSize[2]-30-4 } )
   ::fileList:itemMarked   := {|| ::fileMarked() }
   ::fileList:itemSelected := {|| ::fileSelected() }
   ::extList:create(,, {4, 30-4-24-96}, {aSize[1]-8, 24+96 } )

   ::aExtensions := { "*.*" }
//   AEval( ::aExtensions, {|c| ::extList:xbpListBox:addItem( c ) } )
   FOR i := 1 TO Len(::aExtensions)        //+21.01.2011 20:09  race-Effekt?
      ::extList:xbpListBox:addItem( ::aExtensions[i]+":" )
   NEXT

   ::extList:xbpListBox:setData( { 1 } )
   ::extList:xbpListBox:itemSelected := {|| ::fillFileList(P_aFileMark) }

RETURN self



/*
 * Verzeichnis und Dateierweiterungen fr die Dateiliste definieren
 */
METHOD FileWahl:setFilesTo( cDir, aExtensions )

   IF Valtype( aExtensions ) == "A"
      ::extList:xbpListBox:clear()
//      AEval( aExtensions, {|c| ::extList:xbpListBox:addItem( c ) } )
      FOR i := 1 TO Len(aExtensions)        //+21.01.2011 20:09  race-Effekt? 25.01.2011 11:30 :: entfernt
         ::extList:xbpListBox:addItem( aExtensions[i] )
      NEXT
//      ::extList:xbpListBox:setData( { 1 } )
      ::extList:xbpListBox:setData( ::aFileExt )      //+31.07.2008 15:57
   ENDIF

   IF Valtype( cDir ) == "C"
      ::cDir := cDir
   ENDIF

   ::fillFileList()      //+31.07.2008 15:33
RETURN self



/*
 * Listbox mit bereinstimmenden Dateien fllen
 */
METHOD FileWahl:fillFileList()            //+31.07.2008 15:12
   LOCAL i, imax, j, jmax, aExtensions := {}
   LOCAL nOffset, cExtension


  /*
   * Liste der Erweiterungen aus der Combobox holen.
   * Als Trennzeichen dient das Leerzeichen
   */
   cExtension := AllTrim( ::extList:xbpSLE:getData() )

   DO WHILE ! Empty( cExtension )
      i := At( " ", cExtension )
      IF i > 0
         AAdd( aExtensions, AllTrim( SubStr( cExtension, 1, i-1 ) ) )
         cExtension := AllTrim( SubStr( cExtension, i+1 ) )
      ELSE
         AAdd( aExtensions, cExtension )
         cExtension := ""
      ENDIF
   ENDDO

   jmax := Len( aExtensions )

   ::fileList:clear()
   ::aFiles  := {}


  /*
   * Listbox mit Dateinamen fllen
   */
   FOR j:=1 TO jmax
      aDir    := Directory( ::cDir + "\" + aExtensions[j] )
      nOffset := Len( ::aFiles )
      imax    := Len( aDir )

      ASize( ::aFiles, nOffset + imax )

      FOR i:=1 TO imax
         sleep(1)       //+13.01.2011 16:30 race-Effekt - damit wirklich beseitigt!13.01.2011 16:40
         ::aFiles[nOffset+i] := aDir[i,F_NAME]
         ::fileList:addItem( aDir[i,F_NAME] )
      NEXT
   NEXT
  //+31.07.2008 14:45 markiert beim Neustart den vorigen Eintrag:
   IF !Empty(::aFileMark)  
      ::FileList:setData(::aFileMark)
      ::FileMarked()
   ENDIF

RETURN self



/*
 * Benutzerdefiniertes Ereignis "Datei ist markiert" plus Dateinamen senden
 */
METHOD FileWahl:fileMarked
   LOCAL aItems := ::fileList:getData()

   IF ! Empty( aItems ) .AND. ! Empty( ::aFiles )
      PostAppEvent( xbeFS_FileMarked, ::cDir + "\" + ::aFiles[ aItems[1] ],, ::oWin )
   ENDIF
RETURN self



/*
 * Benutzerdefiniertes Ereignis "Datei ist gew„hlt" plus Dateinamen senden
 */
METHOD FileWahl:fileSelected
   LOCAL aItems := ::fileList:getData()

   IF ! Empty( aItems ) .AND. ! Empty( ::aFiles )
      PostAppEvent( xbeFS_FileSelected, ::cDir + "\" + ::aFiles[ aItems[1] ],, ::oWin )
   ENDIF

RETURN self



/*
 * Die Funktion gibt ein Array mit den Buchstaben aller verfgbarer
 * Laufwerken auáer Diskettenlaufwerke zurck
 */
#define DRIVE_NOT_READY  21

FUNCTION AvailableDrives()
   LOCAL cDrive := CurDrive()
   LOCAL aDrives:= { cDrive }
   LOCAL bError := ErrorBlock( {|oErr| LaufwerkFehler( oErr, aDrives ) } )

   FOR i:=3 TO 26
      BEGIN SEQUENCE
        Curdrive( Chr(64+i) ) 
        CurDir()
        IF AScan( aDrives, CurDrive() ) == 0
           AAdd( aDrives, Curdrive() )
        ENDIF
      ENDSEQUENCE
   NEXT

   CurDrive( cDrive )

   ErrorBlock( bError )   
RETURN ASort( aDrives )

/*
 * Laufzeitfehler abfangen, wenn ein Laufwerk nicht bereit ist
 */
STATIC PROCEDURE LaufwerkFehler( oError, aDrives )
   IF oError:osCode == DRIVE_NOT_READY
      AAdd( aDrives, oError:args[1] )
   ENDIF
   BREAK
RETURN

//////STATIC PROCEDURE DokumentDruck( cFile )
//////LOCAL oPrinterPS, oBitmap, aRect, aSize
////// 
//////oPrinterPS := PrinterPS()
//////oBitmap    := XbpBitmap():new():create( oPrinterPS )
////// 
//////                                         // Papiergr”áe feststellen 
//////aSize      := oPrinterPS:device():paperSize()
//////aRect      := { 0, 0, aSize[1], aSize[2] }
////// 
//////oBitmap:loadFile( cFile )          // load Bitmap from file
////// 
//////oPrinterPS:device():startDoc()     // Spooler aktivieren
//////
////// 
//////oBitmap:draw( oPrinterPS, aRect )  // Druckjob spoolen
////// 
//////oPrinterPS:device():endDoc()       // Spooler schlieáen
////// 
//////DestroyDevice( oPrinterPS )        // Resourcen freigeben
//////oBitmap:destroy()
////// 
//////RETURN
//////
