Löschung des hässlichen schwarzen DOS-Fensters

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Antworten
Werner
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 118
Registriert: Sa, 18. Mär 2006 16:08

Löschung des hässlichen schwarzen DOS-Fensters

Beitrag von Werner »

Hi!

Ich habe hinter meiner Programmstartmaske immer noch so ein altes hässliches, schwarzes (DOS)-Fenster auf dem oben lediglich der Name der .EXE steht.

Welchen Namen hat dieses Fenster und wie kann ich es löschen bzw. wegbekommen?

Gruß Werner
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Löschung des hässlichen schwarzen DOS-Fensters

Beitrag von Jan »

Werner,

bau in Dein Projekt eine FUNCTION AppSys ein. Da mß nichts drin stehen, nur die Funktion muß es geben.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Löschung des hässlichen schwarzen DOS-Fensters

Beitrag von brandelh »

in der kann man aber auch einige Voreinstellungen machen, siehe hierzu das Beispiel von SDIDEMO:

Code: Alles auswählen

/*
 * Beispiel für AppSys() in SDI Anwendung
 * Die Funktion wird vor der Main Prozedur ausgefhrt
 */
PROCEDURE AppSys
   LOCAL oDlg, oXbp, aPos[2], aSize, nHeight:=400, nWidth := 615

   // Größe vom DeskTop feststellen
   // um Anwendungsfenster zu zentrieren
   aSize    := SetAppWindow():currentSize()
   aPos[1]  := Int( (aSize[1]-nWidth ) / 2 )
   aPos[2]  := Int( (aSize[2]-nHeight) / 2 )

   // Anwendungsfenster erzeugen (application window)
   oDlg := XbpDialog():new()
   oDlg:title    := "Toys & Fun Inc. [Xbase++ - SDI Demo]"
   oDlg:border   := XBPDLG_DLGBORDER
   oDlg:taskList := .T.
   oDlg:maxButton:= .F.
   oDlg:create( ,, aPos, {nWidth, nHeight},, .F. )

   // Font wählen
   oDlg:drawingArea:SetFontCompoundName( "8.Helv" )

   // Mensystem erzeugen (UDF)
   MenuCreate( oDlg:menuBar() )

   // Online-Hilfe mit UDF bereitstellen
   oXbp := XbpHelpLabel():new():create()
   oXbp:helpObject := ;
        HelpObject( "SDIDEMOG.HLP", "Hilfe fr SDI demo" )
   oDlg:helpLink := oXbp

   // Anwendungsfenster anzeigen und Fokus geben
   oDlg:show()
   SetAppWindow( oDlg )
   SetAppFocus ( oDlg )

RETURN
Gruß
Hubert
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Löschung des hässlichen schwarzen DOS-Fensters

Beitrag von Jan »

Hallo Hubert,

das ist natürlich korrekt. Wobei es ja immer mal Diskussionen darum gibt, was in die AppSys rein kann/sollte, und was nicht.

Für den Zweck, den Werner ansprach, muß da gar nichts drin stehen. Alleine die Anwesenheit der AppSys reicht aus, das DOS-Fenster zu unterdrücken.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Löschung des hässlichen schwarzen DOS-Fensters

Beitrag von brandelh »

schön dass du mir zustimmst ;-)

Ich wollte dir auch gar nicht widersprechen :D

Um es genau zu sagen, diese PRG zeigt das Standardverhalten:

...\XPPW32\source\SYS\APPSYS.PRG

Code: Alles auswählen

//////////////////////////////////////////////////////////////////////
//
//  APPSYS.PRG
//
//  Copyright:
//      Alaska Software, (c) 1997-2009. 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.
//   
//////////////////////////////////////////////////////////////////////

#include "xbp.ch"

****************************************************************************
* Funktion AppSys() um Standard-Ausgabegeraete zu erzeugen
****************************************************************************
PROCEDURE AppSys()

#define DEF_ROWS       25
#define DEF_COLS       80
#define DEF_FONTHEIGHT 16
#define DEF_FONTWIDTH   8

  LOCAL oCrt, nAppType := AppType()
  LOCAL aSizeDesktop, aPos

  DO CASE 

    // Anwendung wurde im PM Modus gelinkt, eine XbpCrt Instanz
    // ist zu erzeugen.
    CASE nAppType == APPTYPE_PM

      // Bestimmen der Fensterposition (Anordnen in der Mitte
      // des Desktop-Fensters)
      aSizeDesktop    := AppDesktop():currentSize()
      aPos            := { (aSizeDesktop[1]-(DEF_COLS * DEF_FONTWIDTH))  /2, ;
                           (aSizeDesktop[2]-(DEF_ROWS * DEF_FONTHEIGHT)) /2  }

      // XbpCRT-Fenster erzeugen
      oCrt := XbpCrt():New ( NIL, NIL, aPos, DEF_ROWS, DEF_COLS )
      oCrt:FontWidth  := DEF_FONTWIDTH
      oCrt:FontHeight := DEF_FONTHEIGHT
      oCrt:title      := AppName()
