Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi delphi / batch kombinieren (https://www.delphipraxis.net/68230-delphi-batch-kombinieren.html)

toredo 26. Apr 2006 18:36


delphi / batch kombinieren
 
hay,

ist es möglich mti delphi auch eine cmd-anwendung zu schreiben, d.h. ein neuer befehl z.b. sowas:

wenn man z.b. einen befehl random macht, bei dem man eine maximale zahl eingibt.
der batchcode wäre dann etwa so:
Code:
@echo off
set /p ans=bitte geben sie eine zahl ein
random zahL=%ans%
echo eine zufaellig generierte zahl zwischen 0 und %ans% ist %zahl%
jetzt müsste man aber noch diesen befehl random programmieren... aber geht das mit delphi überhaupt?




mfG toredo

easteregg 26. Apr 2006 18:43

Re: delphi / batch kombinieren
 
das programm kannste doch komplett mit delphi schreiben
per writeln die ausgabe, mit readln die eingabe und die zufallszahl einfach mit radominze; und random(a);
mehr ist das doch gar nicht,

oder habe ich dich jetzt nicht richtig verstanden?

toredo 26. Apr 2006 18:45

Re: delphi / batch kombinieren
 
klar kann man das, aber ich möchte ja nicht unbedingt dieses prog haben sondern ich möchte wissen wie man so cmd-anwendungen machen kann.


mfG toredo

KingIR 26. Apr 2006 18:46

Re: delphi / batch kombinieren
 
Hatte grad nix zu tun, deshalb hier ein komplettes Beispiel:

Delphi-Quellcode:
program ConsoleRandom;

{$APPTYPE CONSOLE}

uses
  Math,
  SysUtils;

var
  RangeMin, RangeMax: Integer;

begin
  Randomize;

  try
    RangeMin := StrToInt(ParamStr(1));
    RangeMax := StrToInt(ParamStr(2));
  except
    WriteLn('Please pass two integer values separated by a space character as argument!');
    exit;
  end;

  Write(RandomRange(RangeMin, RangeMax));
end.
(Neue Konsolen-Anwendung erstellen und einfügen)

Aufruf z.B. mit
MeinExeName 10 20
für eine Zufallszwahl zwischen 10 und 20.

:cyclops:

toredo 26. Apr 2006 18:56

Re: delphi / batch kombinieren
 
:) danke, schon kann ich wieder etws neues:)



mfG toredo


-edit-

kann ich den ausgabewert auch in einer variable speichern, also in einer die ich in nem batch-script auch benutzen kann?



mfG toredo

ichbins 26. Apr 2006 19:22

Re: delphi / batch kombinieren
 
Nö. Die CMD und dein Project1.exe sind 2 komplett seperate Proggies. Du müsstest dich schon in die CMD einhacken und selbst den Speicher beschreiben ;)

aber du könntest mit deiner Anwendung ein BatchScript erstellen und dieses dann ausführen. Dann hast du das Problem mit den Variablen nicht ;)


Die Parameter haben mit DOS Proggs auch nix zu tun. Die kannst du auch über Start->Ausführen oder Shellexecute machen.

toredo 26. Apr 2006 19:31

Re: delphi / batch kombinieren
 
im system32-ordner sind ja auch x-dateien die ne variable zurückgeben, das zeugs ist aber wahrscheinlich in irgendnem c geschrieben, aber das sollte ja keinen so unterschied machen...




mfG toredo

Klaus01 26. Apr 2006 20:32

Re: delphi / batch kombinieren
 
Hiermit kannst Du eine Variable erstellen und beschreiben.

Delphi-Quellcode:
{*********************************************}
{ Set Global Environment Function            }
{ Coder : Kingron,2002.8.6                    }
{ Bug Report : [email]Kingron@163.net[/email]               }
{ Test OK For Windows 2000 Advance Server    }
{ Parameter:                                 }
{ Name : environment variable name           }
{ Value: environment variable Value          }
{ Ex: SetGlobalEnvironment('MyVar','OK')     }
{*********************************************}

function SetGlobalEnvironment(const Name, Value: string;
  const User: Boolean = True): Boolean;
resourcestring
  REG_MACHINE_LOCATION = 'System\CurrentControlSet\Control\Session Manager\Environment';
  REG_USER_LOCATION = 'Environment';
begin
  with TRegistry.Create do
    try
      if User then { User Environment Variable }
        Result := OpenKey(REG_USER_LOCATION, True)
      else { System Environment Variable }
      begin
        RootKey := HKEY_LOCAL_MACHINE;
        Result := OpenKey(REG_MACHINE_LOCATION, True);
      end;
      if Result then
      begin
        WriteString(Name, Value); { Write Registry for Global Environment }
        { Update Current Process Environment Variable }
        SetEnvironmentVariable(PChar(Name), PChar(Value));
        { Send Message To All Top Window for Refresh }
        SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, Integer(PChar('Environment')));
      end;
    finally
      Free;
    end;
end; { SetGlobalEnvironment }
Grüße
Klaus

markusj 26. Apr 2006 20:42

Re: delphi / batch kombinieren
 
Oder du schreibst einfach ein Batchfile dynamisch im Programm, welches die Variable mittels SET setzt, dieses Batchfile startest du aus dem Delphi-Programm und löscht das Batchfile nach einer gewissen Zeit wieder.

