Thtec

2 thoughts on “Thtec”
  1. We unfortunately forgot messed up a digit when we made the download available on our portal, resulting in some people downloading v. 7.50.00 instead of 7.75.00. This has been corrected. Please redownload.

  2. Go have a couple of beers and as you down them, you will start to “feel better”!

    Hope you feel better soon!

  3. Wow, windows crash caused by loosing 2 wisdom teeth. I think even for MS that is a first šŸ˜‰

  4. This is really sad day, but everything will be fine, not always the case.

  5. Shane, beer won’t do it. He needs to move up to Bourbon!

  6. Is this/these method(s) thread safe? Must this approach be executed in the Client/Server main thread? Or can it function safely in a threaded session environment?

    1. Hi, It is safe to use the cipher and hashing classes within threads. However only one thread at a time can use the instance. So if you have multiple threads running, give each thread its own instance of the cipher component and it will be able to use it without problems..

  7. If kbmMW can automatically generate this TContact unit according to the definition of the table of database, it would be a wonderful thing!
    Is this plan?

      1. For those who plan to use ORM, this is definitely a happy plan! Such as the early realization of this function, so I prompted the use of kbmMW ORM in my project .

  8. Kim:
    myConfig1:=TkbmMWConfiguration.Create(‘myconfiguration1’);
    myConfig2:=TkbmMWConfiguration.Create(‘myconfiguration2’);

    TkbmMWConfiguration.Create method not have a param in 5.03 version.

  9. Great Post Kim, Really like Kbmmw tools, But do you have a tools to generate the ORM classes from an existing database?

  10. WithObject(AObject:TObject) and WithInterface(AInterface:IInterface) has a example code is a good…

    1. Hi,
      Basically:

      Scheduler.Run(
      procedure (const AEvent:IkbmMWScheduledEvent)
      begin
      …:=AEvent.&Object.Someproperty; // But accessing Someproperty must be threadsafe.
      end).WithObject(yourobject).Activate;

      best regards
      Kim/C4D

  11. This means YOU, personally, really should weight your words SERIOUSLY z j z, and I strongly advice you to delete this written defamation x f l g of both characters and a huge group of people who do not take slander and character assassination like this easily n s k p h. I do not know which organization you have got to back you up, but if you do not care about lawsuits in the multi-million dollar range, fine, just keep on what you are doing b d d m v. If you DO care about spending x-amounts of money to try and defend this CLEARLY written libel, then take my DELETE-advice. Your “Post” is now officially taken both copies and screen-shots of and digitally stored for later use and evidence. This is just a warning. We are antifa, we do not forget. alexis.bourquard@outlook.fr

    1. Reeeeallly šŸ™‚ You need a chill pill. Im happy though that you decide to put a print out of my drawing on your fridge šŸ™‚ Im happy to inspire.

  12. Please notice that emergency release 5.04.32 has been made available. It fixes two bugs. One related to compiling for NextGen and the other has to do with TkbmMWCustomSimpleClient exception handling, which unfortunately broke in 5.04.30. It is strongly recommended to immediately upgrade from 5.04.30 to 5.04.32.

  13. HI Kim. Very Usefull Feature you have made. You’re converting kbMMW , not only in a the best SOA framework for delphi, but also in a developement framework for making easier tasks and prevent creating boiler plates every time we need to do advanced tasks like this. I personally liked the feature of parsing the XML.

    Great JOB!!

    1. Hi Francisco,
      My goal has always to make complex things easy with kbmMW. From release of v5, core RTTI functionality in kbmMW expanded so much, that these syntactical sugar things is possible in a consistent way. Good things do come from working with other environments from time to time… things can inspire… Java Spring Bootstrap did. Both in what is terrible in Spring Bootstrap, and what is actually very nice features. Those I have attempted to reinvent in a kbmMW relevant way. Im happy that it works for other people than myself šŸ™‚

      1. I really can’t wait for the new stuff you’re telling, its getting very interesting.
        Best regards

  14. WOW Hi Kim Great News and congrats, after some weeks of silence it worth the wait,

    Hope next release will come soon.
    Just a little request: Is there a way you can add an extra parameter to the primary Field definition,
    so we can define a Custom Generator Class or Anonimous Procedure, wich you can assign/pass the current ORM Object content and the ORM context, in this case the TAccount

    Ex:



    [kbmMW_Field(‘name:id, primary:true, generator:custom’,ftString,40, TkbmMWCustomGIDGenerator )]
    [kbmMW_NotNull]
    property ID:kbmMWNullable read FID write FID;

    or

    [kbmMW_Field(‘name:id, primary:true, generator:custom’,ftString,40,
    procedure (AORMRecordObject: TObject; AORMContext: TkbmMWORM; AResultType: TFieldType; AResultValue: Variant )
    begin

    Use a custom procedure or Stored procedure to genearte a new UID
    For example in Mysql there is no Generators, but here is way to create a stored procedure to generate
    concurrent Thread-safe UIDs based o a sequence name or curent record values (Consecutive numbers base on the Year of the date of creation of the account, and generate something like ‘2018000099’). Or if you have Comming MariaDB 10.3.x, there will be Sequence generators

    end;)
    ]
    [kbmMW_NotNull]
    property ID:kbmMWNullable read FID write FID;

    1. Hi,
      I most probably wont be able to put that feature into the release right now, since Im attempting to actually getting it released sooner rather than later. However kbmMW already supports falling back to a non native sequencer/generator when a database do not support it. Then kbmMW will automatically generate a pivot table, which, under transactional control, is hosting all sequencers. It is also threadsafe.

      1. Thank for th replya KIM. No problem, I know there are things first, the main usage for this proposal is to generate sequences based on
        some record field values or otehr kind of input, like a unique ID pero Year, generated by concateaning the year and the sequence:
        2018000001, 2018000002, 2017000001.. (at that time in 2017 when the record was created), the year value can come from a field value of the current record or get it by calling YearOF(Date()) at delphi side before posting. So we manage many sequences pero table base on a Field or combination of fields.

  15. —-
    Added support for adding dynamically created TkbmMWORMTable which are not
    related to a specific class or record
    —-
    Does this mean I can Build a TkbmMWORMTable object with definition and query them with the ORM?
    For example define a table at client side, and use it to query records from the server, so the server doesnt need to have the table class definition anymore.

    1. Yes and perhaps šŸ™‚
      The “yes” is for the statement that you can create a TkbmMWORMTable instance and populate it with field info and attribute settings at runtime. Whoever holds the TkbmMWORMTable instance will be able to use it to generate/upgrade datastorages, query, insert/delete/update and so forth, but obviously not via a class (since you decided in this case not to have one), but instead via object notation or TDataset data.
      The “perhaps” is because as long as you can get the appropriate settings from the client to a server side instance of a TkbmMWORMTable, you can essentially let the client manipulate the datastorage via the ORM.

  16. In kbmMemTable v. 7.80.00 this not working
    kbmMemSQL.ExecSql(‘SELECT * FROM A ORDER BY Field1, Field2’)
    Gives exeption
    Exception.Create(‘Order field not a selection field: A_Field1);
    kbmMemSQL.ExecSql(‘SELECT * FROM A ORDER BY 1,2’) is fine

  17. When I try this, the TObjectList comes back with data, but the only JSON I get back is:

    {“Value”:{},”SafeValue”:{},”Weak”:{},”IsWeak”:true,”RefCount”:3}

    Have I missed a step somewhere?

    1. Yes I did:

      implementation

      initialization
      kbmMWRegisterKnownClasses([TContact,TObjectList]);

      1. For some reason when I pasted in my code, TObjectList became TObjectList. Guess the site sees the as an html tag…

  18. Can’t seem to paste in the openBracketTContactcloseBracket code, it’s getting stripped off. But it’s in the code! šŸ˜‰

  19. Below is a portion of the code that I implemented to test the capabilities of the Authorization Manager etc.:
    [kbmMW_Service(‘name:MyREST, flags:[listed]’)]
    [kbmMW_Rest(‘path:/myrest’)]
    TRESTFunctionsService = class(TkbmMWCustomSmartService)
    public
    [kbmMW_Auth(‘role:[WRITER], grant:true’)]
    [kbmMW_Method(‘EchoString’)]
    [kbmMW_Rest(‘method:get, ‘ + ‘path: [ “echostring/{AString}”,”myechostring/{AString}” ]’)]
    function EchoString([kbmMW_Rest(‘value: “{AString}”‘)] const AString: String): String;

    var
    FAuthMan: TkbmMWAuthorizationManager;

    begin
    FAuthMan := TkbmMWAuthorizationManager.Create(Self);
    FAuthMan.Options := [mwaoAutoLogin];
    FAuthMan.AddRole(‘READER’);
    FAuthMan.AddRole(‘WRITER’);
    FAuthMan.AddActor(‘JOEBLOW’,’joeblow’,’READER’);
    FAuthMan.AddActor(‘ALLIEBACK’,’allieback’,’WRITER’);

    kServer.AuthorizationManager := FAuthMan;

    end;

    function TRESTFunctionsService.EchoString(const AString: String): String;
    begin
    Result := AString;
    end;

    When I run the server and open firefox to navigate to the url, I get the login dialog, but when I enter the defined usernames and passwords, I continually get prompted to login again.

    I even tried this:

    procedure TWSMobileServer.AuthLogin(Sender: TObject; const AActorName, ARoleName: string; var APassPhrase: string;
    var AActor: TkbmMWAuthorizationActor; var ARole: TkbmMWAuthorizationRole; var AMessage: string);
    begin
    // Use this event in Wellsoft to follow traditional authentication logic
    if Assigned(AActor) then
    begin
    LogEntry(‘Actor Name: ‘ + AActor.Name);
    LogEntry(‘Role Name: ‘ + AActor.DefaultRole);
    LogEntry(‘Pass Phrase: ‘ + AActor.PassPhrase);
    AMessage := ‘200’;
    LogEntry(‘Message: ‘ + AMessage);
    LogEntry(‘Count of Authorizations: ‘ + IntToStr(FAuthMan.Authorizations.Count));
    end;
    end;

    …to test if the necessary authorization classes for actor and role were being created and populated properly, and they are. Authorizations count is always -0-.

    If I cancel the repeating login dialog – even after entering valid credentials – the servers sends back ‘Anonymous user not authorized’.

  20. One thing that I noticed in stepping through your code, is that this method:

    function TkbmMWAuthorizationResources.Get(const AName:string):TkbmMWAuthorizationResource;
    var
    i:integer;
    s:string;
    begin
    s:=UpperCase(AName);
    for i:=0 to FResources.Count-1 do
    begin
    Result:=FResources.Items[i];
    if Result.FName=s then
    exit;
    end;
    Result:=nil;
    end;

    … has an FResources.Count of -0-.

    So even though I’m using a ‘smart’ service and defining resources inline in the declaration using attributes, it appears that the problem could possibly lie in the fact that kbmMW doesn’t see any resources as being defined.

    As you can see from the previously provided code, I’ve defined 2 actors and 2 roles. They both show up in your code. But no resources show up.

    Anything that I might have missed?

    1. Since I couldn’t get the smart service to generate a resource simply by supplying the following declarations in the service interface:

      [kbmMW_Auth(‘role:[READER,READWRITER], grant:true’)]
      [kbmMW_Rest(‘method:get, path:helloworld, anonymousResult:true’)]
      [kbmMW_Method]
      function HelloWorld:TMyResult;

      …I decided to try explicitly creating a resource this way:

      FAuthMan := TkbmMWAuthorizationManager.Create(Self);
      FAuthMan.Options := [mwaoAutoLogin];
      FAuthMan.DefaultMaxIdleTime := 0;
      FAuthMan.AddResource(‘helloworld’);
      FAuthMan.AddRole(‘READER’);
      FAuthMan.AddActor(‘JOEBLOW’,’joeblow’,’READER’);
      FAuthMan.Actors.Get(‘JOEBLOW’).MaxIdleTime := -1;

      I then traced the creation of AddResource into the constructor of TkbmMWAuthorizatonResource, where my new resource ‘helloworld’ was uppercased and assigned to the FName field.

      When tracing the authorization process I discovered in TkbmMWAuthorizationResources.Get – in the comparison

      if Result.FName=s then

      …Result.FName contains the value of ‘READER’ – a role name, while s contains the value of ‘MyRest.1.0.HelloWorld’, a comparison that will never evaluate to true.

      1. Hi,
        Please use our normal support channels for support, since they are monitored more closely. (nntp://news.components4developers.com)

        With the kbmMW Enterprise Edition installation you also get a host of demo apps. Look in .\Demo\AuthRESTFishFact for one showing how to use authorization along with REST.

        It probably will clear up the confusion.

      2. Are you missing:
        kbmMWSecurity and kbmMWSmartServiceUtils in your service units uses clause in the initialization section?
        If so, the kbmMW_…. attributes are never read and understood by Delphi.
        But please move the diskussion to our news server.

  21. Thats a good solution. Maybe that behaviour should be reported to EMB?
    Regards, how are your vacations? šŸ™‚

  22. Looks great!!, Is this also also Capable to Count() XML nodes that has certain attribute value? I was thinking to have something like XQuery/XPath does. ĀæAlso SUM, Max, MIN?

  23. Thanks kim, is this already in latest kbMMW release? or it will be comming soon?

  24. Greetings,

    We are an educational agency and we use the KBMmem table free edition(XE6 – 7.70.00 CodeGear Edition)
    It looks like the article indicates that there should be a download for Delphi 10.2
    I only see up to 10.1 available.
    Can you please assist us in getting this version?
    Thanks,

  25. Can there be a way to output code using kbmMWORMTable instead of defining a delphi class?
    I was thinking for example, to use that code generated in a script, so instead of recompiling an exe or dll, just sending the script and running that in a pascal-language scripter ie. TMS Scripter, DWS, PaxCompiler, etc

    1. I suppose it is possible but it would probably require some additional code to serialize and deserialize the class for communication with the kbmmw server

      1. Well Maybe I didn’t explain well, Instead of streaming a class, I can stream a script text, then the upgrade can be done at server side. so instead of output a class definition, maybe it can also output something like:
        ———————-
        var
        tbl:TkbmMWORMTable;
        fld: TkbmMWORMField;
        begin
        tbl.TkbmMWORMTable.create;
        tbl.fields.add( TkbmMWORMField.Create(xxx, xxx ,…) );
        tbl.fields.add( TkbmMWORMField.Create(xxx, xxx ,…) );
        tbl.indexes.add (TkbmMWORMIndex.Create(xxx, …) );
        end
        —————————

        Or at least if you can declare a delegate class for the source generator (or overridable methods like ProcessTableName, processFields, etc), so we can generate out own custom output and delegate it:
        i.e.
        MyORM.GenerateSourceCode(tbl…, TkbmMWSourceCodeDelphiClass ); // (TkbmMWSourceCodeDelphiClass can be a class or object instance)
        or
        MyORM.GenerateSourceCode(tbl…, TkbmMWSourceCustom); (can be a class that generates custom Delphi code like the first example, or any other custom scripting language that we can run at server side)

        Regards

        1. Hi,

          Im a bit unsure about why you would do that. You can simply use SQL statements from your script. It should be an easier way to define a table than dedicated script code?
          Perhaps Im completely overlooking something, so please explain your use case so I can understand.

          1. Hi Kim, well it is more for updating a database/table, rather than creating a new one.
            yes for a fresh new database a SQL script is better.

            I was thinking a way to make this process ‘scriptable’, so intead of embedding hte table definitions in an exe, store it via a script (using kbmMMWORMTable sentences intead of class definitions), and that can be executed by the host when starting, if there are changes they will be aplied. My doubt comes if I later can consume that kbmMWORMTable to query stuff (this can be done via scripting, using PaxCompiler or DWScript, which are able to define classes or connect Delphi classes with scripts), or do I still the My Table Class definition (class with rtti attributes) to query stuff?.

            Hope I have explained it well, or maybe Im complicating things and can be done easier. Your opinion is always important to me.
            Regards

          2. Hi,

            kbmMW’s ORM encompass two types of SQL… its own generic SQL and translated SQL. The generic SQL is IMO what you would use as the definition in the “script”. Send the generic SQL to the kbmMW server, and let the ORM rewrite the statements to translated SQL and execute those. Then surface the table (a kbmMW ORM method), and you will have access to it via a number of ORM methods taking a TkbmMWORMTable as argument instead of a class instance. Next minor release will add additional Query methods that can operate directly on TkbmMWORMTable.
            I dont think its possible to directly define classes in PaxCompiler or DWScript and use those for direct ORM use. You should define the class in Delphi code, and then refer to the class from PaxCompiler/DWScript. The reason is that neither of those (afaik) has Delphi compatible extended RTTI support which kbmMW ORM require.

  26. Non-breaking spaces wreak havoc in JavaScript, too. I think it happens sometimes when people copy code from web sites.

    I have a static checker that runs as part of a build process to pick these up. I think I’ll need to check my Delphi files, too.

  27. Nice Christmas Gift!!
    But I read this:
    ——————-
    – Added support for UPSERT SQL statement which works like an UPDATE or INSERT
    combined statement. If the UPDATE succeeds, no INSERT is made otherwis
    records are INSERTed.
    ——————–
    Isnt The other way? ā€œIf the INSERT succeeds, no UPDATE is made otherwise
    records are UPDATEDā€
    This is recalling MySQL ā€˜Insert ….. On Duplicate Key Update….’

    1. Hi, yes and no. It depends on the database what happens. Using pure ANSI92, it will rewrite to a special INSERT combined with a SELECT followed by UPDATE. On Oracle it will either use UPDATE followed by conditional INSERT, or MERGE. On MSSQL it will convert to MERGE. In SQLite it will do an UPDATE that may fail silently followed by a special INSERT/SELECT combo.
      Basically there are no one perfect way to do an UPSERT. Each database has its “best practice” regarding that.

    1. No, currently MySQL will be rewritten to ANSI SQL compliant code for UPSERT that will work with older versions of ANSI SQL.
      Eg.

      upsert table1 (fld1,fld2) VALUES (10,20) WHERE fld3>10

      MySQL, Interbase and PostgreSQL:
      INSERT INTO table1 ( fld1,fld2 ) SELECT 10,20 FROM (SELECT 0 as i) AS mutex LEFT JOIN table1 ON (fld3 > 10) WHERE i=0 AND fld3 IS NULL;
      UPDATE table1 SET fld1=10,fld2=20 WHERE (fld3 > 10)

      Oracle:
      MERGE INTO ‘table1’ USING ( SELECT 10,20 FROM DUAL) ON (fld3 > 10) WHEN MATCHED THEN UPDATE SET fld1=10,fld2=20 WHEN NOT MATCHED THEN INSERT ( fld1,fld2 ) VALUES ( 10,20 );

      MSSQL:
      MERGE INTO table1 USING ( SELECT 10,20 ) AS __src(_fld1,_fld2) ON (fld3 > 10) WHEN MATCHED THEN UPDATE SET fld1=10,fld2=20 WHEN NOT MATCHED THEN INSERT ( fld1,fld2 ) VALUES ( 10,20 );

      SQLite:
      UPDATE table1 SET fld1=10,fld2=20 WHERE (fld3 > 10);
      INSERT INTO table1 ( fld1,fld2 ) SELECT 10,20 WHERE (SELECT Changes()=0);

      You can try the ORM sample “Standalone” and type in various statements and have them rewritten.

  28. Cool functions Kim
    Is there one that you can live receiving the console output fo a process?, not the resulting when the process has ended, but receiving strings while process is executing, like a log viwer.

    Also can you add a ‘Forgot password’ option to your Blog Login?, because I forgot Mine šŸ˜€

    1. Hi,

      “live console output” : Good idea. I will make it available as a variant of the ExecuteProcess method.
      “forgot password” : If you dont type in anything in the login and just click the login button you will be placed on a page where you can handle forgotten passwords.

      Kim/C4D


  29. ā€œlive console outputā€ : Good idea. I will make it available as a variant of the ExecuteProcess method.

    Yes like when running a console app and you can get the current progress, etc
    —-
    ā€œforgot passwordā€ : If you dont type in anything in the login and just click the login button you will be placed on a page where you can handle forgotten passwords.

    Sorry to use this post to tell you this, but when I try to login, or click on the Login button with empty user and password, it sends me to the wordpress site, and seems my account doesnt exists, when when I try to subscribe again it seems like is to create a new Blog intead of recovering my old password.

  30. The code in the OpenAPI function is pretty simple. It just calls the GenerateOpenAPI method of the OpenAPI stub generator with the service to be ā€œOpenAPI’ifiedā€ and optionally a settings string. The settings string can be empty

    with the service to be ā€œOpenAPI’ifiedā€ ??

  31. Is it possible create index on two fields?
    CREATE INDEX idx5 ON table1 (fld2, fld3)
    I tried but error occurs ā€œfield not found ā€˜fld2,fld3ā€²ā€

    1. Hi,
      Yes… however there is a minor bug preventing it.
      Open kbmSQLMemTableAPI.pas, locate line 452 which looks like this:
      a:=’,’;
      and replace it with
      a:=’;’;
      Then rebuild.

  32. I also do not understand the vilification of the EU.
    It is not the EU forcing the UK to leave but the other way round.

    The EU is not perfect but they seem to have a better political system when
    I compare it to the quality of our politicians.

    Let’s hope that when I wake up it was all just a terrible nightmare.

  33. Great stuff, howp to see it soon.

    BTW Im having prblem login into the forum and blog. it send me to wordpress site

  34. Great!
    It can be a product at it’s own!
    KbmmW is more cool now than ever!

  35. Wow!
    I don’t develope “prof” Fmx applications because Livebinding is a true problem, don’t permits us to convert vcl forms that have a lot of components…
    I think you have found a true (and comfortable) solution!
    It’s part of KbmMemtable or KbmMW?
    I want try it…

    1. Hi Stefano,
      I hope its at least a good path for a true solution if not the solution already.
      It is part of kbmMW Enterprise Edition when I release… which Im attempting to get done every day now…. There will be more interesting news on that front after the Enterprise Edition release.
      best regards
      Kim/C4D

  36. Hi Kim,
    I have buyed KbmMW several times (always KbmMemtable) in last years , but for different reason, I have always used another Delphi library tool for remoting/services.
    With smartbinding I can reconsider KbmMW, but I need to test latest features, especially on high performance Rest, Services, Data remoting for a large number of concurrent users (now I have under stress Xdata and Mormot for test…).
    How I can test it (after study latest upgrades and features)?

    1. Hi,
      I hope all the features stacked up in kbmMW in the end will make it a more interesting choice for you. I know you have sent me an email too…. stay tuned….. more is coming!
      best regards
      Kim/C4D

  37. I have been playing with smartbinds and I have to say that it’s really powerfull and simple in use. It’s a verry elegant solution! Thank you!

  38. I hope that kbmMW SmartBind supports fmx Listview.
    My app GUI uses a lot of Listview,
    Is there a plan for implementation?

    1. Hi,
      Currently I did not make direct support for ListView….. But I will have a look at it when Im dome with SmartBinding v2 to be released shortly šŸ˜‰

  39. Thanks for the tips,
    I have a lot of problems in my Android apps regarding this matter, Hope this tip solve’s them.

      1. Hi,

        Two things:

        1) Tyop: immeIDately –> immeDIately

        2) ā€œProperty Disable := false;ā€ — shouldn’t that be ā€œDisableDā€? To disablE something is what you do, a method; whether something is disableD or not is an attribute or property.

        Otherwise: Dang, that looks cool! OK, so maybe I’ll get around to looking at this newfangled FireMonkey sh…tuff one of these years. šŸ˜€

  40. Sounds like a tight coupled house to me ☹ Maybe you can teach those Danish contractors some OOP principles šŸ˜€

  41. I would like further clarification and examples regarding the proper use of DevArt / PostgreSql Provider Connection Pull.

    1. I would like further clarification and examples regarding the proper use of DevArt / PostgreSql Provider Connections Pool.

  42. WIB on android (and WIB in general)
    SmartBinding
    REST
    ORM
    Scheduler

    Examples, best practices not just theory. thanks and best regards

  43. smartservices (rest + classic), combined with orm using both your own queries / table struct and also the kbmmw orm table approach.

  44. Hi,
    An intro to kbMMW for a complete newbie.

    No intermediate or advanced demo. Just a basic hiwyo get started with little assumption that the viewer ‘just knows’.

    Thanks.

    1. In the first sentence:
      ā€œThe Delphi / C4D World Wide Webinar continues full speed ahead, this saturday August 14. 2019, again at 15:30 (3:30PM) CEST (UTC+2).ā€

      Best Regards

  45. Hej igen,

    Two more things:

    1) Now you’re talking about a ā€œDisableDā€ property, so please disregard my comment about that on the previous post in this series. Maybe that was also just a tyop. šŸ™‚

    2) Am I right in surmising that if one wants to use Smart Bindings with ordinary Controls but can’t decide which property to put the binding string into, one can just subclass any TControl and add one’s own String property, calling it ā€œBindStringā€ or something (or whatever one likes, since apparently the Binder uses RTTI to go through all String properties looking for validly formatted binding strings)?

  46. Thank you to Boian Mitov for his great show of OpenWire, Visioino, a preview of the “secret” LightLab which is being worked on and allot more stuff that was shown.
    Unfortunately I had massive technical issues with my mic(s) (tried several), which makes me deduce its probably not the mics, but rather Zoom that is acting up. For that reason I had to postpone the presentation of SmartBinding….

  47. Hi. is there a chance you can show how to implment an authentication mecvhanish for other languages to acces a KBMMW rest service?
    Let say if we can develope an OAuth 2.0 auth frameowrk so any other app (not delphi) can authenticate and use a REST service.

  48. Thanks KIM, I have this kind of request every time and I still use a normal service for sending user/password and return a custom Token. But it should be great to show how to implement those frameworks. Including a Pure Restful Web Service. I knot it should not be difficult, but lack of knowledge on some of there topics make me difficult to implement

  49. Hi Kim, I know I have already mentioned it in a Blog Post but Good ideas to show sould be:

    1) Implement authentication standards like OAuth 2.0, JWT (JSON web tokens), etc to communicate with other
    languages rather than delphi.

    Could be example in Javascript or even with using Delphi but with an App that will not use KBMMW on client side (latest TRestClient or TOauth2Authenticator).

    2) How to implement RESTful services (DataSnap replacement) and how to communicate other NON KBMMW apps (Delphi-TRestClient, Javascript, PHP).

    3) Scriptable services using PascalScript, DWScript.

    4) Possible Dates for next release šŸ™‚

  50. Kim,

    Some questions:
    1. When I have a service derived from TkbmMWCustomQueryService how can I make it multi-threaded? I.e. when there are multiple users and threads requesting TkbmMWClientQueries how can I make them run in different threads so that one long query of one user would not make everybody wait? Where can I read more on that subject?
    2. Is it possible to have TkbmMWClientQuery on a client side but on a server side to have a procedure that would construct the dataset ā€˜manually’ instead of using pre-made query components? Is there any documentation or sample code?
    Thanks in advance,
    Alex Liberov

  51. Hi Alex, I will try to answer you with the things I have already learned.
    1) Any KbmmwXXService is Multithreaded, the only thing you need to set the service flags that is if there will be a Pool for a limited number of instances of a service:
    —-
    // Return the maximum number of instances that is allowed to run.
    {$IFNDEF CPP}class{$ENDIF} function TkbmMWCustomServiceXXXX.GetMaxInstances:integer;
    begin
    Result:=-1; //unlimited
    end;

    or you must create an instance per thread/session (stateful). In the kbmmw service wizard, select ‘stateful’ service.
    ——-
    {$IFNDEF CPP}class{$ENDIF} function TkbmMWCustomQueryServiceXXXX.GetFlags:TkbmMWServiceFlags;
    begin
    Result:=[mwsfListed,mwsfStateful];
    end;
    ——
    check demo: Demo\Basic\Stateful
    2) Dont understand exactly your question, do you mean to use a clientside query like ‘select * from XXxxxx’ , withotu having to have a corresponding Server side qury object for that select? the queyr servcie is for that, ti create a new TkbmMWXXXquery (FireDAC, ODAC, ADO, Etc) on the fly when a sql query is submitted via kbmMWClientQuery.

    check demo:
    Demo\Basic\Client (Coomont client demo)
    Demo\Basic\SQLiteServer (serve side demo using SQLite database)

    1. Thank you for the bug report. I have just updated the installer and also fixing an Android compilation error. New release is 5.10.01 which replaces 5.10.00

  52. Hi,Kim;
    When I use kbmMW 5.9+Unidac 7.4.12,I can use the fileds.Origin to update a database view. When update the Unidac to 8.0.1, all the fields.Origin is null.the code like this:

    for I := 0 to qry1.Fields.Count – 1 do //qry1:Tkbmmwclientquery;
    begin
    lst1.Items.Add(qry1.Fields[I].Origin);
    //the lst1.text like dbo.A1.Name;dbo.A1.Age… when I use Unidac 8.01,the lst1.text is ”
    end;

    I’m Sorry for my poor English,I hope you can understand what I said.
    Best regard.

  53. Hi Alex,

    regarding your second question, there are several ways to do this.
    1. Put a kbmMemtable on the service. You can populate that e.g. using the before open event. On your client you simply call the memtable (using named queries, the @NAME in SQL on client) to get that data on your client.
    2. Call a custom service (the first part of Kim’s presentation) to receive a streamed dataset to your client. At your client you can then populate a kbmMemtable to present that data.

    Both have the disadvantage of not automatically resolving (not 100% sure in case of option 1). But you can keep track of the changes on the client using a custom delta handler to transfer the changes back to the server.

    I often use these techniques to present data in a screen or on a report that needs some work to make, e.g. a lot of calculations, or a query that would become very complex any other way.

    When I need to transfer a delta back to the server to resolve, I often “abuse” the way Kim has made it. I place a normal query (often a Firedac server query) on my service, that has a sql to produce an empty result set (eg using where 1=0). It will return all the fields I need to be able to resolve to. If needed I also create the origins (needed when you use joined tables). Then I open this query on the server and resolve my delta stuff line by line to this dataset.

    kbmMW also has the onInsert, onUpdate and onDelete events where you can plug in code on the server to handle code using different ways than the standard.

    Hope this helps. kbmMW takes some time to learn but once you do it is very flexible and powerfull.

  54. What are the steps to get the 50% Black Friday discount on new kbmMW Enterprise Edition?
    Carlos

  55. I have purchased issue 83. I have found your article and in page 57 I read “HERE IS YOUR BLACK FRIDAY COUPON CODE” but no code appears. I press on the text, go to components 4developers.com, login and nothing special happens.
    What can I do?
    Carlos

  56. Hi,

    Happy New Year!
    Can you publish a TOC (Table of Contents) on the Blog site?
    I trying to get an archive your articles as old kbmMW docs seems to disappeared. A ToC would be a valuable reference to all articles, specially for the series like “REST easy…”
    If I want to read the REST easy series right now i have a hard time to found them.

    Best Regards

  57. I had that earlier on, on the previous look… it was not used much because it also is difficult to navigate.
    I had an archive too, also not really a good way to find stuff.
    Right now I have a large search field at the top. Type REST and search and it will find lots of articles.
    If you want the REST easy articles, type REST easy.

    best regards
    Kim

    1. Hi

      the Site Map (I think you just switched on) totally enough!
      Thanks for this.
      BTW there is no #23 article in the Rest Easy serial.

      Best Regards

      1. “BTW there is no #23 article in the Rest Easy serial.”

        Nope… it is a topic started long time ago, that I never finished. I’ll see if I can get it done at some point šŸ™‚

    2. Hi,

      Any hope to restore the old Docs repo ie the Academy?
      Right now the server says for the Docs and Articles menu: “Internal Server Error”

  58. Same here. There was a time I really only knew Delphi, so I used it by default. But I’ve been around the blocks a few times, and used, know, and taught a lot of other languages and tools, and still prefer Delphi. It isn’t perfect, but it is my preference. So glad to see it growing and expanding.

  59. Kim,
    Including these libraries helped me to build kbmMW:
    requires
    IndyCore,
    IndySystem,
    rtl,
    kbmMemRunD103Pro,
    vcl,
    FIBPLUS_D26,
    dclib,
    dclie,
    FMX,
    DbxCommonDriver,
    dbexpress,
    vclFireDAC,
    FireDAC,
    FireDACCommonDriver,
    FireDACCommon,
    dac260,
    ibdac260,
    vcldesigner,
    adortl,
    ibxpress;
    Some are probably overkill.
    Looking in Computer\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Embarcadero\BDS\20.0\Known Packages helped me find exact package names.

  60. Hi,
    Thank you for the list. I have extracted and added support for FIB and IBDAC, MYDAC and UNIDAC from your example.

    Keep them coming šŸ™‚

    best regards
    Kim/C4D

  61. Where can we download the compile tool? I’m finally updating to RIO, and I tried to leave everything default (paths Delphi uses) this time regarding where Delphi places everything (bpl, dcu, etc). kgmMemTable installed without any issues. kbmMW, fails miserably with 100s of imports that shouldn’t be imported. The error I ultimately get is ā€œ[dcc32 Error] E2621 Export table in output file too large: exceeds 65536 limits]. Very frustrating. It seems so un-related to what I’m actually trying to accomplish. I get a few of these: [dcc32 Hint] H2161 Warning: Duplicate resource: Type 12 (CURSOR GROUP), ID 32761; File c:\program files (x86)\embarcadero\studio\20.0\lib\Win32\release\FMX.Controls.Win.res resource kept; file c:\program files (x86)\embarcadero\studio\20.0\lib\Win32\release\Controls.res resource discarded.
    If Embarcadero needs to work on anything, they need to work on this. Adding third party components should be a no-brainer, but every vendor puts their code in different places, modifies library paths, modifies environment paths, one has a batch file, on and on. Just so frustrating. I’m hoping your compiler tool will help. Can it be downloaded yet or am I missing the obvious and it’s here and I’m not seeing it?

  62. Hi, I feel your pain.. .literally šŸ™‚

    The “exceeds 65536 limits” is because the linker imports all requirements, that are not in the requires section, as internal entrypoints in the BPL it is about to create. A BPL is just a DLL, and MS has defined a max of 65536 exports in a DLL.

    This link explains some of the things you can add as requirements:

    https://stackoverflow.com/questions/61061554/compiling-kbmmw-design-package-in-delphi-10-3-vcl-conflict-error-e2199

    If you are using ReportBuilder, it also adds a huge amounts of exports to the DLL. Make sure you have all ReportBuilder bpl’s listed in the requires section of the kbmMW runtime package. (If you indeed are using ReportBuilder, let me know what you have added, so I can add that knowledge to the Compile Tool)

    The Compile Tool needs a few minor updates in the kbmMemTable and kbmMW sources, so it will be released along with the next kbmMemTable and kbmMW release.

    best regards
    Kim/C4D

  63. Hi,

    I tried to use the CompileTool but always getting build errors, while the IDE can build the packages and install just fine.

    The error which I got:

    “f:\work\Delphi\pkg\kbmMW\Source\kbmMWRunD103Ent.dproj” (Build cl) (1) ->
    (_PasCoreCompile cl) ->
    kbmMWRunD103Ent.dpk(33): error E2202: Required package ‘vcldb’ not found [f:\work\Delphi\pkg\kbmMW\Source\kbmMWRunD103Ent.dproj]

    which is strange because the Runtime package does not require the vcldb package, but the build system wants it and fail.

    BTW
    NEXUSDB v4.5 = NexusDB450ll260;NexusDB450sr260;NexusDB450sd260;NexusDB450db260;NexusDB450se260

    DBISAM4 = dbisamr

    Best Regards

  64. Hi,
    I have seen that behaviour on my 10.2 installation, where I suspect unusual long search path’s to be the reason… but I have not found a solution as of yet.

    Thank you for the info about some 3rdparty package names. The NexusDB one is one of the tricky ones, as it changes with each version released as far as I know?

    1. I have altered the compile tool so its valid to have question marks in the middle of requirements to indicate that something needs to be filled out by the user.

      Hence for NexusDB, this would be the default requirement string:
      NexusDB???ll[!–IDEPACKAGEVERSION–!];NexusDB???sr[!–IDEPACKAGEVERSION–!];NexusDB???sd[!–IDEPACKAGEVERSION–!];NexusDB???db[!–IDEPACKAGEVERSION–!];NexusDB???se[!–IDEPACKAGEVERSION–!]

  65. Hi,

    I think the new/latest version is not compiled with sqldir. I tried to use compiletool but it also gives error. When I just want to re-create the projects, newly prepared projects cannot be compiled. Does anyone have any suggestions?

  66. Updating Android applications outside Google Play is imo not recommended, and in most cases it would require having a rooted device.

  67. Yes indirectly by using an executable.
    It is possible to specify in the manifest file that an installer executable should be transferred and then run.
    Stopping and installing service stuff, usually require the installer to be running in an elevated state, why the installer most likely will ask if it is ok to run it elevated.

  68. Could you check your email and your portal? I have ordered license and send email. No any reply.

    1. Hi,

      I have not made any formal benchmarks or tests of it as of yet. However Pierre do claim a 30% higher performance on highly threaded applications, in which category kbmMW easily can end up in on large setups.

      But since you can download FastMM5 for free for testing it out, you can try it out on your own known setup before making a buy decision.

      Just remember to live up to the license agreement for FastMM5.

  69. Hi All,
    I read your article in Blaise Magazine. I’m not a C4D user/customer and I’m wondering if it’s possible to try and test your compile tool. In case of, than you to provide me an download link.
    Best regards,
    Laurent

    1. Hi,
      Thank you for your interest in the compile tool. It is currently only bundled with source versions of kbmMemTable and kbmMW. What specifically would you like to test?
      best regards
      Kim/C4D

  70. Can I use Method = sslvTLS1.2 at server with these 2 crt and key files created by cmd: “openssl req -newkey rsa:2048 -nodes -keyout domain.key -x509 -days 365 -out domain.crt”

  71. Im not an SSL expert myself, but I see no reason why you should not be able to require TLS 1.2 with that certificate file.

  72. Hi Kim
    I hate to be pain in the neck. I did EXACTLY what this article says (triple checked it) and my client cannot connect to the server (message ‘Connection lost.’).

    I guess my .cnf file has some wrong settings. In your .cnf example file I just changed [ req_distinguished_name ] section to reflect my settings. I generated .crt and .key files on my VPS Win Server 2019 machine in the cloud where my kbm server is. All openssl.exe files and .dll files are in my kbm server folder. Server starts ok, but from my client (there are ssl dll’s in client folder) I get this Connection lost message.

    Is there anything you can suggest me to do? On my Win Server 2019 I don’t have IIS installed. Could that be a problem?

    1. Hi, Kim

      We followed your above instructions, and we also get ā€˜Connection Lost’ from client, we have checked all the source codes, nothing is missing. At this point, we don’t know how to implement this new feature. Please advice

  73. First of try to run them on the same computer to rule out any intermediate filtering.
    Secondly check that the demo server and client application here in your kbmMW installation (\Demo\Other\OpenSSL) works untouched.
    If it works for you, then progress from there to figure out where the difference is.

    1. Just tried the demo, Start SrvDemo first, Click Listen, no error, then start CliDemo, Click Connect button, no error, switch to Query services tab, click Query button, got ‘Connection Lost’.

    2. Also tried the ā€œQuery allā€ and ā€œQuery selectedā€ buttons at Named query services tab, got ā€œConnection Lostā€ error too, even though I assigned SimpleClient1 to the Client property of query components.

  74. Hi Kim,
    Long time customer (~2002). I’ve asked about this before a few times, and something always comes up that pulls me away;

    I’m wanting to use one open port/ip address and combine the WIB and standard message processing. I looked at the demo that is in the samples/demos folder, and it doesn’t have much depth. Can you create a demo with some depth, say a service that has 2 or 3 RPC services and handles WIB on the sever, then on the client, call the RPC services and publish subscribe a message from a client form, and on the same form call one of the services that returns a dataset?

    I’m not wrapping my head around how I can selectively subscribe to a service (or publish a subscription on the client, say a chat app for example), and then also send and RPC request. I guess I’m wondering how to get a message from the server to a specific form. Server side, pick off the requests, route the messages to the message handlers/queues, and then route the RPC correctly (preferably not in a single thread, so the requests don’t become a bottle neck).

    How about Security? How do you secure the WIB? Is just using SSL going to do it? I thought I read somewhere that due to the routing, the message have to be clear text? Maybe an example of securing messaging?

    Thanks Kim,
    Long time kbmMW customer

    Regards,
    Curt

  75. I am working on a screen cast + source code showing a multitier WIB driven rolodex which should incorporate most of the questions you have.

    However to answer your questions.

    First, if you choose to use the WIB, you can make request/response and async push operations concurrently on the same transport and port. You will however be limited to using the protocols that are available that are WIB compatible (that generally boils down to the binary protocol).

    If you would like to provide a REST server too, accessible from web browsers, you would need an additional transport (with additional port) which handles the REST or AJAX protocol, since it operates in a different way compared to the WIB.

    Basically all message routing is based on subscriptions. Your WIB transport would (in the simplest fashion) subscribe for > which means that it subscribes for all types of messages from anybody to anybody. This is an OK starting point, but the subscriptions definitely must be dressed more detailed up before your multi tier system goes into production (or even user test).

    You will often use a hub/spoke transport topology, where your traditional application server will act as a hub node, and the traditional clients as spoke nodes.

    Hence the clients connects as usual to the server (in a similar way as you are used to).

    The clients will each of them usually announce the subjects they subscribe on, to the hub, and the hub will only deliver messages to spokes that are subscribing for those messages. But it also means that a message may be delivered to a number of spokes, if multiple spokes subscriptions match with the subject of that message.

    A request is simply a message. It differs by having a subject starting with REQ.something. Hence the server must be able to receive messages that have subjects starting with REQ to be able to process them. With the initial simple subscription for > (which is a catch all subscription), the server will get all REQ messages sent by any client node.

    When a server has processed a REQ message, it will reply with a RES message. The reply will go out with an address (as part of the subject) that includes the specific node’s node ID that originally made the request. For that reason, nodes should only subscribe for REQ.xxxxx subjects that contain their own node id. AutoSetupResponseSubscription is a simple property to set on the client transport to set to true before connecting. Then the relevant RES..xxxx subscription is setup on the client node.

    A client may do the regular request with a blocking wait for the response, or it may ask for the response to be async, in which case an event or an anonymous method is called.

    Other messages can be sent async by simply using SendMessage fron any node.

  76. Hi,
    For the life of me i can’t get this to work. I can get the api as a download file buthttp://localhost:888/myserver/api/index.html?url=/myserver/api
    gives me back a ā€œRequest not supportedā€. I followed the instructions as best as possible.
    5.10.20 Community Edition
    on Delphi 10.3 CE
    Thanks.

  77. v. 5.13.10 has been released.
    It is primarily a bugfix release.
    5.13.10 Nov 15 2020

    New stuff
    =========
    – Added SendTimeout to TkbmMWCustomTCPIPIndyMessagingServerTransport

    Fixes
    =====
    – Fixed XE5 compilation
    – Fixed warnings and hints.
    – Fixed compilation when directive FMX is defined.

  78. Hi Kim,
    Did you get time to complete your screen cast with the RoloDex demo? I didn’t mention this in my original email, but I’d like to have the RPC stay RPC and the Messaging stay Messaging, meaning I don’t want the messaging to contain datasets that are currently passed back and forth using RPC. Obviously this is a long running project, I’ve got a few projects I’m juggling now, and will be back on this one for this request again soon.
    Thanks,
    Curt

  79. Hi, I send two emails for the support and sales address regarding some question I’ve about kbmmemtable. But didn’t get any answers… are these still operative? if not how can I get support?

    1. Hi,
      I did reply, but perhaps the reply has gone missing in a spamfilter?
      You asked if kbmMemTable supports FPC, and yes it works with FPC. I can not guarantee it works with all the FPC target platforms as I have primarily verified that it works with the Win32 target, but I see no reason why it should not work towards other targets.
      best regards
      Kim Madsen

  80. I tried to compile this project using the guidelines provided for the 74 bit but get the linker error unresolved external ā€˜vtable for Kbmmemtable::TkbmMemTable’

  81. If you have a compile problem with OutputDebugString in kbmMWSmartBindVCL.pas, please clear your browser cache and redownload kbmMW Enterprise Edition v. 5.15.00 again.

  82. I have just spend time (too much) on setting C++Builder 10.4.2 up to compile kbmMemTable for Win64 and link a simple project with it. As long as one is following the instructions in the blog, and makes sure to setup your own project to compile and link with the appropriate settings (matching paths, target compiler etc. and matching compilation for using runtime libraries or not), then it will link.

    C++Builder is however a PITA to work with IMO. Not because of C++Builder in itself, but because as a C++ developer you have to extremely careful about referencing the correct paths and files, and since there are so many of them, there is a real chance of referencing wrong ones.

    I only recommend using C++Builder if you really have no other choice, because you would be so much more productive using Delphi.

    The complete simple project can be downloaded from here (I used kbmMemTable Pro in this case, but replacing the text Pro with Std at relevant places within the project files, it will work as well with kbmMemTable Standard Edition).

    https://drive.google.com/file/d/1OoxGNyRx3evnyNqf_3E2BXKnChwE1UsO/view?usp=sharing

  83. I believe your exclusion from DelphiFeeds is just an oversite. We can also look at GetIt again, I don’t recall all the details. I’ll drop you an email.

    1. Hi Jim,
      Thank you for your reply!
      I do not know why DelphiFeeds has never replied, nor reacted to any of the various ways I have tried to contact them over the years. I have no clue, but it distinctly feels like being ignored. I can understand messages getting lost from time to time, that happens to me too, but with the amount of attempts, and various ways both directly and indirectly, not hearing anything, it does feel more deliberate.
      About GetIt, then there were issues at the time I submitted (May 31 2015) which Luis Navaro would look at during a conversation going on until July 1 2015, but it died after that. As I remember GetIt mostly preferred source files then, and were not great with replacing bpls that might be in use by the IDE.
      /Kim

      1. DelphiFeeds was started by the Gurock brothers. Even before their acquisition by Embarcadero for their TestRail product they had lost interest in Delphi and the DelphiFeeds website. I know of several other blog authors who’s please to be listed on DelphiFeeds went unheard, they weren’t just targeting you. These days Jim McKeeth has taken over DelphiFeeds and things have started to change. Personally though I’d recommend everyone use BeginEnd, it’s a better site.

        1. Good to hear it is not my gentle being that was not to their liking šŸ™‚
          Jim mentioned it had to be a mistake/oversight, so I suppose it will be sorted at some point, although there seemingly has been no change at DelphiFeeds until now.
          I have noticed though that BeginEnd is now aggregating this blog… Yay šŸ™‚

  84. I suggested your Blog to BeginEnd and today it’s listet!

    1. Hi,
      Thank you for your suggestion to them! I noticed them listing this blog a couple of days ago, but thank you for your support!
      /Kim

    1. Hi,
      I think that the issue is somewhat different. I do provide Unicode strings as the arguments, and it does work on IOS 64, which afaik mimics MacOS closely API and handling wise. But I have not tested it as an OSX application so I do not know if “my” problem will be there on OSX or not.
      /Kim

  85. Nice one. But using tabs for indentation hurts my eyes and the code style guide. alot.

    1. Yeh… I agree… But it was done to make it “simple” for the contest to read it, as tab often is the choice for C like languages.

  86. Downloaded from google and adapted for FPC/Lazarus. Only compiled for 64 bit. Project1 best result 14760. Project2 best result 11102.
    Multi-threaded version of Project1 on 16 core cpu best result 98200.

    1. Was it the multithreaded version I provided? Then it is actually a 1 bit per 1 prime candidate, which is what Project2 also does. Project1 is 1 byte per 1 prime candidate.

  87. Hi,

    Agree.
    1. Don’t do free advertisment of this site and don’t list it here.
    2. You can use source or resource fingerprinting to trace back to the leaker, Devexpress doing this it helps to discurage license owners from leaking the product.

    Anyway you can try to fight this, with variable success rate. Best option (in my opinion) is the closed support forum for the license owners….
    Regards

    1. How do you identify the “leaker”? I imagine you would need to pay such sites to check if there is a leaked product and what “fingerprints” (if you are using any) there are.

  88. My software is also listed there.
    I doubt, the “crack” really works.
    So anyone paying them will only loose money.
    And they deserve so.

  89. There is non-zero chance that this is a pure scam. E.g. they don’t actually have any cracks / source code, just grabbing money.

  90. I don’t know why you are publicising them, they won’t care and you’ve just pointed all your legitimate customers at a way to get your software for less. Why tempt them with that?
    Also providing a direct link to a pirate site is never a good idea. The site itself could be full of all sorts of malicious browser exploits that you’re potentially exposing your more curious readers to.

  91. Thank you for the comments so far.
    I have included the link to them because it is not an unknown site for people. Anyone searching for any of the known 3rdparty products will find that link as one of the search results. Google and Facebook have no problem in referring to the site.
    I am pretty sure that the web site in it self, do not pose a threat, as I have numerous detectors running, who have not flagged it as dangerous.
    Does it hurt my own business by pointing my customers to it?
    If it does, then those customers would anyway be looking for a piracy site, and they would be arseholes from the outset, which I can’t do much about.
    About tracking. Yes that is an option, one I have used several times. It does however not make sites as such go away. Being open about their affect on small developers is the only way forward I believe.
    I have started the ball rolling, I hope others will pick it up and unite in an effort of informing our customers and specially potential customers (or would be arseholes) that it is just not worth it, using pirated software.

  92. Dear Kim,
    Maybe you don’t know, but at first I pirated your products.
    I used it for 1 year in my own products. During this time, I saw that kbmmw worked very well and I was very satisfied.
    After this satisfaction, I decided to buy. I have been your customer for about 10 years and I am satisfied with your products.
    The reason why I am writing this; There may be a possibility that the pirated use will turn into a customer for a certain period of time.

    Gogole Translate

  93. You don’t mention the OS, min. image size or spin-up times. Request responsiveness is important but when building systems to scale horizontally .. at, um, scale, deployment efficiency is also a consideration.

    1. Hi,
      OS is Win10 Pro reasonably new updates.
      The monolithic executables range from 2MB to 12MB. The node.js sample required installation of the node.js runtime environment which is a 27MB download, and perhaps roughly twice the installation size. It was required anyway for the NetBenchmarks client.
      I allowed for 6-8 seconds spin up time after start, before triggering the client, which in turn (depending on the number of client threads) took 1-2 seconds starting all threads up, before beginning the calls and measurements.
      In addition the NetBenchmarks test included two JSON files, one which were sent to the server, and the other which can be used for comparison with the returned result.
      Those two files are not a requirement when running the blank variant of the test, in which case only the node.js solution required anything but the simple executable.

  94. why you don’t give a try to Webbroker default?
    check this testhttps://en.delphipraxis.net/topic/5620-pgpool-linux-apache-top-performance-delphi11/
    highly scalable both in IIS windows and Apache linuxhttps://github.com/danieleteti/delphimvcframework true MVC
    really Delphi can be excellent as server

  95. Hi
    RTC is more or less abandon-ware now, which is very sad. I used it and was forced to drop when the Teppi bought it and dropped the development. There is some info about a totally rewritten new library, but no other sign. The package is not supporting Delphi 10.4 and 11.
    It would very good if they restart the support for the latest Delphi.

  96. I have been using kbmMW in desktop applications for 10 years, I am a fan. It’s a good framework. It works cool. But it is also a big pain:
    1. The weak documentation. I can’t understand some approaches or methods.
    2. The absence of demos with fresh features
    3. The hidden errors in my complex application after any new release of kbMW (The last two was a broken JSON and a problem with load table from XML)
    4. The ORM is cool – but I spent a lot of time on adaptation it with Firebird Database on my MPV project. I didn’t resolve a problem with creating definitions for hierarchical classes. I don’t sure what I will use ORM on my real application.
    5. The absence of support. The waiting three or four weeks for an answer on errors’ notice – It is unacceptable

  97. Hi Kim,
    I uses 2.61 long time and 5.xx, so flexible product,
    in my opinion you need to open a demo page on github
    For the product, it would be much better if there was script language support.
    I am currently trying to do something with python language.
    a flexible infrastructure by using the power of kbmmw within the scripting language.
    Best Regards

        1. This is a simple example. You can use the script from a file on kbmMW server. It can be used for changing the servers logic without changing a servers code.
          unit Unit24;
          interface
          uses
          Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
          Vcl.Controls, Vcl.Forms, Vcl.Dialogs, fs_iinterpreter, fs_iclassesrtti, fs_igraphicsrtti, fs_iformsrtti, fs_iextctrlsrtti, fs_idialogsrtti, fs_iinirtti, fs_imenusrtti,
          fs_ipascal, fs_icpp, fs_ijs, fs_ibasic, fs_tree, Vcl.StdCtrls;
          const script = ‘var s2 : String;’ +
          ‘begin ‘ +
          ‘s2 := ”Test”; ‘ +
          ‘s2 := sInput + s2;’ +
          ‘ShowMessage(”ShowMessage from Script ” + s2);’ +
          ‘sOutput := s2;’ +
          ‘end. ‘;

          type
          TForm24 = class(TForm)
          Button1: TButton;
          procedure Button1Click(Sender: TObject);
          private
          { Private declarations }
          public
          { Public declarations }
          end;

          var
          Form24: TForm24;

          implementation

          {$R *.dfm}
          procedure TForm24.Button1Click(Sender: TObject);
          var s : TfsScript;
          begin
          s := TfsScript.Create(Self);
          s.SyntaxType := ‘PascalScript’;
          s.Parent := fsGlobalUnit;
          s.Lines.Add(script);
          s.AddVariable(‘sInput’,’String’,’DataForScript’);
          s.AddVariable(‘sOutPut’,’String’,’DataForScript’);
          // s.Compile;
          s.Run;
          ShowMessage(‘sOutPut: ‘ + s.Variables[‘sOutPut’]);
          s.Free;
          end;
          end.

  98. Hi,
    C4D actually did have a product, that included script support, kbmMWM (kbmMW Management framework). It was back in the 2.5-3.x timeframe as I remember.
    Despite the countless hours put into making an easy to use management console etc. for handling myriads of kbmMW servers, including (3rdparty) scripting built in, it was never a hit between users.
    So I discontinued it after some years.
    However I do understand the feature of scripting in relation to kbmMW could be very useful to some. I am however a bit unsure about exactly what level of scripting is really asked for.
    Is it interesting to have a complete scripting based development IDE/kbmMW system and why? I somehow find it questionable that people would want to write a complete kbmMW based n-tier system in script language, when they can use Delphi and for some versions of kbmMW Lazarus/FPC for the same?
    Hence my take would be to use scripting for specific functionality, like custom calculations and string management etc.
    For that purpose kbmMemtable’s SQL parser actually works wonders as it can handle non SQL expressions to which can include math and string manipulation with variables, native functions etc.
    In fact right now I am working on extending that feature to include scripted functions written in a math type of way: myfunc1(x,y)=sin(x)*y etc.
    It even supports conditions and loops to make for a relatively simple to use, but very powerful scripting engine (that I am using in various customer projects too).
    Then there is the scripting which produce for example HTML or other types of output. Is that a need/wish?
    /Kim

    1. Hi,
      I’ve been writing desktop applications for years and I want to replace that with the web.
      I want to create my business objects on the server layer using scripts and output html in the user interface.
      I’ve been doing a qaurtex pascal review lately. kbmmw and qaurtex can be a good couple. I’ll do R&D on it.

      Exactly what I mean is an integrated development environment, like sap.

      best regards

  99. Can you also add to the banned list the USA for the destruction of sovereign Yugoslavia, for the bombing of Iraq and Syria, for the overthrow of the legitimate government of Libya?

    1. You obviously needs some history lessons Alex.
      Start out with this: https://en.wikipedia.org/wiki/Timeline_of_Yugoslavia
      Then read this: https://en.wikipedia.org/wiki/Socialist_Federal_Republic_of_Yugoslavia
      Yugoslavia was forcefully put together by a dictator, and it was exploding from the inside out in various smaller or bigger events ever since.
      Did US “help” that movement… yes most likely starting from 1984, but the base reason any “success” was the internal fractions and province nationalistic tendencies that was already existing.
      Apart from the history lesson, it HAS NO BEARING ON UKRAINE!

  100. Yes, we need to view a full list of companies who are support fascism and the destruction of civilians in Donetsk and Luhansk

    1. Stupid comment Alex.
      It was not Ukraine that invaded Russian territory. It was “little green absolutely not Russian men” that invaded and overtook the power in those territories. And now it is “little green men again” but this time at least out of the bush, showing themselves as Russian.
      There are NO excuse for this invasion what so ever!
      I am proud of trying to stay on the right side of history on this one. You ought to do the same, many Russians are well aware that what is happening now, is not right.

  101. Although I see it as a good cause and I’m against what is happening. I’m disappointed to see the lack of rage when in Iraq, Libya, Syria, Yemen and Afghanistan cities were/are completely destroyed and hundreds of thousands of civilians were/are killed. Even the decision to bomb Yugoslavia and separate Kosovo were made exclusively by NATO, not the UN. You may create good guys and bad guys or justifications for past actions, but based on your comments that’s not your point/ goal but the humanitarian crisis it creates, which is the same one that was created on all those countries when they were invaded. I’m sad to see that European life’s are more important than those from Africa, Middle east or in any case almost everywhere else in the world. I doubt I’ll ever see you posting “I will not sell to the super power on the west” doesnt matter what they do and they have done a lot, unless it is in Europe off course. In any case, is your statement and I respect it.

    1. Hi Mike,
      Firstly I am 100% focused on what is going on in Ukraine. What is happening does not only have an impact on Ukraine, but the rest of Europe why it obviously is in need of attention. I am sure if you feel your home place being attacked or in danger of being attacked, then you would react too in one way or the other.
      Secondly, war is bad, civilian casualties are bad, regardless of where it happens. This is not a religious war, it is not even really a war about minerals or rare metals or food or water. It is a war without ANY reason except the delusions of a despot trying to hide his own crimes in the fog of war.
      Although I know most wars are blamed on the US, it is not really the full truth for the majority of them.
      The Yugoslavian war was something going on since the forced dictatorship in 1928ish, and there were all sorts of problems and attacks between the fractions all the way until the break up of Yugoslavia. It is easy to blame the US, but in reality the base problems started way before the US had any involvement in anything. You should blame the Soviet Union more than the US or NATO, since they were in all practical reasons in charge, like they were in all of eastern Europe.
      I remember the horrendous killings in Srebrenica, and I remember how UN forces did not do anything of all sorts of reasons, one of them not having the mandate.
      I remember the Danish operation “BĆøllebank” where Danish battle tanks took out several positions that were attempting to ambush the UN vehicles and positions.
      The war was vicious, but the atrocities did not happen because of the UN or US or EU or Denmark being there, but despite them.
      The fighting in Africa is going on about all sorts of things. And yes I believe there are most likely western big business involved there too, at least in some of the conflicts. That is terrible, and again all conflicts should be stopped.
      The fighting in the Middle East usually has been against some dictator that was treating some parts of the population ok, but the remaining badly. The uprising would not happen, regardless of external involvement, if citizens would be content with their system.
      The exit from Afghanistan was terrible and was entirely a shit show left behind by Trump and is complete ignorance. However there is truth in the fact that it is extremely difficult to make people talk with each other when corruption and religion goes hand in hand, because nobody wants to loose out. So I somewhat understand the rationale of leaving, but I absolutely think the control should have been moved to UN level although I have personally heard from war correspondents that there really was no solution, and the warlords had no intention at any time of putting down arms and cooperate, and the sitting government, regardless of who it would have been would be extremely corrupt.
      On the surface it looks easy to just say no to war, but we are dealing with humans.
      I will not silently accept the Ukrainian war, and certainly not that Putin is going to dictate that numerous European countries should be moved back in time into the rule of Russia again, against their will.
      So blame me for this, I do not care. I am loosing loads of money on caring, but I am at least not in physical danger like the brave people of Ukraine!

  102. This is European hypocrisy. Why didn’t Europeans talk to those who lost their lives in Iraq, Libya, Syria, Afghanistan, Palestine and Africa because of the war launched by Europe and the United States? I can only say fuck you.

    čæ™å°±ę˜Æę¬§ę“²äŗŗēš„č™šä¼Ŗć€‚é‚£äŗ›å› äøŗę¬§ę“²å’Œē¾Žå›½å‘åŠØęˆ˜äŗ‰å¤±åŽ»ē”Ÿå‘½ēš„äŗŗļ¼Œå¦‚ä¼Šę‹‰å…‹ć€åˆ©ęÆ”äŗšć€å™åˆ©äŗšć€é˜æåÆŒę±—ć€å·“å‹’ę–Æå¦å’Œéžę“²ļ¼Œę¬§ę“²äŗŗå½“ę—¶ę€Žä¹ˆäøč·³å‡ŗę„å½“åœ£ęÆå©Šļ¼Ÿęˆ‘åŖčƒ½čÆ“ę“ä½ å¤§ēˆ·ć€‚

    1. And yet another mature comment from a confused Chinese citizen (37540862@qq.com)
      But I suppose I can get out of it that it is strengthening my stance on the decision.
      Certain people just want to have everything for nothing.
      Go donate money to Ukraine and you can get a f…. license yourself instead of acting as a moron, but you will have to come out of hiding!

    1. Come on, please behave yourself, you can have different opinions, but don’t embarrass yourself, or our race. Thanks.

  103. US Kill milions people for years怂
    its time to change sale to USA.right?
    double standard is your face~~

    1. Hi Chinese cowardly anonymous friend from Hongkong.
      You know what is double standard? You complaining about having to pay the SAME PRICE as everybody else for my products!
      The SAME PRICE the people of the USA has been paying all the time!
      You most likely do not even have an interest in using it in the first place. But you still feel compelled to complain.
      Now you can get it _EVEN_ cheaper than the agreement that has been POSTPONED or PUT ON PAUSE if you do not understand what I mean by postsponed.. Just show your compassion with the people of the sovereign country of Ukraine, and DONATE some money. Then you can also get a f…. license for almost no money. But you will have to come out of hiding… guitar player šŸ˜‰
      /Kim

  104. Should Close sale to china and russia and America Immediately!just do it~~~

    1. Hi coward hiding behind an american IP address, and a fake email address.
      Surely I have more heart than brain in this case, would you not say that?
      In fact I have more courage and spine than you obviously have! Tossing out idiotic comments without being man or woman enough to stand by it!
      COWARD!

  105. What Ukraine is to Russia is different from what Taiwan and Hong Kong are to China. No country will tolerate a part of its territory being divided from it. The U.S. has done a lot of things against China over the years to hinder its rise, but of course all of them are disguised in a so-called democratic veneer, which is very confusing to the general public. The conflict between Russia and Ukraine is actually a Russian-American conflict. Ukraine is just taking a beating for the United States. Faced with the pressure of NATO’s eastward expansion, Putin has no choice. Over the years you should have heard the contradiction between the promise that NATO will never expand east and the fact that NATO is expanding east. This is also why there is a lot of public opinion from Chinese folk in favor of Russia. I can’t imagine that when you you are faced with continuous provocations from others you will always exercise restraint and forbearance. I don’t think there is any justice in tying your business to the complex game of international politics, rather it is a very funny thing.

    1. Hi Helle.
      Thank you for your actual attempt to enter a debate, rather than just using name calling.
      I would first like to know why none of the commenters here has the courage to stand up for their opinions by not being anonymous? I write on my company’s blog using my name, and is facing all sorts of potential problems standing up for my opinion, but all those who have a differing opinion or just dislike me or my actions, are ANONYMOUS?
      Where is the courage? Where is the spine? Where is the honour?
      Ok… back to your points.
      “What Ukraine is to Russia is different from what Taiwan and Hong Kong are to China”
      Is that not what all people are using as an excuse for their cause being more important than some other people cause? “You can’t compare”
      Putin has said directly that Ukraine is not a country. It should never have been a country. It has always been a part of Russia and is the brothers and sisters of Russian. How does that statement differ from the statements about Taiwan? Please enlighten me. Not with propaganda, but with ACTUAL facts.
      “No country will tolerate a part of its territory being divided from it” – Well the truth being told The island that today is called Taiwan was under control by indigenous non Chinese people until the Dutch took over the ruling of the island. So in all fairness, it is a self imposed idea that it is part of China.
      At some point warlords in China went to war against each other, and one of them kicked the Dutch out and moved to the island because he lost the war against the dynasty that became the foundation of current China.
      So again it was not a Chinese island. It was an island with an exiled Chinese ruling it, but definitely not some that were happy about the people ruling China at the time.
      40 years later that exiled Chinese was also conquered by the ruling Chinese from mainland China and parts of Taiwan came under Qing rule
      But in 1895 it became a Japanese island after yet another war.
      Then in 1945, when the Japanese were defeated, the Chinese moved in on the island again, for 4 years. Then another war, this time a civilian one in mainland China, where another looser of that battle relocated to Taiwan. Again an exile.
      Then came in 1980 a democratic reform, and the Taiwan we more or less know today.
      So how China can claim that Taiwan, that very specifically and with a huge majority do not want to be part of China, is part of China, is a serious mystery to me. Current China has only ruled the islands for an extremely short period of the islands inhabited times, and it seemingly have never been in any peacefully way, so I do not blame the Taiwanese to pursue their own future.
      Like Russia, China is a huge country. The few extra square miles of Taiwan or Ukraine should matter nothing in terms of space, so why is it that Ukraine and Taiwan are not allowed to pursue own happiness?
      Is it an envy that they are actually doing better than Russia and China?
      It is not Ukraines or Taiwans fault. It is the fault of the Russian and Chinese leaders (although I would say both were doing better and better all the way until this stupid conflict that are costing the lives not only of Russian and Ukrainian soldiers, but lots of children!
      Anybody who are trying to make this war acceptable in any way will have to live with the death of children on their conscience.
      Consider for a moment if it would be YOUR children. You would find country XXXXX invading your neighbourhood, shelling your house, killing your wife and your kids.

      How would you feel when the other side is using as a reason… “you are my brothers and sisters, you belong with us!”
      “NATO expanding east”
      No that is a lie constantly being peddled. What is happening is not that NATO is invading countries forcing them to be members. What is happening is that countries actively and with extreme passion want to be part of the NATO and EU communities. Why is it like that?
      Because they have already been under the “protection” of the Soviet Union, in which they were not treated as equals, and with safety in mind. If they would have enjoyed being part of that union, the Soviet Union and Warsaw pact would never have ended. It did, because of the way it was run.
      And right now Putin is proving they were right in asking for NATO membership. The ones already part of NATO, knew the time would come, when some idiot in Russia would become powerful enough that he could assign dictatorial properties on himself, that would make him able to redo a new USSR v2.
      So the proof is in the pudding.

      NATO is not expanding, but countries are fleeing to it…. now proven with good reason.
      China is attempting to show as the reasonable country with ability to clearly think things thru, to work for the peaceful aspect of living etc. So why did they not directly say to Russia… Hey… this is not acceptable. We do not support that type of aggression. It will hurt not only soldiers but children too!

      Instead China is working against the community trying to empower Ukraine to keep its country, while being attacked with an overwhelming force.

      “I don’t think there is any justice in tying your business to the complex game of international politics, rather it is a very funny thing.”
      That is the problem Helle… It is not funny at all! Would it be funny if it were your children? As I like to say to others… DO NOT BE A MORON.

      Kim/C4D

      1. Hello,
        What Russia does is clearly an invasion of another sovereign country, just as was what NATO countries have done to Serbia. These are facts, but why they happened can be interpreted by anyone. I feel sorry for all Ukraine civilians and especially Ukraine citizens of Russian ethnicity in Donbass area, who have suffered indescribable atrocities from Ukraine military units such as the Azov battalion.
        What does it have to do with China or Chinese developers? It is a fact that the Chinese government is not as enthusiastic as NATO countries to impose sanctions against Russia, it voted abstention during UN meeting for this purpose, but at the same time countries of almost half the population of the world voted abstention: India, Pakistan, Iran, Iraq… Unfortunately, in politics “abstention” itself is a strong strong opinion. But it seems that it bothers you that others don’t agree with you and don’t do what you want them to.
        In your announce, you said “I can’t have a clean conscience supporting (even how slightly that is) the Chinese government’s stance on the atrocities happening towards the Ukrainian people. A stance most likely fueled by China’s similar ambitions to take over Taiwan in due course.”, I think this is what makes people frown because the second half was pure speculation, how could you know? And use it as an argument to justify your decision?
        Also, you seem to jump to conclusions concerning Taiwan without much fact checking. When the Japs surrendered in 1945, they were forced to return all occupied territories according to Potsdam Declaration. To whom? Of course the official government which was POC back then. As you said later on, there was a civil war at the end of which POC defected to Taiwan island, part of China under the government POC. Then this civil war is never ended because there is no truce agreement signed, of course as you can guess that’s because of US military interference for their interests to keep a separated China. So the reality is complicated but very clear: Taiwan is part of China. The problem is who represents China, PRC or POC? Well, it is again complicated and clear: the winner the civil war, which isn’t ended yet even though there is no major casualty or any at all. If you still believe Taiwan and Ukraine are the same situation, I challenge you to find a UN document that states Taiwan is a country, or any document at all from US/EU.
        You mentioned also that “NATO is not expanding, people are fleeing to NATO”. Well again, the fact is NATO expansion happened, as for why it happened, I am sure that you will hear different opinions from NATO and from Russia. NATO would tell you the countries wanted to join, Russia would tell you NATO initiated it. Of course you choose to ignore Russia, I’d imagine?
        At last, you don’t have any “potential risk”, the politically correct environment forces people to take a stance against Russia, people cannot have no opinion on the war, look at what happens to Russian footballers, orchestra conductors, ballet dancers, Russian literature, music, cats, trees… So deep down, you know very well that you are safely on a moral high land, there is no risk.
        So back to your announce to Chinese/Russian developers, apart from your sincere worries of Ukraine civilians (except the Donbass residents of Russain ethnicity perhaps), as most people will share, I see you basically try to force users of your product to agree with your stance, and hopefully they can force their government to agree with the stance of your government. It still baffles me why China is singled out, the other countries who don’t sanction Russia for the moment, don’t seem to get the equal anger/concern from you.
        I am a developer, I am Chinese, I live in France, I do my part to reduce a little bit of pain for Ukraine civilians, but other than that, there is really nothing I see myself fit doing.I am very disappointed how the tech communities have become facing political matters. I hope that one day you won’t ban Chinese developers because their government doesn’t agree with Greta Thunberg.

        1. Hi Tonyk

          Thank you for providing a true debate on this. This is how things should be. Also between Russia and the world.
          Unfortunately that is not what is going on.

          I am fully aware that it is not the individual Chinese citizen, nor the individual Russian citizen that bear the full responsibility of such things happening, but it is indeed those people who, in the end, have the most potential influence on their own governments.

          Apart from war, where people turn physical weapons against each other, a slightly more “humane” option is to use sanctions. EU and the USA have imposed “light” sanctions against Russia since the Russian invasion into Ukraine in 2014. But with this full scale invasion, very hard targeted sanctions were introduced, sanctions that are also hurting the west. So we are not doing it for own pleasure, but because we simply can’t tolerate Russia to gobble up Ukraine as if it was a simple package. We are talking about people here! Not things. Those people have expressed no interest in being part of Russia, so Russia should respect that.

          Further letting Russia take over Ukraine without the strongest protest and resistance from the west, would allow Putins megalomania to threaten the rest of Europe, which is absolutely not something we want to happen! And I am surprised that China do not see that as an existential threat towards itself. If Russia gets to gobble up Europe, because we all should be so understanding, when will they turn towards China?

          It will not go that way. The reason is that Europe as a whole + the USA + many more countries around the world (in fact 150 or so of them) do not condone what is happening.

          But China started out with directly condemning the sanctions. Later the Chinese government have soften up that stance somewhat, and why do you think that is? If it was zen to condemn, why has that stance softened? It shows that the Chinese govt. (of course) are doing what they think is best for China. They are not doing it for the wellbeing of the world. In that calculation, Ukraine may easily be sacrificable, but for Europe it is a completely different equation, where Ukraine obviously must be able to remain a free and sovereign country.

          I may actually have been the first company to talk about boycotting Russia in the West, but as you may see now, almost all are. It should send a signal about where our red lines goes. And that signal should be read and understood also by the Chinese govt. and I actually think it is understood by now.

          The countries you mention, that decided to abstain, all have close business and defence relations with Russia. So it is not so much of a surprise. Or actually – it was – in relation to India. I did not know India were so close in bed with Putin that they seemingly are, but I learned that the Modi government entered into close defence cooperation with Russia so that mostly explained that part.

          Hence the countries abstaining are doing so because of defence and business reasons. It has nothing to do with trying to prevent a greater catastrophe or to make life easier for the victims (right now Ukraine).

          I can easily see what is going to happen…. The west will stop buying oil and gas from Russia, Russia will sell that to China to recoup losses. China will use the energy to produce solar panels and batteries for the West, essentially making especially Russia dependant on China resulting in the power relationship changing between the two powers, in China’s favour. That is obviously brilliantly played for local Chinese interests, but do not expect the west to have the same interest, and thus expect the west to act differently, for example with even more interest in Taiwan and moving more production out of China.

          What is going on is a nasty power game, and it is hurting children and what makes this conflict different to all the other atrocities that also hurts children, is that if this is not stopped here, it might end up hurting my own children! It is not a “simple” war between to minor nations. It is a potential complete change of world order with potentially unseen consequences for mankind!

          So to sum it up. I have for years provided a deal for Chinese people that were far better than deals for any other country. So it is not like I have been punishing Chinese. In fact Chinese have been favoured for a long time, and that favoritism has now ended, since Chinese (as a govt.) actively is assisting someone that in the end is trying to hurt me, my family and my country. In the process towards that, they are going to hurt Ukraine, Moldova, Lithuania, Estonia, Latvia and Poland. That is on the menu at the moment for Putin!

          And that is simply not going to happen, with or without the help of China.

          Regarding NATO and expansion. Why do you not ask the countries that asked to join NATO why they did? If they were pressured into it from NATO? I think you will find that they did so due to the explanation I provided. The only villain in that situation is the entity they are trying to escape from… Russia.
          Let me use an analogy. If someone came and wanted to kill you in your house, and you decide to escape from the house to a police station, who then prevents you from being killed, will you then shout “police state!” since the police obviously has expanded into your house? Or would you be happy they saved you and allowed you to be in a safe haven?

          Kim/C4D

  106. When NATO broke its promise to expand eastward some years ago, why didn’t Your Excellency cancel the license of your software in EU countries? Now that Russia has been pushed to the point of no return, thus taking military action against Ukraine, you only see the invasion without seeing the reason for it? It was NATO that acted as a pusher to direct Russia’s military action.

    1. Hi Mirroland you anonymous coward with a fake email address, writing from China (thinkday@vim.com)!
      Please see above for my reply to Helle.
      Oh…..I almost forgot! Do not be a moron!
      Kim/C4D

  107. What a sick brain, pure Neo Nazi!
    (snip) lots of drivel(/snip)You are not even as good as the devil!(snip) more drivel (/snip) Boasting yourself on the moral commanding height, you are doing the acts of bandits and genocide against Indians and Australian Aborigines. You are not even as good as animals!

    1. Hi Nidaye….

      Is this really the best you can do? No arguments? No debate? No reasoning? Pure childish animalistic feelings?
      What are you afraid of? Why do you not dare to engage brain? Why is the only thing you can do, is to spew insults.
      Mind you, 8 out of 10 replies I have got, are Chinese people throwing childish insults, going completely berserk.
      1 of 10 is a Russian debating civilized and 1 of 10 is a Chinese trying to explain the stance.
      But 8 out of 10 CHINESE people do not have the brain or courage to actually argue. Is it only children sitting behind the computers with a huge list of insults they can copy from?
      The Russians never had such a good deal like you Chinese had. And still you complain. That type of behaviour, with the rest of the Chinese silently condoning it, makes it much less likely that the decision I made was only for a period of time.

      Stop being a MORON you anonymous coward!

  108. US Kill milions people for years in Iraq Syria etc怂
    its time to change sale to USA.right?
    double standard is your face怂Are you the running dog of US?

    1. Yet another anonymous Chinese coward acting like a moron. (sunx@163.com)
      One that apparently is also illiterate, since that charming spew of crap has been put out here before and answered.
      You do not deserve a reply for being a moron.
      Kim/C4D

  109. čÆ·ē›“ęŽ„åœę­¢åÆ¹äø­å›½ē”Øęˆ· äæ„ē½—ę–Æē”Øęˆ·ēš„é”€å”®ļ¼Œäø”ę°øčæœäøč¦ę›“ę”¹ć€‚
    Just Stop sale to Chinese and Russians forever.

    1. Yet another anonymous Chinese coward (305230354@qq.com).
      Don’t you think it is going that way all by itself now?
      Russians can’t buy since there is no practically working international transactions going on, and Chinese like you will choose to boycott somebody like me?
      Kim/C4D

  110. Hello. Has this function been integrated into kbmFMX in the meantime? Are the screenshots suitable for the App Store?

    1. Hi,
      Yes it is included in current release of kbmFMX.
      I have released apps on App Store where the generated screenshots has been accepted without problems.
      Obviously you need to make sure that you are making the screenshots with controls that looks equal on both the PC and the mobile device.
      /Kim

  111. Russian aggressors need to be shut down from our computer technology. The whole Czech Republic is behind Ukraine ! We have extensive experience with Russian aggressors from our history.

  112. Nice bro, you nailed those Ruski programers! DId you do the same for the American delphi programwea for the wars in Iraq 1 and 2, Afghanistan, Lybia, Kosovo, Syria, Egypt, Yugoslavia, Gulf, Panama, Tanker, Pakistan, Uganda, Somalli, Yemen, VIetnam, Korea, Lebanon, Cambodia, Dominican, Pig Bay, Laoti, Yemen …the orange revolutions, the arabs springs. the list is big dude.

    1. Here we go again….
      Hi Stefan,
      Did you read the blog post?
      Did you understand it all, or only the parts you want to understand?
      When exactly did “American” (I suppose you mean USA) threaten with levelling the EU or NATO or my home country?
      Please indulge me in my seek for an answer for that particular question!

      /Kim

      1. Obviously not, since the USA is an strategic and historic ally. Still doesn’t stop them from spying on European politicians…
        But yup, the US of A did mess a lot of countries up during and more so after WW2. As usual the real reason has always to do with resources and border protection. Same with Ukraine really. Just a bit closer to home.

  113. I have been asked (by non Russians) about making a full refund for current paid subscriptions since there will be no access to new versions.
    As the subscriptions are running at different offsets (each customer has his own purchase date), I will not refund the purchases, as the products has already been in the hands of the end users for a period of time.
    Also remember that not all 600+ customers has current subscriptions, and many are free riders using our free tools.
    However I have decided, so there will be no wrongful speculation, to simply take the income for the current subscriptions and donate to Ukraine via the UN donation program I have advocated for in previous posts.
    As the current situation is a result of decisions by Russia, I feel no obligation towards Russia.
    I do feel a professional sadness about the users in Russia who never wanted the war in the first place, and who are now going to suffer from it.
    Most of their suffering will not be because of closing down access to their portal accounts, and thus kbmMW, but due to lots of other sanctions imposed upon them from a dead fast determined west!
    However it can never be my, nor people in NATO, or EU or Ukraine’s responsibility that Russia has a despotic leader, unfortunately kept in power by a large enough proportion of Russians who are backing the leader.
    So please point fingers where they belong!

  114. > But I unfortunately can’t legally nor morally sit back and ignore what is going on.
    Kim,
    While I sympathize with the spirit of what you’re doing it it simply not legal. You are well within your right to refuse to do business with Russia going forward but the services you provide are not under embargo by EU or Denmark. If your Russian customers paid for a service then you are legally obliged to either deliver that service or refund the customers – regardless of your personal feelings or opinions.

    With regard to the pointing of fingers; There’s no doubt that Russia is the aggressor in this war and that Ukraine has the moral high ground – on so many levels. And even though your Russian customers supposedly didn’t choose to have their leader go Stalin on them it’s obviously the responsibility of the Russian people to get rid of Putin – and they should have done so long time ago. However it’s not like what’s going on in Russia hasn’t been obvious to the world for many, many years (maybe even more obvious for those outside Russia) and yet many in the west has been enabling it by doing business with Russia. Regardless of Georgia, Chechnya, Crimea, Syria and the countless assassinations and false flag attacks that have followed the rise of Putin.
    So maybe point one of your fingers at yourself.

    1. Anders,
      You are simply not correct. Dual use software is not allowed to be exported to Russia.
      There can be made specific exemptions for certain specific things, but that require that the end user application software specifically will only be used for that exempt area of use. I have no chance of verifying that with a software development package which _is_ in military use today!
      That you want to broadly make it my responsibility that I have “enabled” Russia to attack Ukraine, really deserves no reply. I am surprised you can even come up with such a claim!
      I at least try to prevent it happening.
      As for the (relatively few) people who are against my decision, the interesting part is most are non Russian and not affected.
      /Kim

    1. It is a perpetual license. It includes updates for 6 months after purchase. Additional 12 months can be added (SAU extension) to have access to newer releases, but you can continue to use the version you have also after the SAU expires.
      /Kim/C4D

    1. Hi,
      The purchase includes 6 months of updates from time of purchase.
      If you want to get access to updates after that, you can buy a SAU extension of 12 months which is approx. 1/2 the price of a new license (kbmMW).
      But you can choose to just use the version you have perpetually, but only for the developer for which it was originally licensed for.
      /Kim/C4D

    1. Hi,
      We have something called Community Edition which includes the majority of kbmMW Enterprise Edition features, and which can be used for evaluation.
      It is usually immediately available for download when registering on our download portal at portal.components4developers.com, but due to export restrictions to Russia and Belarusia due to the ongoing war in Ukraine, that is no longer automatically available.
      But when you have registered, you can request access to one of the various products. You can thus request access to Community Edition.
      We will scrutinize the request, including validity of email, address etc. and grant or deny access. It is important you specify as precisely as possible all contact information, when you register yourself, otherwise requests will usually be rejected.
      /Kim/C4D

  115. I“d like to know if I can pay the software by wire transfer?
    It is possible?

    Hello.

    My name is Alyne Moreira and I’m contacting you on behalf of OSB Software .OSB Software is a software reseller company, with over than 2000 partnerships with suppliers all over the world. We are in the business since 2004, and we have a team with over 20 years of experience on software resale. We also count with OSB+, which is an extension of OSB Software, and it is dedicated on services such as training, development, implementation and technical support.

    Currently, I am working on an opportunity for the product below:
    KbmMW
    Could you please, inform me our reseller cost for this opportunity?
    How could we turn your partners in Brazil?
    I also would like to know whether the license is perpetual or annual, if it is standalone or a server software, available via download or if it comes with a CD and if you accept wire transfer payments.

    I look forward to hearing from you.
    Atenciosamente | Cumprimentos | Kind Regards

    1. Hi,
      We use FastSpring for all our transactions, and they technically support Wire transfer, so it should be possible to set that up.
      We usually do not use resellers, but if you have a good amount of business opportunity, then please feel free to email me at kbm@components4developers.com
      The licenses are perpetual, but linked to a specific named developer and thus only transferable to another developer if accepted by us by email, and the original developer no longer in any way use the product.
      The initial purchase of kbmMW Enterprise or kbmMW Pro Edition includes 6 months of updates from time of purchase. The access to updates can be extended by 12 months at a time for roughly 1/2 price of the original purchase.
      /Kim/C4D

  116. So instead of doing good to three sides (you: still making money, customers: continued support they paid for in these hard times, Ukraine people: you could for example donate them most part of payments from Russia) you just did bad for all of them (you: lost money and reputation for actually stealing money, customers: no support they paid for, Ukraine people: there could never be too much donations). Wise move, really.
    Military applications in Delphi and middleware or mem table? Don’t make my boots laugh. You just make many customers to pirate.

  117. Your websites to purchase this are timing out. I would like to purchase, but am unable to get to your store site.

    1. NetCom7 is a basic TCP client/server which does not support HTTP and has poor usable of the socket API, even if it claims otherwise. It uses Select() on both Windows and POSIX, in blocking mode, in a single thread, and only check for reading state, not writing. A set of awful choices.

  118. If you have attempted to download from the portal and been told that it could not find the file, please try again.
    A mistake in file naming is the cause… Sorry!
    /Kim

  119. In your sieve you set num := factor * 3 SHR 1;
    while actually you can set num = sqr(factor) because the square of the factor is the first bit you will find which is a multiple of factor with its bit set to 1.

  120. UPDATE:
    Jon Aasenden’s “Delphi Developer” group have invited me in again, and we have, I think, found an acceptable way that makes it possible to share my posts, while not putting too much of a burden on the moderators.
    Therefore commenting on some of my announcements may be blocked, which I can live with.
    If people want to discuss my post, they are welcome to do so on the original blog post, rather than spamming the Facebook group.
    —-

    I have just dropped participating in a known Delphi Telegram group since it seems that if one is posting a link to a New Year greeting (this post), then that New Year greeting is not deemed welcome, due to me supporting Ukraine.
    In fact several posts came up, complaining about it. A Ukraine Delphi developer chimed in, explaining his life in Ukraine, fearing for his family as a reply to those posts. That post was deleted too.
    I see the same pattern in several Delphi related Facebook groups.
    I got to state very clearly!
    People can do as they will with their channels, Facebook groups. But the problem does not go away! And putting your heads in the sand will not solve the problem.
    I will no longer support any media, channel or group that has the attitude “It is not our problem”, so I have pulled myself from the Telegram group.
    Further today I also pulled myself from the Facebook group “Delphi developer” run by Jon Aasenden.
    I have a number of times posted information about the access to free kbmMW licenses if people donate to Ukraine or for Ukrainian developers. Those got many complaints, why Jon ended up deleting my posts.
    I actually respect Jon and have a professional friendship with him, and he is actually quite sympathetic to my views, but alas, if I can’t post posts like the ones I do, I will no longer spend time on those groups.
    In my book, there can’t be a censoring on posts related to Delphi, Delphi code just because I express sympathy and support for Ukraine!
    Any censoring like that equals participating in war crimes. I do not want to participate in war crimes and I do not want to encourage such!
    /Kim/C4D

  121. As you noted that chat bot always provides answers that look very plausible but often are plain wrong. I am afraid that we will see such text all over the internet in the near future because they supply search engine ā€œoptimizersā€ with cheap and plausible text. This will be really bad for internet research.

    1. ā€œI am afraid that we will see such text all over the internet in the near future because they supply search engine ā€œoptimizersā€ with cheap and plausible text.ā€
      So the AI-supported search will have the same reliability as Wikipedia has now.

  122. Hi Kim, how are you?
    I would like to know if there is a free version of KBMMemtable for Lazarus?
    Thanks.

    1. Hi,
      Free versions of kbmMemTable and kbmMW are only coming in binary form in the kbmMW Community Edition, matching specific Delphi releases.
      To have access to a Lazarus supported version, you will have to purchase the US$30 Standard Edition license.
      /Kim

  123. >gives me back a ā€œRequest not supportedā€. I followed the instructions as best as possible.
    Remove “strict” for service description and Swagger will be work
    [kbmMW_Service(‘name:SMARTDEMO, version:1.0, minInstances:$(service.smartDemo.minInstances=32), maxInstances:$(service.smartDemo.maxInstances=128)’)]
    // If defined on service, it sets the default path for this service instance. It must be absolute.
    [kbmMW_Rest(‘path:/myserver’)]
    But ?url=/myserver/api doesn’t work on demo application – Swagger shows default Pet Stores API

    1. Hi,
      Remember that it is the openapi call (../api) that is responsible for generating the data for Swagger.
      Hence if you have multiple datamodules with each their own smart REST functions, you will need an OpenAPI method in each of them, and call them like this:

      http://localhost:888/myserver1/api/index.html?url=/myserver1/api
      http://localhost:888/myserver2/api/index.html?url=/myserver2/api

      It is possible that Swagger or index.html can be modified to have one specific URL for getting the Swagger specific code, and refer to other URLs to get to their respective api (OpenAPI method).
      That is basically up to Swagger and the index.html file.
      /Kim

  124. I’m experiencing the same delay. I paid for this 7 days ago and have not yet received the software. I’ve sent a license request via the portal 7 days ago too.

    1. There will be some more blog posts. Its being worked on at the moment.
      Improvements since teaser:
      – Performance improvements on large documents (12000 lines XML tested)
      – Nested multilevel macro support with own highlighters… eg <somexmltag>[–SQL: select * from …–]</somexmltag>
      Supports any highlighter for each macro level.
      – Delphi highlighting
      – C# highlighting
      – JavaScript highlighting
      – HTML highlighting
      – CSS highlighting
      – Math expression highlighting

      Will be something of a powerhouse šŸ˜‰

  125. Well…
    I think that’s a overreaction to something that happens often in every forum: politics vs the rest.

    1. In principle you are right. It happened before and due to the (imo very reasonable ruleset trying to keep politics out) I can’t comment on it on the group.
      So being feisty as I usually am, I decided that I will not be on social media, where I can’t reply on people ganging up without risking (reasonably enough considering the ruleset of the channel) being “told off”.
      I’m not a kid. I have a stance, and I do fight for it!
      If people pick a fight with me, I will not be amputated in my options to reply.

  126. Today, the head of German intelligence confirmed: the entire Russian people are ready to follow Putin and support the war. Although this was obvious even without German intelligence. Therefore, hating Russians today is a sign of a smart person who has critical thinking and adequately perceives reality. Russians are not people, they are moral freaks. Take them for what they are and don’t let these monsters affect your life.

    1. I will never go to the extremes of judging a whole people of a country.
      That is simply not fair to those who actually have a different opinion and want something else, but just feel unable to do something about it.
      I have no issue in calling Putin and his corrupt cronies complete and utter murdering morons.
      And there are obviously enough people in Russia that sympathizes with him, that makes it difficult to unpin him and his fellow idiots from their positions.
      But there are also many who do not want what is happening, to happen. Some of them fight actively on the Ukrainian side! Some of them are put in prisons or otherwise pressured to keep quiet. And some of them are vocal within Russia, even with their lives being at risk.
      Those people have my full respect! Those are the people that, with luck and good will, can end up saving Russia as a sensible functioning state, when all this is over.

  127. Nice to see the new FMX Memo released. Two questions:
    1. Does the control allow line numbers to be displayed (I see it in the screenshot, but want to make sure the developer doesn’t have to implement it themselves)?
    2. Can I create my own syntax highlighting for my own domain language?
    Thanks

    1. Hi,
      Yes, it includes the line numbers and a status line showing chosen dialect, highlighter name and style along with cursor pos.
      And yes, you can make your own syntax highlighting. It is not extremely simple, but absolutely doable.
      /Kim

  128. Expand it to “Piss off, Geezer!” to inject a little bit of British humor into your insult.

  129. Do you have the TkbmFMXSyntaxMemo for Delphi 13? I’d like to purchase a copy.

  130. Chatgpt doesn’t fully support Delphi code, I believe that Claude is the only AI that claims to know Delphi, have you tried it there?

    1. Ive not used Claude… I’ve good experience using Gemini for code generation and ChatGPT for reformatting and special cases where Gemini refuse to understand its in the wrong šŸ˜‰
      ChatGPT actually produce pretty good Delphi code and understands most of Delphi, but all AI’s I have tried do sometimes get confused and include syntaxes and features from C#.
      When one points it out, they usually correct themselves.

Comments are closed.