Jump to content

Remy Lebeau

Members
  • Content Count

    2684
  • Joined

  • Last visited

  • Days Won

    113

Everything posted by Remy Lebeau

  1. Just on a side note: the RTL has a FindCmdLineSwitch() function in the SyUtils unit: if FindCmdLineSwitch('NOSHOW') then
  2. Remy Lebeau

    Emails via Indy to Gmail

    Although that is technically correct, that has no bearing on this issue. Skrim is able to send emails in general, so they already have valid authentication. The issue is just that some of the emails are being rejected while others are not. That has nothing to do with authentication.
  3. Remy Lebeau

    Windows XP App

  4. Remy Lebeau

    Emails via Indy to Gmail

    I've never seen that error before. I can't even find any mention of it online, either. Indy does not generate any MessageIDs of its own (there is a piece of code commented out at the end of TIdMessage.GenerateHeader() for that). The generation of a new MessageID is typically handled by the initial SMTP server that receives the email. However, a client can specify a MessageID if it wants to when sending a new email (ie, via the TIdMessage.MsgId property), but there is no guarantee that the initial SMTP server won't overwrite it (some servers do).
  5. Remy Lebeau

    MessageBox is hidden by a modal form

    Sure, if you use the Form's HWND for sending/posting updates. A better option would be to use a persistent HWND that doesn't get recreated, such as the TApplication::Handle, or the result of calling AllocateHWnd(). Otherwise, don't even use an HWND at all, for instance use TThread::Synchronize() or TThread::Queue() instead.
  6. Remy Lebeau

    MessageBox is hidden by a modal form

    That is not a good design. You should move the long calculation to a separate worker thread instead, and then exit the OnClick handler. Have the thread post updates to the UI thread if needed. And you can disable your UI while the thread is running, and then re-enable it when the thread is finished. Never block the UI thread, and avoid using Application->ProcessMessages() whenever possible, it causes more problems than it solves. Let the UI thread run normally. By doing that switching, the modal Form likely lost input focus and wasn't the "active" Form anymore at the time when MessageBox() was called, which likely ended up with the MessageBox dialog becoming owned by either another Form's window, or the hidden TApplication window. That would account for why the MessageBox dialog was allowed to go behind your modal Form. The modal Form's window needs to be the owner of the MessageBox dialog in order for the dialog to stay on top of that Form. Which means, you need to either call the Win32 MessageBox() (or TaskDialog/Indirect()) function directly so you can explicitly pass in the desired owner window, or else use the TApplication/Events::OnGetActiveFormHandle event to provide the desired owner window even if the Form is not "active".
  7. Unfortunately, I see nothing in Delphi that would allow you to use that flag in this situation. TDirectory.GetFiles() is just a wrapper for a typical SysUtils.FindFirst/Next() loop, so it handles whatever files and directories that loop would normally report. If a Package file is treated as if it were a directory (ie FindFirst/Next() returns TSearchRec.Attr with the faDirectory flag set), then TDirectory.GetFiles() is going to recurse into the Package's content if the SearchOption parameter is set to soAllDirectories (as it is in your example). Also, more importantly, FindFirst/Next() simply don't use the FileManager API to enumerate files, they use the POSIX opendir() and readdir_r() functions instead, which have no such skip-Package flag available. Unfortunately, the TDirectory.GetFiles() predicate is only called for files and not for directories (ie, only for items that do not have the faDirectory attribute). Which makes sense, since TDirectory.GetFiles() is looking for only files to add to its output array, so there is no point in it filtering out directories. To prevent TDirectory.GetFiles() from recursing into Packages automatically, you would have to call it with its SearchOption parameter set to soTopDirectoryOnly (which is its default value), and then manually call TDirectory.GetFiles() for any non-Package sub-directory you are interested in. Of course, TDirectory.GetFiles() won't report directories to you, so you would have to use a separate call to TDirectory.GetDirectories() (with SearchOption=soTopDirectoryOnly) and filter out the Packages as needed. Which means, your enumeration time is going to double from having to scan each directory twice. So, in this case, you will likely have to use the FileManager API directly, and not use TDirectory at all.
  8. Remy Lebeau

    MessageBox is hidden by a modal form

    To the Application->OnGetActiveFormHandle event, not to the Application->FOnGetActiveFormHandle data member. But yes, you get the idea. Not set a Form as active, no. The RTL is querying you to choose which Form window should be considered "active" at that moment. So, you would need to enumerate your existing Forms and decide which one you want the MessageBox to be on top of. But you don't actually make that Form window be focused. The RTL is merely establishing a Z-Order relationship between the MesageBox and its Owner window. It is not moving input focus around.
  9. Remy Lebeau

    MessageBox is hidden by a modal form

    Agreed. I never understood why they did that in the first place, and why it was never updated to use String parameters instead.
  10. Remy Lebeau

    [Solved] Can't build project using TJson

    Why would it? If all you did was add an #include statement to your code, the IDE is not smart enough to know which library to automatically add to the project to make the code in that header file link correctly. It doesn't even know what code is in that header file until the compiler is invoked, and by then it is too late. The IDE can do automatic linkage of libraries only for components that are dropped on a Form/Frame/DataModule in the Designer. Did you do that for the REST components? I'm guessing no. But this issue is not specific to just REST, it applies to any library. For non-designtime code, you are responsible for setting up your project with any necessary library references as needed.
  11. Remy Lebeau

    [Solved] Can't build project using TJson

    You are not linking to the BPL library that implements TJson. Try adding a reference to the RESTComponents.bpi file to your project.
  12. Remy Lebeau

    MessageBox is hidden by a modal form

    Which *should* be returning the modal Form's window, if the modal Form has focus at the time TApplication.MessageBox() is called. It should be noted that if no *active Form* window is found, then TApplication.MessageBox() uses the hidden TApplication window, which is what allows the MessageBox dialog to appear behind Form windows. You could alternatively just call the Win32 MessageBox() API directly (or TaskDialog/Indirect() instead), specifying the desired Form window as its owner window.
  13. Remy Lebeau

    DBcheckbox

    Your question is too broad. What is the specific issue you are having trouble with?
  14. You are using a Dark theme in the IDE, which presumably has white text elements defined. It sounds more like MJBComp simply has their Form's Color set to a dark color, which is not the same thing.
  15. Are you installing the IDE on Windows 7, by chance? Windows 7 (and 8 ) was dropped as a supported installation platform for the IDE in 10.4 Sydney (it is still supported as a target platform for compiled projects):
  16. Remy Lebeau

    Left side cannot be assigned to

    Other people have already explained why that doesn't work. But, if you really want it to make it work, you could declare your property as returning a PRectF pointer instead, eg: type TDrawingObject = class private ... FBoundsRect: TRectF; ... function GetBoundsRect: PRectF; public ... property BoundsRect: PRectF read GetBoundsRect; ... end; function TDrawingObject.GetBoundsRect: PRectF; begin Result := @FBoundsRect; end;
  17. It is not a file. In RAD Studio, Delphi and C++ are implemented as separate "personalities", each with its own toolchain, IDE settings, etc. Each project specifies which personality it targets. Think of personalities as the IDE plugins for implementing different programming languages. So, the "missing personality" error means the IDE can't find the Delphi personality installed. Which Community Edition did you actually install? There is no RAD Studio CE, there are only separate Delphi CE and C++Builder CE. This is covered in the Community Edition FAQs. You can't open Delphi projects in C++Builder CE, as there is no Delphi personality installed. To work with Delphi projects, you need either Delphi CE, or the full RAD Studio.
  18. Remy Lebeau

    Indy download and installation on Lazarus running on Ubuntu

    There is an installation guide in FPC's wiki: https://wiki.freepascal.org/Indy_with_Lazarus However, note that Indy is available in Lazarus' OPM, that is the easiest way to install Indy into Lazarus. I think that version is a few months behind in updates from Indy's GitHub repo, so I'll ping GetMem to get that updated to the latest.
  19. Remy Lebeau

    Getting input from a TListBox and continuing execution

    That is what I was thinking, too.
  20. Remy Lebeau

    TEdit Text cannot align vertical centered

    The link works fine for me. Or, did you mean that the *information* presented on the linked page doesn't work for you?
  21. Remy Lebeau

    Indy OpenSSL static linking

    FYI, that is already on Indy's radar: #410 Support YuOpenSSL Since the migration path from OpenSSL 1.1.1 to 3.0 is fairly minimal, I wonder why they don't support 3.0 for Indy.
  22. Remy Lebeau

    Indy OpenSSL static linking

    As I mentioned earlier to your comment on StackOverflow, you can't do it that way:
  23. Remy Lebeau

    std::cbegin can return an iterator

    Then that is a bug that needs to be reported to Embarcadero/Dinkumware, because std::cbegin() is defined as always returning a const_iterator when passed a standard container. The input parameter of std::cbegin() is supposed to be taken as a const, but that is not the case in the example you have shown.
  24. Remy Lebeau

    Waiting for something without blocking the UI

    I've already said my piece about that.
  25. That is not right. It should be the sender's IP, not the target's IP. Where are you getting that IP from? No (and even if there were, the IP alone is not enough, you need the associated subnet mask, too). You would have to calculate the broadcast IP yourself, or on some platforms you can use an API to query it from the network adapter directly.
×