Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Konolenanwendung / DOS-Funktionen (https://www.delphipraxis.net/87551-konolenanwendung-dos-funktionen.html)

Desty 2. Mär 2007 07:48


Konolenanwendung / DOS-Funktionen
 
Hallo Forum,

das ist mein erster Post; viele Grüße aus Neuburg a. d. Donau.

Ich steige gerade wieder hobbymäßig in Delphi ein und möchte ein kleines Programm entwicklen, dass MOPAC2007 steuert (semiempirisches Rechenprogramm zum Berechnen von Molekülgeometrien etc., s. OpenMopac.Net).
Ich habe zu meinem Problem reichlich gelesen (ich weiß also, dass es diverse DOS-Befehle-Threads gibt), keine Lösung trifft meine kleinen Fragen richtig.
Delphi-Quellcode:
program MopRun;

{$APPTYPE CONSOLE}

uses
  SysUtils, ShellAPI, Windows;
var i: integer;
begin
  { TODO -oUser -cConsole Main : Hier Code einfügen }
  writeln('Das Programm startet MOPAC2007 unter Windows XP');
  writeln('');
  writeln('Anzahl der übergebenen Parameter: '+inttostr(paramcount));
  for i:=1 to paramcount do
  begin
   writeln(paramstr(i));
  end;
  readln;
  ShellExecute(0,'open','cmd.exe', '/k dir',nil,SW_NORMAL);
  sleep(2000);
  readln;

end.
Hierzu meine Fragen (ich hoffe, Sie sind nicht allzu dämlich oder irgendwoanders exakt so zu finden):
  • Warum muss ich als ersten Parameter im ShellExecute-Befehl '0' angeben und kann nicht Application.Handle benutzen? Da fehlt die Einbindung einer Unit in 'uses' oder? Welche?
  • Warum steht im Konsolenfenster nicht korrekt "Anzahl der übergebenen Parameter:" sondern "Anzahl der µbergebenen Parameter:" (also irgendein komisches Sonderzeichen statt dem 'ü')?
  • Gibt es eine einfache Möglichkeit, dass eben nicht ein neues Konsolenfenster aufpoppt, sondern der "DIR"-Befehl im bereits offenen Fenster ausgeführt wird?

Viele Grüße, herzlichen Dank,


Thomas aka Desty

marabu 2. Mär 2007 08:01

Re: Konolenanwendung / DOS-Funktionen
 
Herzlich willkommen in der Delphi-PRAXiS, Thomas.

(1) Application.Handle steht dir nur in einer fensterorientierten Anwendung zur Verfügung.

(2) Deine Zeichenketten-Konstanten hast du unter Windows mit der CodePage 1252 erfasst. Die Konsole interpretiert die Zeichen aber anhand der CodePage 850. Du kannst die Ausgabe an die Konsole anpassen:

Delphi-Quellcode:
function AnsiToOem (const s: string): string;
begin
  SetLength(Result, Length(s));
  if Length(s) > 0 then
    CharToOemBuff(@s[1], @Result[1], Length(s));
end;
(3) "Einfache Lösung" ist gewiss relativ. Durch ein Verbiegen der STDIO Handles sollte möglich sein, was du dir vorstellst.

Freundliche Grüße vom marabu

Desty 2. Mär 2007 08:17

Re: Konolenanwendung / DOS-Funktionen
 
Zitat:

Zitat von marabu
Herzlich willkommen in der Delphi-PRAXiS, Thomas.

(1) Application.Handle steht dir nur in einer fensterorientierten Anwendung zur Verfügung.

(2) Deine Zeichenketten-Konstanten hast du unter Windows mit der CodePage 1252 erfasst. Die Konsole interpretiert die Zeichen aber anhand der CodePage 850. Du kannst die Ausgabe an die Konsole anpassen:

Delphi-Quellcode:
function AnsiToOem (const s: string): string;
begin
  SetLength(Result, Length(s));
  if Length(s) > 0 then
    CharToOemBuff(@s[1], @Result[1], Length(s));
end;
(3) "Einfache Lösung" ist gewiss relativ. Durch ein Verbiegen der STDIO Handles sollte möglich sein, was du dir vorstellst.

Freundliche Grüße vom marabu

Danke für die nette Begrüßung!
Code wurde integriert und funktioniert natürlich!
Damit sind zwei von drei Fragen erledigt, das geht ja extrem schnell, herzlichen Dank!
Zur dritten Frage: Das würde jetzt (ich beschreibe es mal, wie ich es mir denke, programmieren könnte ich es noch nicht) wahrscheinlich so laufen: Versteckte Kommandokonsole o. ä., liest über Stream oder so Daten in z. B. ein Stringarray und anschließend muss ich diesen dann mit writeln auf der angezeigten (gewollten) Konsole) ausgeben, oder?
Das wollte ich umgehen, dachte ich könnte Delphi hier als eine Art Super-Batch-Sprache ausnutzen...

Ist nicht so wichtig, ich will das Ding sowieso später mit Formularanwendung laufen lassen, dachte nur, auch mal in die Konsolenprogrammierung reinzuschauen schadet nichts :D

Viele Grüße,


Thomas

turboPASCAL 2. Mär 2007 08:48

Re: Konolenanwendung / DOS-Funktionen
 
Hi und Herzlich willkommen in der DP.

Zu deiner dritten Frage gibt es hier in Forum schon einige Lösungen die dir weiterhelfen
können. zB. hier

Hier im Forum suchenCreateProcess AND CloseHandle


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:27 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