Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

GUI & PRINT
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Dr. Bakterium



Anmeldungsdatum: 13.09.2007
Beiträge: 13

BeitragVerfasst am: 14.10.2007, 07:04    Titel: GUI & PRINT Antworten mit Zitat

Hallo miteinander.
Ich schreib gerade an meinem ersten FreeBasic-Programm und da es ein kleines Windows-Fenster (per API) generiert lasse ich es mit der Option "-s gui" kompilieren. Gleichzeitig möchte ich es aber alternativ auch über Kommandozeileneingabe in irgendeinem Konsolenfenster (bzw. per Batch-Datei) aufrufen können sowie dort bei Fehleingabe die Syntax für den Aufruf ausgeben lassen.

Nun zu meinen Problemen:

a) Der PRINT-Befehlt funktioniert nicht, weil der gibt seinen Text nur im programmeigenen Konsolenfenster aus und nicht in dem Konsolenfenster, in dem das Programm aufgerufen wird.

b) Kompiliere ich mit "-s console" klappt zwar PRINT im richtigen Fenster aber dafür wird das Aufrufer-Konsolenfenster solange blockiert, bis das Programm beendet ist. Das ist auch unerwünscht, es sollte diesbezüglich genauso sein wie bei der GUI-Option.

Ich wäre also dankbar, wenn mir jemand sagen könnte, wie ich entweder ins richtige Konsolenfenster PRINTen kann oder aber die Handbremse bei Konsolen-Kompilierung löse mit den Augen rollen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
AndT



Anmeldungsdatum: 02.04.2007
Beiträge: 481

BeitragVerfasst am: 14.10.2007, 21:14    Titel: Antworten mit Zitat

Ich hab mal eine kleine sub zusammengebaut zwinkern

Code:

sub toconsole(Text as string)
    dim as ubyte ffile = freefile
    open cons for output as #ffile
    print #ffile,Text
    close ffile
end sub

screen 12
toconsole "consolenfenster"
print "richtiges fenster ;)"
sleep


entscheident ist dabei 'cons', welcher die console darstellt.
Allerdings kann mit 'toconsole' nur eingeschränkt so umgegangen werden wie bei 'print'.
So müssen in diesem beispiel Variablen mit dem Befehl
Code:
STR
vorher in einen String umgewandelt werden..
Auch die gesamte Syntax, wie man sie von Basic kennt geht LEIDER auch nicht mit toconsole traurig
Alternativ:
Code:
shell "start echo test"
sleep

Allerdings springt er anschliesend ins consolenfenster..
_________________
Bis irgendwann... grinsen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Dr. Bakterium



Anmeldungsdatum: 13.09.2007
Beiträge: 13

BeitragVerfasst am: 14.10.2007, 22:04    Titel: Antworten mit Zitat

Hm, leider hab ich damit wieder dasselbe Problem. Entweder bleibt alles stehen, bis mein Programm beendet wurde und wenn ich es als GUI kompiliere erscheint kein Text in dem Konsolenfenster, von dem aus ich die Anwendung starte weinen

Gäbs evt. irgendeine Möglichkeit (mit APIs oder so), das Handle des Konsolenfensters herauszufinden, von dem aus die Anwendung gestartet wurde? Bzw. irgendeine Möglichkeit, trotz GUI-Kompilierung in diesen Textpuffer zu schreiben?
Natürlich könnte man über den Windows-Titel (z.B. "C:\WINDOWS\SYSTEM32\CMD.EXE") suchen, aber das ist recht wage weil ja auch mehrere solche Konsolenfenster/Eingabeaufforderungen/DOS-Boxen gleichzeitig offen sein könnten usw.

In JavaScript gibts für sowas das Objekt "opener", mit dem man auf das Fenster, von dem aus das aktuelle geöffnet wurde, zugreifen kann.
Gibt es sowas auch in Windows/FreeBasic? durchgeknallt
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ytwinky



Anmeldungsdatum: 28.05.2005
Beiträge: 2624
Wohnort: Machteburch

BeitragVerfasst am: 14.10.2007, 22:15    Titel: Re: GUI & PRINT Antworten mit Zitat

Dr. Bakterium hat Folgendes geschrieben:
Ich schreib gerade an meinem ersten FreeBasic-Programm und da es ein kleines Windows-Fenster (per API) generiert lasse ich es mit der Option "-s gui" kompilieren.
..das ist sicherlich etwas ganz Besonderes, laß uns einfach teilhaben und poste den Quellcode..
Gruß
ytwinky
_________________
v1ctor hat Folgendes geschrieben:
Yeah, i like INPUT$(n) as much as PRINT USING..
..also ungefähr so, wie ich GOTO..
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Dr. Bakterium



