Jump to content

havrlisan

Members
  • Content Count

    82
  • Joined

  • Last visited

  • Days Won

    1

Everything posted by havrlisan

  1. havrlisan

    When LSP fails

    In this post, I'll share all the workarounds I use when LSP fails, which have greatly helped me during coding. Hopefully, you'll find them useful before Embarcadero completely fixes the LSP Server, which I'm sure will be soon. I'll also mention GExperts throughout this post, as it includes some useful features that can speed up using the tools listed below. Delphi Uses Helper Link: https://delphisorcery.blogspot.com/2021/03/introducing-delphi-uses-helper.html Feature: proper replacement for the Find Unit... refactor (Ctrl+Shift+A) feature. Description This has been by far the most helpful plugin. It's as simple as typing the name of a type and pressing Ctrl+Shift+A to find the unit where it's declared. When the window pops up, you can press Enter to add the unit to the uses section (use the left/right arrows to switch between interface and implementation sections), or press Shift+Enter to open the unit and jump to the line where the type is declared. GExperts bonus: The IDE already has a similar feature under the Refactor menu with the same shortcut, Ctrl+Shift+A, but it doesn’t work well and is certainly not as fast as Delphi Uses Helper. However, sometimes the default feature will trigger instead of the plugin (e.g., when pressing the shortcut without any text at the caret position). To remove the default shortcut, use GExperts' IDE Menu Shortcuts: find the shortcut under Refactor > Find Unit... (it should be the last one), and assign it to another key. MMX - Show Related Classes Link: https://www.mmx-delphi.de/ Feature: shows ancestor class, implemented interfaces, and sibling classes for a given class. Description Want to quickly navigate to a class’s ancestor or interface, or find out which siblings it has? This feature gives you exactly that, neatly and efficiently. To use it, right-click and go to MMX Commands > Navigate and Move > Show Related Classes. Or even better, map a shortcut by going to MMX > Properties > Key Bindings and finding Show Related Classes. I’ve personally mapped it to Shift+Alt+3. MMX - Open Unit... Link: https://www.mmx-delphi.de/ Feature: displays searchable units based on set configuration. Description Quickly displays all units based on your configuration. The configuration allows for adding units from the currently opened project or project group, and the following paths: Project Search path, IDE Library path, and IDE Browsing path. Find Original Symbol Feature: additional help navigating to a unit, type, or method. Description Using Find Declaration (Ctrl+Click) is known to fail occasionally, especially on bigger projects. What I've found helpful at times is to try using the Find Original Symbol that's located under the Search > Find Symbols menu item. I've personally mapped the Find Declaration to Ctrl+< and the Find Original Symbol to Ctrl+Shift+< through the GExperts IDE Menu Shortcuts, and I spam them when needed. It does help sometimes. Add a shortcut to the Reload LSP Server menu item Link: https://github.com/havrlisan/zx-idetools/blob/main/Source/Zx.IT.KeyBinding.ReloadLSPServer.pas Description In Delphi 12.1, a menu item Reload LSP Server was added under the Tools menu. Before that, you could add a custom tool to manually kill the LSP, and the IDE would restart it automatically. Unfortunately, they didn't add a shortcut for the menu item, so your options are limited to mouse clicks or to clicking Alt > T > accelerated key. Note that the accelerated key will be automatically assigned, and it depends on your menu items under the Tools menu, which sucks because that's the most changeable menu (because of custom tools, or third-party plugins). Usually, I'd use GExperts IDE Menu Shortcuts to manually add the shortcut, but the Reload LSP Server menu item doesn't show up there. After some debugging, I realized that the menu item in question isn't registered on IDE startup, but is loaded sometime after all other packages are loaded. My best guess is that the GExperts remembers the menu items when loaded, and doesn't re-fetch them afterward (I'm too lazy to search through the source code, sorry). So I decided to implement an IDE notifier that listens to a "ProjectGroupOpen" notification and then tries to find the Reload LSP Server menu item and assigns the shortcut to it. I've set the default shortcut to Alt+Shift+W, but the code is quite simple and is easily portable to a package of your own. That's all I've got so far. If you have some other features or tips, feel free to share them in this post!
  2. Is it possible to know if a property is redeclared in a class or skip the original property entirely (the redeclared property would overwrite the original property in the Rtti)? It's easier to explain through an example: TMyClass = class strict private FInt: Integer; public property Int: Integer read FInt write FInt; end; TMyChild = class(TMyClass) published [RandomAttr] property Int; end; The Rtti will return 2 properties for TMyChild class, even though both have the same name. I haven't found any data in the TRttiProperty that would indicate that the property is redeclared. Second question would be, if this is not possible: can I rely on the returned properties to be sorted by class inheritance? In other words, can I safely assume the returned array of properties would first contain properties of TMyChild, and then of TMyClass?
  3. Should've searched at least a bit before asking this question.. Digging into TRttiType.GetProperties I found the method TRttiTypeHelper.GetObjectListInVisOrder, which does exactly what I'm asking here. Original question still stands, although knowing this is enough to handle my scenario.
  4. I've seen a few people discussing their development and posting screenshots in the Skia4Delphi telegram group.
  5. havrlisan

    What does [ref] attribute actually dows

    Only if you need to access the actual reference.
  6. havrlisan

    What does [ref] attribute actually dows

    Dalija Prašnikar has a great article on what it's purpose is in FreeAndNil: https://dalijap.blogspot.com/2020/06/magic-behind-freeandnil.html
  7. havrlisan

    Method Selection ability??

    I didn't realize you meant only the implementation. In that case, I'd use the plain simple line commenting: Delphi has that feature set to shortcut "Ctrl+/", where / character is on numpad. MMX has the feature "Toggle Comment Selection", which acts very similar. You can assign a custom shortcut to that one. GExperts also has a similar feature; not a toggle comment, but comment and uncomment. You can find it under "Editor Experts", and assign a custom shortcut as well.
  8. havrlisan

    Method Selection ability??

    Even that is possible with MMX, with the feature called "Comment member(s)..." in the "Text Tools" group. I know I manually set the shortcut of that one to "Alt+Shift+X". With that one, you can even edit the "TODO" comment that gets added, in MMX > Properties >Editing (Pascal group), and there you'll see the setting "Text to insert when commenting entity" in the last section, "Insert Text When Commenting".
  9. havrlisan

    Method Selection ability??

    If you're using MMX (which I highly recommend), you can use the "Delete Entity..." feature which deletes the current entity your caret is on: interface, class, property, method, field, etc. Not sure if it's the default shortcut, but mine is "Ctrl+Shift+Delete". For fun, here are my MMX usage statistics for features that have been used 1000+ times (Delete Entity is in top 3):
  10. havrlisan

    VCL Skia *.svg display dependencies ?

    TSkSvg is originally from skia4delphi. Did you enable Skia already? You can do so by right-clicking the project in the Projects view and clicking on "Enable Skia". Sometimes that may not be enough, in which case you'll need to create a startup unit. Read more about it here: https://github.com/skia4delphi/skia4delphi?tab=readme-ov-file#enable-skia-render I failed to see you're talking about VCL, so disregard this message.
  11. havrlisan

    FMX learning resources?

    For starters, I recommend reading two FMX-related books: "Delphi GUI Programming with FireMonkey" by Andrea Magni, and "Fearless cross-platform development with Delphi" by David Cornelius. Together, they cover the most important parts of how FMX framework functions, and they both write about similarities and differences between VCL. I suggest you also play around and discover the RAD Studio Multi Device Samples, since they contain good chunks of code and UI components to see how to interact with FMX. If you have multiple devices with different platforms (Android, iOS, macOS), make sure you try the apps on all of them, to see how the deployment and functionality works across different platforms. As you start using FMX, I strongly recommend working with skia4delphi in every project. It is already integrated into FMX, but make sure to enable it in every project as it increases performance and provides you a ton of features that are missing in the stock FMX (such being Svg/Lottie support and right-to-left text). Good luck!
  12. You're right. I have the same behavior; I never noticed it before since I don't usually select code like that. That said, you should report it on the Quality Portal instead of here.
  13. havrlisan

    What FireMonkey style do you use and like ?

    I agree; most cross-platform apps nowadays have the same style across platforms. The FMX's approach to style objects with the png is rather stale as well; one should turn to using vector images. This is possible with zx-skiacomponents, which approaches the StyleObjects differently, allowing you to use direct properties for changing colors, animated images, or text settings on triggers. The feature I used the most was the SVG override color change, it allows you to create a beautiful yet responsive UI with no pixelization to worry about.
  14. havrlisan

    FmxLinux and GTK

    Have you installed the gtk library on the linux machine? sudo apt-get install libgtk-3-dev
  15. havrlisan

    TypeInfo Issue..

    You've got a typo: it's not System.TypeInfo, it's System.TypInfo.
  16. That's a good question, I didn't have that case yet so haven't thought about it. Perhaps install the desktop environment and see if the app console will display itself? I never tested Console apps on other platforms, so can't help much in that area.
  17. Not sure I understand your question. Do you expect the output in the console in which you ran the PAServer? If so, that's not going to happen, because PAServer only acts as an intermediary for building and debugging the app on that platform, not outputting app logs (except for exceptions, at least to my knowledge). However, Writeln will output to the IDE Messages panel if running with a debugger, and that was always enough for me.
  18. If you're using a Delphi version 10.3 or newer, you can also achieve this by declaring an inline variable: var LEnum := ssShift;
  19. havrlisan

    Some new projects...

    I'll never understand people like you. Every project except CScript has a Requirements section where he mentions that Delphi 12.2+ is supported, or at least that it is made and tested with Delphi 12.2. You really should RTFM more often.
  20. Version: Beta 15.1.12.2636 Is it just me, or is the source indexer no longer rebuilding automatically after the IDE opens? This is my configuration: According to the hint: I have the source indexer window stored in the bottom panel along with messages, which is hidden until invoked. Am I missing something? This worked in a previous version. As always, thanks for your hard work!
  21. It is not possible to define TCustomContainer<T: TCustomItem> if TCustomItem is its internal public type. This only compiles (up to your error) because there is another TCustomItem defined outside that class. Doing this with classes only is impossible. You cannot have both a T that is a TCustomItem within TCustomContainer<T> and a FContainer that is a TCustomContainer<T> within TCustomItem. The relation cannot be bi-directional in this scenario. A closer implementation to what you're trying to achieve is possible with interfaces, but that comes with its own set of issues. This post has an example of what you're trying to achieve with interfaces: Also, IMO it is not a good idea to couple your classes like you're trying to do here. A TCustomItem should not directly call the TCustomContainer's HandleItemNotification; you should handle that either via an observer pattern or with events.
  22. havrlisan

    Problems with Delphi 12.2 patch 1?

    I installed the version as soon as it came out and had no issues like these you speak of. I see you wrote "patch", did you maybe install it only from GetIt, or did you do a complete reinstall of the RAD studio? For reference, here's the explanation from Embarcadero on how to install it: https://blogs.embarcadero.com/rad-studio-12-2-athens-inline-patch-1-available/
  23. Instead of hardcoding it like this and making it optional (which makes little sense), it would be better to fill the Tab Options (Options > Editor > Tab) with way more options, such as choosing colors for each scenario (locked units, system units, etc.), or disabling them altogether.
  24. havrlisan

    Delphi 12.2 TMEMO - indexoutofbounds

    It does. You can read the change log here: https://blogs.embarcadero.com/rad-studio-12-2-athens-inline-patch-1-available/
  25. havrlisan

    creating a frame at runtime

    Or to an empty string. It's the safest and easiest way, in my opinion.
×