Seite 1 von 1
Programm im Hybridmodus / 50 Zeilen....
Verfasst: Di, 07. Nov 2017 16:11
von mini990
Hallo,
habe hier ein älteres Programm das ich momentan schrittweise auf GUI umstelle.
Mein Problem ist folgendes:
ich benötige an einer Stelle 50 Zeilen.
unter Clipper lief das mit VGA50() einwandfrei.
Setze ich nun den Befehl VGA50() oder SetScrMode(306) ein bekomme ich eine Fehlermeldung:
beschreibung für dieses Objekt unbekannt: Setmode()
Setze ich
oCRT2:= XbpCrt():new( , , , 50, 79, "Titel", )
ein erscheint keine Fehlermeldung aber es passiert..... nix. keine Änderung.
Das Programm wird zuvor gestartet mit:
SetAppWindow():close := {|u1,u2,oXbp| CloseApp() }
SetAppWindow():configure()
RestoreFont()
WInit()
Kann mir da jemand helfen?
Danke im voraus...
Gruß Stefan
Re: Programm im Hybridmodus / 50 Zeilen....
Verfasst: Di, 07. Nov 2017 16:56
von Jan
Hallo Stefan,
schau Dir mal SetMode() an.
Jan
Re: Programm im Hybridmodus / 50 Zeilen....
Verfasst: Di, 07. Nov 2017 19:12
von AUGE_OHR
mini990 hat geschrieben: ↑Di, 07. Nov 2017 16:11
ein erscheint keine Fehlermeldung aber es passiert..... nix. keine Änderung.
deine Syntax ist FALSCH
Code: Alles auswählen
XbpCrt():new( [<oParent>] , [<oOwner>] , [<aPos>] , ;
[<nRowCount>], [<nColCount>], [<cTitle>], ;
[<lVisible>] ) --> oXbpCrt
mini990 hat geschrieben: ↑Di, 07. Nov 2017 16:11
Code: Alles auswählen
SetAppWindow():close := {|u1,u2,oXbp| CloseApp() }
SetAppWindow():configure()
RestoreFont()
WInit()
da du Hybrid geschrieben hast nehme ich an das du weitere XbParts hinzufügen möchtest.
wenn ja dann würde ich dir raten ein XbpDialog() als Parent zu nutzen damit du für die folgenden XbParts weniger Probleme hast mit dem "Focus" beim "umschalten"
Re: Programm im Hybridmodus / 50 Zeilen....
Verfasst: Fr, 26. Jan 2018 10:55
von mini990
hallo,
ich kämpfe da immer noch.....
Code: Alles auswählen
SetAppWindow():close := {|u1,u2,oXbp| CloseApp() } // don't use :destroy() here !
SetAppWindow():icon := ICON_APPLICATION
SetAppWindow():configure()
RestoreFont()
WInit()
*** Modus ist 24/80
*** Font wird so gewählt dass er möglichst bildschirmfüllend ist
oCrt := SetAppWindow()
SetMode(50,80)
@ 0,0 say...
...
...
@ 50,0 say...
Angezeigt wird Zeile 23 - 49
spiele ich etwas mit der Maus so wird irgendwann Zeile 0-24 angezeigt.
Editierbar sind alle Felder (Zeilen)
Setmode(50,80) gibt .T. zurück
Verändere ich nun den Font (Fonthöhe halbieren oder entsprechend kleinen Font wählen) ändert sich nichts bei der Anzeige
Aber die Fensterhöhe ändert sich in Abhängigkeit von der Fonthöhe.
??????? (krieg noch die krise...)
Gruß Stefan
Re: Programm im Hybridmodus / 50 Zeilen....
Verfasst: Fr, 26. Jan 2018 11:08
von brandelh
nicht alle Fonts sind skalierbar / erlaubt ... muss man durchprobieren.
Für die Veranstaltung in Berlin hatte ich ein Hybridfenster mit Fontauswahl - steht meine ich auch in der Wissensbasis.
Re: Programm im Hybridmodus / 50 Zeilen....
Verfasst: Fr, 26. Jan 2018 11:10
von brandelh
Hybrid bedeutet, dass man ein XbpCRT() Fenster nutzt, auf das KANN man auch XbParts legen, aber eben auch nur die @ SAY Syntax nutzen.
Ein XbpDialog() ist immer ein reines GUI Fenster, da geht nix mit @ SAY ...
Re: Programm im Hybridmodus / 50 Zeilen....
Verfasst: Fr, 26. Jan 2018 12:07
von mini990
also wird bei einem CRT Fenster die Höhe und Breite immer durch den Font bestimmt?
kann man da nichts vorgeben?
Re: Programm im Hybridmodus / 50 Zeilen....
Verfasst: Fr, 26. Jan 2018 12:08
von Jan
Stefan,
da sich SetMode() an Zeilen und Spalten festmacht, wird das immer danach gehen. Egal welche Fontgröße Du einstellst. Zeile ist Zeile, egal ob 10 oder 24 Punkt.
Jan
Re: Programm im Hybridmodus / 50 Zeilen....
Verfasst: Fr, 26. Jan 2018 12:27
von mini990
jan, das verstehe ich jetzt nicht.
Mein Verständnis lag so:
Ich habe ein CRT Fenster mit einem bestimmten Font.
Dieser bestimmt die Fenstergröße.
Soweit ok.ich dachte dass ich in diesem Fenster mit z.B. Setmode(50,80) die Zeilenanzahl manipulieren kann
und die Schriftart dann entsprechend ausgegeben wird.
Dem ist aber nicht so.
Da Xbase ja von unten links aus den Bildschirminhalt ausgibt "sehe" ich die
letzten 24 Zeilen meiner 50zeiligen @ say Angaben.
Wo denke ich jetzt verkehrt?
Steh jetzt echt auf dem Schlauch...
Gruß Stefan
Re: Programm im Hybridmodus / 50 Zeilen....
Verfasst: Fr, 26. Jan 2018 14:33
von brandelh
Ihr schreibt an einander vorbei !
In meinem Migrationsbeispiel (und meinen Programmen hier) kann man durch die sinnvoll verfügbaren Schriften durchschalten.
Nicht jede Kombination ist sinnvoll !
Ich ändere zwar nicht die Zeilen / Spalten, aber das sollte auch gehen, womöglich aber nicht mit jeder Kombination.
Die Schriftgröße bestimmt dabei die Fenstergröße (24 * Fonthöhe, 80 * Fontbreite, aber beides in dpi) !
Eine kleine Schrift und das Fenster wird klein angezeigt, eine größere und es wird größer.
Einige der von mir gezeigten Schriften überfordern auch große Monitore obwohl nur 24 x 80 er Anzeige genutzt wird.
Der Standard Alasca Crt Font sollte aber immer gehen, ist halt klein.
Re: Programm im Hybridmodus / 50 Zeilen....
Verfasst: Fr, 26. Jan 2018 14:44
von brandelh
Schau mal hier, wenn man mit F2 einen anderen Font auswählt (die Größe kann man auch größer wählen als angegeben), wird das Fenster größer angezeigt.
configure ... wird hier benötig. SetMode() habe ich noch nicht probiert
Code: Alles auswählen
#include "inkey.ch"
#include "common.ch"
#define CRLF (chr(13)+chr(10))
procedure Main()
cls
// Windows Schließenbutton aktivieren | Close with X-Button
SetAppWindow():close := {|u1,u2,oXbp| CloseApp() } // don't use :destroy() here !
SetAppWindow():configure()
if RestoreFont() // registry or INI-File
@ 24,10 say "Font wurde geladen | font restored !"
endif
do while lastkey() # K_ESC // ESC beendet das Programm
@1,1 say "Dies ist ein Test für XbpCrt - Fonts "+Version()+" ("+;
Version(1)+"."+Version(2)+"."+Version(3)+")"
@3,1 say "1234567890 ABCDEFGHIJKLMNOPQRSTUVWXYZ ÄÖÜ ß"
@4,1 say "1234567890 abcdefghijklmnopqrstuvwxyz äöü ß"
@6,1 say "wichtig ist ein FixedFont ! | only fixed fonts !"
@7,1 say "F2 - startet die Fontauswahl | starts Fontdialog"
@8,1 say "F3 - Font merken | save font for next startup"
@9,1 say "F4 - Alaska Crt (16|8) | back to standard font"
@10,1 say "F5 - Lösche INI Datei | delete INI file"
@12,1 say "ESC - beendet das Programm | end"
@20,1 say "SetAppWindow():FontName: '"+SetAppWindow():FontName+"'"
if chr(0) $ SetAppWindow():FontName
@20,73 say " HEX0 " color "w+/r"
endif
@21,1 say "TrimHex0(...): '"+TrimHex0(SetAppWindow():FontName)+"'"
if chr(0) $ TrimHex0(SetAppWindow():FontName)
@21,73 say " HEX0 " color "w+/r"
else
@21,73 say " OK ! " color "w+/g"
endif
@22,1 say "SetAppWindow():FontHeight: "+ntrim(SetAppWindow():FontHeight)
@23,1 say "SetAppWindow():FontWidth: "+ntrim(SetAppWindow():FontWidth)
inkey(0)
cls
do case
case lastkey() = K_F2
if FontWahl()
@ 24,10 say "Font wurde gewählt ! | font changed "
endif
case lastkey() = K_F3
if SaveFont() // registry or INI-File
@ 24,10 say "Font wurde gespeichert ! | font saved "
endif
case lastkey() = K_F4
CRT_SetFont()
CRT_center()
@ 24,10 say "Alaska Crt (16|8) ? "
case lastkey() = K_F5
delete file (GetNameINI())
@ 24,10 say GetNameINI()+" gelöscht ?"+;
iif(! file(GetNameINI()),"JA","NEIN")
endcase
enddo
return
*-----------------------------------------------------------
procedure CloseApp()
quit
return
*-----------------------------------------------------------
function nTrim(nNum)
return alltrim(str(nNum))
*-----------------------------------------------------------
function TrimHex0(cTxt) // AsciiZ -> ASCII
local nPosHex0
cTxt := alltrim(cTxt)
nPosHex0 := at(chr(0),cTxt)
if nPosHex0 > 0
cTxt := left(cTxt,nPosHex0-1)
endif
return alltrim(cTxt)
*-----------------------------------------------------------
function FontWahl(cTitle)
local oCrt := SetAppWindow()
local oFont
local oFontDlg
local lOK := .f.
default cTitle to oCrt:title+" - Fontwahl"
oFontDlg := XbpFontDialog():New()
oFontDlg:fixedOnly := .t. // CRT-Fenster needs FIXEDFONT
oFontDlg:familyName := oCrt:FontName // Vorgabe ist aktueller Font | show active font
oFontDlg:strikeOut := .f.
* oFontDlg:style := .f.
oFontDlg:underScore := .f.
oFontDlg:title := cTitle
oFontDlg:create() // Font-Dialog anfordern
oFont := oFontDlg:display()
if ! IsNil(oFont)
CRT_SetFont( { TrimHex0(oFont:familyName),;
oFont:height,;
oFont:width } )
oFont:destroy() // Font freigeben
CRT_center()
lOK := .t.
endif
oFontDlg:destroy() // Font-Dial
return lOK
*-----------------------------------------------------------
function CRT_SetFont(aFont) // { NAME, Height, Width }
local oCrt := SetAppWindow()
DEFAULT aFont TO { "Alaska Crt" , 16, 8 }
oCrt:FontName := aFont[1]
oCrt:FontHeight := aFont[2]
oCrt:FontWidth := aFont[3]
oCrt:configure()
return .t.
*-----------------------------------------------------------
procedure CRT_center()
local oCrt := SetAppWindow()
local aSizeDesktop := AppDesktop():currentSize()
local nDesktopBreite := aSizeDesktop[1]
local nDesktopHoehe := aSizeDesktop[2]
local nBreite, nHoehe, nPosX, nPosY
nBreite := oCrt:currentSize()[1]
nHoehe := oCrt:currentSize()[2]
if nHoehe < nDesktopHoehe
nPosY := (nDesktopHoehe-nHoehe) /2
else
nPosY := (nDesktopHoehe-nHoehe)
endif
if nBreite < nDesktopBreite
nPosX := (nDesktopBreite-nBreite)/2
else
nPosX := 1
endif
oCrt:setPos( { nPosX , nPosY } )
return
*-------------------------------------------------------------------------------------------------------
function SaveFont() // registry or INI-File - here easy
local oCrt := SetAppWindow()
MemoWrit(GetNameINI(), TrimHex0(oCrt:FontName)+ CRLF +;
ntrim(oCrt:FontHeight)+ CRLF +;
ntrim(oCrt:FontWidth) )
return .t.
*-----------------------------------------------------------
function RestoreFont() // registry or INI-File
local lOK := .f.
local cTxt := memoread(GetNameINI())
local cFontName := alltrim(memoLine(cTxt,200,1,1,.f.))
local nFontHeight := val(memoLine(cTxt,200,2,1,.f.))
local nFontWidth := val(memoLine(cTxt,200,3,1,.f.))
if ! ( empty(cFontName) .or. empty(nFontHeight) .or. empty(nFontWidth) )
CRT_SetFont( { cFontName,nFontHeight,nFontWidth } )
CRT_center()
lOK := .t.
endif
return lOK
*------------------------------------------------------------
function GetNameINI()
local cName := AppName(.t.)
local nLen := len(cName)
if upper(right(cName,4)) = ".EXE"
cName := left(cName,nLen-3)+"INI"
else
cName := cName+".INI"
endif
return cName
Re: Programm im Hybridmodus / 50 Zeilen....
Verfasst: Fr, 26. Jan 2018 14:55
von brandelh
Wenn ich aber diese Zeilen nach den SetAppWindow() Zeilen einfüge:
Code: Alles auswählen
IF .NOT. SetMode( 43, 80 )
@ 24,10 say "Fehler bei SetMode() !"
inkey(0)
ENDIF
sieht das Fenster so aus:
- XbaseSetMode-50-80.png (34.55 KiB) 11476 mal betrachtet
ansonsten so:
- XbaseSetMode-Ohne.png (26.52 KiB) 11476 mal betrachtet
jeweils ohne jede weitere Änderung, in der Hilfe steht aber dazu, dass man bei GUI Anwendungen das bei XbpCrt() angeben kann.
Man könnte das so verstehen, dass SetMode() eher der alten hardware Änderung von VIO Modus Anwendungen gedacht ist und es anders besser wäre ...
Könnte man auch noch probieren.
Ein Zuweisen eines anderen Fonts führt übrigens wieder zu der alten Anzeige ...
Re: Programm im Hybridmodus / 50 Zeilen....
Verfasst: Fr, 26. Jan 2018 15:00
von brandelh
Wenn man die configure Zeile so ändert, funktioniert es auch mit dem Font-Wechsel:
Code: Alles auswählen
* SetAppWindow():configure()
* :configure( [<oParent>] , [<oOwner>] , [<aPos>] , [<nRowCount>], [<nColCount>], [<cTitle>], [<lVisible>] ) --> self
SetAppWindow():configure( , , , 50 , 80 , "Neuer CRT Test" )
- XbaseSetMode-XbpCrt.png (35.61 KiB) 11467 mal betrachtet
Re: Programm im Hybridmodus / 50 Zeilen....
Verfasst: Fr, 26. Jan 2018 22:07
von AUGE_OHR
mini990 hat geschrieben: ↑Fr, 26. Jan 2018 10:55
ich kämpfe da immer noch.....
Code: Alles auswählen
oCrt := SetAppWindow()
SetMode(50,80)
@ 0,0 say...
...
...
@ 50,0 say...
so ähnlich
FALSCH hat es bei mir am Anfang auch ausgesehen
das du CRT Object (Hybrid) statt dem Root Object (VIO) nimmst ist ja schon mal ein grosser Schritt
nun musst du aber auch die
Methoden des Object nehmen und nicht die Function
Code: Alles auswählen
oCRT:setMode( [<nRowCount>], [<nColCount>] ) --> aOldMode
---
wenn man mit mehreren CRT Fenstern arbeiten will muss man dafür sorgen das nur im "aktiven" Fenster eine "Ausgabe" erfolgt.
wenn man dann so eine Zeile im Hybrid Modus hat
könnte folgendes passieren :
User schaltet auf eine andere App und zurück und klickt dann auf "irgendein" Fenster / Control das dann das "aktive" ist
wenn man ein Object hat dann sollte man auch damit arbeiten und nicht mit der Rückgabe von einer Function
Re: Programm im Hybridmodus / 50 Zeilen....
Verfasst: Fr, 26. Jan 2018 22:37
von AUGE_OHR
wenn du einen Font für CRT Fenster auswählst dann probiere : Umlaute und Euro Zeichen
damit reduziert es sich auf einige wenige für CRT Fenster.
so erzeuge ich meinen CRT Font.
---
Anmerkung "viele" Fenster :
ein CRT "in" einem CRT, also CRT als Parent ist schwierig in Griff zu bekommen.
wenn man auf Hybrid geht empfehle ich einen XbpDialog() als "Shell" dessen o:DrawingArea als Parent "für alle" dient.
wenn man z.b. den Font ändert dann sollten ja auch alle anderen den selben Font bekommen !
hier ein Hybrid Code Beispiel aus dem Demo was ich auf der Forum Konferenz 2018 zeigen will.
es verwendet den XbpFontDialog() zur Auswahl des geeigneten Fonts für ein CRT Fenster.
Code: Alles auswählen
PROCEDURE SetNewFont( oParent, oCrt )
LOCAL oFont, oFontDlg, aSize
oFontDlg := XBPFONTDIALOG() :New()
oFontDlg:fixedOnly := .T.
oFontDlg:familyName := SP_Font() :familyName
oFontDlg:nominalPointSize := SP_Font() :nominalPointSize
oFontDlg:create()
SP_FontMenu( .T. ) // lock
// auswählen lassen
DO WHILE ( oFont := oFontDlg:display( XBP_DISP_APPMODAL ) ) <> NIL
SP_Font( oFont ) // remember
oCrt:FontName := oFont:familyName
oCrt:FontHeight := oFont:height
oCrt:FontWidth := oFont:width
oCrt:Configure()
aSize := oCrt:CurrentSize()
// Statusbar
aSize[ 2 ] += nSBarHeight
SP_SBar() :SetSize( { aSize[ 1 ], nSBarHeight } )
SP_SBar() :SetFont( oFont )
// XbpDialog
oParent:clientSize := aSize
oParent:DrawingArea:SetFont( oFont )
oParent:SetNewPos() // other CenterControl()
SP_MenuBar() :SetFont( oFont )
CenterControl( oParent, APPDESKTOP() )
// Aktuellen Fontnamen
oFontDlg:familyName := oFont:familyName // registrieren
oFontDlg:nominalPointSize := oFont:nominalPointSize
* NEIN
* oFont:destroy() // Font freigeben
ENDDO
oFontDlg:destroy() // Font-Dialog freigeben
SaveFontSetup()
SP_FontMenu( .F. ) // unlock
RETURN
Re: Programm im Hybridmodus / 50 Zeilen....
Verfasst: Sa, 27. Jan 2018 7:01
von Jan
AUGE_OHR hat geschrieben: ↑Fr, 26. Jan 2018 22:37wenn man auf Hybrid geht empfehle ich einen XbpDialog() als "Shell" dessen o:DrawingArea als Parent "für alle" dient.
So mache ich das in diesen Fällen auch.
Jan
Re: Programm im Hybridmodus / 50 Zeilen....
Verfasst: Mo, 29. Jan 2018 2:28
von brandelh
AUGE_OHR hat geschrieben: ↑Fr, 26. Jan 2018 22:07
so ähnlich
FALSCH hat es bei mir am Anfang auch ausgesehen
das du CRT Object (Hybrid) statt dem Root Object (VIO) nimmst ist ja schon mal ein grosser Schritt
nun musst du aber auch die
Methoden des Object nehmen und nicht die Function
Code: Alles auswählen
oCRT:setMode( [<nRowCount>], [<nColCount>] ) --> aOldMode
in der Hilfe zur 1.90.xxx steht diese Methode aber nicht, im Gegenteil wird dort configure ODER die Funktion SetMode() empfohlen;
Hilfe hat geschrieben:Beschreibung
Durch die Methode :setSize() kann die Größe eines XbpCrt-Fensters geändert werden. Die maximale Größe ist durch :maxRow und :maxCol vorgegeben, die bei der Erzeugung eines XbpCrt-Fensters angegeben wurden. Die aktuelle Größe wird durch die Methode :currentSize() abgefragt.
Die Größe eines XbpCrt-Fensters kann unter Windows nicht mit der Methode :setSize() geändert werden. Stattdessen wird die Größe durch den impliziten Textpuffer vorgegeben. Die Größe des Textpuffers wird in :create() eingestellt und kann über die Methode :configure() oder die Funktion SetMode() geändert werden. Der Aufruf der Methode :setSize() hat auf Windows-Rechnern keine Auswirkung und die Methode gibt immer den Wert .F. (FALSE) zurück.
muss ich später mal probieren, ob die Methode auch geht (wäre schön, ich mag kein Configure)
Re: Programm im Hybridmodus / 50 Zeilen....
Verfasst: Mo, 29. Jan 2018 3:15
von AUGE_OHR
brandelh hat geschrieben: ↑Mo, 29. Jan 2018 2:28
in der Hilfe zur 1.90.xxx steht diese Methode aber nicht, im Gegenteil wird dort configure ODER die Funktion SetMode() empfohlen;
uuuups ... die Method ist von VCrt()
aber ich glaub ich "weiss" was Stefan uns sagen will : das CRT Fenster verschiebt sich nach oben
also musst Stefan noch ein o:
SetPos() hinterher schieben oder
CenterControl() einsetzten um es auf dem Parent zu zentrieren. wenn es dann noch nicht "passt" ist dein Font zu gross.