Anmeldungsdatum: 13.09.2007
Beiträge: 13

BeitragVerfasst am: 15.10.2007, 15:40    Titel: Antworten mit Zitat

Klar, hier ist der Code:

Code:
#include once "windows.bi"
#include "DialogAppRes.bi"

Print "Das ist ein Test" '<--- Das sollte beim Starten in aufrufenden Konsole (nicht der programmeigenen) erscheinen

Function DlgProc(byval hDlg as HWND, byval uMsg as UINT, byval wParam as WPARAM, byval lParam as LPARAM) as integer
   dim as long id, event, x, y
   dim hBtn as HWND
   dim rect as RECT

   select case uMsg
      case WM_INITDIALOG
         '
      case WM_CLOSE
         EndDialog(hDlg, 0)
         '
      case WM_COMMAND
         id=loword(wParam)
         event=hiword(wParam)
         select case id
            case IDC_BTN1
               EndDialog(hDlg, 0)
               '
         end select
      case WM_SIZE
         GetClientRect(hDlg,@rect)
         hBtn=GetDlgItem(hDlg,IDC_BTN1)
         x=rect.right-100
         y=rect.bottom-35
         MoveWindow(hBtn,x,y,97,31,TRUE)
         '
      case else
         return FALSE
         '
   end select
   return TRUE

End Function

'''
''' Program start
'''

   ''
   '' Create the Dialog
   ''
   DialogBoxParam(GetModuleHandle(NULL), Cast(zstring ptr,IDD_DLG1), NULL, @DlgProc, NULL)
   ''
   '' Program has ended
   ''
   ExitProcess(0)
   end

'''
''' Program end
'''


Man könnte es aber auch schlicht und einfach reduzieren auf ...

Code:
Print "Das ist ein Test"
end


... und als "Windows GUI" kompilieren. Der Effekt ist derselbe. Der gePRINTtete Text erscheint nicht in der Eingabeaufforderungs-Konsole.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
AndT



Anmeldungsdatum: 02.04.2007
Beiträge: 481

BeitragVerfasst am: 15.10.2007, 17:53    Titel: Antworten mit Zitat

starte es doch mit dem befehl 'start' in einer batchdatei
das würde dann so aussehen:
Code:
@echo off
echo starte programm..
start programm.exe

_________________
Bis irgendwann... grinsen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Dr. Bakterium



Anmeldungsdatum: 13.09.2007
Beiträge: 13

BeitragVerfasst am: 15.10.2007, 21:24    Titel: Antworten mit Zitat

Leider ist es mit "start programm.exe" genauso. Das FreeBasic-Programm kann nichts auf der Eingabeaufforderungs-Konsole ausgeben, von der es gestartet wurde oder es blockiert die ganze Batch-Datei.

Hm, ich werd wohl doch nochmal googeln müssen. Womöglich gibt Windows das garnicht her, was ich möchte. geschockt
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Dr. Bakterium



Anmeldungsdatum: 13.09.2007
Beiträge: 13

BeitragVerfasst am: 17.10.2007, 02:32    Titel: Antworten mit Zitat

Heureka, ich habs! grinsen

Also Handle der eigenen Applikation über Prozeß-ID o. ä. rauszukriegen ist schon eine Qual und hilft leider auch nicht weiter weil Windows keinen Zugriff auf parallel laufende Programmkonsolen wie jene von CMD.EXE erlaubt, was ich nach längerem Suchen schlußendlich in der Win32-API-Dokumentation las. Mal abgesehen davon daß ich keine Ahnung habe, wie man die PID oder das Handle der Eingabeaufforderung zweifelsfrei rausbekommen kann.

Die Idee mit der Batch-Datei war schon nicht schlecht, aber unpraktisch, weil man damit eine zusätzlich Starter-Datei benötigt. Mein Kompromiß wäre daher, die EXE-Datei einfach im Programm selber, aber mit einem speziellen Kommandozeilenparameter versehen, aufzurufen - Rekursiv also.

Hier ein Beispielprogramm:
Code:
#include once "windows.bi"

Const HilfeText = "Syntax: Testprog.exe /t:<ihr Text>"
Dim Shared As String IhrText

IhrText = "Hier könnte Ihr Text stehen"

