-
Content Count
86 -
Joined
-
Last visited
-
Days Won
1
Posts posted by havrlisan
-
-
7 hours ago, JohnLM said:I use the TMemo in Android apps a lot, but due to this issue (I suffer from this as well--Galaxy S10+ phone) I've been holding off compiling to Android via 12.2
Does the Inline Patch 1 from 10-17-2024 fix this issue ?
As soon as I can, I will be making an HDD image before I proceed to this Inline Patch 1 process.
It does. You can read the change log here: https://blogs.embarcadero.com/rad-studio-12-2-athens-inline-patch-1-available/
-
1 hour ago, Der schöne Günther said:Don't forget to set the Name property of your frame to something unique.
Otherwise, it will throw a runtime exception when you have several components with identical name in the same container.
Or to an empty string. It's the safest and easiest way, in my opinion.
-
1
-
2
-
-
If you're unable to go fullscreen (try various ways, such as Windows shortcut keys), check if some other program on your PC might be restricting the window from resizing. If there is no such program, try uninstalling IDE plugins. Finally, if nothing helped, reinstall RAD Studio.
-
52 minutes ago, Uwe Raabe said:Usually MMX avoids to duplicate functionality already available in the IDE. In most of the cases where it does, it is probably the IDE implementing a similar feature recently (f.i. Extract method).
If you feel MMX needs too much time to parse the unit after changes not made by itself, you might try to reduce the Delay times in the General -> Synchronization options of MMX. The defaults were made for hardware standards now pretty much outdated.
I agree with the duplicate functionality, I don't like that approach either but thought it might make sense due to MMX parsing the code.
I didn't realize that option was available. That did the trick, thanks! -
I wondered if there is an equivalent option to the Complete Class at Cursor, whose default shortcut is Ctrl+Shift+C. I'm asking because if you use that shortcut, the MMX gets out of sync and seems to parse the entire unit again, which takes around a second. During that period, you cannot use MMX's other tools, or you'll get this message:
Quote[MMX] Explorer not in sync with modified source. Editing aborted
The closest option I found was invoking Edit Entity... (Ctrl+E), clicking OK, and the method implementation gets created; the MMX doesn't get out of sync that way.
I get that it's a pretty specific scenario, but I find myself getting the above message quite often as I invoke the shortcuts during coding.
Thanks for your time!
-
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.
DescriptionWant 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.
DescriptionQuickly 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.
DescriptionUsing 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.pasDescription
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!
-
5
-
7
-
-
-
Upon closer inspection, it has nothing to do with the Return key, but with the caret position. The bug can be reproduced just by tapping on another line, the only condition is that the current line must have at least one character.
Stack trace:
System._DbgExcNotify(int, void*, System.SmallString<(unsigned char)255>*, void*, void*) System.NotifyReRaise(System.TObject*, void*)($b40000deac336980,$0000006ef3035c10) System._InternalRaiseAtExcept(System.TObject*, void*, bool)($b40000deac336980,$0000006ef3035c10,false) System._RaiseExcept(System.TObject*)($b40000deac336980) System.Internal.Excutils.DoRaiseJNIExceptionCallBack(System.UnicodeString, System.UnicodeString)(??,??) Androidapi.Jni.HandleJNIException(JNINativeInterface**)($b40000701924bbf0) Androidapi.Jnimarshal.ExecJNI(void*, void*, void*, Androidapi.Jnimarshal.JNIMethodInvokeData*, Androidapi.Jnimarshal.m128*)($0000007fe4a32218,$0000007fe4a321f8,$0000007fe4a322f0,$0000007fe4a32200,$0000007fe4a32210) _DispatchToImport Fmx.Platform.Ui.Android.TTextServiceAndroid.InternalUpdateSelection()($b4000070c92faf10) Fmx.Platform.Ui.Android.TTextServiceAndroid.SetText(System.UnicodeString)($b4000070c92faf10,??) Fmx.Text.Texteditor.TTextEditor.UpdateTextInTextService()($b4000070192bc510) Fmx.Text.Texteditor.TTextEditor.SetCaretPosition(Fmx.Text.TCaretPosition const&)($b4000070192bc510,{Line = 1, Pos = 0}) Fmx.Memo.Style.New.TStyledMemo.MMSetCaretPosition(Fmx.Presentation.Messages.TDispatchMessageWithValue__1<Fmx.Text.TCaretPosition>&)($b4000070e92689d0,{MsgID = 5917, Value = {Line = 1, Pos = 0}}) System.TObject.Dispatch(void*)($b40000dfdc2671e0,$0000007fe4a326d8) void Fmx.Presentation.Messages.TMessageSender.SendMessage<Fmx.Text.TCaretPosition>(unsigned short, Fmx.Text.TCaretPosition)($b4000070192bf450,5917,{Line = 1, Pos = 0}) Fmx.Memo.TCustomMemoModel.SetCaretPosition(Fmx.Text.TCaretPosition const&)($b4000070192bf450,{Line = 1, Pos = 0}) Fmx.Memo.TCustomMemoModel.InsertAfter(Fmx.Text.TCaretPosition const&, System.UnicodeString, System.Set<Fmx.Text.TInsertOption, (Fmx.Text.TInsertOption)0, (Fmx.Text.TInsertOption)4>)(??,{Line = 0, Pos = 1},??,{__data = "\\U00000006", __basetype = ??}) Fmx.Memo.Style.New.TStyledMemo.KeyDown(unsigned short&, char16_t&, System.Set<System.Classes.TShiftStateItem, (System.Classes.TShiftStateItem)0, (System.Classes.TShiftStateItem)10>)(??,$0000007fe4a32fa2,U+2fa4 U+e4a3 U+007f U+0000 u'\\xe2\\xbe\\xa4',{__data = "", __basetype = ??}) Fmx.Presentation.Style.TStyledPresentation.PMKeyDown(Fmx.Presentation.Messages.TDispatchMessageWithValue__1<Fmx.Controls.Presentation.TKeyInfo>&)($b4000070e92689d0,{MsgID = 1056, Value = {Key = 13, KeyChar = U+0000 u'\\\\0', Shift = {__data = "", __basetype = ??}}}) System.TObject.Dispatch(void*)($b40000dfdc2671e0,$0000007fe4a32fa0) void Fmx.Presentation.Messages.TMessageSender.SendMessageWithResult<Fmx.Controls.Presentation.TKeyInfo>(unsigned short, Fmx.Controls.Presentation.TKeyInfo&)($b400006fb92f9d80,1056,{Key = 13, KeyChar = U+0000 u'\\\\0', Shift = {__data = "", __basetype = ??}}) Fmx.Controls.Presentation.TPresentedControl.KeyDown(unsigned short&, char16_t&, System.Set<System.Classes.TShiftStateItem, (System.Classes.TShiftStateItem)0, (System.Classes.TShiftStateItem)10>)($b400006f99280520,$0000007fe4a3330a,U+3302 U+e4a3 U+007f U+0000 u'\\xe3\\x8c\\x82',{__data = "", __basetype = ??}) Fmx.Forms.TCommonCustomForm.KeyDown(unsigned short&, char16_t&, System.Set<System.Classes.TShiftStateItem, (System.Classes.TShiftStateItem)0, (System.Classes.TShiftStateItem)10>)($b400006f9927be50,$0000007fe4a3330a,U+3302 U+e4a3 U+007f U+0000 u'\\xe3\\x8c\\x82',{__data = "", __basetype = ??}) Fmx.Platform.Ui.Android.TAndroidTextInputManager.KeyDown(unsigned short&, char16_t&, System.Set<System.Classes.TShiftStateItem, (System.Classes.TShiftStateItem)0, (System.Classes.TShiftStateItem)10>)($b400007009347710,$0000007fe4a3330a,U+3302 U+e4a3 U+007f U+0000 u'\\xe3\\x8c\\x82',{__data = "", __basetype = ??}) Fmx.Platform.Ui.Android.TAndroidTextInputManager.HandleAndroidKeyEvent(AInputEvent*)($b400007009347710,$b40000700939d2a0) Fmx.Platform.Android.TPlatformAndroid.HandleAndroidInputEvent(Androidapi.Appglue.TAndroidApplicationGlue*, AInputEvent*)($b4000070192be490,$b40000700939d2a0) Androidapi.Appglue.TAndroidApplicationGlue.InputEventHandler(int, int, void*) :0000007234A78B74 android::Looper::pollInner(int) :0000007234A7862C android::Looper::pollOnce(int, int*, int*, void**) :00000072278C689C ___lldb_unnamed_symbol9344 :000000009D7B6340 ??
The TTextEditor.FCaretPosition was updated while TTextService.FCaretPosition wasn't, and the TTextEditor.UpdateTextInTextService gets called before the TTextService receives the position update. The UpdateTextInTextService passes the string of the newly selected line to the TTextService.SetText, which, among other code, does this:
FTextView.setText(StrToJCharSequence(FText), TJTextView_BufferType.JavaClass.EDITABLE); // In some cases, EditText can reset selection/caret position to 0. So if user removes text via vkBackspace, // the backspace button in Soft Keyboard can be unpressed automatically. InternalUpdateSelection;
Judging from the comment, that second line seems like a new addition. Tracing into it, lo and behold:
procedure TTextServiceAndroid.InternalUpdateSelection; var SelStart, SelEnd: Integer; begin if FTextView = nil then Exit; CalculateSelectionBounds(SelStart, SelEnd); if SelEnd - SelStart > 0 then FTextView.setSelection(SelStart, SelEnd) else FTextView.setSelection(CaretPosition.X); // this one gets executed end;
It uses its non-updated caret position to update the selection.
-
1
-
-
Exception occurs on my A52s as well. To reproduce, write a character and press the Return key. Pressing the Return key on an empty line doesn't trigger the exception.
-
Works fine for me. The getit server also had no incident reports, you can check it here: https://stats.uptimerobot.com/zJjvZI8vEZ
-
- Go to https://qp.embarcadero.com/ - it will redirect to attlasian.net login
- Log in or sign up.
-
Once logged in, you'll be taken to the main portal. Go to the Requests page:
-
In the Requests page, set these filter types:
If there are still no reports, it is most likely that you haven't been automatically added to the Embarcadero Customers organization. It should be available in one of the filter dropdowns:
In that case, contact @Ian Barker and he'll help you out.
-
This seems to be fixed in the latest version, 1.3.25 build 4298.
-
1
-
-
1 hour ago, Rollo62 said:I use the TPath.GetDocumentsPath mostly, as it felt like the least problematic one.
Switching to Documents path fixed the issue. Thanks!
-
Question for iOS platform. Why would System.SysUtils.ForceDirectories return false for the following path:
Quote/private/var/mobile/Containers/Data/Application/2DBA3EDB-E7AE-4633-BC13-94A47589ECDC/DEBUG (LOCALHOST)/{665ACF03-9968-4C72-915E-0BF7B4F3B102}/_preferences
The path is a combination of TPath.GetHomePath and custom folders starting from the "DEBUG (LOCALHOST)" folder. It's a folder within the app sandbox so it shouldn't be a problem unless I'm missing something.
-
2 hours ago, PetrifiedDelhpi said:Delphi on iOS could be called Deprecated. Had to buy an iPhone X, to enable debugging. (Apple doesn't support degrading to older versions of iOS, signing is removed within days.)
They're just lagging behind because Apple made some major changes to debugging apps through Xcode (see this discussion on Apple forums). Hopefully, they'll announce a fix for it in their upcoming webinar for the 12.2 update.
-
14 minutes ago, dmitrybv said:Correct. If you register your component that has the attribute I mentioned, it will display all the platforms in that hint you screenshotted.
-
You need to add an attribute to your class:
[ComponentPlatformsAttribute(pidAllPlatforms)] TZxButton = class(TZxCustomButton) end;
You also need to add System.Classes to your uses unit.
-
-
6 minutes ago, dmitrybv said:1. This file was created by RAD Studio designer. I did not modify it manually.
2. Why do I need inherited here if the base class - TBaseInTabFrame does not have an fmx file?
3. I created a new frame TInheritedFrame, then in the unit file UnitInheritedFrame, I changed the line TInheritedFrame = class(TFrame) to TInheritedFrame = class(TBaseInTabFrame), because I need to have several basic methods for all frames of my project in the base class TBaseInTabFrame.1. Correct, and RAD Studio correctly created the fmx file. However, you changed your class inheritance from TFrame to TBaseInTabFrame, and because of that the correct keyword becomes inherited, not object. RAD Studio cannot know what your intentions are, so you must change it manually.
2. Your TBaseInTabFrame should have an fmx file; that's how I've always done it. I suppose you just created a blank unit and declared it, but you should create the unit as a new FireMonkey Frame (that's an actual option in the Add New tab menu). That way frame inheritance will work properly.
3. Read the previous two statements, they explain why that's a wrong approach.
-
Your fmx file is wrong:
26 minutes ago, dmitrybv said:object InheritedFrame: TInheritedFrame Left = 0 Top = 0 ClientHeight = 480 ClientWidth = 640 FormFactor.Width = 320 FormFactor.Height = 480 FormFactor.Devices = [Desktop, iPhone, iPad] DesignerMasterStyle = 0 end
In the first line, it should be inherited instead of object. If it's inherited, it draws all the properties from the parent classes, but if it's an object, it won't inherit anything. I never investigated why it saves those properties, which are properties from TForm and not TFrame ones.
Edit: to properly inherit an existing frame in the same project, right click the project in the Projects view, Add new > Other > Delphi (drop down in new window) > Inheritable Items. There you'll see your frames, and you'll only be able to Inherit them (other options Copy and Use will be disabled).
-
11 minutes ago, Ian Branch said:OK.
{%CLASSGROUP 'System.Classes.TPersistent'}
Didn't look right, so I changed it to;
{%CLASSGROUP 'Vcl.Controls.TControl'}
And it is happ now.
I have no idea how/when it was et to System.Classes.TPersistent. 😞
Thanks for the prompt/pointer.
Regards,
Ian
Great to hear that solved your problem. To clarify, changing the ClassGroup property changes that line of code you edited:
-
6 hours ago, Ian Branch said:Hi Team,
I have downloaded and installed SVGIconsImageList from GitHub.
No issues there.
The components are appearing in most of my Apps projects under the Design tab components except for one form in a project. A Datamodule.
It is fine if/when I install SVGIconImageList via GetIt.
What could be causing them to be missing from just the one form on the one project?
It is complaining that Class TSVGIconImageCollection is not found.
Regards & TIA,
Ian
The TDataModule has a published property ClassGroup, check if that's set to VCL (because TSVGIconImageCollection is VCL only).
-
I think this wouldn't scale well, because as soon as you have more types and classes, keeping track of all the aliased (or as you say, redefined) types will become a burden, let alone a refactoring. Another consideration is that some types will have helpers (eg. enumerations or records), which cannot make an alias, so you'd end up including the unit anyway, I find it clean enough to have a MyTypes unit that contains the scope-related types and then include that unit wherever I need a type from it. It's easier to track it, and the LSP will be thankful.
-
Hi all. When you open up an FMX form or a frame, its controls will have their style applied if the style is loaded, eg. you have the data module opened which contains the TStyleBook that contains the styles.
There are two possible scenarios with loading styles:
- load the styles first, then open the form/frame, or
- open the form/frame, and then load the styles.
The second scenario doesn't apply to all controls though. It applies to all the standard FMX controls such as TLabel, TEdit, TPanel, etc., but not to custom controls. A good example is the recently added TSkLabel: style will not get applied until you reopen the frame or reload the form designer (by viewing it as text, then changing back the view to form). Has anyone successfully solved this problem?
Suggestions for improving the display of tabs in the SourceCode editor
in Delphi IDE and APIs
Posted · Edited by havrlisan
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.