Jump to content

Die Holländer

Members
  • Content Count

    279
  • Joined

  • Last visited

  • Days Won

    5

Posts posted by Die Holländer


  1. Try after the add

     

    BudSys_DB.FieldDefs[4].CreateField(BudSys_DB);

     

    or

     

    Private:

    AmountField : TFloatField;

     

    Implementation:

     

    AmountField := TFloatField.Create(BudSys_DB);
    AmountField .FieldName := 'Amount';
    AmountField .Calculated := True;
    AmountField .DataSet := BudSys_DB;
    AmountField .Name := BudSys_DB.Name + AmountField .FieldName;

    BudSys_DB.FieldDefs.Add('Amount',ftFloat, 0);

     

    Destroy:

    AmountField.Free;

     


  2. Many VCL applications have been developed over the years with direct database access, which has become increasingly problematic in modern software environments.

     

    As a result, developers often feel forced to transition to web-based solutions, such as sending JSON over the internet to abstract away direct database access (e.g., for login functionality).

    However, this shift presents significant challenges. One major hurdle is the need to create endpoints for the countless SQL queries accumulated over time, while also transforming the rich and responsive VCL GUI into web pages.

    Although modern frameworks offer solutions for this transition, the process of converting database-driven VCL applications remains highly resource-intensive.

     

    These frameworks are particularly effective when building applications from scratch. But for developers who prefer to maintain their existing VCL applications and avoid going fully web-based, the question arises: is there a way to address the database access issue without a complete overhaul?

     

    Could a solution exist at the database driver level—a kind of bridge between the database server and the client driver (e.g., FireDAC)—that eliminates the need to convert data into formats like JSON and then back into VCL controls or custom DataObjects?

     


  3. There is this small component I use for ages (CEVersionInfo) that takes the version info from the Delphi IDE. (Menu-Projects-Project Options-Version Info)

    In the IDE I put the Delphi version name into the "Comments" field and in the program source you can use it just like: "myEdit.Text:=CEVersionInfo.Comments" 

     

    I've searched the web for the component but only saw some sites where I didn't dare to click to..

    I'm willing to publish the source because there is no copyright involved and it is quite small code.

     

    It can take the following info fields:

      FCompanyname      :='<info not available>';
      FFileDescription  :='<info not available>';
      FFileVersion      :='<info not available>';
      FInternalname     :='<info not available>';
      FLegalCopyright   :='<info not available>';
      FLegalTradeMarks  :='<info not available>';
      FOriginalFilename :='<info not available>';
      FProductName      :='<info not available>';
      FProductVersion   :='<info not available>';
      FComments         :='<info not available>';
      FMajorVersion     :='<info not available>';
      FMinorVersion     :='<info not available>';
      FRelease          :='<info not available>';
      FBuild            :='<info not available>';

     


  4. Last week I also needed such timeline component and I started with the basic Jedi Timeline component.

    It is a basic component but with a bit of programming and the use of an extra StringGrid for the

    right side, a ScrollBox (horizontal scroll) and extra Scrollbar (vertical scroll) I got all the functionality I needed. 

    It has an imagelist property to display images in the timeline.

     

    delphi-jedi.org TJvTimeLine

    • Like 1

  5. 15 hours ago, corneliusdavid said:

    The quickest and cheapest way was to add Thinfinity VirtualUI to the Delphi code and set up a server where the Delphi app could access the data locally and all users use the app through a web browser--with very minimal changes to the code (still Delph XE VCL!). It works great and everyone is happy.

    Could you clarify what you mean by "cheapest way" and can you tell more about the cost and your environment?


    Their website doesn’t provide any information about pricing, which I believe could negatively impact their sales.

    Potential customers are discouraged when they have to contact a company just to get basic cost information.

    It would be helpful if they included some example use cases along with the associated costs.


    For example, if I already have a cloud-based database solution (e.g., MSSQL/Azure File storage/Office365) with 30 users and

    several Delphi applications, what would be the estimated cost of implementing a VirtualUI solution?

     


  6. 1 hour ago, Serge Pilko said:

    A few months later, the client returned for an estimate to migrate other Delphi projects to a web-based platform.

    I'm looking forward to the full story of this project.

    Are you going the Delphi route (webserver, webcore, UniGui, etc..) or (Java)script API - end-points - back-end HTML CSS front-end route?

     

    1 hour ago, Serge Pilko said:

     

     Migrated from Delphi 7 to Delphi 12

     Replaced BDE and Indy 9 with FireDAC and Indy 10

     Refactored code for cross-platform compatibility

     Delivered a modernized UI with preserved workflow familiarity

    Bravo ! 😎🏅🏆


  7. What version of Delphi do you use?

     

    Go to the taskmanager and look to the Delphi IDE, keep refreshing the taskmanager and

    see if the memory of the Delphi IDE goes up all the time eating your entire memory.


  8. There must be something in the .DFM files where you can see if it is a specific report form, like a component class/name or a specific button name.

    Can't you search in your .DFM text files for such indicator? The name of the .DFM file is then the same as the .PAS file.


  9. I found some old code to retrieve the list of a group, like "Global Address List"

    The code here is based on to put the addresses in a TreeView.

     

    I checked the code and it is still running OK but I noticed that I don't see the e-mail addresses

    anymore but instead it reports a string like: "/o=ExchangeLabs/ou=....."

    Maybe this is because of the exchange server configuration in my environment.

     

    see: how-to-get-email-address-from-o-exchangelabs-ou-exchange-administrative-group

     

    You have to play with it to see if you get the proper info you want.

    Maybe you can post the final answer here if you find the proper addresses..

     

    Note that the code has a filter to only show two groups:

    If (CurGroupName='All Groups') or (CurGroupName='Global Address List')  Then...

     

    //Uses Outlook2000;
    
    Procedure TMailTrans.CreateGALTreeForSendMailItem(aTreeView : TTreeView);
    Var pProp : PSPropValue;
        MP : IMAPIProp;
        strAddress : String;
        i, j, Check: Integer;
        myAddressList: AddressList;
        myAddressLists: AddressLists;
        myAddressEntries: AddressEntries;
        myAddressEntry: AddressEntry;
        CurNode, ChildNode, DetailNode :TTreeNode;
        CurGroupName : String;
    begin
      If NmSpace=NIL Then
      Begin
        OutlookApplication1.Connect;
        NmSpace:=OutlookApplication1.GetNamespace('MAPI');
        NmSpace.Logon('', '', False, False);
      End;
    
      myAddressLists := IUnknown(NmSpace.AddressLists) as AddressLists;
      aTreeView.Items.BeginUpdate;
      aTreeView.Items.Clear;
    
      for i := 1 to myAddressLists.Count do
      begin
        CurGroupName:=myAddressLists.Item(i).Name;
        If (CurGroupName='All Groups') or
           (CurGroupName='Global Address List')  Then
        Begin
          CurNode:=aTreeView.Items.Add(Nil,myAddressLists.Item(i).Name);
          CurNode.ImageIndex:=2;
          CurNode.SelectedIndex:=2;
    
          myAddressList := myAddressLists.Item(i);
          if Assigned(myAddressList.AddressEntries) then
          Begin
            myAddressEntries := myAddressList.AddressEntries;
            for j := 1 to myAddressEntries.Count do
            begin
              strAddress:='Unknown';
              myAddressEntry := myAddressEntries.Item(j);
    
              if Assigned(myAddressEntry) then
              Begin
                if myAddressEntry.MAPIOBJECT<>NIL then
                Begin
                  if Assigned(myAddressEntry.MAPIOBJECT) then
                  Begin
                    {
                    Check:=IUnknown(myAddressEntry.MAPIOBJECT).QueryInterface(IMailUser,MP);
                    If Check=0 then MP:=IUnknown(myAddressEntry.MAPIOBJECT) as IMailUser
                    else MP:= IUnknown(myAddressEntry.MAPIOBJECT) as IDistList;
    
                    if S_OK = HrGetOneProp(MP, $39FE001E, pProp) then
                    begin
                      strAddress:=String(pProp.Value.lpszA);
                      MAPIFreeBuffer(pProp);
                    end; // else strAddress:=myAddressEntry.Address;
                    }
                    strAddress:=myAddressEntry.Address;
    
                    ChildNode:=aTreeView.Items.AddChild(
                              CurNode,
                              myAddressEntry.Name);
    
                    ChildNode.ImageIndex:=7;
                    ChildNode.SelectedIndex:=7;
    
                    DetailNode:=aTreeView.Items.AddChild(
                              ChildNode,
                              strAddress);
                    DetailNode.ImageIndex:=6;
                    DetailNode.SelectedIndex:=6;
                  End;
                End;
    
                {
                DetailNode:=aTreeView.Items.AddChild(
                          ChildNode,
                          myAddressEntry.Address);
                DetailNode.ImageIndex:=6;
                DetailNode.SelectedIndex:=6;
                }
              End;
            End;
          End;
        end;
        //Application.Processmessages;
      end;
      aTreeView.Items.EndUpdate;
    end;

     

    • Like 1

  10. Maybe this is what you need..

     

    You have to tell TidHTTP that it should return the error JSON message and not only the HTTP error code.

     

    Result:=False;
    idHTTP.Request.ContentType := 'application/json;odata=verbose';
    //Tell the idHTTP that it should NOT ignore the (JSON) errormessage returned by the server.
    idHTTP.HTTPOptions := idHTTP.HTTPOptions + [hoNoProtocolErrorException, hoWantProtocolErrorContent];
    //Add the message in a string var.
    ReceiveData := idHTTP.Put(Param, JsonToSend);
    if (idHTTP.ResponseCode div 100) = 2 then
    begin
      Result:=True;
    end else
    Begin
      //Parse/Show the message
      aMessage:=CreateErrorMessage(ReceiveData);
    End;

     


  11. 2 hours ago, Rollo62 said:

    I haven't looked into this, but perhaps its related to the Azure stuff and a later extension:

    Yes, these are basically the pages reflecting what Glenn shows in the Youtube video.

    As you can see almost all of the development, configuration, testing and deploying is

    based on Visual Studio Code (extensions) and only the "Hello world" webbroker exe is made in Delphi.

    I was hoping that the "Azure IDE helper plugin" will bypass the Visual Studio Code part.

    Another thing is that it's also difficult to go through the Azure deploying part by it's dashboard

    that supports now about 100 zillion Cloud possibilities, options and configurations.

    • Like 1

  12. I really hope that Embarcadero will investigate the possibilities of using Azure with Delphi.

    During the session in this youtube video about Azure Cloud Development with Delphi

    I saw a statement (at time 40:38) "Azure IDE helper plugin under development by Glenn Dufke"

    I have tried to configure an Azure function myself but the Azure Portal interface has been changed a lot

    and I didn't succeed. I don't know if he ever completed such a plugin but I've tried to find and ask

    him but didn't succeed.


  13. 1 hour ago, Squall_FF8 said:

    I dont understand your question ....

    I was just wondering why you use a cache list. I use a DBGrid in one of my projects and added the calculated fields as extra columns in the DBGrid and to the FieldDefs of the query. Also in my case there is a file read calculated field and I hardly see any speed difference while displaying the resultset of the databse including the calculated fields. So, I never have used a cache list and I was just wondering why you need one, but as Uwe explained that sometime you need a cache list if the process is too slow and probably if you don't use a DBGrid.

×