Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Dr. Bakterium
Anmeldungsdatum: 13.09.2007 Beiträge: 13
|
Verfasst am: 14.10.2007, 07:04 Titel: GUI & PRINT |
|
|
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  |
|
Nach oben |
|
 |
AndT
Anmeldungsdatum: 02.04.2007 Beiträge: 481
|
Verfasst am: 14.10.2007, 21:14 Titel: |
|
|
Ich hab mal eine kleine sub zusammengebaut
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
vorher in einen String umgewandelt werden..
Auch die gesamte Syntax, wie man sie von Basic kennt geht LEIDER auch nicht mit toconsole
Alternativ:
Code: | shell "start echo test"
sleep |
Allerdings springt er anschliesend ins consolenfenster.. _________________ Bis irgendwann...  |
|
Nach oben |
|
 |
Dr. Bakterium
Anmeldungsdatum: 13.09.2007 Beiträge: 13
|
Verfasst am: 14.10.2007, 22:04 Titel: |
|
|
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
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?  |
|
Nach oben |
|
 |
ytwinky

Anmeldungsdatum: 28.05.2005 Beiträge: 2624 Wohnort: Machteburch
|
Verfasst am: 14.10.2007, 22:15 Titel: Re: GUI & PRINT |
|
|
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 |
|
 |
Dr. Bakterium
Anmeldungsdatum: 13.09.2007 Beiträge: 13
|
Verfasst am: 15.10.2007, 15:40 Titel: |
|
|
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 |
|
 |
AndT
Anmeldungsdatum: 02.04.2007 Beiträge: 481
|
Verfasst am: 15.10.2007, 17:53 Titel: |
|
|
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...  |
|
Nach oben |
|
 |
Dr. Bakterium
Anmeldungsdatum: 13.09.2007 Beiträge: 13
|
Verfasst am: 15.10.2007, 21:24 Titel: |
|
|
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.  |
|
Nach oben |
|
 |
Dr. Bakterium
Anmeldungsdatum: 13.09.2007 Beiträge: 13
|
Verfasst am: 17.10.2007, 02:32 Titel: |
|
|
Heureka, ich habs!
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  |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 17.10.2007, 12:34 Titel: |
|
|
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 |
|
 |
Dr. Bakterium
Anmeldungsdatum: 13.09.2007 Beiträge: 13
|
Verfasst am: 17.10.2007, 15:10 Titel: |
|
|
Hallo volta,
bist du sicher? 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 |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 17.10.2007, 20:29 Titel: |
|
|
Hi,
den ersten Fehler meinerseits habe ich gerade entdeckt.
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 |
|
 |
Dr. Bakterium
Anmeldungsdatum: 13.09.2007 Beiträge: 13
|
Verfasst am: 18.10.2007, 01:16 Titel: |
|
|
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
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  |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 18.10.2007, 11:29 Titel: |
|
|
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 |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 18.10.2007, 13:50 Titel: |
|
|
probier es doch mal unter XP aus Jojo
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 |
|
 |
stuner
Anmeldungsdatum: 29.06.2006 Beiträge: 45
|
Verfasst am: 18.10.2007, 13:57 Titel: |
|
|
Nein....
Ausgabe unter WinXP Home SP2
Zitat: | FbTemp.exe
(Dateipfad) |
|
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 18.10.2007, 14:17 Titel: |
|
|
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 |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 18.10.2007, 14:20 Titel: |
|
|
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 |
|
 |
stuner
Anmeldungsdatum: 29.06.2006 Beiträge: 45
|
Verfasst am: 18.10.2007, 14:33 Titel: |
|
|
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 |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 18.10.2007, 14:44 Titel: |
|
|
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 |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 18.10.2007, 16:04 Titel: |
|
|
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 |
|
 |
|