Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi GUI Anwendung mit Consolen-Ausgabe (https://www.delphipraxis.net/49312-gui-anwendung-mit-consolen-ausgabe.html)

MrKnogge 8. Jul 2005 23:41


GUI Anwendung mit Consolen-Ausgabe
 
Hallo,

ich würde gerne eine Gui-Anwendung schreiben, die wenn man sie aus der Eingabe-Aufforderung mit Parametern startet, die Ausgabe per Eingabe-Aufforderung geschieht, (wie beispielsweise 7z).

Ist das möglich, oder muss ich dann eine extra Consolen-Anwenung schreiben, die dann aus meiner Anwenung aufgerufen wird ?

gruss

marabu 9. Jul 2005 16:16

Re: GUI Anwendung mit Consolen-Ausgabe
 
Hallo Christian,

ein gesondertes Konsolenprogramm wird wohl nicht notwendig sein:

Delphi-Quellcode:
uses
  Windows;

var
  hIn: THandle;
  hOut: THandle;
  c: char;
  iRead, iWritten: cardinal;
  s: string;

begin
  AllocConsole;

  hIn := GetStdHandle(STD_INPUT_HANDLE);
  hOut := GetStdHandle(STD_OUTPUT_HANDLE);
 
  FlushFileBuffers(hIn);

  s := '';
  repeat
    ReadFile(hIn, c, 1, iRead, nil);
    if c = #13
      then Break
      else s := s + c;
  until false;

  WriteFile(hOut, s[1], Length(s), iWritten, nil);

  FreeConsole;
end.
Grüße vom marabu

Olli 9. Jul 2005 18:09

Re: GUI Anwendung mit Consolen-Ausgabe
 
{$APPTYPE CONSOLE} ... wenn ein GUI-Programm auch Writeln() können soll ;)

SirThornberry 9. Jul 2005 18:12

Re: GUI Anwendung mit Consolen-Ausgabe
 
@olli: Nur leider kommt dann das Consolenprogramm standardmäßig immer, ich glaub aber der Sinn war dass, das Consolenfenster entweder gar nicht erscheinen sollte oder eben nur bei bestimmten Parametern... Ansonsten war das auch mein erster Gedanke, denn mit diesem Apptype (Console) und dann dem Projekt ein Form hinzufügen hat man leider genau den selben effekt wie gerade beschrieben.

Olli 9. Jul 2005 18:24

Re: GUI Anwendung mit Consolen-Ausgabe
 
Zitat:

Zitat von SirThornberry
@olli: Nur leider kommt dann das Consolenprogramm standardmäßig immer, ich glaub aber der Sinn war dass, das Consolenfenster entweder gar nicht erscheinen sollte oder eben nur bei bestimmten Parametern... Ansonsten war das auch mein erster Gedanke, denn mit diesem Apptype (Console) und dann dem Projekt ein Form hinzufügen hat man leider genau den selben effekt wie gerade beschrieben.

Das stimmt, allerdings gehen bestimmte Sachen nicht, wenn du über AllocConsole() gehst. Das wäre die Alternative um sich auf die Schnelle eine Ausgabekonsole im normalen Windowsstil zu holen ;)

marabu 9. Jul 2005 18:46

Re: GUI Anwendung mit Consolen-Ausgabe
 
Hi Olli,

das WIN32 Console API bietet mir eigentlich alles was ich brauche, aber hier reicht das wohl nicht. Beim Starten des Programmes aus einer Konsole will MrKnogge wahrscheinlich kein neues Konsolfenster, sondern die Standard-Kanäle des offenen Fensters benutzen.

Nachdenkliche Grüße vom marabu

Olli 9. Jul 2005 18:51

Re: GUI Anwendung mit Consolen-Ausgabe
 
@marabu: In diesem Falle sollte er es ganz simpel vergessen. <--- KEIN SCHERZ!
Ich habe das vor Jahren intensiv recherchiert. Das geht einfach nicht. Liegt daran, daß der PE-Loader je nach Flag des Subsystems (CUI/GUI) andere Sachen macht. Also vergeßt es ... alles was machbar ist ist eine Frickellösung! Natürlich ginge es sicher "irgendwie" über das Einschleichen in den Elternprozeß, so dieser das zuläßt.

MrKnogge 9. Jul 2005 20:38

Re: GUI Anwendung mit Consolen-Ausgabe
 
Zitat:

Zitat von marabu
Beim Starten des Programmes aus einer Konsole will MrKnogge wahrscheinlich kein neues Konsolfenster, sondern die Standard-Kanäle des offenen Fensters benutzen.

Genau das wollte ich eigentlich, aber erstmal reicht die Funktion von dir auf jedenfall !

