ich habe angefangen in meinen aus Clipper in xbase übertragenen Code GUI Teile zu implantieren und habe sofort das erste Problem. Um dies zu erläutern habe ich den Code entsprechend verkleinert. Mit der Func Appsys() wird das Textfenster erzeugt und ich kann aus einen kleinen Menü auswählen. Wähle ich das Browserfenster, so erhalte ich die Anzeige wie gewünscht und ich kann in der Datenbank lesen.
Ab hier habe ich ein Problem.
1. In der Eventschleife reagiert das Programm nicht auf die ESC Taste um zum vorherigen Fenster wieder zurückzukehren.
2. Wie und wo muß ich welchem Fenster den Focus geben, was muß destroyed werden?
3. Ist das Browse Objekt wie ein Fenster zu behandeln mit setfocus und destroy?
Code: Alles auswählen
#include "directry.ch"
#include "DLL.CH"
#include "inkey.ch"
#include "regclass.ch"
#include "xbp.ch"
#pragma Library( "XppUi2.lib" )
//////////////////////////////////////////////////////////////////////
// APPSYS.PRG
// Copyright:
// Alaska Software GmbH, (c) 1997-1999. Alle Rechte vorbehalten.
// Inhalt:
// AppSys() - Standard Applikationsfenster erzeugen
// Bemerkungen:
// Diese Datei ist Teil der XppRt0.lib.
// Syntax:
// Die Funktion AppSys() wird automatisch beim Programstart
// aufgerufen.
//////////////////////////////////////////////////////////////////////
****************************************************************************
* Funktion AppSys() um Standard-Ausgabegeraete zu erzeugen
****************************************************************************
PROCEDURE AppSys()
#define DEF_ROWS 25
#define DEF_COLS 80
public oCrt //war früher Zeile 1 bei Local mußte aber public und am Ende
//jeden Programmes muß oCrt:destroy() freigegeben werden
aSizeDesktop := AppDesktop():currentSize() // Anordnen in der Mitte des Desktop-Fensters
DEF_FONTHEIGHT = 24
DEF_FONTWIDTH = 12
aPos := { 25,77 }
// XbpCRT-Fenster erzeugen
oCrt := XbpCrt():New ( NIL, NIL, aPos, DEF_ROWS, DEF_COLS )
oCrt:FontWidth := DEF_FONTWIDTH
oCrt:FontHeight := DEF_FONTHEIGHT
oCrt:title := "Prüffix"
oCrt:automark:= .f.
oCrt:icon := 1
oCrt:sysmenu := .f. // macht rechts oben die Icons weg
oCrt:FontName:= "System VIO"
oCrt:Create()
oCrt:PresSpace() // Presentation Space initialisieren
SetAppWindow ( oCrt ) // XbpCrt wird aktives Fenster und Ausgabegerät
RETURN
procedure main
mmende = " "
do while mmende <> "E"
@6,1 clear to 23,78
@07,15 prompt "Browse Fenster wählen"
@09,15 prompt "Hier passiert im Moment nix"
@21,15 prompt "Ende"
@23,7 say "Wählen Sie mit C up oder C down + RETURN oder erstem Buchstaben"
menu to opt1
if lastkey() = 27 .or. opt1=3
exit
endif
do case
case opt1 = 1
browser() // Fenster mit xbpbrowse für Daten aufrufen
endcase
enddo
wait
return
func browser // hier wird links unten Fenster mit Daten angezeigt
LOCAL nEvent, mp1, mp2, oXbp, oBrowse, cField, i
USE formblat NEW
// Dialogfenster versteckt erzeugen
oXbp := GuiStdDialog( "Standard GUI Browser for DBF" )
// Browser im Fenster erzeugen
oBrowse := GuiBrowseDb( oXbp:drawingArea )
// Spalten für alle Felder anfügen
FOR i:=1 TO FCount()
cField := FieldName( i )
oBrowse:addColumn( FieldBlock(cField), , cField )
NEXT
// Der Browser füllt nach :resize() immer das Fenster aus
oXbp:drawingArea:resize := {|mp1,mp2,obj| obj:childList()[1]:setSize(mp2) }
oXbp:show()
oBrowse:show()
SetAppFocus( oBrowse )
nEvent = 0
DO WHILE nEvent <> xbeP_Close
nEvent := AppEvent( @mp1, @mp2, @oXbp )
if nEvent=xbeK_ESC
quit
endif
oXbp:handleEvent( nEvent, mp1, mp2 )
ENDDO
RETURN .t.
******************************************************************
* GUI Browser mit Navigations-Codeblöcken für DBF erzeugen
******************************************************************
FUNCTION GuiBrowseDB( oParent, aPos, aSize )
LOCAL oBrowse
oBrowse := XbpBrowse():new( oParent,, aPos, aSize ):create()
// Navigationscodeblöcke für den Browser
oBrowse:skipBlock := {|n| DbSkipper(n) }
oBrowse:goTopBlock := {| | DbGoTop() }
oBrowse:goBottomBlock := {| | DbGoBottom() }
oBrowse:phyPosBlock := {| | Recno() }
// Navigationscodeblöcke für den vertikalen Scrollbar
oBrowse:posBlock := {| | DbPosition() }
oBrowse:goPosBlock := {|n| DbGoPosition(n) }
oBrowse:lastPosBlock := {| | 100 }
oBrowse:firstPosBlock := {| | 0 }
RETURN oBrowse
******************************************************************
* Standard Dialogfenster versteckt erzeugen
******************************************************************
FUNCTION GuiStdDialog( cTitle )
LOCAL oDlg
DEFAULT cTitle TO "Standard Dialog Window"
oDlg := XbpDialog():new( ,,{10,10}, {600,400},, .F. )
oDlg:icon := 1
oDlg:taskList := .T.
oDlg:title := cTitle
oDlg:titlebar := .F.
oDlg:create()
oDlg:drawingArea:setFontCompoundName( "10.Helv" )
RETURN oDlg
Wolfgang