Autor Beitrag
en!gma
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 378

win xp
delphi 7.0
BeitragVerfasst: Di 23.08.05 21:01 
wollt nur fragn ob es wohl möglich wäre soetwas zu realisieren.
also das ist es auf jedenfall, aber halt ob ich sag mal für nen durchschnitts delphianer möglich ist :)

alles komplett nachzubauen wäre unsinn, wollte halt zu lernzwecken mal schaun ob ich zumindest sowas hinkriegen könnte
wie zB das ausführen von exe dateien und halt das man durch ordner durschnüffeln kann mit cd und cd.. usw.

sinn der sache wäre für mich halt was zu lernen und das ganze villeicht ein bischen grafisch aufzubessern.
galagher
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2562
Erhaltene Danke: 46

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Di 23.08.05 21:37 
user profile iconen!gma hat folgendes geschrieben:
wollt nur fragn ob es wohl möglich wäre soetwas zu realisieren

Ja, ist durchaus möglich - ich hab's nämlich schon gemacht - nennt sich WinDos. Ist aber ein gewaltiger Aufwand, ok, bei cmd vielleicht weniger (wenn man das mit command vergleichen kann :nixweiss: ), aber ich habe ndos.com (das nebenbei bemerkt eine .exe ist) von Norton nachprogrammiert, erweitet um einige neue Befehle, komlett mit einer Art Stapeldatei-Syntax, Aliasverarbeitung usw..

Vor allem die Fehlerbehandlung ist aufwändig, wenn du nicht a) ständig Standardfehlermeldungen sehen willst und b) mehr als bloss "Unbekannter Befehl" oder "Fehlerhafte Syntax" haben willst. Also musst du neben der eigentlichen Befehlsverarbeitung auch etliche Fehlermeldngs-Strings festlegen, die möglichst einheitich sein sollten.

Das Ganze läuft als normale Delphi-Anwendung in einem normalen Fenster.

Geht also schon, du musst "bloss" eine eigene Befehlssprache verwenden, also Befehle wie copy, move, md, dir usw. samt deren Parametern, darauf achten, was passiert, wenn der Benutzer Ungültiges eingibt usw.

Naja, funktioniert, leider ist es recht unübersichtlich geraten (Spaghetticode...)

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
en!gma Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 378

win xp
delphi 7.0
BeitragVerfasst: Di 23.08.05 21:43 
könntest du wohl ein kleines beispiel geben?
also wie gesagt ich würd mich schon erstmal zufrieden geben wenn ich per cd usw durch die ordner hüpfen könnte.
wie macht man das dann am besten?
ne memo + nen edit?
JayEff
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: Di 23.08.05 21:54 
Würdest du dir dann nich lieber gleich den vollkomennen Spass geben und eine Konsolenanwendung schreiben, statt eine Awendung mit Form? oO

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
Amateur
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 777