If Command(1) <> "irgendwas" Then
   If Command(-1) = "" Or UCase(Left$(Command(1),3)) = "/T:" Then
      If Run(ExePath+"\"+Command(0),"irgendwas "+Mid$(Command(1),4)) > -1 Then
         End
      Else
         FreeConsole()
      EndIf
   Else
      Print HilfeText
      end
   EndIf
EndIf

If Command(2) <> "" Then IhrText = Command(2)

MessageBox(0,IhrText,"Titel",MB_OK)
end


Das Ganze muß man als "Windows Console" kompilieren.
Und so verhält sich mein Programm in der Eingabeaufforderungskonsole:

1. Fall: TestProg.exe
Das Programm wird nicht-blockierend mit dem Default-Text gestartet

2. Fall: TestProg.exe alsdökjfasdalökf
Eine Syntax-Meldung wird auf der Eingabeaufforderungskonsole ausgegeben, sonst passiert nix weiter

3. Fall: TestProg.exe /t:Hallo
Wie Fall 1, nur wird statt dem Default-Text "Hallo" verwendet

4. Fall: Doppelklick auf TestProg.exe
Der Defaulttext wird ausgegeben, die programmeigene Konsole wird mit freeconsole() sofort weggeblendet


Damit sind alle Anforderungen erfüllt. Mich würde nur noch interessieren, ob der Code auch mit anderen Windows-Versionen harmoniert. Vielleicht kann ihn jemand bitte mit Win XP, 2003, Vista etc. testen? Danke lächeln
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 17.10.2007, 12:34    Titel: Antworten mit Zitat

Hi Dr. Bakterium,
das Programm reagiert aber etwas anders als du beschreibst:
Zitat:
2. Fall: TestProg.exe alsdökjfasdalökf
Eine Syntax-Meldung wird auf der Eingabeaufforderungskonsole ausgegeben, sonst passiert nix weiter
Ist aber nicht lesbar da die Konsole sofort geschlossen wird!
Zitat:
3. Fall: TestProg.exe /t:Hallo
Wie Fall 1, nur wird statt dem Default-Text "Hallo" verwendet
Da Command(2) = "" wird 'Hier koennte Ihr Text stehen' ausgegeben?

Ohne -s gui oder -s console kompiliert geht es etwas einfacher:
Code:
' ohne -s gui oder -s console
#INCLUDE ONCE "windows.bi"

Dim Shared As String IhrText
IhrText = "Hier koennte Ihr Text stehen"

If Command(1) <> "" Then
  If Ucase(Left(Command(1), 3)) = "/T:" Then
    IhrText = Mid(Command(1), 4)
  Else
    Screen 0
    Print "Syntax: Testprog.exe /t:<Ihr Text>"
    Sleep
    End
  End If
End If
FreeConsole()

Screen 18, 32
Print IhrText
Sleep
End


Wenn es auch ohne Konsolenfenster sein darf (warum auch nicht?):
Code:
'mit -s gui kompilieren
#INCLUDE ONCE "windows.bi"

Dim Shared As String IhrText
IhrText = "Hier koennte Ihr Text stehen"

If Command(1) <> "" Then
  If Ucase(Left(Command(1),3)) = "/T:" Then
    IhrText = Mid(Command(1),4)
  Else
    MessageBox(0,"Syntax: Testprog.exe /t:<Ihr Text>",Command(0),MB_OK)
    End
  End If
End If


Screen 18,32
Print IhrText
Sleep
End

_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Dr. Bakterium



Anmeldungsdatum: 13.09.2007
Beiträge: 13

BeitragVerfasst am: 17.10.2007, 15:10    Titel: Antworten mit Zitat

Hallo volta,
bist du sicher? mit den Augen rollen Wenn ich im Windows sage "Start - Ausführen - cmd.exe" und in dieser Konsole dann mein Prog aufrufe schließt sich die cmd.exe-Konsole nicht von selber wieder. Ich glaube aber das kann man am Windows einstellen. Naja, das ist der Preis dafür, daß das Programm die Konsole nicht blockiert.

Im anderen Fall mit dem /t-Parameter hast du übersehen, daß das Programm im 1. Durchlauf im IF-Block bereits beendet wird. Dort findet auch der 2. Aufruf statt, mit dem zusätzlichen Parameter "irgendwas" sodaß beim 2. Durchlauf das Programm komplett durchlaufen kann.

Es geht um diesen Code-Schnipsel:

Code:
If Command(1) <> "irgendwas" Then
   If Command(-1) = "" Or UCase(Left$(Command(1),3)) = "/T:" Then
      If Run(ExePath+"\"+Command(0),"irgendwas "+Mid$(Command(1),4)) > -1 Then
         End


Ohne den Run-Befehl würde das Ganze freilich nicht funktionieren und "-s" wegzulassen erzeugt bei mir automatisch eine Konsolenanwendung. "-s console" scheint die Default-Einstellung des Compilers zu sein.

Hm, wie genau reagiert mein letztes Programm bei dir? Welche Compiler- und Windows-Version benutzt du?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 17.10.2007, 20:29    Titel: Antworten mit Zitat

Hi,
den ersten Fehler meinerseits habe ich gerade entdeckt. verwundert
Ich hatte es mit XP ausprobiert und da wird schon durch Command(0) der ExePath mitgeliefert.
Der Aufruf 'Run(ExePath+"\"+Command(0)....' führt damit zu einem Fehler und die Ausgabe ist 'Hier koennte Ihr Text stehen'.
So geht das also nur unter 98/ME.

Unter ME schließt sich die cmd.exe-Konsole tatsächlich nicht, unter XP tat sie das? Eine Einstellmöglichkeit dafür habe ich auf die Schnelle nicht gefunden?

PS. mit FB0.18.2 erstellt. Die Version sollte aber keine Rolle dabei spielen.
_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Dr. Bakterium



Anmeldungsdatum: 13.09.2007
Beiträge: 13

BeitragVerfasst am: 18.10.2007, 01:16    Titel: Antworten mit Zitat

Ah danke,
unter Win 2000 läuft es übrigens auch. Hm, wußte nicht, daß Command(0) unter XP den Pfad gleich mitliefert. In der FreeBasic-Doku steht dazu einfach "returns the name of the executable" ... wieder was dazugelernt zwinkern

Eigentlich sollte die Konsole nur mit "exit" schließen. Ich glaube das kann man an der Verknüpfung selber einstellen. Allerdings kenne ich mich in XP nicht gut aus traurig
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 18.10.2007, 11:29    Titel: Antworten mit Zitat

Dr. Bakterium hat Folgendes geschrieben:
Hm, wußte nicht, daß Command(0) unter XP den Pfad gleich mitliefert.


Tut's nicht... Wäre auch unlogisch, weil das ja die Verwendung von EXEPATH obsolet machen würde.
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 18.10.2007, 13:50    Titel: Antworten mit Zitat

probier es doch mal unter XP aus Jojo Zunge rausstrecken
Code:
#INCLUDE ONCE "windows.bi"

screen 0
?COMMAND(0)
?exepath
MessageBox(0,"doch !!!",COMMAND(0),MB_OK)
END

_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
stuner



Anmeldungsdatum: 29.06.2006
Beiträge: 45

BeitragVerfasst am: 18.10.2007, 13:57    Titel: Antworten mit Zitat

Nein....

Ausgabe unter WinXP Home SP2

Zitat:
FbTemp.exe
(Dateipfad)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 18.10.2007, 14:17    Titel: Antworten mit Zitat

doch
bei meinem XP Professional SP2 schon
XP Professional SP2 hat Folgendes geschrieben:
F:\FBIDE4_17\TestProg2.exe
F:\FBIDE4_17

_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 18.10.2007, 14:20    Titel: Antworten mit Zitat

Bei mir steht's auch ohne Pfad... Hast du evtl ein CVS-Build installiert oder so?
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
stuner



Anmeldungsdatum: 29.06.2006
Beiträge: 45

BeitragVerfasst am: 18.10.2007, 14:33    Titel: Antworten mit Zitat

volta hat Folgendes geschrieben:

PS. mit FB0.18.2 erstellt. Die Version sollte aber keine Rolle dabei spielen.


Also kein CVS build...
Vlt. liegts am Professional...

Edit:

Bei einem kurzen Pfad zeigt es den Pfad scheinbar mit an.....komisch

Edit2:

Die Wege des Windows sind unergründlich:

Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 18.10.2007, 14:44    Titel: Antworten mit Zitat

ich hab auch Prof... Und ob Home oder Prof sollte wirklich keine rolle spielen...
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4704
Wohnort: ~/

BeitragVerfasst am: 18.10.2007, 16:04    Titel: Antworten mit Zitat

stuner hat Folgendes geschrieben:
Die Wege des Windows sind unergründlich

Das erinnert mich jetzt irgendwie an eine der Quizfragen in einem (meiner Ansicht nach nicht allzu brauchbaren) Python-Programmierbuch:
Zitat:
Wer entscheidet, wann ein GUI-Programm zu Ende ist?

  • [...]
  • [...]
  • Das Betriebssystem. Wenn dem Betriebssystem langweilig wird, springt es zum Blue Screen of Death.
  • [...]

_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz