Results 1 to 9 of 9

Thread: Form-based programma starten vanaf commandline: Sttaus via environmen variabelen?

  1. #1

    Form-based programma starten vanaf commandline: Sttaus via environmen variabelen?

    Het gaat om een programma waarin de mogelijkheid bestaat om database-gegevens te exporteren: Bepaal uit een lijst welke velden moeten worden geëxporteerd, deze selectie kan worden vastgelegd zodat die een volgende keer default naar voren komt. De bedoeling is om datzelfde programma vanuit een script, dus vanaf commandline, uit te voeren met de code die in de scherm-objecten zit maar zonder de schermen te tonen.
    Dat werkt op zich prima, maar ik mis de mogelijkheid om status-informatie aan te geven, bijvoorbeeld als een parameter niet klopt en er (dus) geen uitvoer is. ik heb al geprobeerd die met environment variabelen (SetEnvironmentVariable) terug te geven:
    Code:
      if not SetEnvironmentVariable(PChar('EXPORT_STATUS'),PChar(IntToStr(ExpStatus))) then
        vError.SchrijfErrorWeg(format ('SetEnvVar EXPORT_STATUS: %d', [getlasterror]) );
    maar als het progtramma is afgelopen blijkt dat niet te zijn ingesteld....

    Is er een methode om de exit-status van dat schermprogramma (alleen voor die functionaliteit) op een of andere manier - anders dan via een bestand of registry - vast te houden zodat de aanroeper gemakkelijk na kan gaan of alles correct is verlopen?

  2. #2
    Was dat niet de ExitCode variabele? Volgens mij kan je daar een int waarde in zetten. Het resultaat kan je uitlezen als errorlevel in een aanroepend batch script of programma.

    Het probleem met de environment variabele is denk ik dat deze weg is zodra je programma afsluit.

    Dat wordt bevestigd door MSDN, waarin staat:
    Quote Originally Posted by MSDN
    Remarks: This function has no effect on the system environment variables or the environment variables of other processes.
    Je programma draait als het ware in een omgeving die gekopiëerd wordt van het aanroepende programma. Het aanroepende programma kan dus wel variabelen zetten voordat het jouw programma aanroept, maar je kan niet op die manier terug.

    Wellicht is er een andere call om echt de system variabelen aan te passen, of je kan via de registry werken, maar beide oplossingen vind ik nogal onelegant. Wellicht is zo'n status code voldoende, en anders is het ook nog mogelijk om output naar de console te schrijven die het aanroepende programma kan uitlezen.

    "Code in schermen die niet getoond worden"... dat klinkt overigens wel eng. Ik zou proberen om die code te isoleren in een datamodule of ergens anders ver van de UI. Maar dat is weer een ander verhaal.
    Last edited by GolezTrol; 21-Mar-18 at 13:21.
    1+1=b

  3. #3
    Kun je daar niet gewoon System.ExitCode voor gebruiken?

    Je aanroepende code kan a.d.h.v. die ExitCode zien wat de exitstatus is.

  4. #4
    Ok; geprobeerd:
    ik zet de exitcode op het moment dat ik wat wil signaleren (de functie sluit daarna af - en de applicatie zal stoppen):

    Code:
     
        System.Exitcode := ExpStatus ;
    ik weet dat ExpStatus = 7 (fout in een van de parameters) maar als ik dan in commandbox ErrorLevel uitvraag geeft dat gewoon 0:

    terwijl, als ik de instelling van exit-code in het project opneem:
    [CODE]
    begin
    Application.Initialize;
    Application.MainFormOnTaskbar := True;
    Application.CreateForm(TMainForm2, MainForm2);
    Application.Run;
    System.ExitCode := 999; // nagaan wat code nu is - en wat commandline ervan vindt;
    end.[
    /CODE]
    (in debug in IDE blijkt System.ExitCode vóór aanpssing inderdaad 7 te zijn)

    maar echo %errorlovel% geeft dan nog steeds "0", en niet "7" of "999".

    Als ik in de commandbox een fout maak, zoals:
    [CODE] set errorlevel/CODE]
    is Errorlevel = 1 (terecht) , start ik de image daarna weer op, blijft dat 1...

    Ik vermoed zo dat het programma in een aparte thread gestart wordt, want als ik het programma vanaf de commandline start komt vrijwel direct de prompt terug - terwijl het programma nog bezig is.
    Dus System.ExitCode werkt helaas niet....

  5. #5
    Quote Originally Posted by GolezTrol View Post
    "Code in schermen die niet getoond worden"... dat klinkt overigens wel eng. Ik zou proberen om die code te isoleren in een datamodule of ergens anders ver van de UI. Maar dat is weer een ander verhaal.
    Lijkt enger dan het is . een Form-object is 'gewoon' een object wat je kan instantiëren en initialiseren en waarvan je de methods kan gebruiken. Zolang je in- en uitvpoer naar scherm amar onderdrult. (tonen wordt in onze applicatie altijd expliciet gedaan dus dat is makkelijk te voorkomen). Het is inderdaad mooier om een en ander in aparte units onder te brengen maar er waren (valide) redenen om dat niet te doen. Misschien later

  6. #6
    Quote Originally Posted by WillemGrooters View Post
    Ok; geprobeerd:
    Application.Initialize;
    Application.MainFormOnTaskbar := True;
    Application.CreateForm(TMainForm2, MainForm2);
    Application.Run;
    System.ExitCode := 999; // nagaan wat code nu is - en wat commandline ervan vindt;
    Dat is ook geen console programma.
    Je zult zien dat als je dit programma start via de commandline, je cursor direct terugkomt op de console terwijl je programma op de achtergrond doorloopt.

    Als je echt een GUI programma wilt starten en zien wat er terugkomt dan moet je die met start /B /WAIT opstarten.

    Ik heb b.v. dit gedaan (project8 is een gui programma met 1 form die ik direct weer sluit):

    Delphi Code:
    1. begin
    2.   Application.Initialize;
    3.   Application.MainFormOnTaskbar := True;
    4.   Application.CreateForm(TForm5, Form5);
    5.   Application.Run;
    6.   System.ExitCode := 123;
    7. end.

    Code:
    C:\Debug>type test.bat
    start /b /wait project8.exe
    echo %ERRORLEVEL%
    Code:
    C:\Debug>test.bat
    
    C:\Debug>start /b /wait project8.exe
    
    C:\Debug>echo 123
    123
    Werkt dus prima.

    (handmatig op de console starten met start /b /wait project.exe en dan echo %errorlevel% doen werkt ook)

  7. #7
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    Je kunt je applicatie ook met een ExitCode laten stoppen door Halt(HierDeExitCode) te gebruiken.
    TMemoryLeak.Create(Nil);

  8. #8
    Dat kan, maar het eindigt wel direct je programma. Dat kan wellicht onwenselijk zijn.
    1+1=b

  9. #9
    rvk - dank - dat werkt.

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •