

dmitrybv
Members-
Content Count
95 -
Joined
-
Last visited
Everything posted by dmitrybv
-
We are glad to inform that a new version of EhLib software - EhLib.VclFmx 12.1 is available for download. In this version: + Added support for RAD Studio 13 + The EhLibFmx package has been updated with the Fmx.TDataVertGridEh and Fmx.TDataComboBoxEh components + A TDataGridComboboxColumnEh column has been added to Fmx.TDataGridEh in design-time + In Fmx.TDataGridStringColumnEh , highlighting of URL sections of text has been added + Support for formatting text sections has been added to the Fmx.TDataGridStringColumnEh.DataCellGetStyleParams event + In Fmx.TDataGridEh , the ability to display a single record without dividing into cells has been added + Added support for displaying the tree status area to Fmx.TDataGridEh Read detail information about new features of this version in a file "EhLib.VclFmx 12.1 Release Notes Eng.docx" in EhLib archive and the documentation: What's New in EhLib.VclFmx 12.1 _________________ Best regards EhLib Support Team www: http://www.ehlib.com E-mail: support@ehlib.com MS Teams support: ehlib.support
-
Runtime error 217 when launching Delphi FMX Linux 64-bit application (RAD Studio 12, Ubuntu 22.04)
dmitrybv posted a topic in Cross-platform
I’m having trouble running my Delphi FMX application on Linux 64-bit (Ubuntu 22.04.4 LTS, FmxLinux 1.78). The application runs fine on Win32, Win64, Android-64, macOS-64. On Linux 64-bit, when I try to start it in debug mode, the IDE immediately stops execution without showing any error. PAServer doesn’t print anything either. A simple test app (just one form with a button) runs without issues on Linux. My real project has several dozen forms. When I run it in debug mode in Embarcadero RAD Studio 12 (Version 29.0.55362.2017), the debugger just stops with no messages. If I try “Run without debugging”, PAServer prints: Runtime error 217 at 00000000012AFEFC According to ChatGPT, this usually means the crash happens inside the initialization section of one of the units included in the project’s uses. 👉 My question: What’s the best way to identify which unit or initialization block is causing the crash on Linux, and how can I debug this further? -
Runtime error 217 when launching Delphi FMX Linux 64-bit application (RAD Studio 12, Ubuntu 22.04)
dmitrybv replied to dmitrybv's topic in Cross-platform
If I place a breakpoint in the initialization section of the very first unit in my project, the debugger hangs when exiting the method procedure System.StartUpCopy.CopyStartUpFiles; -
Refactor – Rename (Type, Field, Property) Alternatives in Delphi 13
dmitrybv posted a topic in Delphi IDE and APIs
In previous versions of Delphi, there was a Refactor → Rename menu for renaming types, fields, and properties across the entire project. In Delphi 13, this menu seems to be missing. I tried using MMX Code Explorer, but I couldn't find an equivalent. MMX offers Rename in Scope, but it only works at the unit level and does not rename the identifier throughout the entire project. Are there any alternatives or tools in Delphi 13 that provide full-project renaming functionality similar to the old Refactor → Rename? -
FMX Frame always marked as modified when opened (RAD Studio 12.3)
dmitrybv posted a topic in Delphi IDE and APIs
Hi, Embarcadero® RAD Studio 12 Version 29.0.55362.2017 I noticed a strange behavior in RAD Studio 12.3 (FireMonkey Application): Whenever I open my custom FMX Frame in the IDE designer, it is immediately marked as modified. The IDE then asks me to save changes when I close the frame, even though: the frame is completely empty (no components, no property changes), no changes were made manually, saving does not actually alter the .fmx or .pas files (their timestamps remain the same). The issue only happens with Frames. With regular Forms, this does not occur. I cannot understand whether this is an intended feature of the IDE (some hidden metadata handling) or a bug. Has anyone else noticed the same behavior? -
FMX Frame always marked as modified when opened (RAD Studio 12.3)
dmitrybv replied to dmitrybv's topic in Delphi IDE and APIs
This issue is easily reproducible, was reported back in 2023 and has a high priority (Priority: Major), although it is still not resolved. This is strange. -
Hi All What are the performance profilers for Delphi 12? Under Delphi 10.4 I use AQTime. But it looks like AQTime with Delphi 12 support hasn't been released yet.
-
Hello everybody. What is the equivalent of Vcl.TDBLookupComboBox in FMX?
-
You may be wrong. There is no native control like TDBLookupComboBox in Windows OS. That is why Owner-drawn Control – TDBLookupComboBox is written in VCL.
-
Android 64-bit Package Compilation Fails in Delphi 12 After SDK Update Prompt ([Error] Failed)
dmitrybv posted a topic in Cross-platform
Product and Version: Embarcadero® RAD Studio 12 — Version 29.0.55362.2017 Installed from: RADStudio_123_2017_E9E8FB1D4F9F.iso (7,256 MB) Platform: Android 64-bit Issue Description: When attempting to compile a runtime package for the Android 64-bit platform in Delphi 12, I receive the following warning: Would you like to update the platform SDK now? Regardless of whether I choose Yes or No, the build immediately fails with the error: [Error] Failed In Tools → Options → Deployment → SDK Manager → Android 64-bit, several fields (e.g., SDK paths or tools) are marked with exclamation marks (!), although I did not encounter any errors during installation. File sizes of installed Android SDK components: CatalogRepository\AndroidSDK-2525-23.0.55362.2017 — 159 MB CatalogRepository\AndroidSDK-NDK-23.0.55362.2017 — 981 KB The SDK and NDK appear to be partially installed or missing components, but no installation errors were reported. Questions: What is the reason for the exclamation marks in the SDK Manager? Why does the build fail with [Error] Failed after the SDK update prompt? How can I fully verify and repair the Android 64-bit platform SDK installation? What I’ve tried: Clicking Yes or No on the SDK update prompt makes no difference — the build still fails. I haven’t manually modified the SDK folders. The SDK was installed by the ISO installer without any visible issues. Any guidance on resolving this issue would be appreciated. -
programmatically determine the edition of RAD Studio 12.3
dmitrybv posted a topic in Delphi IDE and APIs
Hello, How can I programmatically determine the edition of RAD Studio 12.3? In the registry key Computer\HKEY_CURRENT_USER\Software\Embarcadero\BDS\23.0, there is no value named Edition. I have the same question regarding RAD Studio 11.3 and 10.4. -
programmatically determine the edition of RAD Studio 12.3
dmitrybv replied to dmitrybv's topic in Delphi IDE and APIs
I tested RAD Studio 12.1 Community Edition. For this edition, the "Detail" properties of the bds.exe contain the value “Personal”. I don’t know what the value Personal means and whether it is related to the concept of Edition at all. -
programmatically determine the edition of RAD Studio 12.3
dmitrybv replied to dmitrybv's topic in Delphi IDE and APIs
Yes, in a real application I use the registry branch Computer\HKEY_CURRENT_USER\Software\Embarcadero\BDS\23.0 to get the value for the App parameter that stores the path to bds.exe I try to keep the demo code to a minimum so that it is clear what problem I am discussing here. -
programmatically determine the edition of RAD Studio 12.3
dmitrybv replied to dmitrybv's topic in Delphi IDE and APIs
It seems that the solution with "bds.exe /ProductInfo:SKU" is suitable, but it does not work in the classic function of outputting the results of the StdOutput work via CreatePipe. Can you tell me how to correctly redirect the results passed to StdOutput to TMemo? I am trying to use the following code, but TMemo remains empty. At the same time, if you create a BdsGetSKU.Cmd file with the text C:\RADStudio\23.0\bin\bds.exe /ProductInfo:SKU and run it in cmd, the text "Enterprise" is output in cmd. procedure RunConsoleAppAndCaptureOutput(const ACommandLine, AWorkingDir: string; AMemo: TMemo); var SecurityAttr: TSecurityAttributes; ReadPipe, WritePipe: THandle; StartupInfo: TStartupInfo; ProcessInfo: TProcessInformation; Buffer: array[0..255] of AnsiChar; BytesRead: DWORD; AppRunning: DWORD; Output: TStringStream; CommandLineMutable: array[0..1023] of Char; begin AMemo.Clear; SecurityAttr.nLength := SizeOf(TSecurityAttributes); SecurityAttr.bInheritHandle := True; SecurityAttr.lpSecurityDescriptor := nil; if not CreatePipe(ReadPipe, WritePipe, @SecurityAttr, 0) then begin AMemo.Lines.Add('Failed to create channel.'); Exit; end; FillChar(StartupInfo, SizeOf(StartupInfo), 0); StartupInfo.cb := SizeOf(StartupInfo); StartupInfo.hStdOutput := WritePipe; StartupInfo.hStdError := WritePipe; StartupInfo.dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW; StartupInfo.wShowWindow := SW_HIDE; StrPLCopy(CommandLineMutable, ACommandLine, Length(ACommandLine) + 1); if not CreateProcess( nil, CommandLineMutable, nil, nil, True, 0, nil, PChar(AWorkingDir), // <- working directory StartupInfo, ProcessInfo ) then begin AMemo.Lines.Add('Failed to start process.'); CloseHandle(ReadPipe); CloseHandle(WritePipe); Exit; end; CloseHandle(WritePipe); Output := TStringStream.Create; try repeat BytesRead := 0; if ReadFile(ReadPipe, Buffer, SizeOf(Buffer) - 1, BytesRead, nil) and (BytesRead > 0) then begin Buffer[BytesRead] := #0; Output.WriteString(String(AnsiString(Buffer))); end; GetExitCodeProcess(ProcessInfo.hProcess, AppRunning); until AppRunning <> STILL_ACTIVE; // Read the rest while ReadFile(ReadPipe, Buffer, SizeOf(Buffer) - 1, BytesRead, nil) and (BytesRead > 0) do begin Buffer[BytesRead] := #0; Output.WriteString(String(AnsiString(Buffer))); end; AMemo.Lines.Text := Output.DataString; finally Output.Free; CloseHandle(ReadPipe); CloseHandle(ProcessInfo.hProcess); CloseHandle(ProcessInfo.hThread); end; end; procedure TForm1.Button1Click(Sender: TObject); begin // RunConsoleAppAndCaptureOutput(Edit1.Text, 'C:\RADStudio\23.0\bin', Memo1); // RunConsoleAppAndCaptureOutput('cmd /c dir', 'C:\Windows', Memo1); RunConsoleAppAndCaptureOutput('C:\RADStudio\23.0\bin\bds.exe /ProductInfo:SKU', 'C:\RADStudio\23.0\bin', Memo1); // RunConsoleAppAndCaptureOutput('C:\RADStudio\23.0\Projects\CommandLineInterpreter\BdsGetSKU.Cmd /ProductInfo:SKU', 'C:\RADStudio\23.0\bin', Memo1); end; -
programmatically determine the edition of RAD Studio 12.3
dmitrybv replied to dmitrybv's topic in Delphi IDE and APIs
dcc32.exe does not generate any error. You can understand that something went wrong only at the end of the installation, when bpl packages are registered in the registry for IDE. dcc32.exe does not create bpl packages and then it is already clear. But I want to give the user information about the impossibility of installation before the installation process begins. -
programmatically determine the edition of RAD Studio 12.3
dmitrybv replied to dmitrybv's topic in Delphi IDE and APIs
dcc32.exe is present in RAD Studio 12.3 Community Edition. It runs without errors. After running dcc32.exe %ERRORLEVEL% = 0. -
programmatically determine the edition of RAD Studio 12.3
dmitrybv replied to dmitrybv's topic in Delphi IDE and APIs
Actually I need to determine the edition of RAD Studio from an external program, from my installer program, in order to understand whether I can use dcc32.exe to compile the library source codes to generate packages for installation or not. RAD Studio 12.3 Community Edition does not support compilation via dcc32.exe. I am trying to understand how I can determine in advance in the LibInstaller program whether I can generate packages and install the library in the IDE or not. -
programmatically determine the edition of RAD Studio 12.3
dmitrybv replied to dmitrybv's topic in Delphi IDE and APIs
1. RTLVersion and RAD Studio Edition (Professional, Enterprise, Community Edition) are different concepts. 2. RTLVersion for RAD Studio 12.3 cannot be called from an external program. -
Description: In Delphi, it's not possible to list units that reference each other in the interface uses section. This limitation significantly hinders class organization within a package. Initially, developers work around this by moving some unit references to the implementation uses section. However, as the class hierarchy becomes more complex, this strategy breaks down. At a certain point, class inheritance and cross-referencing between units can no longer evolve naturally due to circular reference restrictions. Instead of focusing on building a clean and scalable architecture, developers are forced to spend an excessive amount of time carefully juggling interface and implementation references across units to avoid dependency issues. Suggestion: Consider removing the concept of unit as a fundamental structural element in Delphi’s object model, and instead rely entirely on package-based architecture. Classes within the same package should be able to access each other regardless of which unit they reside in, without exposing their internal structure outside the package. If this change is too radical for Delphi’s current model, a more incremental alternative could be introduced: Allow splitting of interface/implementation code across multiple files, which could then be merged by the compiler or a preprocessor into a single internal unit. This would simulate package-level cohesion without breaking existing language design principles.
-
CaretPositionRTTIProp.GetValue(Memo1) raises AV
dmitrybv posted a topic in RTL and Delphi Object Pascal
Hello I can't figure out why the following code causes an AV error. procedure TFormSimpleDraw2.Button2Click(Sender: TObject); var Value: TValue; LType: TRttiType; RttiContext: TRttiContext; CaretPositionProp: TRttiProperty; CaretPosition: TCaretPosition; begin RttiContext := TRttiContext.Create; LType := RttiContext.GetType(Memo1.ClassInfo); CaretPosition := Memo1.CaretPosition; CaretPositionProp := LType.GetProperty('CaretPosition'); Value := CaretPositionProp.GetValue(Memo1); //AV is here end; Embarcadero® RAD Studio 12 Version 29.0.55362.2017 1. Create FMX Form. 2. Put TButton and TMemo on the Form. 3. Write TButton.OnClick as written above 4. Run and click Button -
CaretPositionRTTIProp.GetValue(Memo1) raises AV
dmitrybv replied to dmitrybv's topic in RTL and Delphi Object Pascal
"Just curious — how did you specify the calling convention cdecl? After all, DoGetValue doesn't contain any parameters for specifying the calling convention." -
CaretPositionRTTIProp.GetValue(Memo1) raises AV
dmitrybv replied to dmitrybv's topic in RTL and Delphi Object Pascal
If this issue is related to a bug in RTTI or TMemo, then a new bug report should be added to the Embarcadero Quality Portal. If this issue is related to the fact that the CaretPosition property cannot be read via RTTI, then is there a way to check this. -
Class alias for class helper doesn't make class helper visible for compiler.
dmitrybv posted a topic in RTL and Delphi Object Pascal
Class alias for class helper doesn't make class helper visible for compiler. Is it possible to declare class alias for class helper with making class helper visible for compiler? Example Unit1 TControlHelper = class helper for TControl function RefSelf: TControl; end; Unit2 TControlHelper = Unit1.TControlHelper; Unit3 uses Unit2; ... var MyControl: TControl; MyControl.RefSelf //Compiler error. -
Android. TDirectory.GetFiles('/storage/emulated/0/DCIM/Camera') returns an empty list
dmitrybv posted a topic in Cross-platform
Good day. Embarcadero® RAD Studio 12 Version 29.0.55362.2017 Android 13, Samsung S20. I have files taken by the camera in the folder '/storage/emulated/0/DCIM/Camera' on my phone. How to set up the Android application correctly so that I can get a list of these files? When creating an Fmx application by default, the command TDirectory.GetFiles('/storage/emulated/0/DCIM/Camera') returns an empty list. -
Android. TDirectory.GetFiles('/storage/emulated/0/DCIM/Camera') returns an empty list
dmitrybv replied to dmitrybv's topic in Cross-platform
Hello, Dave Thanks for the demo project. Is there a more universal way to view the list of files in Android folders? Regarding the TDirectory.GetDirectories(), TDirectory.GetFiles() methods, I noticed that the TDirectory.GetDirectories('/storage/emulated/0/') method returns a list of folders similar to what is visible in the Files by Google program. Files by Google displays files in folders such as: '/storage/emulated/0/DCIM/Camera' '/storage/emulated/0/DCIM/Screenshots' '/storage/emulated/0/Documents' '/storage/emulated/0/Download' but the TDirectory.GetFiles() method does not return any files when specifying any path. What method should be used in Android to get a list of files in a folder?