Jump to content

Uwe Raabe

Members
  • Content Count

    2542
  • Joined

  • Last visited

  • Days Won

    147

Posts posted by Uwe Raabe


  1. 3 hours ago, PenelopeSkye said:

    I need to loop through a dynamic array which is populated by the result of a query. 

    Why the array? What hinders you to iterate through the dataset directly? Besides being easier it also avoids the memory problem when copying the complete query result into an array.


  2. 15 minutes ago, A.M. Hoornweg said:

    Delphi installations are simply too huge to keep more than a few installed and archiving a whole VM for each Delphi version is overkill.

    I use my build VM for that. It has Delphi versions 5, 7, D2007 up to 11 installed side by side and there still is plenty of room for more. When someday it will run out of disk space I can simply extend that.

     

    BTW, having all versions on the same machine simplifies multi-version builds a lot.

     

    My working environment is different, though. There I have several VMs for each of my customers to avoid problems with different needs and security. The Delphi versions on those may change during time.

    The physical host is reserved for my own projects and has only Delphi versions 10 to 11 installed. Usually it is cleaned after some years - latest when the hardware changes.


  3. 2 hours ago, David Heffernan said:

    Why just wish for relaxing the 255 limit? Why not aim for multi line literals and more? 

    Isn't that what I just wrote?

    15 hours ago, Uwe Raabe said:

    Despite allowing string constants with more than 255 characters in one line, it would be more helpful to have string constants over multiple lines preserving linefeeds.

     


  4. 6 hours ago, Joseph MItzen said:

    Really? You've never needed a JSON literal, or an HTML literal, or an XML literal, or some template string literal?

     

    Heck, what about SQL queries?

    Actually I use these quite often. In the case of your SQL, which could as well come from the FireDAC query editor, I just copy the whole code, create a string array constant with a simple template, multi-paste the SQL and format the results:

    const
      cArr: TArray<string> = [                                    //
        'SELECT',                                                 //
        'DATE_FORMAT(co.order_date, ''%Y-%m'') AS order_month,',  //
        'DATE_FORMAT(co.order_date, ''%Y-%m-%d'') AS order_day,', //
        'COUNT(DISTINCT co.order_id) AS num_orders,',             //
        'COUNT(ol.book_id) AS num_books,',                        //
        'SUM(ol.price) AS total_price,',                          //
        'SUM(COUNT(ol.book_id)) OVER (',                          //
        '  ORDER BY DATE_FORMAT(co.order_date, ''%Y-%m-%d'')',    //
        ') AS running_total_num_books',                           //
        'FROM cust_order co',                                     //
        'INNER JOIN order_line ol ON co.order_id = ol.order_id',  //
        'GROUP BY ',                                              //
        '  DATE_FORMAT(co.order_date, ''%Y-%m''),',               //
        '  DATE_FORMAT(co.order_date, ''%Y-%m-%d'')',             //
        'ORDER BY co.order_date ASC;',                            //
        ''];
    
    procedure UseSQL;
    begin
      var qry := TFDQuery.Create(nil);
      try
        qry.SQL.AddStrings(cArr);
    //    ...
      finally
        qry.Free;
      end;
    end;

    The same scheme also works for JSON  or XML.

     

    Interesting, that you bring up the SQL text, which is neatly split into multiple lines - probably for better readability.

     

    Despite allowing string constants with more than 255 characters in one line, it would be more helpful to have string constants over multiple lines preserving linefeeds. Then it wouldn't even matter if the lines are limited to 255 characters each, although I expect this limit being lifted anyway whenever such a feature will be implemented.

    • Like 3

  5. That is not needed when the dcu folder is configuration and platform specific using something like $(Platform)\$(Config). That way the existing dcu files in that folder are compiled with the last settings for that platform and configuration.

    If working with several projects it also helps to have separate dcu folders for each. Some use $(SanitizedProjectName) for that.

    With this approach I have no problems switching platforms, configurations or projects. I very rarely make changes to the directives in a project configuration. If that turns out to be necessary I'd rather add another (child-)configuration with separate dcu folders.

     

    BTW, avoiding circular unit dependencies gives a significant performance boost for Code Insight.

    • Thanks 2

  6. 10 hours ago, Ian Branch said:

    I want to assign it at run time if possible.

    What steps do I need to take to do that please??

    Move the event to the private section, so the Form Designer won't fiddle with it.

    At the appropriate code determine which of the eligible methods must be used and assign it to the TDataSource OnDataChange event.

    // assuming this code runs inside the datamodule. Otherwise myDataSource must be qualified
    begin
      if SomeCondition then 
        myDataSource.OnDataChange := MyEventHandler
      else
        myDataSource.OnDataCHange := MyOtherEventHandler;
    ...    

    Personally I would rather extract the code from inside the event to a separate method or different separate methods. Then you can make the decision inside the hard-wired event:

    procedure TdmC.dsJobTicketsDataChange(Sender: TObject; Field: TField);
    begin
      if SomeCondition then
        MyEvent(Sender, Field)
      else
        MyOtherEvent(Sender, Field);
    end;

     


  7. 24 minutes ago, emileverh said:

    if we sum all the time spend on this ( for me stupid) limitation

    I for myself have never spent any time on this limitation, because I never had to (and probably never will) write that long string literals. Not only that the style guide is much stricter, it is just way less readable and thus I would never even think of doing that. In addition I would literally slap such code in the face of the developer presenting it to me. So better don't count me in here.

    • Like 6
×