Lajos Juhász
Members-
Content Count
986 -
Joined
-
Last visited
-
Days Won
12
Everything posted by Lajos Juhász
-
Is XML Documentation in Delphi 10.4 is 105% broken?
Lajos Juhász replied to Lajos Juhász's topic in Delphi IDE and APIs
The oldest bug report is from July and it's not marked as duplicated if it was a known issue they would flag it. -
Is XML Documentation in Delphi 10.4 is 105% broken?
Lajos Juhász replied to Lajos Juhász's topic in Delphi IDE and APIs
Unfortunately this is a well known bug in Delphi 10.4 - there was a bug report that I didn't found at first - https://quality.embarcadero.com/browse/RSP-30690 the report is from July an still open. I was a bit shocked that nobody noticed in the betas. -
You should also consider to enter a QP ticket for this. I believe for this case there is no ticket yet.
-
Is XML Documentation in Delphi 10.4 is 105% broken?
Lajos Juhász replied to Lajos Juhász's topic in Delphi IDE and APIs
Unfortunately this is Help Insight. For example http://docwiki.embarcadero.com/RADStudio/Sydney/en/Help_Insight show a picture as it was in Delphi XE5. So the expected behavior is still to generate a readable definition of the function. -
According to Delphi it's not 66 days but 67: Date: 15.02.2021 Days between: 67 program Project1; {$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils, System.DateUtils; var X: Tdate; begin try { TODO -oUser -cConsole Main : Insert code here } x:=IncDay(IncMonth(now, 2), 5); WriteLn('Date: '+DateToStr(x)); WriteLn('Days between: '+IntToStr(DaysBetween(x, now))); ReadLn; except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; end.
-
Can you restart the LSP or do you have to restart the whole IDE?
Lajos Juhász replied to Der schöne Günther's topic in Delphi IDE and APIs
Also now it's running in separate process and will not bring / or slow / down the IDE. You can use the IDE to edit your code while the LSP processes are doing their jobs. -
According to the Roadmap (https://blogs.embarcadero.com/rad-studio-roadmap-november-2020/) in Delphi 10.5 H2 2021 you can expect a better support for the M1 CPU. In the roadmap it's under Platform Enhancements macOS ARM (Delphi). Of course as ever please do not forget this is only planned. There is no legal bound that it will be delivered in the first release of Delphi 10.5. A more detail can be found also at https://blogs.embarcadero.com/rad-studio-november-2020-roadmap-pm-commentary/ At this moment the best you can do is to wait for the first beta for Delphi 10.5.
-
I would just set the property Style to csExDropDownList.
-
Integer overflow in tStringList.SaveToFile
Lajos Juhász replied to Jud's topic in RTL and Delphi Object Pascal
Technically there is no problem. However it could be improved: 1.) When _NewUnicodeString failes due to CharLength instead of _IntOver it should raise a more meaningful exception. For example: You cannot create string length of %d. 2.) The overflow occurs in GetTextStr. When debugging a 32 bit application you get the following call stack: :766f9ab2 KERNELBASE.RaiseException + 0x62 :41169900 :41169900 System.Classes.TStrings.SaveToStream($3033D38,???) System.Classes.TStrings.SaveToFile(???,nil) System.Classes.TStrings.SaveToFile(???) mainFRM.TForm1.Button2Click($2FCEEA0) Vcl.Controls.TControl.Click Vcl.StdCtrls.TCustomButton.Click SaveToStream is focused, this almost ok as this method calls GetTextStr. I've tried again to run the 64 bit version and I get a different call stack this time: System._RaiseAtExcept(???,???) System.SysUtils.ErrorHandler(???,$40FA0A) System.ErrorAt(5,$40FA0A) System._IntOver System._NewUnicodeString(1092000000) System._UStrFromPWCharLen('',nil {#0},???) System.Classes.TStrings.GetTextStr System.Classes.TStrings.SaveToStream($302DD30,$302CDD0) System.Classes.TStrings.SaveToFile('d:\temp\StringTest.txt',nil) System.Classes.TStrings.SaveToFile(???) mainFRM.TForm1.Button2Click(???) The IDE focuses System._IntOver instead of System._NewUnicodeString. -
Integer overflow in tStringList.SaveToFile
Lajos Juhász replied to Jud's topic in RTL and Delphi Object Pascal
Now back to the original problem. This is the limitation of Delphi strings. You cannot allocate string larger than: (MaxInt - SizeOf(StrRec)) div SizeOf(WideChar) = 1073741815. Unfortunately, internally TStringList first tries to convert its content to string and using TEncoding to a byte array. That's why it is not suitable to work with large volume of text. -
Integer overflow in tStringList.SaveToFile
Lajos Juhász replied to Jud's topic in RTL and Delphi Object Pascal
It's quite easy to test. I've tested using: procedure TForm1.Button1Click(Sender: TObject); var i: integer; begin i:=1024; while true do i:=i*i; ShowMessage('Completed. The result is:'+i.ToString); end; When tested using the 64 bit the call stack is: :00007FF965893E49 ; C:\WINDOWS\System32\KERNELBASE.dll System._RaiseAtExcept(???,???) System.SysUtils.ErrorHandler(???,$70AE52) System.ErrorAt(5,$70AE52) System._IntOver mainFRM.TForm1.Button1Click(???) Vcl.Controls.TControl.Click Vcl.StdCtrls.TCustomButton.Click Vcl.StdCtrls.TCustomButton.CNCommand(???) System.TObject.Dispatch((no value)) But it's not bad, double click on the mainFRM.Tform1.Button1Click and the debugger focues where the 32 bit debugger does, so it's just an extra step. -
It's working for me. Try using https://getitnow.embarcadero.com/ . Also if you've used the ISO installer you've to switch getit to "online mode" (from the command line execute: GetItCmd.exe -c=useonline).
-
64 bit compiler running out of memory
Lajos Juhász replied to Dave Novo's topic in RTL and Delphi Object Pascal
The easiest way to kill the compiler is to have huge cyclic unit dependencies. Try to reduce that. Also if the project was created before unit scope names were introduced you should add the scope names to the units in the uses lists and remove from project options in Unit Scope Names. -
You are not adding WSNO as I wrote earlier you're adding a pointer to an address of a string returned by a function. You cannot do that. You should try something like this: procedure TForm1.DBGrid2ColEnter(Sender: TObject); if DBGrid2.SelectedField <> CDS1.FieldByName('WSNAME') then Exit; while not MyQry.Eof do begin DBGrid2.Columns[ColIndex].PickList.AddObject(MyQry.Fields[1].AsString, Pointer(MyQry.RecNo)); MyQry.Next; end; procedure TForm1.DBGrid2ColExit(Sender: TObject); var Inx:Integer; begin if DBGrid2.SelectedField <>CDS1.FieldByName('WSNAME') then Exit; Inx:= DBGrid2.Columns[ColIndex].PickList.IndexOf(DBGrid2.SelectedField.asString); MyQry.RecNo:=integer(DBGrid2.Columns[ColIndex].Picklist.Objects[Inx]); CDS1.FieldByName('WSNO').AsString:=MyQry.Fields[0].AsString; end;
-
There are multiple problems in your code: 1.) It's not a good idea to add the address value of a return value of a function - Pointer(MyQry.Fields[0].AsString) 2.) .PickList.IndexOf('WSNAME') you are searching the index for string 'WSNAME' while you most probably meant to search the index for the value of the selected field: DBGrid2.Columns[2].PickList.IndexOf(DBGrid2.SelectedField.asString)
-
type Texample = class private findex: integer; public constructor Create; reintroduce; published property Index: integer read fIndex write fIndex default -1; end; constructor TExample.create; begin inherited; findex:=-1; end; If it's a published property you should use the default directive (when the value of the published property equals to it's default value it's not streamed to the dfm). Even if you set the default directive it's the job of the constructor to initialize the field value.
-
TwSocket Udp Client how to receive Bytes Properly ?
Lajos Juhász replied to Skullcode's topic in VCL
First you've to initialize aBytes. Try something like this: setLength(aBytes, 1024); wsocket.Receive(aBytes, length(aBytes)); -
Why is public class method marked as used, while it's not actually used?
Lajos Juhász replied to Mike Torrettinni's topic in Algorithms, Data Structures and Class Design
Let's return the focus on the original question. In the IDE the blue dots represents the lines of codes that might be executed (http://docwiki.embarcadero.com/RADStudio/Sydney/en/Debugging_the_Application_(IDE_Tutorial). IMHO nobody should expect the IDE will keep which method is where used (especially if you have a project with thousands of units). Another problem could be if you debug a code in a package. There you can have public methods that are used exclusively only from outside of the package. If the IDE would place blue dots only to reachable code from the active project you would be unable to debug those procedures. -
Anyone with a working crystal ball that could tell when the road map will be released or at least a hotfix for https://quality.embarcadero.com/browse/RSP-30787 ? To the RSP Marco Cantù added a comment - 14/Oct/20 11:48 AM patch is still under testing Almost a month later no information when we could expect to have a working Delphi 10.4.1.
-
Why is public class method marked as used, while it's not actually used?
Lajos Juhász replied to Mike Torrettinni's topic in Algorithms, Data Structures and Class Design
While a private method can be accessed only from inside the class and if not used doesn't require a code to be generated (there will be no blue dot). A protected/public/published methods can be used from outside the class and the code will be generated. You can write from another unit: var vDummy: TDummy begin vDummy.B; end; -
FireDAC TFDTable navigation only sees the first 100 rows
Lajos Juhász replied to ABDug's topic in Databases
Maybe read the help (you should use Last): FindLast is intended to be used together with FindPrior, FindFirst and FindNext in order to search for the last record using any filters. See the example. Notes: This function is not implemented for TFDTable Live Data Windows mode. To conventionally navigate through a dataset use First, Last, Next and Prior. Descendant classes override FindLast to make the last record active, honoring any filters that are in effect. In descendants, FindLast returns true: True -- if the active record is successfully changed. False -- if the active record is not successfully changed. -
I asked this question in the FB Delphi developer group. Bruce McGee answered a month ago: "It's in the works". I have no idea whenever he has some insider information about it or not. It would be really useful to know when we can expect the hotfix for the compiler error in 10.4.1.
-
Organizing enums
Lajos Juhász replied to Mike Torrettinni's topic in Algorithms, Data Structures and Class Design
Are you loooking for this http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/devcommon/compdirsscopedenums_xml.html ? The $SCOPEDENUMS directive enables or disables the use of scoped enumerations in Delphi code. More specifically, $SCOPEDENUMS affects only definitions of new enumerations, and only controls the addition of the enumeration's value symbols to the global scope. In the {$SCOPEDENUMS ON} state, enumerations are scoped, and enum values are not added to the global scope. To specify a member of a scoped enum, you must include the type of the enum. For example: {$SCOPEDENUMS ON} type THTMLType = (htTemplate, htStatic, htHeader, htCustom); vHtmlReportType:=THTMLType.htTemplate; // Ok vHtmlReportType:=htTemplate; // [dcc32 Error] Unit1.pas(35): E2003 Undeclared identifier: 'htStatic' -
TMemo - How to select (highlight) a line of text in code?
Lajos Juhász replied to Incus J's topic in FMX
Looks like a bug, but you can do: var x: TCaretPosition; begin x.Line:=5; x.Pos:=1; MyMemo.Model.SelectText(x, 50); (Using Delphi XE5 in that version Selstart and Sellength worked as expected.) -
I don't know where is this written in the documentation. However, of course this is true only for the first time. Like in BDE,as FD was designed to replace BDE, later when you give the same connectionname it will use the already created connection. There is no reason to create a connection for every single query as it would be inneficient with databases. You can check it simple using code: FDQuery1.ConnectionName:=CONN_DEF_NAME; FDQuery1.Open; FDQuery1.Connection.Name:='Test'; // Just to give a name. FDQuery2.ConnectionName:=CONN_DEF_NAME; FDQuery2.Open; if FDQuery1.connection=fdQuery2.Connection then ShowMessage('FDQuery1 shares the connection with FDQuery2.');