(Win98, WinMe) WinXP Prof
D3 Prof, D6 Pers, D2k5 Pers., Turbo C++ Explorer
BeitragVerfasst: Di 23.08.05 22:00 
ja wäre logischer gleich ne konsolenanwendung zu machen auch wenn ich das noch nie geprogt hab..
und son codebeispiel fände ich auch interessant...
will ja dazulernen ;-)
JayEff
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: Di 23.08.05 22:06 
Kleine Konsolenanwendung:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  ShellApi;
var x:STring;
begin
Write('C:\');
Readln(x);
ShellExecute(0,'open',PChar(x),nil,nil,0);
end.

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
en!gma Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 378

win xp
delphi 7.0
BeitragVerfasst: Mi 24.08.05 13:13 
hmm so konsolenanwendungen kenn ich wohl schon.
aber was mich besonders interessiert hat:
ich fang ja bei "c:\" an wenn ich dann "cd programme" eintippe bin ich in
"c:\programme"
bei "dir" zeigt er mir dann ja alle programme darin an.
wie funktioniert das?
also ich muss ja eigentlich schauen in welchem ordner ich gerade bin und ob der existiert wo ich hineinmöchte.

achja und ich wollte eigentlich keine konsolenanwendung, damit es ein wenig schöner aussehen sollte.
also wenn ich da zumindest farbe/schriftart ändern könnte, dann würd mir das auch schon reichen
retnyg
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2754

SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
BeitragVerfasst: Mi 24.08.05 14:24 
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
program BasicCmd;

{$APPTYPE CONSOLE}

// (C) retnyg @ http://krazz.net/retnyg

uses
  windows,
  SysUtils,
  ShellApi;

type Tcommand = record
        exe : string;
        parms : string;
     end;

var x:STring;
    cmd: Tcommand;

function error:string;
begin
  result := SysErrorMessage(GetLastError())
end;

function input2cmd(aCmd:string):Tcommand;
  var p : integer;
begin
    p := pos(' ',aCmd);
    if p = 0 then begin
      result.exe := aCmd;
      result.parms := '';
    end else begin
      result.exe := ansilowercase(copy(aCmd,1,p-1));
      result.parms := copy(aCmd,p+1,maxint);
    end;
end;

function RunCommand(aDir, aCmd, parms: string): boolean;
var   start: TStartupInfo;
  procInfo: TProcessInformation;
  return: cardinal;

begin
      FillChar(start, SizeOf(start), #0);
      start.cb          := SizeOf(start);
      start.hStdOutput  := GetStdHandle(STD_OUTPUT_HANDLE);
      start.hStdInput   := GetStdHandle(STD_INPUT_HANDLE);
      start.hStdError   := GetStdHandle(STD_ERROR_HANDLE);
      start.dwFlags     := StartF_UseStdHandles or StartF_UseShowWindow;
      start.wShowWindow := SW_NORMAL;
      if CreateProcess(nil, PChar(aCmd + ' ' + parms), nil, nil, True,
                       0, nil, PChar(aDir), start, procInfo) then
      begin
        SetPriorityClass(procInfo.hProcess, Idle_Priority_Class);
        WaitForSingleObject(procInfo.hProcess, Infinite);
        GetExitCodeProcess(procInfo.hProcess, return);
        Result := (return = 0);
        CloseHandle(procInfo.hThread);
        CloseHandle(procInfo.hProcess);
      end;
end;

procedure showdirectory(parms:string);
var sr: tsearchrec;
    mask:string;
begin
    if parms = '' then mask := includetrailingbackslash(GetCurrentDir)+'*.*' else mask := includetrailingbackslash(GetCurrentDir)+parms;
    if findfirst(mask,faAnyfile,sr) = 0 then
    repeat
      writeln(sr.name);
    until findnext(sr) <> 0
    else writeln('no file found');
end;


begin
//  SetCurrentDir('C:\');
  while true do begin
    Write(GetCurrentDir + '> ');
    Readln(x);
    cmd := input2cmd(x);
    if (length(cmd.exe) = 2) and (length(cmd.parms) = 0) then
      (if cmd.exe[2] = ':' then
         (if not SetCurrentDir(cmd.exe) then writeln(error)))
    else
    if cmd.exe = 'cd' then SetCurrentDir(cmd.parms)
    else
    if cmd.exe = 'dir' then showDirectory(cmd.parms)
    else
    if not runcommand(GetCurrentDir,cmd.exe ,cmd.parms ) then
      if not runcommand('',cmd.exe ,cmd.parms ) then
        writeln(error);
  end;
end.

_________________
es gibt leute, die sind genetisch nicht zum programmieren geschaffen.
in der regel haben diese leute die regel...
galagher
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2562
Erhaltene Danke: 46

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Mi 24.08.05 21:36 
user profile iconen!gma hat folgendes geschrieben:
könntest du wohl ein kleines beispiel geben?


Zuerst muss dein Programm feststellen, was eingegeben wurde. Das erste Wort ist immer der Befehl, bei cd wird sinnvollerweise ein weiteres Wort erwartet, das den Ordnernamen angibt, falls erforderlich, mit Laufwerksangabe. Du musst also feststellen, ob es ein zweites Wort gibt, und, wenn ja, ob es einen vorhandenen Ordner auf einem vorhandenen Laufwerk bezeichnet. Vergiss nicht, ein Laufwerk kann auch nicht bereit sein - Diskette oder USB-Stick!

Wenn also alles korrekt ist, führt dein Programm intern ein ChDir durch. Bei del musst du u.a. prüfen, ob die zu löschende Datei existiert.

Es ist jedenfalls schon eine Menge Code, der die Benutzereingabe und den Befehl auf Durchführbarkeit prüft, bis er endlich ausgeführt werden kann. Es ist besser, vorher zu prüfen, und gegebenenfalls eine eigene Fehlermeldung auszugeben, anstatt den Befehl einfach so durchzuführen.

Das Programm interpretiert die Eingabe also - cd an sich sind bloss zwei Buchstaben.

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
retnyg
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2754

SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
BeitragVerfasst: Mi 24.08.05 23:56 
und wenn das programm noch mehr können soll wie cd und dir, nämlich dass man mit konsolencommandos arbeiten kann ist es auch notwendig, dich um die ausgabe / eingabe der gestarteten programme zu kümmern.
wie ich das in dem source mit GetStdHandle mache.
wenn du das ganze mit fenstern machen will, muss die ausgabe ins memo, oder was auch immer du zum anzeigen verwendest, wandern.

_________________
es gibt leute, die sind genetisch nicht zum programmieren geschaffen.
in der regel haben diese leute die regel...