Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Konsole oder was? (https://www.delphipraxis.net/24617-konsole-oder.html)

MaBuSE 23. Jun 2004 16:24


Konsole oder was?
 
Hallo,

Folgende Situation:
Ich möchte ein Programmschreiben, das wenn es aus der Konsole aufgerufen wird eine Textausgabe bringt, wenn es aber aus Windows direkt (Explorer oder so) aufgerufen wird soll ein Form erscheinen.

Delphi-Quellcode:
program Project1;

uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

begin
  if isConsole then
  begin
    WriteLn('Konsole ist geil.');
  end
  else
  begin
    Application.Initialize;
    Application.CreateForm(TForm1, Form1);
    Application.Run;
  end;
end.
Das bringt ja leider nichts, weil isConsole ja nur angibt, ob es sich um ein Konsolenprogramm handelt.

Frage:
Wie krieg ich raus, ob eine Anwendung aus dem "Textfenster" gestartet wurde oder nicht?

Deshalb der Titel: "Konsole oder was?" :mrgreen:

Danke für die vielen Antworten... :dp:

ps: hoffentlich ließt das NicoDE, der kennt sich doch mit so was aus :zwinker:

alcaeus 23. Jun 2004 16:27

Re: Konsole oder was?
 
Du könntest es mit einem Parameter realisieren. Wenn das Programm in der Konsole aufgerufen wird, soll einfach "/c" als Parameter übergeben werden.
In der DPR-Datei schreibst du dann
Delphi-Quellcode:
if LowerCase(ParamStr(1)) = '/c' then
begin
  Application.CreateForm(...
//Originaler Code der DPR
end
else
//Konsolensachen
Greetz
alcaeus

MaBuSE 23. Jun 2004 16:33

Re: Konsole oder was?
 
Zitat:

Zitat von alcaeus
Du könntest es mit einem Parameter realisieren. Wenn das Programm in der Konsole aufgerufen wird, soll einfach "/c" als Parameter übergeben werden.

Danke, aber genau das will ich nicht !!!

Mein Programm ist ein Konsolenprogramm.

Es gibt natürlich Spezialisten, die klicken im Explorer drauf und wundern sich, das ein Fenster auf und wieder zu geht.
Es soll dann eine Meldung kommen z.B.: "Das ist nix für Dich, starte ein anderes Programm :-)"

Ich will aber auch die Konsolenanwender nicht mit einem Parameter /nogui oder so strafen.

Nur dazu müsste man natürlich erkennen wie es gestartet wurde.

Christian Seehase 23. Jun 2004 19:27

Re: Konsole oder was?
 
Moin Mabuse,

folgendes könnte funktionieren:

Entferne aus dem Konsolenprogramm die Zeile {$APPTYPE CONSOLE}
Anschliessend kannst Du mit

Delphi-Quellcode:
  if GetStdHandle(STD_INPUT_HANDLE) = 0 then begin
    ShowMessage('KEINE KONSOLE');
  end else begin
    ShowMessage('KONSOLE');
  end;
überprüfen, ob das Programm mittels Doppelclick aus dem Explorer heraus gestartet wurde, oder innerhalb einer Konsole.

Bleibt der Apptype auf Console, so würde Windows bei einem Doppelclick erkennen, dass es eine Konsole starten, und innerhalb dieser Dein Programm ausführen soll, lässt Du den weg, dann entfällt das.

NicoDE 23. Jun 2004 19:39

Re: Konsole oder was?
 
Zitat:

Zitat von MaBuSE
hoffentlich ließt das NicoDE, der kennt sich doch mit so was aus :zwinker:

Es gibt leider nicht unter allen Win32-Versionen die Möglichkeit herauszufinden, ob der eigene Prozess in der Konsole des Vaterprozesses ausgeführt wird, sorry. Selbst dann bleiben noch diverse Fragen offen (Erkennung von Umleitungen der Standard-Ausgabe, etc.).

Ultimator 23. Jun 2004 19:45

Re: Konsole oder was?
 
Zitat:

Zitat von Christian Seehase
Delphi-Quellcode:
if GetStdHandle(STD_INPUT_HANDLE) = 0 then begin
    ShowMessage('KEINE KONSOLE');
  end else begin
    ShowMessage('KONSOLE');
  end;

Aber eigentlich braucht man doch da nicht immer begin und end zu schreiben; du hast doch immer nur eine Anweisung zu erledigen :gruebel:

Christian Seehase 23. Jun 2004 19:57

Re: Konsole oder was?
 
Moin Ultimator,

stimmt, notwendig ist es nicht, aber wenn ich else verwende mache ich das immer.
Ich finde das übersichtlicher.

Sollte es hierzu noch weiteren Diskussionsbedarf geben, möchte ich aber darum bitten dies in einem gesonderten Thread zu tun, da es doch ziemlich OT ist.
Danke.

MaBuSE 24. Jun 2004 08:34

Re: Konsole oder was?
 
Zitat:

Zitat von Christian Seehase
folgendes könnte funktionieren: ...

Danke, das werd ich mal heute Abend probieren.

Zitat:

Zitat von NicoDE
Es gibt leider nicht unter allen Win32-Versionen die Möglichkeit herauszufinden, ob der eigene Prozess in der Konsole des Vaterprozesses ausgeführt wird, sorry. Selbst dann bleiben noch diverse Fragen offen (Erkennung von Umleitungen der Standard-Ausgabe, etc.).

Das wollte ich eigentlich nicht hören, aber danke ;-)
Die meisten Anwender werden wohl me, w2k und xp einsetzen.
Gibt es da eine gute Möglichkeit fest zustellen ob Text oder GUI?
Win 95, 98 kann ich vernachlässigen.

Ich möchte mein DP ShoutBox Reader ausbauen.
Ein Bennutzer schrieb in der Bewertung, dass nur ein schwarzes Fenster aufging und sich wieder schloss ;-(

Es soll dann entweder eine GUI starten, oder eine Meldung kommen.
Das ist der Einsatzzweck.

Ich glaube Umleitungen und Sonstiges brauche ich nicht zu berücksichtigen.

Im schlimmsten Fall geht halt eine GUI auf :-)
Für Problemfälle kann man ja dann doch einen Schalter /forceConsole einbauen.

Vielen Dank für die Antworten.

Muetze1 24. Jun 2004 09:32

Re: Konsole oder was?
 
Moin!

Ich sehe da noch ein grundlegendes Problem: Also nochmal zur Überlegung eine kleine Liste...

1. Wenn du {$APPTYPE CONSOLE} in deinem Programm drinne hast, dann funktioniert WriteLn() und die anderen, aber ein Form musst du er umständlich erzeugen.
2. Wenn du {$APPTYPE CONSOLE} entfernst, dann klappen zwar die Forms, aber laut Delphi nicht WriteLn() und Co
Zitat:

Zitat von Delphi OH
Bei anderen Anwendungen sführt jeder Versuch, aus Input zu lesen oder in Output zu schreiben, zu einem E/A-Fehler.

Somit: Wie willst du das machen? Grundlegend sehe ich da nur die Möglichkeit entweder die DFM's zur Laufzeit selbst aus den Resourcen zu laden und aufzubauen oder eine nonVCL Fensterumgebung aufbauen.

Nochwas: IsConsole() hilft da eigentlich wenig, weil sich diese immer direkt an {$APPTYPE CONSOLE} orientiert, weil dieser Switch veranlasst ihn die Stdio's zu initialisieren, ergo...

MfG
Muetze1

MaBuSE 24. Jun 2004 09:40

Re: Konsole oder was?
 
Zitat:

Zitat von Muetze1
2. Wenn du {$APPTYPE CONSOLE} entfernst, dann klappen zwar die Forms, aber laut Delphi nicht WriteLn() und Co
Zitat:

Zitat von Delphi OH
Bei anderen Anwendungen sführt jeder Versuch, aus Input zu lesen oder in Output zu schreiben, zu einem E/A-Fehler.

Somit: Wie willst du das machen? Grundlegend sehe ich da nur die Möglichkeit entweder die DFM's zur Laufzeit selbst aus den Resourcen zu laden und aufzubauen oder eine nonVCL Fensterumgebung aufbauen.

Das geht relativ Einfach:
Delphi-Quellcode:
  if not IsConsole then
    Windows.AllocConsole;
Danach kann man WriteLn benutzen ;-)

Zitat:

Zitat von Muetze1
Nochwas: IsConsole() hilft da eigentlich wenig, weil sich diese immer direkt an {$APPTYPE CONSOLE} orientiert, weil dieser Switch veranlasst ihn die Stdio's zu initialisieren, ergo...

Das weiss ich!
Das Habe ich ja auch in meiner Frage geschrieben.
Zitat:

Zitat von MaBuSE
Das bringt ja leider nichts, weil isConsole ja nur angibt, ob es sich um ein Konsolenprogramm handelt.



Alle Zeitangaben in WEZ +1. Es ist jetzt 11:21 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz