Jump to content

Remy Lebeau

Members
  • Content Count

    2998
  • Joined

  • Last visited

  • Days Won

    135

Everything posted by Remy Lebeau

  1. 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):
  2. 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;
  3. 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.
  4. 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.
  5. Remy Lebeau

    Getting input from a TListBox and continuing execution

    That is what I was thinking, too.
  6. 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?
  7. 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.
  8. Remy Lebeau

    Indy OpenSSL static linking

    As I mentioned earlier to your comment on StackOverflow, you can't do it that way:
  9. 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.
  10. Remy Lebeau

    Waiting for something without blocking the UI

    I've already said my piece about that.
  11. 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.
  12. Remy Lebeau

    Waiting for something without blocking the UI

    It seems like you are receiving the server's response asynchronously. In which case, I would suggest not waiting for the response at all. Send the request, and then move on. Let the asynchronous handler notify your code whenever the response actually arrives. You can always disable the UI in the meantime, if needed. Otherwise, if you must make the function act synchronously, even though the response is asynchronous, then at least consider waiting on a TEvent instead of a boolean, eg: function GetTCPIPC(const msg: string): string; begin if not clientclass.Connected then begin Result := ''; Exit; end; clientclass.MsgEvent.Reset; idTCPClient.IOHandler.WriteLn(msg); while clientclass.MsgEvent.WaitFor(10) <> wrSignaled do Application.ProcessMessages; Result := clientclass.msgfromserver; end; Otherwise, consider changing the function to read the response directly in the function itself, not asynchronously from elsewhere. That way, you can place a TIdAntiFreeze component on your Form to keep the UI responsive while the TCP socket is blocking the UI thread, eg: function GetTCPIPC(const msg: string): string; begin if not clientclass.Connected then begin Result := ''; Exit; end; IdTCPClient.IOHandler.WriteLn(msg); //read response here Result := msgfromserver; end; Though, you really should not be doing socket I/O in the UI thread at all. Consider a threaded approach, similar to what ioan showed earlier.
  13. On some platforms, you might be able to just set the TIdUDPClient.BoundIP property to the IP of the network adapter you are sending broadcasts from. On other platforms, you might have to resort to using TIdUDPClient.Binding.SetSockOpt(SO_BINDTODEVICE) to bind to a network interface by name instead of IP. But either way, this should prevent your outgoing network adapter from receiving duplicates of its own broadcasts. Not quite sure I understand what you are asking. If you are asking how to ignore the IP of the broadcaster, then whenever you receive a packet, you are also given the sender's IP (and port). You can just ignore packets that come from your own IP. If you are asking what a broadcast IP is in general, then it is a network IP that is masked by its subnet mask, and then OR'ed with the inverse of the subnet mask. So, for example, if you have an IP of 192.168.100.5 and a subnet mask of 255.255.255.0, then the broadcast IP is 192.168.100.255: 192.168.100.5 & 255.255.255.0 = 192.168.100.0 ~255.255.255.0 = 0.0.0.255 192.168.100.0 | 0.0.0.255 = 192.168.100.255
  14. Remy Lebeau

    How to use a particular network interface to send out UDP data

    You can optionally set the TIdUDPClient.BoundIP property to the IP of the desired network adapter. If you don't bind the client, the OS will route the packet using the network adapter it thinks is most appropriate, based on its configured routing tables.
  15. Remy Lebeau

    TidTCPServer and TidTCPClient withh SSL/TLS enabled

    Unfortunately, those version numbers predate Indy's switch from SVN to GIT, when build number versioning was lost. So I can't diff those versions to see what changed between them (unless you have dates on them, at least). But the behavior should have improved from older to newer, not degraded. It is technically possible (you would have to peek - not read - the first handful of bytes to detect whether a SSL/TLS header is present, and if so then set PassThrough=False. I do not recommend this approach. You should use separate ports, one port with SSL/TLS enabled, and one port without. It is just easier, safer, and more reliable that way. I posted an example in Indy's AToZed forum a few years ago (it was written for TIdHTTPServer, but you can adapt it for TIdTCPServer): https://www.atozed.com/forums/thread-367-post-834.html#pid834
  16. Remy Lebeau

    TidTCPServer and TidTCPClient withh SSL/TLS enabled

    You should double-check that, since you clearly do have an SSL/TLS handshake being performed. TIdServerIOHandlerSSLOpenSSL.Accept() should be creating a new TIdSSLIOHandlerSocketOpenSSL whose PassThrough is True, so the server can then decide when it is best to set it to False (ie, when the client is connected to an implicit SSL port, or after receiving a STARTTLS-style command, etc). Note that there was a bug where PassThrough was initialized as False in TIdSSLIOHandlerSocketBase, that was fixed a few years ago, I think that might have been after 10.6.2.5366. You might consider upgrading to the latest version from Indy's GitHub repo and see if the problem continues, just to make sure you have all of the latest fixes.
  17. Remy Lebeau

    TidTCPServer and TidTCPClient withh SSL/TLS enabled

    That is simply not possible the way you describe. The ONLY way you can get that error is during an SSL/TLS handshake, which is NOT performed when PassThrough is set to True (ie, pass-through raw data as-is) thus disabling SSL/TLS. So, you MUST be setting PassThrough to False (ie, intercept data for SSL/TLS processing) in order to get that error. Which version of Indy are you using? IIRC, there was a bug in old versions where a server would set PassThrough to false for all clients, causing an SSL/TLS handshake for non-SSL/TLS clients. But that was fixed a LONG time ago.
  18. Remy Lebeau

    TidTCPServer and TidTCPClient withh SSL/TLS enabled

    Yes. Define 2 separate ports in the server's Bindings collection, and then in the server's OnConnect event you can cast the AContext.Connection.IOHandler property to TIdSSLIOHandlerSocketBase and set its PassThrough property to True (SSL/TLS disabled) or False (SSL/TLS enabled) based on which port the client connected to, which you can get from the AContext.Binding.Port property.
  19. Remy Lebeau

    Indy OAuth authentication over SASL

    FYI, this morning I checked in a new 'sasl-oauth' branch in Indy's repo, which includes a new 'IdSASLOAuth.pas' unit for SASL classes for OAUTH10A, OAUTHBEARER, and XOAUTH2 for TIdDICT, TIdPOP3, TIdSMTP, and TIdIMAP4. They are still a work in progress (ie, no parsing of response JSON yet), and you are responsible for obtaining the OAuth tokens externally (ie, over HTTP), but once you have the tokens then you can use these SASLs to login to the DICT/POP3/SMTP/IMAP servers.
  20. Remy Lebeau

    Sending Email via GMail Using OAuth 2.0 via Indy

    FYI, this morning I checked in a new 'sasl-oauth' branch in Indy's repo, which includes a new 'IdSASLOAuth.pas' unit for SASL classes for OAUTH10A, OAUTHBEARER, and XOAUTH2 for TIdDICT, TIdPOP3, TIdSMTP, and TIdIMAP4. They are still a work in progress (ie, no parsing of response JSON yet), and you are responsible for obtaining the OAuth tokens externally (ie, over HTTP), but once you have the tokens then you can use these SASLs to login to the DICT/POP3/SMTP/IMAP servers.
  21. Remy Lebeau

    icon/bmp

    I'm sorry, but that didn't answer ANY of my questions. Try again. Where EXACTLY are you currently using a .bmp right now, and why do you want to change it to .ico?
  22. Remy Lebeau

    icon/bmp

    I'm sorry, but your question is WAY too vague. You need to be much more specific. What kind of .ico do you have? How exactly do you want to use it instead of .bmp? What kind of UI control do you want to display it in?
  23. Remy Lebeau

    Recommended email tool?

    In what way, exactly?
  24. Remy Lebeau

    Access Violation when i free idUDPClient

    Very simple: pre-D2009: Char is AnsiChar String is AnsiString, using ANSI encoded AnsiChars UTF8String is just an alias for AnsiString, it is not guaranteed to be UTF-8 unless it comes from UTF8Encode() post-D2009: Char is WideChar String is UnicodeString, using UTF-16 encoded WideChars UTF8String is a native string type, using UTF-8 encoded AnsiChars In you example, the length will be 4 Chars (after adding the 'A'). How many bytes those Chars will take up depends on the byte encoding you tell the UDPClient to use. In ANSI/UTF-8, ASCII characters are 1 byte each. In UTF-16, they are 2 bytes each. Things get more complex when you start dealing with non-ASCII characters. First off, TIdUDPClient does have a Write() method, it has Send() and SendBuffer() methods instead. In any case, internally TIdUDPClient will convert the String to bytes, and then transmit the bytes. The default encoding used to produce those bytes is US-ASCII, but you can specify a different encoding in the optional AByteEncoding parameter of Send/Buffer(), or by setting the global GIdDefaultTextEncoding variable in the IdGlobal unit. Well, you have to do that anyway, since you are including binary data in your request, not just text. Explicitly tell TIdUDPClient (or any other Indy component) to transmit strings in the desired ANSI encoding. Don't just rely on defaults. It is because your server did not send the response to the correct port on the client. The client sent out the request from port 59114, so that was the port it could receive the response on, but the server sent the response to port 55510 instead. So, the server ignored the source port of the request and sent the response to its own port instead. If the server requires the client to use the same port that the server is using, you will have to set the TIdUDPClient.BoundPort to that port before sending requests (which you seem to have already figured out). Otherwise, fix the server to send the response to the request's actual source port. Indy does not behave differently in a worker thread vs in the main UI thread. It is not dependent on message handling. Your client is sending the request to a subnet broadcast IP (192.168.84.255) instead of to the server's actual IP (192.168.84.128) (why?). And since you are not setting the TIdUDPClient.BoundIP to bind the client to a specific network adapter, that explains why your client is receiving a duplicate copy of the broadcasted request. So, you will have to either: - send to the server's IP directly. - make your client ignore messages that have its own local IP as the source IP. - set the TIdUDPClient.BoundIP to the client's own local IP, then it won't receive broadcasts from itself.
  25. Since there is a lot of talk of COM in this discussion, have a look at the COM tutorials on this website: http://www.techvanguards.com/com/, especially the section on Events and Callbacks.
×