[fpc-devel] CGI/Command line/GUI all in one
Dariusz Mazur
darekm at emadar.com
Thu Sep 17 15:12:06 CEST 2009
Gilles MARCOU pisze:
> Hello,
>
> I'm trying to build an interface for a program so that it could be used
> as a command line, a GUI or a CGI. For the CGI, I use powutils 1.7.1,
> FPC 2.2.0 and Lazarus 0.9.24. I mean that the same executable should be
> used either as a CGI, a command line or a GUI.
>
> Currently I have kept separated in different unit each user interface
> (see the code below). But, at execution, if there is an execution error,
> it always open message box. Therefore, even in command line, the
> software requires GUI libraries be there (GTK for instance) and it
> simply does not work as a CGI.
>
You have to change all automatic initialization of visual components and
make all linking with GUI libraries dynamic. That i no easy.
But you can invoke second executable from this console (distribute 2
file, but always invoke the same)
> Do you see a more clever solution? Otherwise, the only solution I see is
> to keep all three interfaces in separate executable.
>
>
This is not problem to have separate executable, only have one source to
both GUI.
I made program which can work as desktop and as web-based (FCGI or
standalone web server)
Each form is create dynamical in runtime, source is one, but in compile
time:
1 for desktop: clasic units from LCL (or rather VCL, on windows I use
Delphi)
2.for web-base different set of units to handle web, but with the same
API as VCL
Darek
> Thanks in advance,
> Gilles Marcou
>
> program Predictor;
>
> {$mode objfpc}{$H+}
>
> uses
> {$IFDEF UNIX}{$IFDEF UseCThreads}
> cthreads,
> {$ENDIF}{$ENDIF}
> //{ you can add units after this },
> Classes, sysutils, UnitRunGUI, UnitRunCMD, UnitRunCGI;
>
> type
> TRuntype=(CGI,CMD,GUI,UNK);
>
> var
> cfg: TStringList;
> rt: TRuntype;
> begin
> cfg:=TStringList.Create;
> cfg.LoadFromFile('cfg');
> rt:=UNK;
> if (cfg[0]='CGI') then
> rt:=CGI
> else if (cfg[0]='CMD') then
> rt:=CMD
> else if (cfg[0]='GUI') then
> rt:=GUI;
> FreeAndNil(cfg);
> if (rt=GUI) then
> RunGUI
> else if (rt=CMD) then
> RunCMD
> else if (rt=CGI) then
> RunCGI;
> end.
> -------
> unit UnitRunGUI;
>
> {$mode objfpc}{$H+}
>
> interface
>
> uses
> Classes, SysUtils, Interfaces, Forms, UnitPredictor;
>
> procedure RunGUI;
>
> implementation
>
> procedure RunGUI;
> begin
> Application.Initialize;
> Application.CreateForm(TFormPredictor, FormPredictor);
> Application.Run;
> end;
>
> end.
> --------
> unit UnitRunCGI;
>
> {$mode objfpc}{$H+}
>
> interface
>
> uses
> Classes, SysUtils, pwinit, pwmain;
>
> procedure RunCGI;
>
> implementation
>
> procedure RunCGI;
> begin
> outln('CGI: Not yet supported');
> end;
>
> end.
> --------
> unit UnitRunCMD;
>
> {$mode objfpc}{$H+}
>
> interface
>
> uses
> Classes, SysUtils;
>
> procedure RunCMD;
>
> implementation
>
> procedure RunCMD;
> begin
> writeln('CMD: Not supported yet');
> end;
>
> end.
>
>
> _______________________________________________
> fpc-devel maillist - fpc-devel at lists.freepascal.org
> http://lists.freepascal.org/mailman/listinfo/fpc-devel
>
>
--
Darek
More information about the fpc-devel
mailing list