#ifdef __OS2__
      oCrt:FontName   := "System VIO"
#endif
#ifdef __WIN32__
      oCrt:FontName   := "Alaska Crt"
#endif
      oCrt:Create()

      // Presentation Space initialisieren
      oCrt:PresSpace()

      // XbpCrt wird aktives Fenster und Ausgabeger„t
      SetAppWindow ( oCrt )

    // Anwendung wurde im VIO oder NOVIO Modus gelinkt, eine RootCrt
    // Instanz ist zu erzeugen.
    CASE nAppType == APPTYPE_VIO .OR. nAppType == APPTYPE_NOVIO

      // RootCrt Instanz erzeugen.
      //
      // Die IVar :CreateBuffer bestimmt wie sich das RootCrt verhaelt
      // wenn es in einem Shell Fenster erzeugt wird.
      //
      //   :CreateBuffer == .T. : Das RootCrt wird einen eigenen Bildschirm
      //                          Puffer erzeugen der dann fuer die Darstellung
      //                          verwendet wird. Dies hat zur Folge das 
      //                          Ausgaben mit OutStd() nicht mit anderen
      //                          Text Ausgaben (z.B: Qout(), Dispbox() gemischt
      //                          werden koennen.
      //   :CreateBuffer == .F. : Es wird kein eigener Bildschirm Puffer erzeugt
      //                          und der des Shell Fensters verwendet. OutStd()
      //                          Ausgaben werden nun gleichzeitig dargestellt.
      oCrt := RootCrt():New()
      oCrt:CreateBuffer := .T.
      oCrt:Create()

      // RootCrt wird aktives Fenster und Ausgabeger„t.
      SetAppWindow ( oCrt )

  ENDCASE

RETURN

// EOF
so wird sichergestellt, dass man standardmäßig ein Clipper kompatibles Fenster hat.
Gruß
Hubert
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Löschung des hässlichen schwarzen DOS-Fensters

Beitrag von Jan »

Hubert,

warum sollte ich Dir widersprechen wollen? Du hattest ja vollkommen Recht. Mir ging es ausschließlich darum darauf hinzuweisen, daß das alles nicht notwendig ist um das zu erreichen, was Werner braucht.

Es gibt da einen interessantes Video von Frank++, in dem er aufzeigt, in welcher Reihenfolge bestimmte Funktionen beim Programmstart ausgeführt werden. All das, was Du aufgeführt hast, kann man auch z. B. in die Main() stecken. Aber die AppSys kommt halt schon vorher dran. Es macht also manchmal durchaus Sinn zu überlegen, wo genau man bestimmten Code unterbringt.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Löschung des hässlichen schwarzen DOS-Fensters

Beitrag von brandelh »

Es ist immer gut zu wissen wie was aufgerufen wird :-)

Als meine EXE mit der neuen Xbase++ Version kurz zu sehen und dann sofort wieder weg war, konnte ich mit einer msgbox() in einer Exit Prozedur erkennen, dass es KEIN Programmabsturz sondern ein reguläres Ende war.
Eine der Abfragen war plötzlich .f. die vorher immer .t. war ... warum auch immer (kann mich nicht mehr erinnern).
Gruß
Hubert
Werner
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 118
Registriert: Sa, 18. Mär 2006 16:08

Re: Löschung des hässlichen schwarzen DOS-Fensters

Beitrag von Werner »

Hallo: Hier meldet sich der Fragesteller Werner!

Ich habe, wie empfohlen, die PROCEDURE AppSys() Return in den Quellcode eingebaut ... und das hat bei drei von meinen 5 Projekten auch zauberhaft funktioniert!

Bei zwei weiteren Projekten, die ganz ähnlich aufgebaut sind, wie die drei ersten, führt die Aufnahme der PROCEDURE AppSys() jedoch dazu, dass
die .:EXE nicht mehr hochfährt. Kann das vielleicht an der Stelle innerhalb des Quellcodes liegen, an der die PROC AppSys eingebaut wurde?

Gruß Werner
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Löschung des hässlichen schwarzen DOS-Fensters

Beitrag von brandelh »

Eine Funktion muss zwingend außerhalb anderer definiert werden, aber wo spielt keine Rolle,
solange die PRG compiliert und gelinkt wird.
Die im lokalen PRG definierte Funktion ersetzt dann die aus der DLL.
Gruß
Hubert
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Löschung des hässlichen schwarzen DOS-Fensters

Beitrag von Tom »

Sind das möglicherweise CRT-Anwendungen? Oder hatten sie schon sinnvolle AppSys-Prozeduren, die jetzt überlagert wurden? Obwohl, dann gäb's ja Compilerfehler. XPPFATAL?
Herzlich,
Tom
Antworten