Jump to content

dkounal

Members
  • Content Count

    41
  • Joined

  • Last visited

Posts posted by dkounal


  1. Each time I switch from dfm text to form designer and back, (or when reloading file after saving the form), I have a 1-3 pixels smaller form and controls moved inside it. (from image 1 to image 2)

    The tpanel has anchors set to [arTop,arRight]

    I opened a ticket  https://quality.embarcadero.com/browse/RSP-41759 but it is really annoying. It happens also to 11.2 and I tried a new fresh install with 11.3 patch1 and it happens without any addon

    I do not have any custom setting, nor any change in IDE from defaults. My screen is 100% scale in windows 11 without any noticeable change.

    Do you have such a problem? How did you overcome it?

    image.thumb.png.b61ce16f57ff605a31756476eb8f93c9.png image.thumb.png.c6403c9f5a92570873000287192dc539.png


  2. I have this error many times but I think I found the reason

    If I have an open project in the IDE and I update through git a library source from Github that it is used by this open project I reproduce this error

    After that error I can go to Tools->Options->Editor, click save to any subtab and then write a space somewhere in the source

    Either compile, or build, clear this error without requesting to restart the IDE


  3. Hi,

    I want to create a  Notification in an android application that shows the progress in uploading an image.

    I have seen many styled, multiline with icons notifications in existing applications, having also controls like a progress bar.

    Tried to do the same in Delphi, and I have not managed to find documentation, nor an example how to do that, without writing it in java.

    I found that even Flutter can now show a notification with controls inside.

    Can Delphi show such a notification and update its contents?

    Thank you in advance


  4. 53 minutes ago, FPiette said:

    IMO it is not a good idea to start learning FMX by a project mixing VCL and FMX!

    If you need to run on Windows and mobile, the choice with Delphi and native application is FMX framework.

    Another possibility is to create a frontend web application (UI) and a backend application. In that architecture, you can write the backend with VCL and the frontend (UI written in HTML, CSS and JavaScript) will run in a browser on both Windows and Mobile. This will require a lot of effort to port your current application to that architecture. Embarcadero RadServer is designed for that kind of architecture.

     

    The new editor is in FMX, the existing application will take time to change and needs just this FMX form type. Until now it works with the exception when finishing. I am testing it.

    For the moment I am moving part of the code in a web service using XData.

     


  5. 4 hours ago, FPiette said:

    @dkounalAll I can says is that my code works for what I am doing with it. In the link @Remy Lebeaugave, it is stated that it is legal but full of traps. What I do is very simple in the relationship between the VCL exe and the FMX dll but probably doing more complex things require more code.

     

    The question you have to ask yourself is "Why in the first place do I need FMX?". In my case, FMX offer 3D model rendering and animation incredibly easy. I did a quick test and it worked fine. The VCL part was required because I already had huge VCL code for the everything else in the application.

    I have a working application in VCL that it does not worth to transform it to FMX. And I need custom interactive forms with controls inside created once by the user and being available to run in both VCL and mobile apps.

    Until now, I am a bit afraid to invest in FMX. This was a first attempt in windows.


  6. 2 hours ago, Remy Lebeau said:

    Thank you, I did not know it.

    2 hours ago, FPiette said:

    @dkounalI have done this kind of code: In a DLL, a single FMX form showing and animating a 3D model. The DLL is loaded by a VCL application and parented to a TPanel. Everything works nice and easy except one thing: When the VCL application closes, it hangs if the FMX DLL is unloaded (FreeLibrary). I simple didn't unload the DLL which is not a problem since the DLL is an Add-on that has the same life time as the main VCL application. Anyway Window unload the DLL by itself.

     

    To be honest I started from your code as it is here.

    The problem is that even without unloading the DLL the exception happens.

    It happens inside the Thtmleditor component, when it frees a TGPRegion and I believe it has to do with GDI+

    It is mentioned here and here but I am not so experienced to deal with it.

     


  7. 14 minutes ago, Dave Novo said:

    I believe Remobjects Hydra can help you with this. If you go to https://hydra.remobjects.com/hydra/tour.aspx,

    you can see there is a section

     

    "Combining VCL and Firemonkey"

    ....

    Hydra provides a solution for this problem by allowing developers to integrate FireMonkey UI seamlessly with their existing VCL applications, or conversely add existing VCL user interfaces into new FireMonkey apps.

    ...

    As my project is just minimal for the moment I will try the separate process.

    RemObjects's hydra is really interesting, I will give it a try

    Thank you


  8. 31 minutes ago, dkounal said:

    If I have the FMX form to run as a separate process, in an separate executable, is it possible to embed it in a vcl control (ex tpanel) by using its window's handle?

    It works with the following code I found:

    procedure TForm1.ShowAppEmbedded(WindowHandle: THandle; Container: TWinControl);
    var WindowStyle : Integer; FAppThreadID: Cardinal;
    begin
      /// Set running app window styles.
      WindowStyle := GetWindowLong(WindowHandle, GWL_STYLE);
      WindowStyle := WindowStyle
                     - WS_CAPTION
                     - WS_BORDER
                     - WS_OVERLAPPED
                     - WS_THICKFRAME;
      SetWindowLong(WindowHandle,GWL_STYLE,WindowStyle);
    
      /// Attach container app input thread to the running app input thread, so that
      ///  the running app receives user input.
      FAppThreadID := GetWindowThreadProcessId(WindowHandle, nil);
      AttachThreadInput(GetCurrentThreadId, FAppThreadID, True);
    
      /// Changing parent of the running app to our provided container control
      winapi.Windows.SetParent(WindowHandle,Container.Handle);
      SendMessage(Container.Handle, WM_UPDATEUISTATE, UIS_INITIALIZE, 0);
      UpdateWindow(WindowHandle);
    
      /// This prevents the parent control to redraw on the area of its child windows (the running app)
      SetWindowLong(Container.Handle, GWL_STYLE, GetWindowLong(Container.Handle,GWL_STYLE) or WS_CLIPCHILDREN);
      /// Make the running app to fill all the client area of the container
      SetWindowPos(WindowHandle,0,0,0,Container.ClientWidth,Container.ClientHeight,SWP_NOZORDER);
    
      SetForegroundWindow(WindowHandle);
    end;

     


  9. 1 minute ago, David Heffernan said:

    This is way more complicated than you might hope. Your VCL app will run a message loop that is designed for VCL. It's not going to be able to service your FMX form. I don't expect there is a simple solution.

     

    btw, INVALID_HANDLE_VALUE is for HANDLE types, i.e. THandle in Delphi. For an invalid HWND use NULL, which is 0 in Delphi.

    Thank you for your response.

    I have read not enthusiastic comments about having VCL and FMX together. I have tested the Firemonkey-container but I have usually strange internal compiler errors and I do not feel safe.

    The FMX form is a user customized form that should be able to run in all environments but for windows I have a VCL app that I do not want to change.

    I should probably forget FMX and try something else for these forms.


  10. Hi,

    I have a dll with a FMX form inside. Four procedures are exported to create and destroy the form. No other interaction exists.

    var xform:Txform;
    
    function CreatexForm: HWnd; stdcall;
    begin 
    try 
    	if not Assigned(xform) then xform:=Txform.Create(nil);
    	Result:=xform.GetHWnd; 
    except 
    	Result:=INVALID_HANDLE_VALUE; 
    end; 
    end;
    
    procedure ShowxForm; stdcall;
    begin 
    	if Assigned(xform) then xform.Show; 
    end;
    
    procedure HidexForm; stdcall;
    begin 
    	if Assigned(xform) then xform.Hide; 
    end;
    
    procedure DestroyxForm; stdcall;
    begin 
    	if Assigned(xform) then FreeAndNil(xform); 
    end;

    I want to use it from a VCL application that loads the DLL, show the form before closing.

    The testing VCL application just load DLL, calls CreatexFrom and ShowxForm to show the FMX form from the DLL.

    I click the system close button in the shown FMX form from the DLL

    Then I call DestroyxForm, and FreeLibrary and the DLL unloads without problems.

    I am getting an Exception just when VCL forms that called the DLL closes.

     

    I have searched about the subject but I found only results that deal with FMX forms from DLL inside VCL controls or forms. That it is not my case.

    Any ideas? Tank you in advance


  11. I am using sOmniXmlVendor for mobile app compatibility.  The Xml.XMLIntf.IXMLNode.XML is not available.

    How can I get the xml of an IXMLnode ? or how can I copy an IXMLnode to a new IXMLdocument?

    Thank you in advance

    SOLVED:

    I did the following:
     

    function getxml(x:inodexml):string;
    var srcx:Txmldocument;
    begin
    srcx:=Txmldocument.Create(nil);
      try
          srcx.xml.Text:='';
          srcx.Active:=true;
          srcx.DOMDocument.appendChild(x.DOMNode);
          srcx.SaveToXML(result);
      finally srcx.Free; end;
    end;

     


  12. On 1/29/2021 at 12:19 PM, dkounal said:

    Using TThreadedQueue<T> in Delphi 10.4.1, I have a couple of computers with windows 10 running an application of mine that have an Access violation error in line 7917 of system.generics.collections as reported by Eurekalog.

    it is the line: "TMonitor.Enter(FQueueLock);" It is not random. It happens all the time the first time it is used.

    Can you think of a reason?

    
    function TThreadedQueue<T>.PushItem(const AItem: T; var AQueueSize: Integer): TWaitResult;
    begin
      TMonitor.Enter(FQueueLock);
      try
        Result := wrSignaled;
        while (Result = wrSignaled) and (FQueueSize = Length(FQueue)) and not FShutDown do
          if not TMonitor.Wait(FQueueNotFull, FQueueLock, FPushTimeout) then
            Result := wrTimeout;
    
        if FShutDown or (Result <> wrSignaled) then
          Exit;
    
        FQueue[(FQueueOffset + FQueueSize) mod Length(FQueue)] := AItem;
        Inc(FQueueSize);
        Inc(FTotalItemsPushed);
    
      finally
        AQueueSize := FQueueSize;
        TMonitor.Exit(FQueueLock);
      end;
    
      TMonitor.Pulse(FQueueNotEmpty);
    end;

     

    Just to comment that the problem was resolved after removing a Tevent that was used by a function.... And the renovation continues with excellent results and Delphi 10.4.2 now.

    I also returned back to TThreadedQueue<T>

    The books from Dalija Prasnikar (Delphi Event-based and Asynchronous Programming) and Primož Gabrijelčič (Delphi High Performance) helped a lot.

    Thank you all for the help


  13. 2 hours ago, Dalija Prasnikar said:

    Random errors like that suggest that some of your code is not thread safe and originating point of your problems may not be in the place where it finally blows up, but it gives you some hints to inspect your code that uses ThreadedQueue in broader context and possible code paths before you land on the error.

     

    Using different queue will not magically fix your problem, because problem is not in TThreadedQueue but in your code. You might get different behavior, and it might crash more often or not, but it will not be fixed until you find and fix real issue.

    I fully agree and I looking into it. It is an old project that slowly undergoes changes to be able to be used with the FMX framework too.

    The problem started when I replaced the messaging part between a thread and the UI that in the past TOmniMessageQueue where used. I can confirm that no access exists for ThreadedQueue that can cause problems.

    For the sure, the project still uses other ThreadedQueues and Tcriticalsections with other threads and I should check them all. I will check again and I will report. For the moment I have not an error report with cocinasync  but it is too early to be sure.


  14. 47 minutes ago, Anders Melander said:

    Since FQueueLock is instantiated in the TThreadedQueue constructor and destroyed in the destructor my guess would be that you are calling PushItem on a TThreadedQueue instance that has been destroyed - or not yet instantiatred.

    If you can reproduce in the debugger, try placing a breakpoint on the place where you create the TThreadedQueue and one on the place where you destroy it. This way you should be able to verify that things are called in the order you expect.

    I had the same though, but:

    1. I can not reproduced it in any of my computers, nor inside the development IDE.

    2. It happens to a small number of computers of clients and in a couple of them it is reprodusable.

    3. I got this line of error from Eurekalog and I am not it is the correct line of the error

    I am testing now the cocinasync Tqueue<T>


  15. On 1/29/2021 at 6:13 PM, Darian Miller said:

     

    Can you provide a small sample project that reproduces the error?  My limited testing shows that it's working much better in 10.4.1.  If you could reproduce the problem in a simple example project, it has a much higher chance at getting fixed.

    I can not reproduce it in a separate project and it does not happen to all computers in the original Delphi project. I am still looking for a solution.


  16. Hi,

    I usually use varchar fields in SQL databases with a big number as max size.

    When I use a TFDMemTable, does the ftstring size consumes memory as described in its definition?

    If I declare it as "Add('lab',ftstring,500)", does it consumes in memory 500bytes (or 1000bytes) for each record, or as a Delphi string type is just the content string size ?

    I have Delphi professional and I can not see its code.

    Thank you in advance

×