mfG

Markus

(Das ist Q&D)

ichbins 26. Apr 2006 20:59

Re: delphi / batch kombinieren
 
@markusj: Das habe ich schon vorhin vorgeschlagen ;)

@Klaus01: Stehen die DOS-Konsolenvariablen etwa in der Registry? :shock:

Klaus01 26. Apr 2006 21:05

Re: delphi / batch kombinieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
@ichbins
ja, siehe screenshot

Grüße
Kalus

toredo 27. Apr 2006 14:52

Re: delphi / batch kombinieren
 
hm, wenn ich jetzt aber normal ne variable über start/ausführen/cmd/set a=b definiere dann gibt es keine neue zeichenfolge in der registry, ist denn da ein unterschied wenn man die variable "normal" macht?
und werden die zeichenfokgen auch wieder automatisch gelöscht wenn ich die batch schliesse oder muss ich da noch in batch was schreiben?

n'batch script könnte man natürlich auch erstellen lassen, wäre auch einfahc nur halt unprofessioneller, da man nacher noch mit call auf das script zugreiffen müsste. wäre aber auch keine schlechte lösung.




mfG toredo

Klaus01 27. Apr 2006 16:26

Re: delphi / batch kombinieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Die Funktion die ich mit SetGlobalEnvironment setze, setzt eine globale
Environmnet Variable. Diese ist von jedem cmd Fenster aus
abfragbar. Sie überlebt den reboot.

Um ein Variable nur im activen cmd-Fenster zu haben,
reicht es das API command
SetEnvironmentVariable(PChar(Name), PChar(Value));
auszuführen.

Zu den Parametern gibt es im angehängten pdf File mehr Infos.

Grüße
Klaus

habe ich noch gefunden:
nicht getestet:

Delphi-Quellcode:
unit Environment;

interface

  procedure ActivateEnvironmentVariables;

  function AddGlobalEnvironmentVariable(const Key: string; const Value : string; const now : boolean) : boolean;
  function AddEnvironmentVariable(const Key: string; const Value : string; const now : boolean) : boolean;

  function DelGlobalEnvironmentVariable(const Key: string; const now : boolean) : boolean;
  function DelEnvironmentVariable(const Key: string; const now : boolean) : boolean;

implementation

uses
   Registry, Windows;

const
  GlobalKey = 'System\CurrentControlSet\Control\Session Manager\Environment';
  LocalKey = 'Environment';
  WM_WININICHANGE = $001A;


procedure ActivateEnvironmentVariables;
begin
  SendMessage(HWND_BROADCAST, WM_WININICHANGE, 0, LongInt(PChar('Environment')));
end;

function AddGlobalEnvironmentVariable(const Key: string; const Value : string; const now : boolean) : boolean;
var
  Reg : TRegistry;
  ok : boolean;
begin
  Result := true;
  ok := false;
  try
    Reg := TRegistry.Create;
    Reg.RootKey := HKEY_LOCAL_MACHINE;
    if Reg.OpenKey(GlobalKey, false) then
    begin
      Reg.WriteString(Key, Value);
      Reg.CloseKey;

      if now then ActivateEnvironmentVariables;
      ok := true;
    end;
    Result := ok;
  except
    Result := false;
  end;
end;

function AddEnvironmentVariable(const Key: string; const Value : string; const now : boolean) : boolean;
var
  Reg : TRegistry;
  ok : boolean;
begin
  Result := true;
  ok := false;
  try
    Reg := TRegistry.Create;
    Reg.RootKey := HKEY_CURRENT_USER;
    if Reg.OpenKey(LocalKey, false) then
    begin
      Reg.WriteString(Key, Value);
      Reg.CloseKey;

      if now then ActivateEnvironmentVariables;
      ok := true;
    end;
    Result := ok;
  except
    Result := false;
  end;
  Result := SetEnvironmentVariable(PChar(Key), PChar(Value));
end;

function DelGlobalEnvironmentVariable(const Key: string; const now : boolean) : boolean;
var
  Reg : TRegistry;
  ok : boolean;
begin
  ok := false;
  Result := true;
  try
    Reg := TRegistry.Create;
    Reg.RootKey := HKEY_LOCAL_MACHINE;
    if Reg.OpenKey(GlobalKey, false) then
    begin
      Reg.DeleteValue(Key);
      Reg.CloseKey;

      if now then ActivateEnvironmentVariables;
      ok := true;
    end;
    Result := ok;
  except
    Result := false;
  end;
end;

function DelEnvironmentVariable(const Key: string; const now : boolean) : boolean;
var
  Reg : TRegistry;
  ok : boolean;
begin
  ok := false;
  Result := true;
  try
    Reg := TRegistry.Create;
    Reg.RootKey := HKEY_CURRENT_USER;
    if Reg.OpenKey(LocalKey, false) then
    begin
      Reg.DeleteValue(Key);
      Reg.CloseKey;

      if now then ActivateEnvironmentVariables;
      ok := true;
    end;
    Result := ok;
  except
    Result := false;
  end;
  Result := SetEnvironmentVariable(PChar(Key), nil);
end;

end.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:47 Uhr.

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