[fpc-pascal] Developing a mini ERP / web based development

silvioprog silvioprog at gmail.com
Thu Jul 4 04:27:27 CEST 2019

Hi Darius.

On Thu, Jun 27, 2019 at 1:10 PM Darius Blaszyk <dhkblaszyk at gmail.com> wrote:

> Hi all,
> I have been asked to write a limited functionality / mini ERP type of
> software for an NGO that is setting up a hospital. I'm doing this in my own
> time and free of charge. The compiler and IDE of choice are of course
> FreePascal & Lazarus. I’m still thinking about the direction to go exactly
> with this and I was hoping to get some feedback/support from the community
> here as I always have gotten over the years.

First of all, good luck in your project! :-)

The hardware of choice is already made and will be a network of several
> Chromebooks on which all staff will be logging in the system. This made me
> think that a desktop application is less feasible and I should look at a
> web-based solution. I found some frameworks such as ExtPascal, fano, Brook,
> pas2js. Unfortunately, I don't know much about web-based applications. So
> my question is whether any of the frameworks are mature enough to create a
> database driven application as described. Possibly there are other
> frameworks available that I don't know of but are worth investigating?

There is an important project also for web/database purposes missing on the
above list: mORMot. You should consider to investigate it too. :-)

Regarding Brook, there are two active versions of it:

1. https://github.com/risoflora/brookframework
2. https://github.com/risoflora/brookfreepascal

Let me explain starting from option 2, BrookFreePascal, which I'm going to
reference as B4F. As Michael commented (thanks dude! :-)), it is a
long-standing FCL-based project, providing high-level features making it
easy to develop FPC/Laz web applications. It was strong influenced by Slim
Framework, also active nowadays and, like Slim, B4F uses a basic routing
concept, which triggers predefined methods named as the same HTTP verbs,
like Get, Post, Delete etc., declared in the public scope of an action
class. The few lines below illustrates it:

  THello = class(TBrookAction)
    procedure Get; override;

procedure THello.Get;
  Write('Hello Darius. I'm Brook on the Chromebook! :-)');


If you run a Brook application containing these lines above, just navigate
to "/hello" to get the message "Hello Darius. I'm Brook on the Chromebook!
:-)" on your web browser and have a lot of fun.

Now, I'm going to explain the option 1 a bit, the new Brook Framework,
under active development, projected for Free Pascal and Delphi, which will
be referenced in next lines as BF. It was entirely written from scratch
with special care for embedded systems. BF routing was and is still
inspired by projects like Express, Flask, Laravel, and its components
follows some RAD concepts adopted by DataSnap/fpWeb. For example, if you
have a console or VCL project, you can turn it into a web server
application: at design time, just drag-drop three components (
BrookLibraryLoader1, BrookHTTPServer1 and BrookHTTPRouter1) to a form or
data module, define a regular expression pattern for a route item and
implement its request event:

... [.lfm or .dfm]

  object BrookHTTPRouter1: TBrookHTTPRouter
    Routes = <
        Pattern = '/hello/(?P<name>[a-zA-Z]+)'
        OnRequest = BrookHTTPRouter1Routes0Request

... [.pas]

procedure TForm1.BrookHTTPRouter1Routes0Request(ASender: TObject;
  ARoute: TBrookHTTPRoute; ARequest: TBrookHTTPRequest;
  AResponse: TBrookHTTPResponse);
  AResponse.SendFmt('Hello %s', [ARoute.Variables['name']], 'text/html',


This way, if you navigate to "/hello/Darius", the message "Hello Darius"
will be displayed on the browser, however, any other invalid value, like "
/hello/*123*", will be automatically refused, due to pattern "
/hello/(?P<name>[a-zA-Z]+)" defined to the route item.

There are a lot of features (three threading models, data compression,
on-demand content, JIT optimizations, etc.) with focus on performance that
I couldn't detail in a single message, but the most important info: BF
loads a GNU C library which provides a low-level API containing common HTTP
features that are a good replacement for HTTP servers like Apache, Nginx,
NodeJS, Civetweb and so on. In short, you can run your application in
production and provide web services in the same (or higher) performance as
those servers, just distributing a small single-file library with your
executable, that probably will already be using other library, like the
database client one, for example.

As I am starting this endeavor I would welcome any advisory or practical
> help. If someone is willing to support in any form, please contact me via
> PM.
> TIA for all pointers, tips, and suggestions.
> Regards, Darius

I'd like to make a naive suggestion for you regarding to server side. You
mentioned about several Chromebooks logging to the system. So, beforehand,
what do you think about simulating that scenario? It is a little bit easy
to do: there are tools like wrk, JMeter, ApacheBench etc. you could use to
trigger several requests generating reports by itself like those ones
IMHO, it could be a reasonable way to choose the proper package/server to
serve your requirements.

Silvio Clécio
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freepascal.org/pipermail/fpc-pascal/attachments/20190703/9e076ea9/attachment.html>

More information about the fpc-pascal mailing list