Jump to content

ChrisChuah

Members
  • Content Count

    108
  • Joined

  • Last visited

Posts posted by ChrisChuah


  1. The TControlSizer made by http://www.simes.clara.co.uk/delphi/ctrlsize.htm no longer exists.

    Is there a replacement for it to work on Delphi 11?

    Its still working under Delphi 6 but somehow due to it using windows messages lparams, it is currently not working now

     

    regards

    chris

     

    === From the Delphi Groups ======

    Here are a few URLs you may want to check out:

     TStretchHandle         http://www.torry.ru/index.htm, at the Authors's
    page under S for Scott, Anthony.
     TControlSizer          
    http://community.borland.com/homepages/dsp/index.htm

    http://www.simes.clara.co.uk/delphi/ctrlsize.htm
          DDH by Marco Cantu has an example,
          download DDh3Code.zip from
          http://www.marcocantu.com/ddh/default.htm
          Part II, Chapter 8 "Advanced Window Components",
          DdhSizer.pas. And how to use it ..\SizeComp\SizeDemo.dpr.
    TSizeControl   http://rpi.net.au/~ajohnson/delphi/

    --
    Peter Below (TeamB)  
    Use the newsgroup archives :
    http://www.mers.com/searchsite.html
    http://www.tamaracka.com/search.htm
    http://groups.google.com
    http://www.prolix.be

     

     

  2. Hi

    Is there a ActiveX or native component for VNC Client or Remote Desktop client so that the application can connect to the VNC server running on Ubuntu 22 and above.

    The VNC ActiveX component that i have been using since Delphi 6 is not able to properly show the Ubuntu desktop version 22. But it is able to display properly for Ubuntu 20.

     

    Please advise

     

    regards

    chris


  3. Hi

    I have a local web page which i will use the FMX.TWebBrowser for Linux to call

    e.g. File:///home/chris/webpage.html

    In this web page, there is a java script that will read the xml in that /home/chris directory

    However, the web browser is unable to read the xml due to CORS

    Is there a way to allow the FMX.TWebBrowser to enable the javascript to read the local xml file or how to disable the CORS?

     

    regards

    chris

     


  4. Hi

    So sorry to cause so much of confusion.

    Currently, i am running MacOS Monterey with XCode 14.2, PAServer 13.1.11

    Actually, if i were to upgrade the MacOS from Monetery to Ventura, while keeping the PAServer for Delphi 11.1 at 13.1.11 and XCode  14.2, would there be any problem to compile and run a FMX application for MacOS?

    Previously i had a problems after upgrading the XCode or MacOS, Delphi would not be able to compile and run the fmx application for iOS or MacOS.

    I am now stuck with Delphi 11.1 as the company may not want to continue with using Delphi further due to not able to find programmers with such skills locally.

    Everyone is onto newer programming languages such as javascript, Ruby, Rust, C sharp etc.

    So sorry to say (what i feel) that delphi is really on a decline whereby the number of components released in 2008 and now, its not easy to find a suitable component for delphi.

     

    Hence maybe i am stuck in the middle whereby i may need to re-write some of my apps into other programming languages such as Java or ReactJS

     

    regards

    chris

     

     

     

     

    Screen Shot 2023-03-30 at 9.30.37 AM.png


  5. Hi

    Currently i running Delphi 11.1 in Windows 10 VM. The VM is running on MacOS Monterey 12.6.3

    With Delphi 11.1, i am still able to compile MacOS app to run on Monterey.

    However, if i were to upgrade my MacOS to Ventura, Will my Delphi 11.1 able to compile MacOS app for Ventura?

    I dont want to face the fact that after i upgraded my MacOS from Monterey to Ventura and Delphi 11.1 cannot compile for MacOS, iOS and Android via PAServer.

     

    regards

    chris


  6. I agree with you. It is really a headache when dealing with Thread and synchronisation.

    In Indy TCP component, i need to use the Thread component to read the TCP socket constantly for data.

    When there is data, need to append to a buffer or memstream as network data does not come in nice chunk of data with start and end.

    Then we need to process that memstream for the appropriate data and remove the part of the data process from the memstream and add to another queue or List.

    Then we need to create another thread to process this List to send out events. Need to create the thread so that it will hog up the first thread that read data from the TCP component.

    In this processing thread, need to fire event based on the message. 

    In this event, if there is a need to update the Main form UI, we need to use the TThread.Synchronize or TThread.Queue. If I were to update the data in memory, then i would not need to use TThread isnt it? <== Am i on the correct path?

     

    So, if i update the data in memory and i use the timer to refresh the Main form UI, Do i still need to use TThread.Synchronize or TThread.Queue?

    But using System.TTimer to refresh the data would have a lower priority in refreshing as if there are lots of data coming in on the TCPClient, the updates would use up the CPU and the timer will be set back to later time when the CPU is less busy isnt it?

     

    Please advise

     

     


  7. Hi remy

    Ignore my last statement on the TThread.Queue can be called by Clipboard event. I am still trying to figure out why my application UI can hang or irresponsive when there is a large amount of data is received from the TidTCPClient. The TidThreadComponent will be busy processing and send out events to the MyEvent function as shown below 

     

    TMainForm.MyComponentMyEvent(Sender : TObject; aData : string)

    begin

      TThread.Synchronize (nil, procedure

      begin

        // update the FMX Form UI button, grid etc.

      end);

    end;

     

    My app is then reported by windows task manager that it is not responding.

    How can i check where  the problem lies? Is it at the TThread.Synchronized  in the MyComponentMyEvent? I cannot click on any part of the application UI anymore.

    This is an FMX application running in Windows 32 bit. Would I not face any of this hanging issue if i change to a VCL application instead of FMX?

     

    Please advise

    regards

    Chris

     


  8. Hi

     

    I have a component like this

     

    TMyComponentEvent = procedure (Sender : TObject ; aData : string) of object;

    TMyComponent = class(TComponent)

    private

      FClient : TidTCPClient;

      FProcessList : TmyStringList;

      FReadThreadComponent : TidThreadComponent;

      FProcessThreadComponent : TidThreadComponent;

     

      FOnMyEvent : TMyComponentEvent;

      procedure DoMyEvent(aData : string); dynamic;

    ...

    ...

      procedure ReadThreadComponentRun(Sender : TidThreadComponent)

      procedure ProcessThreadComponentRun(Sender : TidThreadComponent)

    ..

    ..

    published

      property OnMyEvent : TMyComponentEvent read FOnMyEvent write FOnMyEvent;

    end;

     

    procedure register;

    begin

      RegisterComponents('MyComponents', [TMyComponent]);

    end;

     

    // cc : the UI screen will have this component and will have a set of code

    // cc : to implement on this event

    procedure TMyComponent.DoMyEvent(aData : string);

    begin

      if assigned(FOnMyEvent) then

      FOnMyEvent(self, aData);

    end;

     

    // cc : assume that the TidTCPCLient is connected to the server

    // cc : so the FReadThreadComponent will always get the data from TidTCPClient

    procedure TMyComponent.ReadThreadComponentRun(Sender :TidThreadComponent)

    var

      l_readBytes : TIdBytes;

      l_processdata : string;

    begin

      FClient.IOhandler.ReadBytes(l_ReadBytes, -1, false);

      if length(l_readBytes) = 0 then exit;

      {There are some headers to remove from the l_readBytes 

      l_processData := ProcessidBytes(l_readBytes);

      FProcessList.add(l_processData);

    end;

     

    // cc : this is another idThreadComponent that will take the first item from the myStringList

    // cc : and process it

    procedure TMyComponent.ProcessThreadComponentRun(Sender : TidThreadComponent);

    var

      l_data : string;

    begin

       // cc : take the first item from the MyStringList

      l_data := FProcessList.getFirstData;

      if (l_data[1] = '1') then

        DoMyEvent(l_data);

    end;

     

    In the main form

     

    TMainForm.MyComponentMyEvent(Sender : TObject; aData : string)

    begin

      TThread.Synchronize (nil, procedure

      begin

        // update the FMX Form UI button, grid etc.

      end);

    end;

     

    Now, the question is, if i DO NOT use the TThread.Synchronize, there will be problem updating the UI grid etc.

    What is the difference if i use the TThread. Synchronize and TThread.Queue

     

    Somehow, if i use the Synchronize function, it is slower in updating the UI than TThread.Queue.

    How can i make the UI updating more responsive?

    Am i doing it correctly or can anyone advise?

     

    Also there is some hanging issue whereby the function using the TThread.Queue can be called by Clipboard event. Maybe i will need to capture that event screen again

     


  9. 1 hour ago, ChrisChuah said:

    Hi

    I tried to install Indy 10.6.2 into Delphi 6.

    First I would need to recompile the CompUtils.dpr under delphi 6 running in Windows XP as i think the CompUtils.exe is not meant for Win XP.

    After compiling that into CompUtils.exe, i run the fulld_6.bat in terminal mode

    Once that has been done,

    Open the Delphi 6 and compile the package IndyCore60.dpk.  When i tried to install it, it prompted me "Cannot load package IndySystem60. It contains unit IdWinSock2 which is also contained in Package Indy60."

    Then i recompile and install dclIndyCore60.dpk and it came out the same message. "Cannot load package IndySystem60. It contains unit IdWinSock2 which is also contained in package Indy60

    Then i recompile and install IndySystem60.dpk and another message "Cannot load IndySystem60. It contains unit IdGlobal which is also contained in package Indy60.

     

    Where is Indy60 package?

    I tried to look for it but cant find it.

    please advise

     

    regards

    chris

     

    Finally managed to install Indy 10 on Delphi 6.

    I need to remove the indy60.bpl files from c:\windows\system32 as well as c:\program files\borland\delphi6\projects\bpl

    also remove all the indy*.bpl from those 2 directories and install the delphi 10 dpk file

     

    seems like need to install packages from different directories as compared to Indy9

    Install the design package from Core then Protocol directory. 

     

    Is this correct?

     

    regards

    chris


  10. On 8/1/2021 at 9:11 PM, mjustin said:

     

    Indy 9.0.50 can be downloaded here:

    https://github.com/IndySockets/Indy9

     

    Indy 10.6.2 works with Delphi 6 and can be downloaded here:

    https://github.com/IndySockets/Indy <== Downloaded the package from here

     

    Hi

    I tried to install Indy 10.6.2 into Delphi 6.

    First I would need to recompile the CompUtils.dpr under delphi 6 running in Windows XP as i think the CompUtils.exe is not meant for Win XP.

    After compiling that into CompUtils.exe, i run the fulld_6.bat in terminal mode

    Once that has been done,

    Open the Delphi 6 and compile the package IndyCore60.dpk.  When i tried to install it, it prompted me "Cannot load package IndySystem60. It contains unit IdWinSock2 which is also contained in Package Indy60."

    Then i recompile and install dclIndyCore60.dpk and it came out the same message. "Cannot load package IndySystem60. It contains unit IdWinSock2 which is also contained in package Indy60

    Then i recompile and install IndySystem60.dpk and another message "Cannot load IndySystem60. It contains unit IdGlobal which is also contained in package Indy60.

     

    Where is Indy60 package?

    I tried to look for it but cant find it.

    please advise

     

    regards

    chris

     


  11. hi

    attached is the code whereby it generated the error.

    The funny thing is that this app can run on other machines without error but only that particular machine.

     

    procedure TDataModule1.loadFilterTable;
    var
      l_str : string;
      l_ini : TIniFileEx;
      l_fieldList : string;
    begin
      if (trim(FFilterDay) = '') and (Trim(FFilterOthers) = '') then
        l_str := ''
      else if (Trim(FFilterDay) = '') and (Trim(FFilterOthers) <> '') then
        l_str := Trim(FFilterOthers)
      else if (Trim(FFilterDay) <> '') and (Trim(FFilterOthers) = '') then
        l_str := Trim(FFilterDay)
      else
        l_str := Trim(FFilterDay) + ' and ' + Trim(FFilterOthers);
      cdsDYNAFLTS.Close;
      qyDYNAFLTS.Close;
      if DataModule1.getLoginSuccess then begin
        try
          cdsDYNAFLTS.IndexName := '';
          cdsDYNAFLTS.Filter := '';
          cdsDYNAFLTS.Filtered := false;
          qyDYNAFLTS.SQL.Clear;
          l_Ini := TIniFileEx.create(ChangeFileExt(Application.ExeName, '.ini'));
          l_fieldList := l_ini.ReadString(DYNAFLTS_TABLE, INI_SECT_FIELDS, '');
          // cc : if the field list is still empty, then make it a *
          if Trim(l_fieldList) = '' then
            l_fieldList := '*';
          l_ini.Free;
          qyDYNAFLTS.SQL.Add('SELECT ' + l_fieldList + ' FROM ' + DYNAFLTS_TABLE );
          if l_str <> '' then
            qyDYNAFLTS.SQL.Add(' WHERE ' + l_str);
          DoLog('LoadTableData2 SQL: ' + qyDYNAFLTS.SQL.Text);
          cdsDYNAFLTS.ProviderName := '';
          cdsDYNAFLTS.ProviderName := 'dspDYNAFLTS';
          cdsDYNAFLTS.Active := true; <== when open is called, the BeforeOpen will be logged. However the afterOpen is not called
        except
          on e:Exception do begin
            if not CheckDBConnectionError(e.message) then
              DoLog('Error in LoadFilterTable: ' + e.message); <== this will log down the access violation as shown int he log
          end;
        end;
      end;

    end;
     


  12. Hi

    I am having a problem with this function. When issued a ClientDataset.open, the Before Open event is triggered but before the After event is triggered, it returned an Access violation

     

    ==== Access Violation Log =====

    22-12-7 14:46:48-10.100.252.26> LoadTableData2 SQL: SELECT ROW_ID,CREATED_AT,CREATED_BY,FIDSID,AODBID,EVENT,FLIGHT,DOMINT,SDT,TABLENAME,TABLENUMBER,XMLFILE FROM DYNAFLTS
     WHERE (CREATED_AT>=1670342400 and CREATED_AT<1670428800)

    <22-12-7 14:46:48-10.100.252.26> cdsDYNAFLTS Before Open
    <22-12-7 14:46:48-10.100.252.26> Error in LoadFilterTable: Access violation at address 00F5CC2B in module 'FidsEventViewer.exe'. Read of address 00000000
    <22-12-7 14:46:48-10.100.252.26> App Exception: cdsDYNAFLTS: Cannot perform this operation on a closed dataset
    === =========

     

    ==== Normal log on other machine ====

    <7/12/2022 2:53:56 pm-192.168.0.124> LoadTableData2 SQL: SELECT ROW_ID,CREATED_AT,CREATED_BY,FIDSID,AODBID,SDT,FLIGHT,DOMINT,TABLENAME,EVENT,XMLFILE FROM DYNAFLTS
     WHERE (CREATED_AT>=1670342400 and CREATED_AT<1670428800)

    <7/12/2022 2:53:56 pm-192.168.0.124> cdsDYNAFLTS Before Open
    <7/12/2022 2:53:56 pm-192.168.0.124> cdsDYNAFLTS Start AfterOpen
    <7/12/2022 2:53:56 pm-192.168.0.124> cdsDYNAFLTS Start read INI
    <7/12/2022 2:53:56 pm-192.168.0.124> cdsDYNAFLTS End read INI
    <7/12/2022 2:53:56 pm-192.168.0.124> cdsDYNAFLTS Assign Field to process
    <7/12/2022 2:53:56 pm-192.168.0.124> cdsDYNAFLTS End AfterOpen
    =============

     

    In my code, the SQL is added to TQuery

    The Client dataset is link to the Provider. The provider is linked to TQuery.

     

    This application is run on another machine without this error but always gives an access violation on this machine.

    Is there a "cache" file that ClientDataset would read after the BeforeOpen event?

     

    Please advise

    regards

    chris

     


  13. Hi

    In Windows, there is a TWinExit component to allow us to reboot the OS from our software.

    Is there one that can reboot the Linux OS?

    Or is there a script component whereby the software can call it to reboot?

    please advise

     

    regards

    chris

     


  14. hi

    here is the getItInstall.log.

    From GitHub, it states that SynEdit supports up to Delphi 10.4

    Could this error due to not able to support 11.1?

     

    regards

    chris

     

    ====== Start ======

    [2022-08-29 09:28:55] [DEBUG] GetIt: Loading EULAS...
    [2022-08-29 09:29:02] [DEBUG] GetIt: Installing Library "SynEdit for VCL"...
    [2022-08-29 09:29:03] [DEBUG] GetIt: Downloading Library "SynEdit for VCL"...
    [2022-08-29 09:29:07] [DEBUG] GetIt: Extracting Library "SynEdit for VCL" to "C:\Users\chuahyen\Documents\Embarcadero\Studio\22.0\CatalogRepository\SynEdit-2022.03-11\". This could take a while...
    [2022-08-29 09:29:08] [DEBUG] GetIt: Compiling project "SynEditDR.dproj"...
    [2022-08-29 09:29:13] [DEBUG] GetIt: Problem occurred when compiling for "Win64" platform with "Release" configuration.
    [2022-08-29 09:29:15] [DEBUG] GetIt: Problem occurred when compiling for "Win64" platform with "Debug" configuration.
    [2022-08-29 09:29:17] [DEBUG] GetIt: Problem occurred when compiling for "Win32" platform with "Release" configuration.
    [2022-08-29 09:29:18] [DEBUG] GetIt: Problem occurred when compiling for "Win32" platform with "Debug" configuration.
    [2022-08-29 09:29:19] [DEBUG] GetIt: Error when executing an action of "SynEdit for VCL" catalog. The action is "CompileProject" (ID 6).
    [2022-08-29 09:29:19] [DEBUG] GetIt: A problem occurred during the process.
    [2022-08-29 09:29:26] [DEBUG] GetIt: Cancelling process...
    [2022-08-29 09:29:39] [DEBUG] GetIt: Loading EULAS...
    [2022-08-29 09:29:41] [DEBUG] GetIt: Installing Library "SynEdit for VCL"...
    [2022-08-29 09:29:41] [DEBUG] GetIt: Downloading Library "SynEdit for VCL"...
    [2022-08-29 09:29:42] [DEBUG] GetIt: Extracting Library "SynEdit for VCL" to "C:\Users\chuahyen\Documents\Embarcadero\Studio\22.0\CatalogRepository\SynEdit-2022.03-11\". This could take a while...
    [2022-08-29 09:29:42] [DEBUG] GetIt: Compiling project "SynEditDR.dproj"...
    [2022-08-29 09:29:45] [DEBUG] GetIt: Problem occurred when compiling for "Win64" platform with "Release" configuration.
    [2022-08-29 09:29:47] [DEBUG] GetIt: Problem occurred when compiling for "Win64" platform with "Debug" configuration.
    [2022-08-29 09:29:48] [DEBUG] GetIt: Problem occurred when compiling for "Win32" platform with "Release" configuration.
    [2022-08-29 09:29:50] [DEBUG] GetIt: Problem occurred when compiling for "Win32" platform with "Debug" configuration.
    [2022-08-29 09:29:50] [DEBUG] GetIt: Error when executing an action of "SynEdit for VCL" catalog. The action is "CompileProject" (ID 6).
    [2022-08-29 09:29:50] [DEBUG] GetIt: A problem occurred during the process.
    [2022-08-29 09:32:26] [DEBUG] GetIt: Cancelling process...
    ===== End =======


  15. Hi 

    Is there a XML Viewer component rather than using the TWebBrowser component?

    Although i can use the TMemo component to load the xml but the output is not that pretty.

    Please advise

     

    regards

    chris


  16. We are just learning. I am still learning too

    I tried not to create the form but to call showmodal each time user click on the update button

    But i will get a problem is that cannot Showmodal when the form is visible.

    In the FormClose of aircrafttype form, i set it to caHide instead of caFree

    and i have that error.

     

    I feel that even though i have use delphi since Delphi 1, i am still learning how to use this language.

    Delphi 6 was the most stable version that i used and I am still using that now to do minor changes to those application written in 2007.

     

×