Könnte ich den das Offene Fenster benutzen, wenn ich noch eine "Consolen-Variante" meines Programmes schreiben würde ?

Der Aufwaand wäre eigentlich nicht mal zu hoch, wenn ich die benötigten funktionen aus meiner Haupt-exe exportieren würde.

Olli 9. Jul 2005 20:41

Re: GUI Anwendung mit Consolen-Ausgabe
 
Zitat:

Zitat von MrKnogge
Könnte ich den das Offene Fenster benutzen, wenn ich noch eine "Consolen-Variante" meines Programmes schreiben würde ?

Ein klares: JA!

MrKnogge 9. Jul 2005 20:46

Re: GUI Anwendung mit Consolen-Ausgabe
 
Muss ich da etwas beachten, oder kann ich einfach ganz normal mit ReadLn und WriteLn arbeiten ?

Olli 9. Jul 2005 20:59

Re: GUI Anwendung mit Consolen-Ausgabe
 
Zitat:

Zitat von MrKnogge
Muss ich da etwas beachten, oder kann ich einfach ganz normal mit ReadLn und WriteLn arbeiten ?

Nichts zu beachten. Wie gesagt, das Problem ist, daß der Loader dafür sorgt, daß dein Prozess die Konsolenhandles erbt oder eine neue Konsole erstellt. Bei GUI-EXEs geht das nicht.

Bei einer normalen CUI-Anwendung mußt du nichts beachten. Writeln/Readln alles normal!

marabu 9. Jul 2005 21:05

Re: GUI Anwendung mit Consolen-Ausgabe
 
Hallo Christian,

wenn du die eigentliche Funktionalität deines Programms von deinem GUI trennst, dann könntest du deine Anwendung in Abhängigkeit von ParamCount das Konsolfenster oder dein VCL MainForm zeigen lassen.

ReadLn() und WriteLn() sind etwas ganz Spezielles, ich bin da mit weniger zufrieden.

marabu

MrKnogge 9. Jul 2005 21:10

Re: GUI Anwendung mit Consolen-Ausgabe
 
Wie meinst du das ?

Die Prozeduren/Funktionen sowie den eigentlichen Programm-Ablauf hab ich schön für sich gehalten, die GUI wird nur für die Ein/Ausgabe benötigt.

Aber was genau meinst du :gruebel:
Lieber die Funktion benutzen die du vorher gepostest hast ?

Zitat:

Zitat von marabu
ReadLn() und WriteLn() sind etwas ganz Spezielles, ich bin da mit weniger zufrieden.

Warum bist du damit nicht zufrieden ?

marabu 9. Jul 2005 21:24

Re: GUI Anwendung mit Consolen-Ausgabe
 
Wenn du schon alles sauber getrennt hast, um so besser. Dass du überhaupt erwägst beide Oberflächen (Konsole und GUI) anzubieten, lässt mich darauf schließen, dass dein Programm das GUI eh nur zum Einstellen der Parameter hat. Dann ist ja eigentlich alles ganz einfach. Im Projekt-Quelltext bringst du sowas ähnliches unter:

Delphi-Quellcode:
if ParamCount > 0 then begin
  CheckParams();
  Execute();
end else begin
  with Application do begin
    Initialize;
    CreateForm();
    Run;
  end;
end;
In deiner MainForm hast du wahrscheinlich einen Button, der die Verarbeitung (Execute() in meinem pseudo code) anstößt.

ReadLn() und WriteLn() sind etwas ganz Spezielles, weil sie sich in mehreren Punkten von einer normalen Pascal procedure unterscheiden. Die lassen sich nicht exakt nachbilden. Deshalb bin ich mit weniger zufrieden - in meiner eigenen Unit habe ich nur ReadStr() und WriteStr().

marabu

MrKnogge 9. Jul 2005 21:30

Re: GUI Anwendung mit Consolen-Ausgabe
 
Die Idee gefällt mir, werd's gleich mal umsetzen.

Mit welchem Befehl soll ich deiner Meinung nach die Consolen-Ausgabe machen ?
WriteLn,
WriteStr,
oder wie du's oben gepostet hast ?

marabu 9. Jul 2005 21:41

Re: GUI Anwendung mit Consolen-Ausgabe
 
Liste der Anhänge anzeigen (Anzahl: 1)
Schau mal rein - vielleicht hilft es dir bei deiner Entscheidung...

marabu

MrKnogge 9. Jul 2005 21:45

Re: GUI Anwendung mit Consolen-Ausgabe
 
Danke, ich werd's mir ansehen!


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:57 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 by Thomas Breitkreuz