fix list for embarcadero delphi xe2 and c++builder xe2 · up the existing languages in the delphi...

194
Fix List for Embarcadero Delphi XE2 and C++Builder XE2 This includes the list of fixes in the release of Delphi XE2 and C++Builder XE2 in August 2011. QC #: Date Reported : Area: 8747 4 8/23/2010 Demos Description: Steps: [QC Short Description] HelpInsight is not working for source code comments [QC Description] XML Documentation for Help Insight is not being displayed correctly QC Entry 87474 1. Open the DbxDataPump project from https://radstudiodemos.svn.sourceforge.net/svnroot/radstudiodemos/branches/RadStudio_XE/Delphi/Database/dbExpre ss 2. open ..\Utils\DbxUtils.pas 3. go to the implementation of function GetValue() (around line 1154) 4. hover over the call to CreateDataSet (which has xml documentation in both its interface and implementation,) //exp: the documented call to CreateDataSet() //act: the default help insight dialog with no documentation // Problem is bad XML in DbxUtils.pas, line 118. There is an closing "</c>" tag, but no opening "<c>" tag. The closing tag should be removed. QC #: Date Reported: Area: 96472 7/21/2011 Demos\Other Description: Steps: [QC Short Description] problems with an expert, downloaded from SVN Samples\Delphi\VCL\ToolsAPI\Productivity\ [QC Description] problem when adding XML comments to the function for which between the closing bracket and the argument is blank. example function Sample ( A, B: Integer; C: string = 'NULL' ): boolean; This is a serious problem, given that not all share a certain Delphi syntax. is solved as // original function ParseCPPDeclaration(const Declaration: string): string; var RoutineDeclaration: TRoutineDeclaration; begin RoutineDeclaration := ParseCPP(Declaration); Result := RoutineDeclaration.XML; RoutineDeclaration.Free; end; // change to function ParseCPPDeclaration(const Declaration: string): string; var RoutineDeclaration: TRoutineDeclaration; S: string; begin S := StringReplace(Declaration, ' ', '', [rfReplaceAll]); RoutineDeclaration := ParseCPP(S); Result := RoutineDeclaration.XML; problems with an expert, downloaded from SVN Samples\Delphi\VCL\ToolsAPI\Productivity\ 1. write a blank function Sample ( A, B: Integer; C: string = 'NULL' ): boolean; 2. write ///

Upload: dodiep

Post on 20-Mar-2019

394 views

Category:

Documents


1 download

TRANSCRIPT

FixListforEmbarcaderoDelphiXE2andC++BuilderXE2 

This includes the list of fixes in the release of Delphi XE2 and C++Builder XE2 in August 2011. 

QC #:

Date Reported:

Area:

87474 8/23/2010 Demos Description: Steps: [QC Short Description] HelpInsight is not working for source code comments [QC Description] XML Documentation for Help Insight is not being displayed correctly QC Entry 87474

1. Open the DbxDataPump project from https://radstudiodemos.svn.sourceforge.net/svnroot/radstudiodemos/branches/RadStudio_XE/Delphi/Database/dbExpress 2. open ..\Utils\DbxUtils.pas 3. go to the implementation of function GetValue() (around line 1154) 4. hover over the call to CreateDataSet (which has xml documentation in both its interface and implementation,) //exp: the documented call to CreateDataSet() //act: the default help insight dialog with no documentation // Problem is bad XML in DbxUtils.pas, line 118. There is an closing "</c>" tag, but no opening "<c>" tag. The closing tag should be removed.

QC #: Date Reported: Area:96472 7/21/2011 Demos\Other

Description: Steps:[QC Short Description] problems with an expert, downloaded from SVN Samples\Delphi\VCL\ToolsAPI\Productivity\ [QC Description] problem when adding XML comments to the function for which between the closing bracket and the argument is blank. example function Sample ( A, B: Integer; C: string = 'NULL' ): boolean; This is a serious problem, given that not all share a certain Delphi syntax. is solved as // original function ParseCPPDeclaration(const Declaration: string): string; var RoutineDeclaration: TRoutineDeclaration; begin RoutineDeclaration := ParseCPP(Declaration); Result := RoutineDeclaration.XML; RoutineDeclaration.Free; end; // change to function ParseCPPDeclaration(const Declaration: string): string; var RoutineDeclaration: TRoutineDeclaration; S: string; begin S := StringReplace(Declaration, ' ', '', [rfReplaceAll]); RoutineDeclaration := ParseCPP(S); Result := RoutineDeclaration.XML;

problems with an expert, downloaded from SVN Samples\Delphi\VCL\ToolsAPI\Productivity\ 1. write a blank function Sample ( A, B: Integer; C: string = 'NULL' ): boolean; 2. write ///

RoutineDeclaration.Free; end; DelphiParserImpl.pas // original function ParseDelphiDeclaration(const Declaration: string): string; var RoutineDeclaration: TRoutineDeclaration; begin RoutineDeclaration := Parse(Declaration); Result := RoutineDeclaration.XML; RoutineDeclaration.Free; end; // change to function ParseDelphiDeclaration(const Declaration: string): string; var RoutineDeclaration: TRoutineDeclaration; S: string; begin S := StringReplace(Declaration, ' ', '', [rfReplaceAll]); RoutineDeclaration := Parse(S); Result := RoutineDeclaration.XML; RoutineDeclaration.Free; end; please correct example. It would be nice if the new version of Delphi it would be a standard feature. QC Entry 96472 QC #: Date Reported: Area:28624 4/30/2006 Demos\Other

Description: Steps:[QC Short Description] docking demo is broken, was ok in delphi7 [QC Description] the docking demo behaves strangely sometimes, is broken other times, compared to delphi7 version of the docking demo. tab-sheet host: using the delphi7 demo, create a floating host with some tabs. drag a new client over the tabsheets, and you get only one dock-rect allowed - drop the new client and it's added as a new page. good. now try with the d2006 demo. when you drag the new client over, you get additional possibilities for dock-rects: top, bottom, left, right, centre. all of those do weird stuff. the new client is not added in a logical way to the others. instead, the new client and one of the old ones gets combined, and kicked out as a floating pair. conjoin host: using delphi7 demo, create the following arrangement of tiles in a floating host: wide rectangle on top, tall rectangles underneath on the left and on the right: AA BC BC now dock a new client into the bottom half of rectangle C, to make this arrangement: AA BC BD works fine. now try with the D2006 demo. when dropping D onto C, the host ejects C, and we're left with two floating hosts, one containing A and

1. open ($BDS)\Demos\DelphiWin32\VCLWin32\Docking\dockex.dpr 2. click the "White" toolbutton. 3. move the "White" window to a convenient location 4. click the "Blue" toolbutton. 5. dock the"Blue" window into the Right-hand Half of the white window. 6. click the "Green" toolbutton 7. dock the "Green" window into the Right-hand Half of the docked blue window. 8. click the "Lime" toolbutton 9. dock the "Lime" window into the Right-hand Half of the docked blue window. Exp: All four windows will be docked together Act: The green and lime windows jump out of the other docked group (See image attachments 1_xxxx 2_xxxx 3_xxxx) Note that if the lime window is into either the white or the blue window results are as expected. Close app and retry with tabbed docking: 1. click the "White" toolbutton. 2. move the "White" window to a convenient location 3. click the "Blue" toolbutton. 4. dock the"Blue" window into the center of the white window to tab-dock. 5. click the "Green" toolbutton 6. dock the "Green" window into the center of the tab-docked blue window to add as a tab. Exp: The green window will be added as a third tab to the group Act: The blue and green windows jump out of the white window and form their own tabbed duo. (See image attachments A_xxxx - D_xxxx) Tested in RAD Studio 2007 with identical results (using the demo from BDS2006, since I don't see it in the RAD Studio distribution)

B, the other containing C and D. i am very nervous about tapping into the docking provisions of the VCL on account of these differences. if i add docking to my app, will i need to rewrite it with each new update of the VCL? QC Entry 28624 QC #: Date Reported: Area:88996 10/15/2010 Demos\Other

Description: Steps:[QC Short Description] RichEdit demo project and ITE compatibility [QC Description] Why was the RichEdit sample project that ships with Delphi XE in C:\Users\Public\Documents\RAD Studio\8.0\Samples\Delphi\VCL\RichEdit was modified compared to the same demo that ships with Delphi 2010 (and older versions) in C:\Users\Public\Documents\RAD Studio\7.0\Demos\DelphiWin32\VCLWin32\RichEdit Previously, the demo consisted of a RichEdit project and three resource DLL files that would produce RichEdit.DEU, RichEdit.ENU, and RichEdit.FRA, in the same way the Integrated Language Environment does, and quite compatible with it. The "new" (and in my view degraded) version in Delphi XE produces the RichEdit.exe executable, but resource DLL projects that have been manually renamed to RichEditDEU.dll, RichEditENU.dll, and RichEditFRA.dll. No more locale as file extention, but part of the filename in Delphi XE. Huh? Why this change? As a consequence of this manual renaming, someone also had to go through the trouble of changing the implementation in the reinit.pas unit, making it incompatible with the ITE and ETM language translation tools in Delphi. I really do not understand why this was needed... QC Entry 88996

Open the RichEdit sample project, and try to add a new language using Project | Language - Add Language. It will not recognise or pick up the existing languages in the Delphi XE edition of the sample project. Compare this to the Delphi 2010 edition, which worked fine and was compatible with the ITE.

QC #: Date Reported: Area:42269 3/10/2007 Documentation

Description: Steps:[QC Short Description] Need links to enums [QC Description] TPanel.DragMode Property has no link to values QC Entry 42269

Start a VCL-project Drop a Tpanel onto the form Click into combo of DragMode property (text of dmAutomatic will be selected) press F1 ms-help://borland.bds5/delphivclwin32/ExtCtrls_TPanel_DragMode.html will be occurred as expected. But, try to find a list of Potential Values (dmAutomatic, dmManual) --- NO try to find a link to ms-help://borland.bds5/delphivclwin32/Controls_TDragMode.html where this values are listed --- NO BTW, the description of effect of selecting any of them is no on both pages, while this would be also a good feature .

QC #: Date Reported: Area:43408 3/28/2007 Documentation

Description: Steps:[QC Short Description] non stream file IO not in help [QC Description] Assignfile, rewrite, append, reset and system.closefile are not found in help when pressing F1, they do not appear in the index either. QC Entry 43408

var afile : file;] astring : string; begin assignfile(afile,'c:\test'); rewrite(afile); writeln(afile,'test'); reset(afile); readln(afile,astring); append(afile); writeln(afile,'test2'); closefile(afile); end; Actual: highlight any of the functions Assignfile, rewrite, reset, append,closefile (a closefile function is found under the IFileIsInUse but thats not the one in question) expected: Many people still use this IO method as its simple for beginners, and with no docs, its hard for them to follow.

QC #: Date Reported: Area:76397 8/4/2009 Documentation

Description: Steps:[QC Short Description] swscanf documentation missing format specifiers, esp. for wide string [QC Description] The documentation page for sscanf, swscanf states "Note: For details on format specifiers, see scanf.", but there is no such info on the scanf page. A more serious problem is that there is nothing on the swscanf page that informs the programmer that swscanf considers the "s" (little s) specifier to refer to a two-byte character (wchar_t), rather than requiring the capital s or "ls" (little l, little s) to indicate that a pointer to a two-byte character is being passed. QC Entry 76397

String str = "2We"; wchar_t daystr[4]; int no; // this works int resultLittleS = swscanf(str.c_str(), L"%1d%2s", &no, daystr); // this does not int resultBigS = swscanf(str.c_str(), L"%1d%2S", &no, daystr); (by providing these steps, I am not suggesting that the behavior is incorrect, but rather that this is the behavior that should be documented. Obviously, this is C++ code, not Delphi, but I could not find a C++ Builder documentation section)

QC #: Date Reported: Area:86158 7/11/2010 Documentation

Description: Steps:[QC Short Description] Json convert to object error [QC Description] Added by Sysop <<<<<<<<<<< Please see comments of QC for workaround. >>>>>>>>>>> I see a article( http://www.andreanolanusse.com/blogpt/utilizando-generics-para-transformacao-generica-de-objetos-em-datasnap-2010/), I write a demo to test it. i define the utils class: TmyJsonUtils(see steps), it used for converting between json and object. 1.if unremark the code of the btnJsonToObjectClick, then run btnObjectToJsonClick and btnJsonToObjectClick, it is all ok 2.i define the TCustomer(not inherited from TmyJsonUtils) inherited from TObject, when I convert jsonvalue to TCustomer, it happen error:Internal: Cannot instantiate type Customer.TCustomer. (see steps 3.clientTest description ) 3.I define the TCustomer inherited from TmyJsonUtils. when I run: cst:= TmyJsonUtils.JsonToObject<TCustomer>(jv); it is also happen error. but I run: cst:= TCustomer.JsonToObject<TCustomer>(jv); it is OK. I do not know whether is it a bug? or what should I convert it? QC Entry 86158

see attachments 1. define two class: TmyJsonUtils and TCustomer: TCustomer = class// (TmyJsonUtils) private FName: string; public property Name: string read FName write FName; end; TmyJsonUtils = class public class function ObjectToJson<T: class>(obj: T): TJsonValue; class function JsonToObject<T: class>(json: TJsonValue): T; end; class function TmyJsonUtils.ObjectToJson<T>(obj: T): TJsonValue; var marshal: TJsonMarshal; begin ... marshal:= TJsonMarshal.Create(TJsonConverter.Create); try Result:= marshal.Marshal(obj); finally marshal.Free; end; ... end; class function TmyJsonUtils.JsonToObject<T>(json: TJsonValue): T; var unmarshal: TJsonUnmarshal; begin ... unmarshal:= TJsonUnmarshal.Create; try Result:= T(unmarshal.Unmarshal(json)); finally unmarshal.Free; end; end; 2. server: function TServerMethods1.getCustomer: TJsonValue; var cst: TCustomer; begin cst:= TCustomer.Create; cst.Name:= 'I am coming from DSServer'; cst.Age:= 15; Result:= TmyJsonUtils.ObjectToJson<TCustomer>(cst); end; 3. clientTest: procedure TForm1.btnObjectToJsonClick(Sender: TObject); var proxy: TServerMethods1Client; jv: TJSONValue; cst: TCustomer; begin SQLConnection1.Open; proxy:= TServerMethods1Client.Create(SQLConnection1.DBXConnection); jv:= proxy.getCutomer; cst:= TmyJsonUtils.JsonToObject<TCustomer>(jv); // error-->Internal: Cannot instantiate type Customer.TCustomer. showMessage(cst.ToString); cst.Free; proxy.Free; end; end;

QC #: Date Reported: Area:90523 12/27/2010 Documentation

Description: Steps:[QC Short Description] TMaskEdit Documentation [QC Description] Documentation on the basic TMaskEdit does not assist in creating a custom mask. The sample masks do not include a currency mask, and I am trying to create a simple dollars and cents mask. (I wonder if there is a reason this common need is not included in the masks?) The documentation contains the following, but it never actually explains the mask.

Place a TMaskEdit component on a form, place the cursor in the Editmask property, open the property editor and press F1.

"Define your own masks for the edit box. You can use special character to specify the mask; for a listing of those characters, see the Mask.TCustomMaskEdit.EditMask property." In fact, the "listing of those characters" is not found at the location indicated - or anywhere else that I could find. QC Entry 90523 QC #: Date Reported: Area:85170 6/6/2010 Documentation

Description: Steps:[QC Short Description] Documentation of DeallocateHWND should mention threading issue [QC Description] The documentation of DeallocateHwnd should mention that it should only be called from the same thread as the corresponding AllocateHwnd call had been made. QC Entry 85170

QC #: Date Reported: Area:87827 9/6/2010 Documentation

Description: Steps:[QC Short Description] help incorrect in subversion help topic re: readme file [QC Description] ms-help://embarcadero.rs_xe/rad/IDE_Changes_for_XE.html "Subversion is immediately available in the IDE after you open a project containing files that are under version control by Subversion. You can also start by checking out a working copy of the files in a Subversion repository. If you need to create a Subversion repository, see instructions in the README.txt file in the /bin/Subversion directory." No such help exists in the readme QC Entry 87827

QC #: Date Reported: Area:87954 9/10/2010 Documentation

Description: Steps:[QC Short Description] SysErrorMessage should be linked from System.GetLastError [QC Description] Hello, ms-help://borland.bds5/delphivclwin32/System_GetLastError.html should also link to SysErrorMessage so a reader can find out easily that this will get him a proper error message the easy way. QC Entry 87954

QC #: Date Reported: Area: 88029 9/13/2010 Documentatio

n Description: Steps: [QC Short Description] E2528 needs to be documented [QC Description] The error E2528 is not documented in "Error and Warning Messages (Delphi)"

http://docwiki.embarcadero.com/RADStudio/XE/en/Error_and_Warning_Messages_%28Delphi%29_Index Furthermore consider mentioning in the Parameterized Methods section http://docwiki.embarcadero.com/RADStudio/XE/en/Declaring_Generics#Parameterized_Methods that constructors and destructors are not supported. Example that leads to E2528 program E2528Test; {$APPTYPE CONSOLE} type TFoo<T: class> = class(TObject) constructor CreateEx<T>; end; begin end. QC Entry 88029 QC #: Date Reported: Area:88593 10/3/2010 Documentation

Description: Steps:[QC Short Description] Working with lists link not working [QC Description] ms-help://embarcadero.rs_xe/vcl/Classes.TStringList.html contains a link to "working with lists". At least in the german version it's not working. Upd.: This is the link which doesn't work: /VCL/XE/d/index.php?title=Rad_de:Mit_Listen_arbeiten&action=edit&redlink=1 When entering this link directly I get "This page cannot be displayed" QC Entry 88593

QC #: Date Reported: Area:89065 10/18/2010 Documentation

Description: Steps:[QC Short Description] ms-help://embarcadero.rs_xe/vcl/SysUtils.TEncoding.html contains broken link [QC Description] ms-help://embarcadero.rs_xe/vcl/SysUtils.TEncoding.html contains a broken link "Verwendung von TEncoding f· Unicode-Dateien " in the german version (didn't test the others). Error message is rad.DE:Verwendung von TEncoding f· Unicode-Dateien (page does not exist) when hovering over the link. Can such links get auto identified? SInce this is the 2d I'm reporting I'm not sure if reporting each of those separately makes much sense.QC Entry 89065

QC #: Date Reported: Area:90415 12/20/2010 Documentation

Description: Steps:[QC Short Description] German translation of System.Copy is a bit misleading [QC Description] The translation of this help topic:

ms-help://borland.bds5/delphivclwin32/System_Copy.html to German is a bit misleading in the following sentence (this applies to the docwiki XE versio as well): The substring or subarray is a unique copy (that is, it does not share memory with S; if the elements of the array are pointers or objects, these are not copied as well.) Der Teilstring oder das Teil-Array ist eine eindeutige Kopie (d.h., Speicher wird nicht gemeinsam mit S genutzt, obwohl Zeiger- oder Objektelemente des Arrays nicht kopiert werden). Look at the text in parenthesis. I can understand the english text and its meaning but the german one puzzled me and I'm a native German speaker! QC Entry 90415 QC #: Date Reported: Area:

34694 10/2/2006 Documentation

Description: Steps:[QC Short Description] ListView OwnerDraw does nothing [QC Description] ListView's property OwnerDraw seems to have no effect. The documentation claims that once it is set to true, event OnDrawItem will be fired for drawing Items, but the event is never called no matter what happens. SYSOP: I actually believe this is an error in the documentation as OnDrawItem is never fired. Sample application included ms-help://borland.bds4/bds4win32api_win32/html/DelphiWin32_ComCtrlsTCustomListViewOnCustomDrawItemEvent.htmms-help://borland.bds4/bds4win32api_win32/html/DelphiWin32_ComCtrlsTCustomListViewOwnerDrawProperty.htm QC Entry 34694

Create a TListView on a form. Set OwnerDraw to true and "something" into the OnDrawItem event. "something" will never run.

QC #: Date Reported: Area: 74632 6/5/2009 Documentatio

n Description: Steps: [QC Short Description] Description of argument 'CharIndex' for TEncoding.GetChars is wrong [QC Description] In the documentation for TEncoding.GetChars the CharIndex argument is incorrectly described as the "maximum number of characters to store". It is really the index in 'Chars' to start writing results into. Here is a quick link to the page in question: ms-help://embarcadero.rs2009/delphivclwin32/SysUtils_TEncoding_GetChars@PByte@Integer@[email protected] Entry 74632

QC #: Date Reported: Area:98126 8/25/2011 Documentation

Description: Steps:[QC Short Description] MkDir doesn't say that higher leven dirs don't get created as well [QC Description] This help topic: ms-help://embarcadero.rs_xe/vcl/System.MkDir.html doesn't tell the reader that it will only create the last directory (unlike the linked ForceDirectories). It would be good to name this limitation!QC Entry 98126

QC #: Date Reported: Area:67539 10/4/2008 Documentation\Online Help

Description: Steps:[QC Short Description] Several linker options are undocumented [QC Description] Several of the Delphi options under Project Options, Linking are undocumented. The list includes: Set extra PE header flags Set extra PE header optional flags Set OS version fields in PE header Set subsystem version fields in PE header Set user version fields in PE header QC Entry 67539

Go to Project, Options, Delphi Compiler, Linking and hit F1 and note the missing items there

QC #: Date Reported: Area:69657 12/6/2008 Documentation\Online Help

Description: Steps:[QC Short Description] {$O+} not in the index [QC Description] {$O+} should be in the index (as every such compiler option should) and link to ms-help://embarcadero.rs2009/devcommon/compdirsoptimization_xml.html It's fine that it's listed on the list of compiler options (which should get another column showing immediatelly the notion like {$O+/-}) but doesn't help much when it's found in the wild. QC Entry 69657 O

1. open help 2. go to index page 3. type in the search field: {$O+} 4. wonder why nothing is found

QC #: Date Reported: Area:80493 12/18/2009 Documentation\Online Help

Description: Steps:[QC Short Description] F1 in Build pane no longer shows help for errors or warnings [QC Description] In past versions of Delphi, pressing F1 in the build results window (or pane) used to bring up Delphi's Help showing more information about the selected error or warning. See Steps. Added by Sysop <<<<<<<<<<<<<<<< The help content for E2081 is missing. E2081 Assignment to FOR-Loop variable 'I' >>>>>>>>>>>>>>>> QC Entry 80493

In Delphi 2010... 1) Go to File > New > VCL Forms Application - Delphi 2) Place a Button on the form 3) Double-click Button1 to get to its OnClick event handler 4) Declare the following var section: var I, J: Integer; S: String; 5) Paste or write the following code: for I := 0 to 10 do if I = 3 then Inc( I ) else S := S + IntToStr( I ) + ' '; 6) Compile the project. 7) The first message you should receive is something like this: [DCC Error] Unit1.pas(33): E2081 Assignment to FOR-Loop variable 'I' 8) Click the error and press F1. Instead of showing you page E2081 in the help, you instead get a generic help page with the title "DCC32.EXE, the Delphi Command Line Compiler". Nothing about your specific problem is highlighted. However, if you type E2081 in the Index page of the Help, you'll see the page exists. 9) To further illustrate this problem, delete the lines starting with "if" and ending in "else" so that you have one statement in the for loop. 10) Compile the project. 11) The first message should be something like: [DCC Hint] Unit1.pas(28): H2164 Variable 'J' is declared but never used in 'TForm1.Button1Click' 12) Again, click the message and press F1 and you get the same help page, instead of the H2164 help page. Typing H2164 in the Index tab of the help will show you the page you really wanted to see. This is broken functionality as of Delphi 2010. I hadn't seen it before this version. Please fix it. :)

QC #: Date Reported: Area:82442 2/24/2010 Documentation\Online Help

Description: Steps:[QC Short Description] Project page item missing in Project Menu

The item is missing on the menu. Added by Sysop

[QC Description] According to the Help there should be an item on the Project Menu called Project Page. It should open the project Page option dialog that lets you designate a html-file that will open first when you open the project later on. Added by Sysop <<<<<<<<<<<<<< This documentation issue is about Delphi for .NET which has been already removed on 2009/2010. >>>>>>>>>>>>>> QC Entry 82442

<<<<<<<<<<<<<<<<<<< The URL in the help is ms-help://embarcadero.rs2010/rad/Project_Page_Options.html >>>>>>>>>>>>>>>>>>>

QC #: Date Reported: Area:88549 9/30/2010 Documentation\Online Help

Description: Steps:[QC Short Description] Deploy to the Cloud - missing information [QC Description] The online help page should mention that the destination folder should be a shared folder on the remote EC2 server (I missed that step earlier). QC Entry 88549

The EC2 cloud machine it just a server, and you need to define a directory on that machine where your files will end up being deployed to. So, if I want to deploy to a directory called "Bob", I need to make a directory on the server, and make it shareable under the name "Bob", and need to make sure Administrator can write to it. OK, so I've made a directory Bob, set up sharing and made sure Administrator can write to it. When you login to the EC2 machine, that login will connect to the Windows Shared directory (not very secure, I know) and upload the files. This may mean that you need to disable the firewall for a while (in order to allow the incoming connection). From my laptop, I could deploy quite easily to the EC2 shared folder Icreated at the server, and my file is already up there as well now. The missing bit of information from the on-line Help was the fact that the destination folder on the EC2 machine should be a shared folder (so the upload can take place).

QC #: Date Reported: Area:90576 12/30/2010 Documentation\Online Help

Description: Steps:[QC Short Description] Wrong mentioning of NIL for key parameter [QC Description] ms-help://embarcadero.rs_xe/vcl/Registry.TRegistry.OpenKeyReadOnly.html contains (at least in the german verion) the following sentence: Wenn Key nil (Delphi) oder NULL (C++) ist, wird die Eigenschaft CurrentKey auf den in der Eigenschaft RootKey festgelegten Schl·sel gesetzt. In English this means that if the key parameter of the function is set to NIL CurrentKey will be set to RootKey. Since key is a string it cannot be NIL in Delphi. It can only be empty! ('') QC Entry 90576

Open ms-help://embarcadero.rs_xe/vcl/Registry.TRegistry.OpenKeyReadOnly.html and read it. Then create a TRegistry instance in your code and try to call OpenKeyReadOnly with NIL as parameter. Compile and see the compiler complaining that key is a string and no pointer.

QC #: Date Reported: Area:90575 12/30/2010 Documentation\Online Help

Description: Steps:[QC Short Description] SysUtils.GetHomePath not documented [QC Description] ms-help://embarcadero.rs_xe/vcl/SysUtils.GetHomePath.html doesn't contain any description about what the function does. This is true at least for the german version. QC Entry 90575

Open ms-help://embarcadero.rs_xe/vcl/SysUtils.GetHomePath.html in the help viewer.

QC #: Date Reported: Area:

90761 1/9/2011 Documentation\Online Help

Description: Steps:[QC Short Description] ms-help://embarcadero.rs_xe/vcl/SysUtils.EInvalidOpException.html unclear [QC Description] The following help topic: ms-help://embarcadero.rs_xe/vcl/SysUtils.EInvalidOpException.html contains only inherited information from its base class so it doesn't tell the reader in which situation to expect or raise EInvalidOpException. A single sentence explaining this would help a lot here. This is at least true for the German version. QC Entry 90761

Read: ms-help://embarcadero.rs_xe/vcl/SysUtils.EInvalidOpException.html

QC #: Date Reported: Area:96198 7/14/2011 Documentation\Online Help

Description: Steps:[QC Short Description] Help for TCustomIniFile.ReadFloat is wrong and incomplete [QC Description] At least in the german help (with help update 3 installed) the following topic: ms-help://embarcadero.rs_xe/vcl/IniFiles.TCustomIniFile.ReadFloat.html is wrong because the first sentence of the description translates to this english sentence: "Reads a boolean value from a INI-file". Float is not boolean... And the topic is incomplete, because it doen't tell the reader how the decimal point is being handled. Is it fix a . (point) or is the system setting taken? If the latter, can I override this somehow, perhaps by assigning something to FormatSettings from SysUtils? QC Entry 96198

Open the german help with update 3 applied. Enter this URL: ms-help://embarcadero.rs_xe/vcl/IniFiles.TCustomIniFile.ReadFloat.html Read it.

QC #: Date Reported: Area:80506 12/19/2009 Documentation\Online Help

Description: Steps:[QC Short Description] TFormatSettings definition wrong/abbreviated [QC Description] The array parts of the TFormatSettings record as shown here: ms-help://embarcadero.rs2010/vcl/SysUtils.TFormatSettings.html are displayed the wrong way and the C++ declaration is nearly empty. Why is it a class in C++ anyway? This is with help update 1 applied. QC Entry 80506

QC #: Date Reported: Area:83100 3/17/2010 Documentation\Online Help

Description: Steps:[QC Short Description] Missing/inaccurate documentation for IBQuery.RecordCount property [QC Description] The property TIBQuery.RecordCount isn't documented and redirects to

the TDataSet.RecordCount docs. In TIBQuery, reading RecordCount returns the number of records fetched from the database so far, which may not be what you are expecting. It would be nice if the behaviour was clarified in the docs. See this discussion for further information: https://forums.embarcadero.com/thread.jspa?threadID=34457&tstart=0QC Entry 83100 QC #: Date Reported: Area:86000 7/6/2010 Documentation\Online Help

Description: Steps:[QC Short Description] Contents tree is inconsistent / illogical - language references under IDE [QC Description] In current help (after update 3) in the contents tree the "Delphi reference" and "C++ reference" subtrees are listed under "RAD studio IDE" while "VCL reference" and "Code samples" are one level higher, under "RAD studio". IMO "Delphi reference" (and C++ ref) should be under "RAD studio" too, only "Delphi Class Explorer Topics" should stay under "RAD studio IDE". QC Entry 86000

QC #: Date Reported: Area:89017 10/16/2010 Documentation\Online Help

Description: Steps:[QC Short Description] ms-help://embarcadero.rs_xe/vcl/Classes.TStrings.Encoding.html is useless [QC Description] ms-help://embarcadero.rs_xe/vcl/Classes.TStrings.Encoding.html only says that EMBT has no further information. At least in the german version. QC Entry 89017

QC #: Date Reported: Area:89016 10/16/2010 Documentation\Online Help

Description: Steps:[QC Short Description] ms-help://embarcadero.rs_xe/vcl/Classes.TFileStream.html contains invalid link [QC Description] ms-help://embarcadero.rs_xe/vcl/Classes.TFileStream.html (at least in german translation) contains a invalid link in the "view also" section. It's the first one and named "Den Antwortinhalt festlegen" in german. Hovering over it DExplorer says Rad de:Den Antwortinhalt festlegen (page does not exist) QC Entry 89016

QC #: Date Reported: Area:89035 10/17/2010 Documentation\Online Help

Description: Steps:[QC Short Description] Invalid link in help file - "Date/Time Support" [QC Description]

1) open delphi help (document explorer) 2) go to ms-help://embarcadero.rs_xe/vcl/System.TDateTime.html 3) click the second link from the bottom. (Date/Time Support)

ms-help://embarcadero.rs_xe/rad/Date/Time_Support.html linked from ie. ms-help://embarcadero.rs_xe/vcl/System.TDateTime.html shows "Cannot display page" error in window. QC Entry 89035 QC #: Date Reported: Area:83499 3/31/2010 Documentation\Online Help

Description: Steps:[QC Short Description] Using Multiple Server Data Modules does not discuss dbExpress DataSnap [QC Description] The online documentation for "Using Multiple Server Data Modules" (http://docwiki.embarcadero.com/RADStudio/en/Using_Multiple_Server_Data_Modules) does not discuss how to do this with the new dbExpress DataSnap. It only discusses the feature for DCOM based DataSnap. QC Entry 83499

Go to http://docwiki.embarcadero.com/RADStudio/en/Using_Multiple_Server_Data_Modules and try to find information relating to doing this with a TDMServerContainer or TDSServerModule.

QC #: Date Reported: Area:

96105 7/12/2011 Documentation\Online Help

Description: Steps:[QC Short Description] Help for automation expert incomplete [QC Description] Added by Sysop <<<<< [Automation Object or ASP Object Wizard - Threading Model] http://docwiki.embarcadero.com/RADStudio/XE/en/Automation_Object_or_ASP_Object_Wizard>>>>> The following help topic (at leas in its german translation): ms-help://embarcadero.rs_xe/rad/Experte_f?_Automatisierungsobjekte.html which is for the Automatiopn Object creation wizard lacks the description of the simple threading model option. The other four are documented though. QC Entry 96105

1. open a vcl application project 2. click file/new/active x 3. select automation object to start the wizard 4. look at the options for the threading modell (5 options) 5. open the help topic 6. look at how the threading model is documented (4 options only)

QC #: Date Reported: Area:65405 8/7/2008 Documentation\Online Help

Description: Steps:[QC Short Description] Online Help is incomplete and also nearly unusable [QC Description] TField's OnGetText event has a boolean parameter named DisplayText. But the online help has no reference to what this parameter is all about. With hope, when you select the link to TFieldGetTextEvent, yes... you get: This is type DB.TFieldGetTextEvent. Now, the stranger thing is this; TField.OnGetText Event description section has two paragraphs. These two paragraphs are ,word by word, an exact duplication of, Delphi 3's 1st and 3rd paragraphs (no typo, 1997 Delphi 3). Guess what? The second paragraph of Delphi 3 documents all the missing information. From Delphi 3 help; "The Sender parameter is the field component. The Text parameter receives the formatted text that is used by the DisplayText or Text property. The DisplayText parameter indicates whether the text will be used for display purposes only, or whether the string will be used for editing purposes."

See description

Not being able to provide a decent documentation for a 13 years old product, with 3 major updates after more than 1 years have passed till its offering is one thing, crippling existing documentation is an other thing. Note that, this report is not about TField's OnGetText, it is about documentation. I have refferred to Delphi 3's help countless times. Unfortunately I do not own a more recent Delphi than the 3rd one and it is missing lots of new technologies. In short, I want decent documentation, and I want it with Delphi 2007, not with a future version. Is it too much to ask for? QC Entry 65405 QC #: Date Reported: Area:77416 9/6/2009 Documentation\Online Help

Description: Steps:[QC Short Description] Class documentation missing hierarchy [QC Description] In Delphi 2009 and earlier, class documentation included a hierarchy list documenting a class' ancestors and providing links to those ancestor classes. In D2010 help, links to ancestors are inconsistent, and usually only reference the parent class. QC Entry 77416

Using TStringList as an example, compare these two help topic in D2010 and D2007: ms-help://embarcadero.rs2010/vcl/Classes.TStringList.html ms-help://borland.bds5/delphivclwin32/Classes_TStringList.html

QC #: Date Reported: Area:89637 11/13/2010 Documentation\Online Help

Description: Steps:[QC Short Description] Applying XE Help Update 1 deleted Windows SDK articles [QC Description] Applying XE Help Update 1 downloaded through Registered Users Download has deleted windows SDK articles from Help. I had to reinstall original XE Help files. QC Entry 89637

1. Make sure that you have Windows SDK installed 2. Run Help Update 1 3. After installing Windows SDK articles are no longer available

QC #: Date Reported: Area:

42542 3/13/2007 Documentation\Online Help\Component writers guide

Description: Steps:[QC Short Description] Creating a New Component Topic refers to .HLP [QC Description] ms-help://borland.bds5/devwin32/cwgcreatinganewcomponent_xml.html Content states: When you finish, the complete component includes the following files: A package (.BPL) or package collection (.DPC) file A compiled package (.DCP) file A compiled unit (.DCU) file A palette bitmap (.DCR) file A Help (.HLP) file HLP files are not supported in Delphi 2007 and must be MS HTML Help 2 and be installed and registered differently to be added to the overally Delphi 2007 help. QC Entry 42542

QC #: Date Reported: Area:

88991 10/15/2010 Documentation\Online Help\Whats new

Description: Steps: [QC Short Description] DocGenCLI.exe must be GenDocCLI.exe [QC Description] The documentation mentions DocGenCLI.exe (for example at ms-help://embarcadero.rs_xe/rad/Command_Line_Documentation_Generation_Tool.html or in the wiki at http://docwiki.embarcadero.com/RADStudio/en/Command_Line_Documentation_Generation_Tool)but this tool is called GenDocCLI.exe as mentioned at ms-help://embarcadero.rs_xe/rad/Documentation_Generation_Facility.html and in the wiki at http://docwiki.embarcadero.com/RADStudio/en/Documentation_Generation_Facility GenDocCLI.exe can be found in the RAD Studio\8.0\bin directory. QC Entry 88991

Open Help, go to "What's New in XE" and click on the Command Line Documentation Generation Tool link to see a reference to DocGenCLI.exe

QC #: Date Reported: Area:

86955 8/5/2010 Documentation\Online Help\Object Pascal

Description: Steps:[QC Short Description] Spelling error in compiler directive name SCOPEDEUNMS [QC Description] In the topic "Scoped Enums (Delphi)" ms-help://embarcadero.rs2010/rad/Scoped_Enums_(Delphi).html there is a spelling error in the directive's name, on line "Syntax {$SCOPEDEUNMS ON}, or {$SCOPEDENUMS OFF}" it is wrongly spelled SCOPEDEunMS instead of SCOPEDEnuMS in the "{$SCOPEDEUNMS ON}," part. Help update 3 installed. QC Entry 86955

QC #: Date Reported: Area:54822 11/14/2007 Documentation\Online Help\VCL

Description: Steps:[QC Short Description] VCL properties and methods are not indexed [QC Description] When you press F1 and go into the index tab and search for a method or property of a vcl component, let us say TControl for example, you will get a bunch of useless references to Windows documentation and other non relevant pages. I would expect that since the VCL is the primary programming library in Delphi, that I would be able to find all the methods and properties of all components indexed and easily available for quick reference. QC Entry 54822

For example I want to find the documentation of TControl.Parent. Press F1. Go into the Index tab. Type in "Parent" in the Look for: edit. Expected result: All references to Parent method displayed. What I got: A bunch of useless stuff.

QC #: Date Reported: Area:80887 1/6/2010 Documentation\Online Help\VCL

Description: Steps:[QC Short Description] Documentation for TGUID is not correct [QC Description] The documentation in the help file for System.TGUID is not correct QC Entry 80887

Go to the help entry for System.TGUID. The following information on the page is not correct (the structure is not right): "Delphi Information From System.pas TGUID = packed D1: Cardinal; D2: Word; D3: Word; end;" This information on the same page is not correct (doesn't add up to 32 hexadecimal digits): "D1 maps to the first 8 hexadecimal digits. D2 maps to the next 4 hexadecimal digits. D3 maps to the next 4 hexadecimal digits. D4 maps to the final 8 hexadecimal digits"

QC #: Date Reported: Area:46140 5/17/2007 Documentation\Online Help\VCL

Description: Steps:[QC Short Description] Images missing from TBrushStyle documentation [QC Description] In the help for TBrushStyle, there is a table listing the possible values of TBrushStyle along with a space for the pattern that is to be used. However, the images of the patterns are missing making the table useless. SYSOP: D2007 help is at: ms- help://borland.bds5/delphivclwin32/Graphics_TBrushStyle.html D2006 help is at: ms-help://borland.bds4/bds4win32api_win32/html/DelphiWin32 _GraphicsTBrushStyleType.htm The help content is D2006 is also malformed. The D2007 help has no real content. (nor does the 2006 content for that matter). QC Entry 46140

Look up the help for TBrushStyle and examine the table.

QC #: Date Reported: Area:13283 5/31/2005 Documentation\Online Help\VCL

Description: Steps:[QC Short Description] No help for compents in ShellCtrls Unit [QC Description] The following are on the Samples Tool pallete TShellChangeNotifier TShellListView TShellComboBox TShellTreeView and have no help or comments in the source code QC Entry 13283

QC #: Date Reported: Area:80668 12/26/2009 Documentation\Online Help\VCL

Description: Steps:[QC Short Description] New TFieldType types not descibed [QC Description] There is no detail description for the new TFieldType types ftTimeStampOffset, ftObject, ftSingle QC Entry 80668

QC #: Date Reported: Area:

39886 2/3/2007 Documentation\Online Help\Main help

Description: Steps:[QC Short Description] TStringList.IndexOf docs are incorrect [QC Description] The Help for TStringList.IndexOf states "Call IndexOf to obtain the position of the first occurrence of a string that matches S." But this statement is correct ONLY if TStringList.Sorted=False and/or

1. Create a TStringList. 2. Set Sorted=True and Duplicates=dupIgnore. 3. Add 10 duplicate strings to the list 4. Call IndexOf() with the same string as was added to the list. The IndexOf return value should be 0 according to the docs/Help, but it will be an integer near the middle of the TStringList.Count, probably 5.

TStringList.Duplicates=dupIgnore or dupError. Otherwise (when Sorted=True and Duplicates=dupAccept) IndexOf merely returns the index of *any* string in the list which matches the parameter S of the IndexOf() call. Why? Because if Sorted=True, calling IndexOf() internally calls Find(), and Find uses a binary search to locate *any* string matching the passed string parameter. In a TStringList where duplicates are allowed, this will not always be the *first* matching string. QC Entry 39886 QC #: Date Reported: Area:

39052 1/20/2007 Documentation\Online Help\Main help

Description: Steps:[QC Short Description] Example for AllocateHwnd and DeallocateHWND missing [QC Description] The examples in the D7 help for the AllocateHWnd and DeallocateHwnd routines are missing. They should be accessible from these help pages: ms-help://borland.bds5/bds5win32api_win32/html/DelphiWin32_ClassesAllocateHWndRoutine.htm ms-help://borland.bds5/bds5win32api_cpp/html/CPPWin32_classesAllocateHWndRoutine.htm ms-help://borland.bds5/bds5win32api_win32/html/DelphiWin32_ClassesDeallocateHWndRoutine.htmms-help://borland.bds5/bds5win32api_cpp/html/CPPWin32_classesDeallocateHWndRoutine.htm I've added a Word document containing the missing examples as an attachment. QC Entry 39052 [D7HELP]

QC #: Date Reported: Area:

75237 6/24/2009 Documentation\Online Help\Main help

Description: Steps:[QC Short Description] Inaccurate documentation on "Disabling Themes in the IDE and in Your Application" [QC Description] This documentation is inaccurate and/or incomplete. The file mentioned ($(IDE)\bin\bds.exe.manifest) does not exist, at least on my installation. Details from "Send feedback" link on help page: Project: RAD Studio (Common) Topic ID: disablethemes.xml Title: Disabling Themes in the IDE and in Your Application QC Entry 75237

See description

QC #: Date Reported: Area:

76550 8/9/2009 Documentation\Online Help\Main help

Description: Steps:[QC Short Description] VCL Reference link on Rad Studio main help page link to non-existant page [QC Description] On Rad Studio Main page ms-help://embarcadero.rs2010/rad/Main_Page.html QC Entry 76550

Click on VCL Reference link and you'll be showed with a non-existant page (which url is ms-help://embarcadero.rs2010/vcl/Main_Page)

QC #: Date Reported: Area:

76762 8/17/2009 Documentation\Online Help\Main help

Description: Steps:[QC Short Description] SO Suffix used for BPL not DCP [QC Description] Struggling to understand and use the Namespace and SO Suffix features. I honestly do not know whether this is as-designed or a bug, because the documentation is at the level of what to type instead of giving conceptual guidance. For me these issues are key. Perhaps not for others. 1. DPK compiles and creates DCP and BPL of different names. The BPL uses the SO Suffix (as I expected). The DCP does not. (Should it? Could you document that?) YES - done. 2. Related issue: the true difference between Default Namespace and Namespace Prefix is unclear. I think the documentation needs some use cases here. I can give you my use case : We maintain some open-source code, and update it occasionally. Use ZaphodsMap as the example. ZaphodsMap classes are used in Rubicon and WebHub. I want to use the SO Suffix to differentiate releases, so that we can help people avoid problems based on interface changes. I want to use the namespace idea to differentiate ZaphodsMap-in-Rubicn from ZaphodsMap-in-WebHub so that both products can be installed in the IDE at once, but with different source code (say Rubicon is released in August then ZaphodsMap changes then WebHub is released in September). I believe that this issue is central to massive global cooperation among component vendors. I am probably missing something ..... and/or this area is not fully tested. Please see screenshots and ask me if you want further details. I have not yet posted ZaphodsMap to CC because I wanted to sort this issue out in advance, but I can post it if anyone wants to look at specifics. Apologies if I am just being a dumb tired user. Hopefully not. QC Entry 76762

Search for namespace gives many matches, most seem to be about C++Builder eg ms-help://embarcadero.rs2010/rad/Defining_A_namespace.html Search for "so suffix" does not show me anything about the Project Options dialog or when to use it. Search for Project Options..... ms-help://embarcadero.rs2010/rad/Setting_Project_Options.html .... states the obvious about the UI with no details about which options to use when..... (Rushing now so I am probably missing some things) This page ms-help://embarcadero.rs2010/rad/Building_Packages.html says you can Add a package to a project - and that definitely does wierd things such as displaying the BPL file in hex in the editor window, and, still not making the project able to find the package. That's another story. If you want to see real trouble, try renaming a package a few times, using dots in the filename. Not sure what else to give for steps.

QC #: Date Reported: Area:

20347 10/20/2005 Documentation\Online Help\Main help

Description: Steps:[QC Short Description] No information on 'New IDE...' keymappings [QC Description] DeXter offers 'New IDE Classic' and 'New IDE EMacs' but they don't seem to be documented anywhere. QC Entry 20347

QC #: Date Reported: Area:89226 10/25/2010 Documentation\IDE Help Contexts

Description: Steps:[QC Short Description] Dialog DataBreakpoint - No help found for context 5645 [QC Description] In Dialog DataBreakpoint is Help button, but click on it produce exception --------------------------- Error

Add data breakpoint, click on Help button

--------------------------- No help found for context 5645. --------------------------- OK Details >> --------------------------- QC Entry 89226 QC #: Date Reported: Area:45300 5/1/2007 Documentation\IDE Help Contexts

Description: Steps:[QC Short Description] Automated Incident Report [QC Description] No help found for (none) No help topic for MessageDlg QC Entry 45300

Press CTRL-F1 over the word 'MessageDlg'

QC #: Date Reported: Area:81516 2/9/2010 11:29:24 AM Documentation\IDE Help Contexts

Description: Steps:No help found for "Remove Runtime Packages" dialog hcDRemoveRuntimePackages = 1419; QC AIR report 81516

Start IDE Create a Delphi VCL app Project | Options Select Packages page Check the "Build with runtime packages" checkbox Uncheck the "Embarcadero Ribbon Controls" in the list Add: ";vclribbon" to the end of the runtime package list (omit the quotes) Click OK Project | Options Select Packages page Check the "Embarcadero Ribbon Controls" in the list Unheck the "Embarcadero Ribbon Controls" in the list You get the "Remove Runtime Packages" dialog Click Help button EXP: Help on this dialog ACT: No help found for context

QC #: Date Reported: Area:81674 1/31/2010 Documentation\IDE Help Contexts

Description: Steps:[QC Short Description] No help for E2555 Cannot capture symbol [QC Description] Pressing F1 on "E2555 Cannot capture symbol" in the Messages pane gives an Error dialog: "No help found for cm_E2555_Delphi". QC Entry 81674 Update on FT build: currently brings up topic "DCC32.EXE, the Delphi Command Line Compiler" rather than an error.

1. Open the attached project (copied below). 2. Project | Syntax check 3. In the Messages pane, click on the line [Error] DocBugE2555;.dpr(14): E2555 Cannot capture symbol 'Rec' 4. Press F1. //EXP: A help page about E2555, indicating that the record parameter can't be captured because it's const //ACT: Error: No help found for cm_E2555_Delphi. program DocBugE2555; {$APPTYPE CONSOLE} uses SysUtils, Types; procedure CallAnonProc(Proc: TProc); begin Proc; end; procedure DoSomethingWithRec(const Rec: TRect); begin CallAnonProc(procedure begin WriteLn(Rec.Top); end); end; begin DoSomethingWithRec(Rect(0, 4, 1, 1)); end.

QC #: Date Reported: Area:74839 6/13/2009 Documentation\IDE Help Contexts

Description: Steps:[QC Short Description] W1056 not documented [QC Description] No help available for the error: [DCC Warning] W1056 Warning: Duplicate resource: Type 10 (RCDATA), ID TDTMCWCSESSION; File dmCWCSession.dfm resource kept; file

C:\CWCWebRedesignD2009\Source\dmCWCSession.dfm resource discarded. QC Entry 74839 QC #: Date Reported: Area:77283 9/2/2009 Documentation\Help Output

Description: Steps:[QC Short Description] wrong registry key for localization [QC Description] In the "Using Resource DLLs" chapter of the Help a wrong registry key for locale information is given. The key in Help is "HKEY_CURRENT_USER\Software\Borland\Locales" but really Delphi uses "HKEY_CURRENT_USER\Software\CodeGear\Locales" QC Entry 77283

QC #: Date Reported: Area:86246 7/13/2010 IDE

Description: Steps:[QC Short Description] Windows 7: RAD Studio has stopped working (crash on exit) [QC Description] Crash when closing Delphi IDE, after clean install and doing nothing - just exited. Problem signature: Problem Event Name: APPCRASH Application Name: bds.exe Application Version: 15.0.3840.32376 Application Timestamp: 4c351c08 Fault Module Name: ntdll.dll Fault Module Version: 6.1.7600.16559 Fault Module Timestamp: 4ba9b29c Exception Code: c0000005 Exception Offset: 0002f94c OS Version: 6.1.7600.2.0.0.256.48 Locale ID: 1033 Additional Information 1: 2e88 Additional Information 2: 2e8830cbe5eb6d105f8b574a00c2faf4 Additional Information 3: 89dd Additional Information 4: 89dd89e85fc06857afd76f303f3db2bc QC Entry 86246 Note from Iulian: other user reported the same problem. See link https://forums.embarcadero.com/thread.jspa?threadID=40521&tstart=30

1. A fresh install is not strictly necessary. 2. Start the IDE and create a new Intraweb project (this will force the IDE to load the intraweb runtime which may be delay loaded after the first time the IDE is run) 3. Exit the IDE, or Component | Install Packages then uncheck the Intraweb design package [Old Steps] VirtualBox host running on Windows 7 64-bit Guest OS is also Windows 7 64-bit New clean install of Fulcrum (after deleting all prior downloaded files) Start Fulcrum Exit Fulcrum Windows 7 reports: Embarcadero RAD Studio for Windows has stopped working. Note from Iulian Chitan: I could reproduce it on Windows Vista 64 bit. Did a clean install of the build 15.0.3846.32576.1, opened the IDE, closed the IDE and then error received: Embarcadero RAD Studio for Windows has stopped working (i think this happens only the first time you do this). Problem signature: Problem Event Name: APPCRASH Application Name: bds.exe Application Version: 15.0.3846.32576 Application Timestamp: 4c3d0522 Fault Module Name: ntdll.dll Fault Module Version: 6.0.6002.18005 Fault Module Timestamp: 49e03824 Exception Code: c0000005 Exception Offset: 000327e2 OS Version: 6.0.6002.2.2.0.256.4 Locale ID: 1033 Additional Information 1: bfef Additional Information 2: e8adce1c2b9e7be834b4063ac3c53863 Additional Information 3: bfef Additional Information 4: e8adce1c2b9e7be834b4063ac3c53863

QC #: Date Reported: Area:88050 9/14/2010 IDE\Dialogs\Project Options

Description: Steps:[QC Short Description] With a Delphi Win32 forms application, 1. select project | options

Error when adding path(which contains spaces) to project search paths [QC Description] 1. Create any new build configuration that descends from an existing build configuration. 2. Open Project | Options. 3. Edit the Search Path in the descendant build configuration, disable inheritance from the parent build configuration, and add directories containing spaces, e.g.: ..\Common Classes\SharedForms;..\Common Classes\Classes. 4. Save the Project Options. 5. Build the project. DCC will exit with the indicated error. 6. Open the .dproj file with an editor. Notice that " entities are included in the XML for the DCC_SearchPath path for the new build configuration. QC Entry 88050

menu 2. in first tab, select 'Search Path' editor 3. Add a path 4. attempting to compile gets the error message [DCC error] Invalid command line switch for "dcc". Illegal quote passed to the command line switch "-I". The value was ["c:\rot"]

QC #: Date Reported: Area:21451 10/13/2005 IDE\Dialogs\Project Options

Description: Steps:COM linker options are not visible by default in project options dialog [10.0.2143.37589 : 236135]

Start Delphi (test done in 1024x768) --- QA notes that screen size doesn't appear to matter ---- Make a new ActiveX library Add in an Automation object or a COM object to the library Go to the project options dialog Go to the Linker page Note at the bottom you can just see the *top* of the COM groupbox, but nothing else

QC #: Date Reported: Area:88748 10/7/2010 IDE\Dialogs\Project Options

Description: Steps:[QC Short Description] Pre- and Post-Build Macros Missing [QC Description] [Regression from D2010] In the Project Options box for my project, I click on the Build Events node, and then I click on either of the Edit... buttons. In the ensuing dialog box titled "Pre-Build event" or "Post-Build event", the list of Macros in the bottom half of the form is completely empty. I have verified that my Delphi 2010 product, installed on this same machine, does contain a list of useful macros I can use. So, where are they in XE? How can I get them back, as the list appears read-only? QC Entry 88748

By USc: - create a new project - open the project options - select page Build Events - press an Edit... button on the right expected: there are macros like BDS, DEFINES, ..., WINDIR in "...-Build event" dialogs on the bottom in the Macros groupbox actual: there are no macros

QC #: Date Reported: Area:94899 6/8/2011 IDE\Project Management

Description: Steps:[QC Short Description] Adding {$R *.res} for console app leads to IDE hung [QC Description] Due to inability to edit versioninfo for console app we need to manually add {$R *.res} to out code. But this action leads to IDE hung. QC Entry 94899

1. Create new console app 2. Save all files to disk 3. Manually enter or copy/paste {$R *.res} to code 4. IDE hungs after showing message about Resource file not found. Recreating. No .RES file actually created!

QC #: Date Reported: Area:

90130 12/5/2010 IDE\Project Management\Project Manager

Description: Steps:[QC Short Description] Stray *.dres "file" in project manager [QC Description] Sometimes a weird "file" "*.dres" appears in project manager - see steps to reproduce. It seems to have no effect at all. You can't remove it, you can't rename it. QC Entry 90130

1. Create new package. 2. Project/Resources and images. 3. Add any resource of any type, close window by OK. 4. Notice your file in "Contains" node in project manager. 5. Save all. 6. Close all. 7. Reopen last package project. Exp: the same view. Act: in Contains node there is a one more entry: "*.dres".

QC #: Date Reported: Area:

36006 11/1/2006 IDE\Project Management\Project Manager

Description: Steps:[QC Short Description] Highlander does not release folder [QC Description] If save a project in a newly created folder, Highlander does not release the folder after closing the project. Trying to delete the folder in the Windows Explorer will result in an error message: "cannot delete folder: it is being used by another person or program". QC Entry 36006

1. Create a new VCL Win32 project 2. Save All, choose a new folder which has just been created! 3. Close All 4. Change to Windows Explorer and try to delete the folder. "cannot delete folder: it is being used by another person or program".

QC #: Date Reported: Area:

73249 6/11/2008 IDE\Project Management\Project Manager

Description: Steps:[QC Short Description] Project options: search path -> MSBuild "-I" and "-U" are correct, but "-O" and "-R" are not [QC Description] While using the source version of the JVCL I noticed that the IDE does not add the search path to the -O and -R option in the MSBuild command line. In fact of the incorrect -R option the resource files could not be found and I had to add the resource file path to the library path to get it compiling. Delphi 2007: -I<Project search path>;<library path> -O<Project search path>;<library path> -R<Project search path>;<library path> -U<Project search path>;<library path> Tiburon: -I<Project search path>;<library path> -O<library path> -R<library path> -U<Project search path>;<library path> QC Entry 63188

- start Tiburon - create a new Delphi.Win32 project - enter "c:\MySearchPath" into "Search path" on the page for the node "Delphi Compiler" in the project options - enter "c:\MyNewResourcePath" into "Include file search path" on the page for the node "Resource Compiler"\"Directories and Conditionals" (this is just to check if this path ends up somehow in -R option -> it doesn't and I don't expect that) - compile - switch to the "Output" tab in the message pane - copy the "dcc32.exe" line and paste it into notepad.exe (or any other tool where you can better read and re-format it) expected: -Ic:\MySearchPath;<library path> -Oc:\MySearchPath;<library path> -Rc:\MySearchPath;<library path> -Uc:\MySearchPath;<library path> actual: -Ic:\MySearchPath;<library path> -O<library path> -R<library path> -Uc:\MySearchPath;<library path>

QC #: Date Reported: Area:

72361 3/20/2009 IDE\Project Management\Project Source

Description: Steps:[QC Short Description] Packages and Option set [QC Description] When I use package and try to activate Debug or Release configuration nothing happens. IDE use the settings from Base

1) Create Package 2) Select Project -> Options 3) In dialog select Compiling item in tree 4) Select in compo box configuration to Debug and change "Optimization" to false 5) Click OK to close dialog 6) Click Project -> Configuration Manager and activate debug configuration 7) Click Project -> View source and check OPTIMIZATION flag on dpk file then try to debug package using some host application

configuration. What I must to do to apply settings from active configuration. Added by Sysop <<<<<<<<<<< This issue still exists in Delphi XE(w/ Update1). Please see comments of QC report and attached screenshots. >>>>>>>>>>> QC Entry 72361 QC #: Date Reported: Area:

91004 1/20/2011 IDE\Project Management\Project Source

Description: Steps:[QC Short Description] Conditional defines in projects source causes wrong changes in the code [QC Description] If you have condiftional defines including IFDEFS and add a unit to the project the code changes in a worng way. It happens from D2007 . Added by Sysop <<<<<<< Please see comments of QC for more detail. >>>>>>> QC Entry 91004

1) Add a ifdef conditional defines on your project source DPR file. Your code look like this {$IFDEF MSWINDOWS} {$R *.res} {$ENDIF} {$IFNDEF LCL} {$R RODLFILE.res} {$ENDIF} {$IFDEF WINDOWS} {$R PetroBoxData.rc} {$ENDIF} {$IFDEF LCL} {$R PetroBoxData.res} {$ENDIF} begin {$IFNDEF LCL} ROService.CreateForm(TServerDataModule, ServerDataModule); ServerDataModule.fEsServicio := True; ROService.Run; Exit; {$ENDIF} Application.Initialize; {$IFDEF LCL} Application.Title:='PetroBox Data Linux Server'; {$ELSE} Application.Title:='PetroBox Data Service'; {$ENDIF} Application.CreateForm(TServerDataModule, ServerDataModule); Application.CreateForm(TServerForm, ServerForm); if Assigned(ServerDataModule) then ServerDataModule.fEsServicio := False; Application.Run; end. 2) Add a files to your project 3) Changes to this: {$IFDEF MSWINDOWS} {$R *.res} {$ENDIF} {$IFNDEF LCL} {$R RODLFILE.res} {$ENDIF} {$IFDEF WINDOWS} {$R PetroBoxData.rc} {$ENDIF} {$IFDEF LCL} {$R PetroBoxData.res} {$ENDIF} begin {$IFNDEF LCL} ROService.CreateForm(TServerDataModule, ServerDataModule); ServerDataModule.fEsServicio := True; ROService.Run; Exit; {$ENDIF} Application.Initialize; {$IFDEF LCL} Application.Title:='PetroBox Data Linux Server'; {$ELSE} Application.Title:='PetroBox Data Service'; {$ENDIF} AApplication.CreateForm(TServerDataModule, ServerDataModule); AApplication.CreateForm(TServerForm, ServerForm); Assigned(ServerDataModule) then ServerDataModule.fEsServicio := False; Application.Run; end.

QC #: Date Reported: Area:91095 1/25/2011 IDE\Code Editor

Description: Steps:[QC Short Description] Delphi XE IDE freezes when the Welcome screen is closed [QC Description] Delphi XE IDE freezes many times a day. The most common cause is when the welcome screen is closed without opening a file first. Frozen IDE never recovers and needs to be shut down using Task manager, and all unsaved work is lost. Added by Sysop <<<<<< This issue seems to be similar to(related to) QC#88886. Please see comments of QC for more detail. >>>>>> QC Entry 91095

1) Start Delphi XE. 2) Choose any project from the welcome screen. 3) Perform one of the following: a) Close the welcome screen. b) switch from form view to the code view

QC #: Date Reported: Area:

2001 8/6/2002 IDE\Code Editor\Syntax Highlighting

Description: Steps:There is a bug in syntax highlighting of 'L' character prior to a string constant.

program Project1;

Same in D6 [From QC #2001]

begin WriteLn(L'123'); end. + Click Tools | Editor Options | Color Tab + Select the String Element + Set it to red so that it is easier to see the issue. + Click OK // Notice the 'L' in the WriteLn argument is highlighted with the color for a string

QC #: Date Reported: Area:88886 10/12/2010 IDE\Code Editor\Error Insight

Description: Steps:[QC Short Description] IDE lock-up [QC Description] 1. Start the IDE, create a new console application. 2. Make sure that Error Insight is enabled. 2. Copy/paste the test program from "Steps" over the code generated by the IDE. QC Entry 88886

type X = procedure(const dummy: pchar); type T = class var FA: X; property A: X read FA; property A: X read FA; end; procedure foo; var bar: X; begin bar('') end; begin end.

QC #: Date Reported: Area:87250 8/14/2010 IDE\Code Editor\Error Insight

Description: Steps:[QC Short Description] Error Insight can't distinguish between class function and class operator of same name [QC Description] In my Decimals unit (attached), Error Insight of XE can't distinguish between class operator Decimal.Subtract(const Left, Right: Decimal): Decimal;begin InternalSubtract(Result, Left, Right); end; and class function Decimal.Subtract(const Left, Right: Decimal): Decimal;begin InternalSubtract(Result, Left, Right); end; I get errors: Identifier redeclared 'Decimal.Subtract' at line 3753 (3753:16) Undeclared identifier 'Result' at line 3755 (3755:20) This does not happen in Delphi 2010 Update 4. QC Entry 87250

Open attached file Decimals.pas in editor Exp: No Error Insight errors. Act: Error Insight errors for Decimal.Add, Decimal.Divide, Add.Multiply, Add.Round and Add.Subtract Steps by USc: - create a new console app and replace it with the following program expected: no Error Insight errors in the Structure view and the editor actual: Identifier redeclared 'Decimal.Add' at line 25 (25:16) Undeclared identifier 'Result' at line 27 (27:3) Identifier redeclared 'Decimal.Divide' at line 35 (35:16) Undeclared identifier 'Result' at line 37 (37:3) Identifier redeclared 'Decimal.Multiply' at line 45 (45:16) Undeclared identifier 'Result' at line 47 (47:3) Identifier redeclared 'Decimal.Round' at line 55 (55:16) Undeclared identifier 'Result' at line 57 (57:3) Identifier redeclared 'Decimal.Subtract' at line 65 (65:16) program QC87250; {$APPTYPE CONSOLE} type Decimal = packed record public class function Add(const Left, Right: Decimal): Decimal; static; class function Divide(const Left, Right: Decimal): Decimal; static; class function Multiply(const Left, Right: Decimal): Decimal; static; class function Round(const D: Decimal): Decimal; static; class function Subtract(const Left, Right: Decimal): Decimal; static; class operator Add(const Left, Right: Decimal): Decimal; class operator Divide(const Left, Right: Decimal): Decimal; class operator Multiply(const Left, Right: Decimal): Decimal; class operator Round(const D: Decimal): Decimal; class operator Subtract(const Left, Right: Decimal): Decimal; end; class function Decimal.Add(const Left, Right: Decimal): Decimal; begin Result := Left; end; class operator Decimal.Add(const Left, Right: Decimal): Decimal; begin Result := Left; end; class function Decimal.Divide(const Left, Right: Decimal): Decimal; begin Result := Left; end; class operator Decimal.Divide(const Left, Right: Decimal): Decimal; begin Result := Left; end; class function Decimal.Multiply(const Left, Right: Decimal): Decimal; begin Result := Left; end; class operator Decimal.Multiply(const Left, Right: Decimal): Decimal; begin Result := Left; end; class function Decimal.Round(const D: Decimal): Decimal; begin Result := D; end; class operator Decimal.Round(const D: Decimal): Decimal; begin Result := D; end; class operator Decimal.Subtract(const Left, Right: Decimal): Decimal; begin Result := Left; end; class function Decimal.Subtract(const Left, Right: Decimal): Decimal; begin Result := Left; end; begin end.

QC #: Date Reported: Area:89332 10/30/2010 IDE\Code Editor\Error Insight

Description: Steps:[QC Short Description] 1. Create a new console application 2. Copy the following code into

AV in ErrorInsight when reference to procedure is not complete [QC Description] If the "reference to procedure" is not complete like "reference to proc" and ErrorInsight parses the code it throws an NullReferenceException. QC Entry 89332

the editor program EI_AV; {$APPTYPE CONSOLE} type TMyProc = reference to proc begin foo bar end. 3. Wait for Error Insight to parse the code Expected: "proc", "begin", "foo" and "bar" are underlined Actual: "proc" is underlined and if you attach the CLR Debugger you see that the parser throws an NullReferenceException.

QC #: Date Reported: Area:87390 8/19/2010 IDE\Code Editor\Error Insight

Description: Steps:[QC Short Description] Using CodeSite Units Breaks Error Insight [QC Description] Adding CodeSiteLogging to the uses clause triggers error insight QC Entry 87390

Install RadStudio + CodeSite File, New VCL Forms App Add CodeSiteLogging to Unit1 uses clause The project compiles, but error insight underlines the new unit. I assume parsing dcu-only units is not working?

QC #: Date Reported: Area:87774 9/3/2010 IDE\Code Editor\Error Insight

Description: Steps:[QC Short Description] $CodeAlign is not recognised [QC Description] The recently introduced directive $CodeAlign is not recognised by Error Insight. QC Entry 87774

Create a new project, place {$CodeAlign 16} anywhere below the program header. The directive is underlined and flagged in the Structure window: “Invalid directive ‘codealign’”. By USc: - create a new console app and replace it with the following program expected: no Error Insight errors in the Structure view and the editor actual: Invalid directive 'CODEALIGN' at line 5 (5:3) Invalid directive 'CODEALIGN' at line 6 (6:3) Invalid directive 'CODEALIGN' at line 7 (7:3) Invalid directive 'CODEALIGN' at line 8 (8:3) Invalid directive 'CODEALIGN' at line 9 (9:3) Invalid directive 'CODEALIGN' at line 10 (10:3) program QC87774; {$APPTYPE CONSOLE} {$CODEALIGN 0} {$CODEALIGN 1} {$CODEALIGN 2} {$CODEALIGN 4} {$CODEALIGN 8} {$CODEALIGN 16} begin end.

QC #: Date Reported: Area:89984 11/27/2010 IDE\Code Editor\Help Insight

Description: Steps:[QC Short Description] HelpInsight doesn't work for all units [QC Description] HelpInsight is only working for units, which are listed in project's uses (dproj). This makes this feature useless for 3rd party components and code library developers - since units of libs are not included into project. They just listed in uses clause inside application units. QC Entry 89984

See demo application in the attach. 1. Open application. 2. Open Unit27. 3. Hover P method. 4. Exp.: there will be custom help message in HelpInsight window. 5. Act.: there will be custom help message in HelpInsight window. 6. Now open Unit28. 7. Hover D procedure. 8. Exp.: there will be custom help message in HelpInsight window. 9. Act.: default message without custom help.

QC #: Date Reported: Area:92494 3/22/2011 IDE\Code Editor\Formatting

Description: Steps:[QC Short Description] Formatter doesnt add space after generic property declaration [QC Description] Formatting classes with generic propertys causes a small bug that leads to code, that is not easy to read and also breaks the jump to deklaration feauture. QC Entry 92494

use a class with: property Foo: TFoo<TBar> read FFoo; Formatter will do this: property Foo: TFoo<TBar>read FFoo; --> Rightclick->Search for declaration on TFoo wont work anymore

QC #: Date Reported: Area:92909 4/7/2011 IDE\Code Editor\Formatting

Description: Steps:[QC Short Description] Try to format this unit: unit unTest; interface type TFoo = Integer;

Formatter fails on partial range declaration [QC Description] If you have some partial value range declaration like "type TCaps='A'..'Z';" the formatter will not indent this and every following type declaration. QC Entry 92909

TCaps = 'A' .. 'Z'; TBar = Integer; type TFoo2 = Integer; implementation end. Result will look similar to the one above. TCaps and TBar not indented but TFoo and TFoo2 are. ------------ ... type TFoo = Integer; TCaps = 'A' .. 'Z'; TBar = Integer; ... ------------

QC #: Date Reported: Area:82755 3/7/2010 IDE\Code Editor\Formatting

Description: Steps:[QC Short Description] Please make an option to combine the "end else if" statement on a single line [QC Description] The style is something i inherited from using small editor screens. By using the statement on a single line i could see more code in the editor.. QC Entry 82755

#34199 - description. #34200 - implementation #34201 - tests #34573 - properties in config

QC #: Date Reported: Area:88896 10/12/2010 IDE\Code Editor\Formatting

Description: Steps:[QC Short Description] Formatter should differentiate method names from directives [QC Description] Methods named as some of directives are not properly capitalized. QC Entry 88896

1. Set Capitalization Options Capitalization of other words - As first occurrence Capitalization of reserved words and directives - lower case 2. Format following code unit Unit1; interface type TMyClass = class function Read: string; procedure Write(const s: string); end; implementation { TMyClass } function TMyClass.Read: string; begin end; procedure TMyClass.Write(const s: string); begin end; end. *************************** And the result will be: unit Unit1; interface type TMyClass = class function read: string; <------ SHOULD BE Read procedure write(const s: string); <----- SHOULD BE Write end; implementation { TMyClass } function TMyClass.Read: string; begin end; procedure TMyClass.Write(const s: string); begin end; end.

QC #: Date Reported: Area:89198 10/24/2010 IDE\Code Editor\Formatting

Description: Steps:[QC Short Description] Anonymous methods incorrectly formatted [QC Description] if EnumerateFiles(InputDir, '*.wav', faAnyFile, // !!!! function(FileName: string; Time: integer; Size: int64): boolean begin if not (FileName[1] = 'A') then begin inc(TotalSize, Size); inc(N); end; if GetTickCount - Tick > 100 then begin sleep(10); Tick := GetTickCount; end; Result := True; end) then begin if N > 0 then begin MessageBox(0, PChar('N: ' + inttostr(N) + #13#10 + 'TotalSize: ' + inttostr(TotalSize)), 'Ok', MB_ICONINFORMATION); end; end; This code is transformed into if EnumerateFiles(InputDir, '*.wav', faAnyFile, // !!!!

See attached example. Module Unit.pas [vk]Fixed in #35346. Formatter supportts now 2 types of anonymous methods: anonymous1 - in the assignment anonymous2 - in the operator (usually in function). For example R := function(a, t): Integer var i: Integer; begin Result := 0; end; and EnumFiles(10, function(r: Integer; s: String): Integer var l: String; begin Result := 0; end, 145); Example file is attached ___proj1.dpr Additional - two parameters added - "Line breaks in Anonymous Functions assignment" and "Line breaks in Anonymous Functions usage". Correct description if necessary

function(FileName: string; Time: integer; Size: int64): boolean begin if not(FileName[1] = 'A') then begin inc(TotalSize, Size); inc(N); end; if GetTickCount - Tick > 100 then begin sleep(10); Tick := GetTickCount; end; Result := True; end) then begin if N > 0 then begin MessageBox(0, PChar('N: ' + inttostr(N) + #13#10 + 'TotalSize: ' + inttostr(TotalSize)), 'Ok', MB_ICONINFORMATION); end; end; QC Entry 89198 QC #: Date Reported: Area:89290 10/28/2010 IDE\Code Editor\Formatting

Description: Steps:[QC Short Description] There is no space between ] and write directive [QC Description] If you have property that reads and writes fixed array field there is no space between ] and write directive. QC Entry 89290

Formating the following code results in: type TMyClass = class private FTable: array of [0 .. 1] of string; published property Table0: string read FTable[0]write FTable[0]; property Table1: string read FTable[1]write FTable[1]; end; and it should be type TMyClass = class private FTable: array of [0 .. 1] of string; published property Table0: string read FTable[0] write FTable[0]; property Table1: string read FTable[1] write FTable[1]; end;

QC #: Date Reported: Area:90030 11/30/2010 IDE\Code Editor\

Description: Steps:[QC Short Description] Misformatting of try-except under certain circumstances [QC Description] Found under the following circumstances: 1. Begin - end enclosing 2. try-except with 3. else construct inside exception-handling doesn't align the begin - end pairs correctly regarded as rather severe problem as the error continues to work further down the text QC Entry 90030

Enter following text: procedure Test; begin if SomeDecision then begin try DoSomething except on e: ESomeError do Test else raise end; end; end; is formatted like this: procedure Test; begin if SomeDecision then begin try DoSomething except on e: ESomeError do Test else raise end; // << this end belongs to except - not to on - else!!! end; end;

QC #: Date Reported: Area:91497 2/10/2011 IDE\Code Editor\

Description: Steps:[QC Short Description] Pascal Code Formatter not usable; Expressions in brackets break the formatter. [QC Description] The integrated code formatter doesn't work like it should. Expressions in brackets let the formatter fail on the code follwing. So your indention is completely broken. QC Entry 91497

Load the attached formatter config file and format with the attached pascal code. Take a look at line 417 and following. Added by Sysop <<<<<<<<< The following code was formatted with the settings i meantioned above (indention is completly broken): procedure TClass.FormatAsCastWithoutSemicolon; var Obj: TObject; begin Obj := nil; // NG while True do (Obj as TObject).ClassName; Obj.ClassName; // OK if True then (Obj as TObject).ClassName; Obj.ClassName; if True then (Obj as TObject).ClassName else // B?SE Obj.ClassName; Obj.ClassName; // NG if True then (Obj as TObject).ClassName else // NG (Obj as TObject).ClassName; Obj.ClassName; // OK if True then begin (Obj as TObject).ClassName; end else (Obj as TObject).ClassName; Obj.ClassName; // ULTRA-NG if True then begin (Obj as TObject).ClassName end else Obj.ClassName; Obj.ClassName; // ULTRA-NG if True then begin (Obj as TObject).ClassName; end else begin (Obj as TObject).ClassName end; Obj.ClassName; Obj.ClassName; Obj.ClassName; Obj.ClassName; end; // Collateral damage procedure ThisMethodBodyShouldNotBeIndented; begin end; >>>>>>>>>

QC #: Date Reported: Area:91630 2/18/2011 IDE\Code Editor\

Description: Steps:[QC Short Description] Formatter dont like anonymous methods [QC Description] The Code Formatter don't like anonymous methods... The Code is messed up after formatting. QC Entry 91630

//Format this Source: program Project1; type TAnonMethod = reference to procedure(aParam: Boolean); procedure UseAnonMethod(AAnonMethod: TAnonMethod); begin AAnonMethod(True); end; begin UseAnonMethod( procedure(aParam: Boolean) begin if not aParam then Halt; end); end. // //Formatter will formate the source above like this: // program Project1; type TAnonMethod = reference to procedure(aParam: Boolean); procedure UseAnonMethod(AAnonMethod: TAnonMethod); begin AAnonMethod(True); end; begin UseAnonMethod( procedure(aParam: Boolean)begin if not aParam then Halt; end); end.

QC #: Date Reported: Area:93638 5/6/2011 IDE\Code Editor\

Description: Steps:[QC Short Description] Code Formater inserts incomplete CRLF sequence [QC Description] Under specific circumstances when formatting only the selection of the code, formatter will eat first character of the selected code and insert only CR at the and of the selection. After that not having a complete CRLF sequence in source code results in other bugs (like Error Insight and Code Completion not working properly) I think that Copyright character in Documentation region in attached sample code causes misbehavior. Other international characters cause the same misbehavior. QC Entry 93638

1. Select following options: Error Insight - on Source Options - Show Line Breaks - on Formatter Options: Keep user line breaks - false Line breaks un Uses clauses - yes 2. Open attached project 3. Open - XSpace.Engine file 4. Error Insight will show red lines under - TSomething, and all line breaks will be normal CRLF pairs 5. Select uses + Classes, XSpace.Controls, XSpace.Classes; lines 6. Press Ctrl + D to invoke formatting 7. As the result formatter will eat up "u" character from uses and add only CR at the end of the selection 8. Error Insight will now show errors in wrong lines I have also attached images of described behavior before.jpg shows code before, and after.jpg after formatting.

QC #: Date Reported: Area:20170 10/16/2005 IDE\Form Designer

Description: Steps:[QC Short Description] Closing action editor makes BDS go behind other applications. [QC Description] I have insatlled only the C++ personality. When closing the action editor BDS is no longer the active appplication. WinXP SP2 with latest MS patches. QC Entry 20170

You must have another application running 1. Create new VCL Form Application. 2. Add ActionList to form. 3. Double -click ActionList1. 4. Right - click and select New Standard Action... 5. Cancel Dialog. 6. Close Action List Editor by clicking on the X top Right. 7. The other application is now the foreground window.

QC #: Date Reported: Area:82194 2/16/2010 IDE\Form Designer

Description: Steps:[QC Short Description] Event handlers are inserted incorrectly [QC Description] Added by Sysop <<<<<<<<<<<<<<<<<<<< [Steps] Create a form with 2 buttons (First and Second) and one label

NOTE: My platform is actually Windows 7 64-bit, but the platform field in Quality Central doesn't have any options for Windows 7. Double clicking on a control in the form designer creates and inserts the default event handler for that control (assuming the event handler doesn't already exist). The new event handler is not being inserted correctly. It is breaking the code. Here is the code BEFORE the event handler is inserted. procedure TMainForm.jobNumberEditChange(Sender: TObject); begin ; end; procedure TMainForm.modifiedOnDateTimePickerChange(Sender: TObject); begin ; end; If I then double click on a control (any one will do, so long as it creates a new event handler), I get the following error

(Label1). Write event handlers for the buttons as follows: procedure TForm1.FirstEventClick(Sender: TObject); begin // The presence of this comment appears to be involved in the bug. Label1.Caption := 'First Button'; end; procedure TForm1.SecondEventClick(Sender: TObject); begin Label1.Caption := 'Second Button'; end; Save. Switch back to the designer and double-click the label - procedure Label1Click is created. Format the source code with Ctrl+D then save again with Ctrl+S - the empty event hander for the label is deleted by the IDE. Switch back to the designer and double-click the label again. The error message appears and the following is inserted into the code editor: procedure TForm1.FirstEventClick(Sender: TObject); begin // The presence of this comment appears to be involved in the bug. Label1.Caption := 'First Button'; end; pprocedure TForm1.Label1Click(Sender: TObject); begin end; rocedure TForm1.SecondEventClick(Sender: TObject); ... >>>>>>>>>>>>>>>>>>>> QC Entry 82194

message. Cannot find implementation of method jobNumberLabelClick. Here is the code AFTER the event handler is inserted. procedure TMainForm.jobNumberEditChange(Sender: TObject); begin ; end; pprocedure TMainForm.jobNumberLabelClick(Sender: TObject); begin end; rocedure TMainForm.modifiedOnDateTimePickerChange(Sender: TObject); begin ; end; Notice that the new event handler has actually been inserted between the 'p' and 'r' of the reserved word 'procedure' at the start of the second pre-existing method. This same error occurs if I double click next to an unassigned event in the object inspector. This is a major pain. An added problem is that the event handler is inserted in alphabetical order, so I have to go looking for it to fix it. In my opinion new event handlers should be inserted at the end of the unit where I can easily find them and then put them were I want them. At the moment I'm creating event handlers manually to avoid both the insertion error and the alphabetical issue. I have just upgraded to Delphi 2010 and I'm not at all impressed by such a fundamental operation failing, something that for me worked fine in Delphi 2009 and Delphi 7.

QC #: Date Reported: Area:91928 3/3/2011 IDE\Form Designer

Description: Steps:[QC Short Description] F**** explicit properties [QC Description] Have I ever told you, what I think about the explicit properties? Please do the following: - Open Delphi 2010 - Create a new vcl forms application - Put 2 buttons on the form - Move the buttons at a bottom / right position of the form - Now think, that the form should be smaller - Really believe, that the form must be smaller - Set the anchors of the buttons to [akRight, akBottom] - Set the size of the form as small as you like - Reset the anchors of the buttons to [akLeft, akTop] - Wonder yourself, where the buttons have been gone. - Now, ask yourself: How stupid are explicit properties? QC Entry 91928

Added by Sysop <<<<<<<<<<< Please see attached screenshot for more deailed [Steps] to reproduce this issue. >>>>>>>>>>>

QC #: Date Reported: Area:96737 7/27/2011 IDE\Form Designer

Description: Steps:[QC Short Description] Ctrl +F4 does not close the form designer [QC Description] Ctrl +F4 does not close the form designer window. You must first switch to code view (F12), and then Ctrl+F2 works. The local menu

Open a form attempt to close it using Ctrl+F4

for the Tab shows that Ctrl+F4 should close the tab the same as if it was displaying the associated code unit. QC Entry 96737 QC #: Date Reported: Area:88419 9/26/2010 IDE\Form Designer

Description: Steps:[DE TRANSLATION issue] [QC Short Description] DE translation of "Selection contains a component, %s, introduced in an ancestor and cannot be deleted." message has additional period [QC Description] The DE translation of the Form Designer message, that is shown when you try to delete a component that is part of a ancestor, has an additional period. The message is "Die Auswahl enthaelt eine Komponente %s, die in einem Vorfahr eingefuehrt wurde und nicht geloescht werden kann.." (umlauts replaced with their two character non umlaut representations) In the US, FR and JA version the message has only one period. -> see steps QC Entry 88419

- start Delphi with DE localization - open the attached project - open InheritedForm.pas and switch to the Form Designer - try to delete Button1 - look the shown error message expected: the message has only one period "...werden kann." actual: the message has two periods "...werden kann.."

QC #: Date Reported: Area:20784 10/25/2005 IDE\Form Designer

Description: Steps:use context menu or use Ctrl + X/C do not work in VCL Form Designer (regression) WORKAROUND: switch to code and back to designer. it should now work.

1. File | New | Win32 VCL Application 2. drop a button // Ctrl + X // nothing change 3. mouse select the button // Ctrl + X // nothing change

QC #: Date Reported: Area:90054 12/1/2010 IDE\Form Designer

Description: Steps:[QC Short Description] Automated Incident Report [QC Description] Access violation at address 007E4C7D in module 'designide160.bpl'. Read of address 00000000. Had multiple components selected on a form and then tried to drag them all. [DevBuild] QC Entry 90054

Drop 2 buttons. Select both. Drag them.

QC #: Date Reported: Area:89149 10/21/2010 IDE\Form Designer

Description: Steps:[QC Short Description] Saving a form with a ListView can kill the IDE [QC Description] For some visual inherited formulars with a TListView the IDE can vanish by pressing Ctrl+S (Save). This happens when the ListView.Handle is recreated while the TComponentRoot.GetRootStream method is running. In that case the output stream of the called function Classes.ObjectResourceToText(Input, Output: TStream) is destroyed

by a call to TComponentRoot.InstanceRemoved that is triggered by "Columns.Clear" in "TCustomListView.CreateWnd. QC Entry 89149 QC #: Date Reported: Area:89739 11/17/2010 IDE\Object Inspector

Description: Steps:[QC Short Description] Some characters can't be entered in object inspector [QC Description] Using a French keyboard, on a French Windows Seven 64 bits , all keys involving the combination <Alt Gr> + something are not producing any character in object inspector for instance, to access the EURO sign (€), key combination is <Alt Gr> + <E>. In the main (pascal) editor, the combination is working. However, in object inspector, this combination will not operate NOTE: The issue occur not only in object inspector, but in almost ALL fields where text need to be entered, but the source code editor. Example: in the commit comment of subversion, same problem .... QC Entry 89739

New project go in source edit window hit <Alt Gr> + <E> key combination: expected €, got € go to object inspector, select Caption property of the form hit <Alt Gr> + <E> key combination: expected €, got -nothing- Characters from key combination that doesn't work (on a French keyboard, French system) ~ # { [ | ` \ ^ @ ] } € ¤

QC #: Date Reported: Area:90248 12/10/2010 IDE\File Handling

Description: Steps:[QC Short Description] Double click on .pas file does not open in Delphi XE [QC Description] Using the windows file browser go to any .pas file and double click on it. The best reaction I get is that it opens in the older version (Delphi 2010). I want it to open in Delphi XE. Attempts to manually correct this have failed (right click on a .pas file, go through properties, and hand select the executable to open it with). QC Entry 90248

double click on a .pas file from the Windows browser. I am using a Windows Vista 64 bit, but I just saw a report on www.experts-exchange.com that indicates someone is having the issue on Windows 7 64 bit as well.

QC #: Date Reported: Area:21483 4/11/2005 IDE\Toolbars

Description: Steps:******************************************************* NOTE: This bug is a generic IDE issue and not specific to the HTML designer. When verifying this bug please test using the standard IDE toolbars as well as the HTML designer toolbars. ******************************************************* when HTML designer is open, trying to remove html designer toolbar button causes .. 1) List index out of bounds 2) Av in ntdll.dll // stack trace attached [BCMF] [BCS] [10.0.2131.8949 (11/1) : true ] AV in ntdll.dll [10.0.2138.21187 (11/8) : true ]

1) File | New | Other | Web Document | HTML page 2) Rclick on HTML designer select Toolbars | Customize 3) remove one of commang button ( for example : Font foregrand color ) // Drag it off of a toolbar // you will get .. Error : List index out of bounds (14) Repeat the same steps on the IDE main toolbars for any button that is NOT the last button on the toolbar. If you need more info contact Steve T. x5030 <Details ..> <OK> // Error : AV at 7C918FEA in ntdll.dll. Write of address 00000010 [10.0.2131.8949 (11/1) : true ] AV in ntdll.dll + $5B[7C918FEA]{ntdll.dll } RtlpWaitForCriticalSection + $5B + $0[51F36B47]{rtl100.bpl } System. (Line 9980, "system.pas" + 13) + $0 + $41[7C903786]{ntdll.dll } RtlConvertUlongToLargeInteger + $41

QC #: Date Reported: Area:89680 11/15/2010 IDE\Performance

Description: Steps:[QC Short Description] Compilation slows down slightly after each compile if project has excluded packages [QC Description] When repeatedly compiling a project which has excluded packages the reported "elapsed times" grows after each compile. QC Entry 89680

New VCL forms application Project | Options | Packages Uncheck some or all. The more you uncheck the larger the slowdown. Click OK. Switch to code editor, right click and "View Messages" Compile Make message view larger so you can read "Elapsed Time" Compile repeatedly and observe the elapsed time values.

QC #: Date Reported: Area:88730 10/7/2010 IDE\Code Completion

Description: Steps:[QC Short Description] Code Completion method override wrong arg type [QC Description] Code completion for filling in inherited methods will fail if one of the arguments is a class type. The wrong format of the type will be inserted, and the resulting code will not compile. This was not a problem in Delphi 2010. It is a new bug. QC Entry 88730

Step 1: Given this code: TItem = class end; TItemClass = class of TItem; TAncestor = class public constructor Create(AItemClass: TItemClass = nil); virtual; end; TDescendent = class(TAncestor) <------ CURSOR IS PLACED HERE end; Step 2: Hit CTRL-SPACE Step 3: Find "Create" in the list Step 4: Hit ENTER Step 5: Observe that code completion changed the format of the argument from the ancestor method: TAncestor = class public constructor Create(AItemClass: TItemClass = nil); virtual; end; TDescendent = class(TAncestor) public // THIS IS INCORRECT constructor Create(AItemClass: class of TObject = nil); override; end;

QC #: Date Reported: Area:89331 10/30/2010 IDE\Code Completion

Description: Steps:[QC Short Description] Code Insight can't handle asm blocks in used units [QC Description] Code Insight stops working if there is a unit that isn't compiled yet (no dcu file exists) and that contains asm blocks between "begin" and "end". QC Entry 89331

1. Open the attached project 2. Place the caret after the comment that tells you where to place the caret in the dpr file. 3. Press Ctrl+Space (invoke Code Insight) Expected: The popup shows all available items Actual: No popup window is visible because Code Insight failed parsing the "inner" asm blocks in the used unit.

QC #: Date Reported: Area:89333 10/30/2010 IDE\Code Completion

Description: Steps:[QC Short Description] Code Insight can handle OleVariants with named parameter "end" [QC Description] Code Insight stops working if there is a unit that isn't compiled yet (no dcu file exists) and that contains an OleVariant dynamic call with named parameters whos parameter is named "end" QC Entry 89333

1. Open the attached project 2. Place the caret in the dpr file in the line after "begin" 3. Press Ctrl+Space (invoke Code Insight) Expected: The popup shows all available items Actual: No popup window is visible because Code Insight failed to parse the "end:=" correctly.

QC #: Date Reported: Area:74857 6/14/2009 IDE\Code Completion

Description: Steps:[QC Short Description] Code completion incomplete when {$SCOPEDENUMS ON} [QC Description] When an enum type is defined when {$SCOPEDENUMS ON} is turned on, then the identifier will not be listed in code completion as expected. When trying to use code completion for TSearchOption in TDirectory.GetDirectories, I'd expect that code completion shows TSearchOption at the top of the list or better TSearchOption.soTopDirectoryOnly and TSearchOption.soAllDirectories as this is what the user needs to use as parameter.

Press Ctrl+Space where indicated in the example program Project1; {$APPTYPE CONSOLE} uses SysUtils, IOUtils; begin try TDirectory.GetDirectories('C:\', '*.*', // <-- CURSOR HERE except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; end.

When the user has typed "TSearchOption.", then the available identifiers will be visible, but this is too late. This is more or less "just" a usability issue, but it I think it is very confusing for those who don't know about the $SCOPEDENUMS compiler directive or miss it in the source of IOUtils. QC Entry 74857 QC #: Date Reported: Area:89334 10/30/2010 IDE\Code Completion

Description: Steps:[QC Short Description] Code Insight can handle anonymous methods correctly [QC Description] Code Insight stops working if there is a unit that isn't compiled yet (no dcu file exists) and that contains a anonymous method. QC Entry 89334

1. Open the attached project 2. Place the caret in the dpr file in the line after "begin" 3. Press Ctrl+Space (invoke Code Insight) Expected: The popup shows all available items Actual: No popup window is visible because Code Insight failed to parse the "type foo: record end;" correctly.

QC #: Date Reported: Area:87185 8/12/2010 IDE\Code Browsing

Description: Steps:[QC Short Description] Automated Incident Report [QC Description] Access violation at address 0AFE9D4A in module 'dcc150.dll'. Read of address 80000160. Code completion while declaring a new stream class's constructor. [DevBuild] QC Entry 87185

// Note: In a dev build, add $(TP)\Testing\Zombie\Harness to the global browsing path (Tools/Options/Delphi Options/Library/Browsing path) 1. Do a checkout off the following project: http://dtg-svn.embarcadero.com/svn/bdstests/trunk/zombie/tests/IDE/EDITOR/CodeFoldingOption 2. Open RAD Studio, open DelphiCodeFoldingOption.dpr 3. Open CodeFoldingOption_U.pas in editor. 4. At line 157, Ctrl + Click on DelphiUI 5. In Delphi.pas, at opened line, Ctrl + Click on TDelphiUIModel 6. In Delphi.pas, go to line 1109 and ctrl + click on Connect. (constructor for TDelphiUIModel class) 7. Go to the project source file, and ctrl + click on RunTests (at line 30); 8. In opened DosApp.pas, Ctrl + Click at line 258 on RunNextTest. AV appears.

QC #: Date Reported: Area:29732 6/1/2006 IDE\Class Completion

Description: Steps:[QC Short Description] Class Completion adds published section [QC Description] When performing Class Completion on the class declaration shown in Steps, Class Completion will add an unnecessary published section.QC Entry 29732

1. Create the following class in a Win32 project: type TTest = class public property X: Integer; end; 2. Press Ctrl+Shift+C The result looks like this: type TTest = class private FX: Integer; procedure SetX(const Value: Integer); published public property X: Integer read FX write SetX; end; The published section is not really needed.

QC #: Date Reported: Area:70411 1/11/2009 IDE\Class Completion

Description: Steps:[QC Short Description] Code completion fails when class operator is present [QC Description] After installing Delphi 2009 Win32 update 2 (German Version), in the IDE, hitting Ctrl-Shift-C inside a record definition with a class operator, produces an error message, instead of completing the implementation part.

type TNullable<T> = record private FValue: T; FIsNil: Boolean; public class operator Implicit(const Value: T): TNullable<T>; class operator Implicit(Value: Pointer): TNullable<T>; class operator Implicit(const Value: TNullable<T>): T; property IsNil: Boolean read FIsNil; property Value: T read FValue; end; ********************* After pressing Ctrl+Shift+C the following error ocures: --------------------------- Project1 - CodeGear Delphi für Microsoft Windows - Unit2 ---------------------------END erwartet, aber '(' gefunden in Klasse TNullable<T>. --------------------------- OK ---------------------------

See Report #: 52011 for Delphi 2007 It seems this error still exists in Delphi 2009 Update 2 QC Entry 70411 QC #: Date Reported: Area:75701 7/12/2009 IDE\Class Completion

Description: Steps:[QC Short Description] Extended Identifiers confuse Class Completion [QC Description] Try to invoke Class Completion for the class Foo in the test case. Error message: Expected END but '=' found in class Foo. QC Entry 75701

unit test; interface type Foo = class type &Type = ( One, Two, Three ); procedure Bar; end; implementation end.

QC #: Date Reported: Area:88921 10/13/2010 IDE\Search

Description: Steps:[QC Short Description] Search for Usages fails on Project Groups [QC Description] Sometimes Search for Usages fails when searching entire Project Group QC Entry 88921

1. Open attached Project Group 2. Open Unit1 in Package1 3. Click on procedure LoadFromString 4. Right click Search for Usages - Check Usages of the Element - Scope : Entire Project Group 5. Click "Search" 6. Nothing happens (in larger project that I have window with search progress is shown, but it dissapears when reaches 40%) If you Select Scope : Current Project everything works fine (of course it does not find procedure in Unit3)

QC #: Date Reported: Area:95034 6/11/2011 IDE\Help

Description: Steps:[QC Short Description] I just tried to start the Delphi 2009 help (F1) -> Object has not been correctly initialized. [QC Description] Object has not been correctly initialized. I just tried to start the Delphi 2009 help (F1) This is similar issue. ------- https://forums.embarcadero.com/message.jspa?messageID=8149 ------- QC Entry 95034

For example, 1. setup Vista SP1 2. install .NET Framework 4 3. install Vista SP2 4. install Delphi 2009 5. start IDE 6. Click F1

QC #: Date Reported: Area:88172 9/17/2010 IDE\Help

Description: Steps:[QC Short Description] Date/Time Support help is missing [QC Description] The Date/Time support topic in the Delphi XE help is missing QC Entry 88172

Open ms-help://embarcadero.rs_xe/vcl/SysUtils.DateTimeToStr.html Click on See Also / Date-Time Support See url ms-help://embarcadero.rs_xe/rad/Date/Time_Support.html loaded //exp: See help content //act: See "missing page" notic

QC #: Date Reported: Area:87987 9/11/2010 IDE\Help

Description: Steps:[QC Short Description] No link to TFontDialogOptions members when pressing F1 in OI on Options for a TFontDialog [QC Description] In D7: when pressing F1 on Options of a TFontDialog in the OI the page provided gives you a link to see the TFontDialogOptions

members and their explanation In DXE: there is no link to TFontDialogOptions, the only way to get more info on this is by manually using the Index or Search function. The page is still there in DXE help: ms-help://embarcadero.rs_xe/vcl/Dialogs.TFontDialogOptions.html There is just no link in ... ms-help://embarcadero.rs_xe/vcl/Dialogs.TFontDialog.Options.html ... to get to that page. Note: the links look very similar but one of them (the one opened when pressing F1 in the OI) has a dot between TFontDialog and Options. QC Entry 87987 QC #: Date Reported: Area:87531 8/25/2010 IDE\Refactoring\Find References

Description: Steps:[QC Short Description] Find local references broken [QC Description] Find local references is giving me an 'Object reference not set to valid instance of an object' error nearly all the time. QC Entry 87531

File | New | Delphi projects | Console application Ctrl-click on SysUtils to open that file Scroll down to line 425 Rightclick on EAbort and choose Find | Find local references to type EAbort EXP: the Find references panel to open ACT: --------------------------- Error --------------------------- Object reference not set to an instance of an object. --------------------------- OK Details << --------------------------- [20445040]{refactoride150.bpl} RefactorCmds.TRefactorCommands.actnFindLocalRefsExecute (Line 373, "RefactorCmds.pas" + 0) + $C [500AF987]{rtl150.bpl } Classes.TBasicAction.Execute (Line 12988, "Classes.pas" + 3) + $7 [5026AA1D]{vcl150.bpl } ActnList.TContainedAction.Execute (Line 448, "ActnList.pas" + 8) + $2C [5026B7F8]{vcl150.bpl } ActnList.TCustomAction.Execute (Line 1094, "ActnList.pas" + 7) + $8 [500AF84B]{rtl150.bpl } Classes.TBasicActionLink.Execute (Line 12917, "Classes.pas" + 2) + $7 [5029E790]{vcl150.bpl } Menus.TMenuItem.Click (Line 2525, "Menus.pas" + 17) + $7 [5029FCA3]{vcl150.bpl } Menus.TMenu.DispatchCommand (Line 3390, "Menus.pas" + 5) + $2 [502A0E82]{vcl150.bpl } Menus.TPopupList.WndProc (Line 4496, "Menus.pas" + 4) + $E [502A0DD1]{vcl150.bpl } Menus.TPopupList.MainWndProc (Line 4471, "Menus.pas" + 2) + $5 [500B067C]{rtl150.bpl } Classes.StdWndProc (Line 13491, "Classes.pas" + 8) + $0 [50358AFF]{vcl150.bpl } Forms.TApplication.ProcessMessage (Line 9760, "Forms.pas" + 23) + $1 [50358B42]{vcl150.bpl } Forms.TApplication.HandleMessage (Line 9790, "Forms.pas" + 1) + $4 [50358E6D]{vcl150.bpl } Forms.TApplication.Run (Line 9927, "Forms.pas" + 26) + $3 [004ACCE2]{bds.exe } bds.bds (Line 201, "" + 8) + $FFFB

QC #: Date Reported: Area:73365 4/25/2009 IDE\Refactoring\Introduce Variable

Description: Steps:[QC Short Description] Problems with Introduce Variable (Introduce Field) [QC Description] The refactoring "Introduce Variable" opens a dialog for entering the new variable name, but nothing happens. The same problem also exists in the "Introduce Field" dialog. This functionality is not working under D2009,OS Vista SP1 Under D2007 and OS XP this functionality is working correct in both variants QC Entry 73365

1. Create a new VCL application 2. Create a new form and put on button 3. add the following code (OnClick Event): procedure TForm1.Button1Click(Sender: TObject); var x, y: integer; zz: Integer; z: Integer; begin x:=1; y:=2; z:=x+y; zz:=x+y+1; end; 4. Add Together Support to the project 5. Now select the "x+y" expression, and from the Refactor menu select "Introduce Variable". 5. you get a dialog with the title "Introduce Variable" which correctly shows the new variable type as integer and allows entering a name. 5. Enter a name vor the new variable, e.g. "Summe" 6. There is also a checkbox on that dialog saying "Replace all occurrences (2 occurrences found). Check It 7.Press OK. 8. ...nothing happens

QC #: Date Reported: Area:

88818 10/10/2010 IDE\Refactoring\Extract Superclass

Description: Steps:[QC Short Description] Extract superclass fails for class that implements interface [QC Description] If you have a class TMyClass (derived from TInterfacedObject) that implements the IMyClass interface and you want to extra a super class from it in TBase, then the TBase is derived from TInterfacedObject (which is OK), but TMyClass is only implementing IMyClass, and no longer derived from TBase. Also, TBase is declared *after* the TMyClass and IMyClass (see QC #88817 for another case where that happens). QC Entry 88818

Consider the following exampe code: type IContact = interface procedure Contact(Msg: TMessage); end; TContact = class abstract(TInterfacedObject, IContact) strict private FName: String; function GetName : String; procedure SetName(val : String); public property Name: String read GetName write SetName; procedure Contact(Msg: TMessage);virtual; abstract; end; We can create a TPerson super class which only contains a Name property and GetName and SetName methods, but without the Contact method. First, we need to select the methods or properties we want to include in the super class. For example, select the GetName and SetName methods, and then do Refactoring | Extract Superclass to get a similar dialog as we saw earlier. In that dialog, we can specify the name of the superclass and the namespace, and can also select the specified fields (unselect them if you want less, but you cannot add more like the Contact method), as well as specify which methods should be made abstract in the super class. We can also specify abstract for the Name property, but that will have no effect, of course. Unfortunately, there is a regression in Delphi XE: the effect of this dialog is that a new class TPerson is added, derived from TInterfacedObject: TPerson = class(TInterfacedObject) strict protected FName: string; procedure SetName(val: string); public function GetName: string; property Name: string read GetName write SetName; end; This is great, since although TPerson does not need to implement the IContact interface (for the Contact method), it does need to “include” the TInterfacedObject in order for it to be available for the TContact descendent class. The problem, however, is the fact that TContact now only implements the IContact interface, but does not inherit from TPerson, not does it contain the previous fields and methods that are now moved to TPerson. The definitions for IContact and TContact are a bit empty now.

QC #: Date Reported: Area:88821 10/10/2010 IDE\Refactoring\Safe Delete

Description: Steps:[QC Short Description] Safe Delete refactoring option is not enabled? [QC Description] In previous versions of Delphi, I could select a member from a class in the UML Designer and select the "Safe Delete" Refactoring feature. However, in Delphi XE this option doesn't appear available: the menu option remains "gray" and disabled at all times. QC Entry 88821

QC #: Date Reported: Area:90163 12/7/2010 IDE\Refactoring\Change Parameters

Description: Steps:[QC Short Description] Refactoring "Change params" throws an expection when try to add a new item [QC Description] Feature Refactoring."Change params" throws an expection when trying to add a new item. QC Entry 90163

1) Open the test project 2) In Unit8.pas uncomment line 18 3) Attempt to refactor doShowMessage on line 19 by right click, Refactor, Change Params 4) Once the Change Params window comes up click the Add button exp: Add Parameter window is shown act: The following error occurs: Unhandled exception has occurred in a component in your application. If you click Continue, the application will ignore this error and attempt to continue. The given assembly name or codebase was invalid. (Exception from HRESULT: 0x80131047).

QC #: Date Reported: Area:89089 10/19/2010 IDE\Refactoring\Find Unit

Description: Steps:

[QC Short Description] Refactoring "Find Unit" often does not work any more [QC Description] This problem is in a class "of intermittend" issues that do not always reproduce. Therefore do not close it before contacting the original author. Since Delphi XE, the "Find Unit" refactoring often does not work for me any more. Delphi Refactoring in Delphi has become more stable over time, so it gets harder and harder to reproduce instabilities. This particular feature goet less stable in the last release. Therefore it might need special attention: the cause might make other features unstable as well. This case reproduces it only some of the times. If I find a way to reproduce it better, I will amend the steps. I have a gut feeling that the problem is caused by the facts that: 1. the "Find Unit" refactoring sometimes is asynchronous 2. if "Find Unit" is aready running, it is not disabled in the menu. I have not found out yet the "sometimes". After the error, the IDE becomes unstable. You cannot copy/paste the error with Ctrl-C to the clipboard, hence the attachment of one of the errors (so you have an idea how the dialog looks like). Besides RAD Studio XE, I have installed the latest GExperts and Model Maker Code Explorer. Even when I have disabled those two experts, the "Find Unit" refactoring often fails. mtError Dialog Title=CodeGear RAD Studio Content=System.IO.FileLoadException: The given assembly name or codebase was invalid. (Exception from HRESULT: 0x80131047) Buttons=[OK] mtError Dialog Title=CodeGear RAD Studio Content=System.NullReferenceException: Object reference not set to an instance of an object. Buttons=[OK] Steps to reproduce (I perform all the "New..." stuff using the "Tool Palette" search). 1. Start a new instance of RAD Studio XE 2. Create a new VCL Forms Project 3. Swithch the form view to the code editor view using F12 4. Create a new Unit (which is now Unit2) 5. Paste the Doit method into Unit2 so the unit looks like this: unit Unit2; interface implementation procedure DoIt; var S: string; begin S := NullAsStringValue; end;

Steps to reproduce (I perform all the "New..." stuff using the "Tool Palette" search). 1. Start a new instance of RAD Studio XE 2. Create a new VCL Forms Project 3. Swithch the form view to the code editor view using F12 4. Create a new Unit (which is now Unit2) 5. Paste the Doit method into Unit2 so the unit looks like this: unit Unit2; interface implementation procedure DoIt; var S: string; begin S := NullAsStringValue; end; end. 6. Put the cursor on NullAsStringValue 7. Perform a "Refactor, Find Unit" (Alt-O, U) from the menu (it should return the Variants unit) 8. Close the project 9. Create a new VCL Forms Project 10. Swithch the form view to the code editor view using F12 11. Create a new Unit (which is now Unit2) 12. Paste the Doit method into Unit2 so the unit looks like this: unit Unit2; interface implementation procedure DoIt; var S: string; begin S := TWinControl.ClassName; end; end. 13. Put the cursor on TWinControl 14. Perform a "Refactor, Find Unit" (Alt-O, U) from the menu (it should return the Controls unit, but often you now get one of the two errors below). 15. If the "Find Unit" is asynchronous, then: 15a. Put the cursor on ClassName 15b. Perform a "Refactor, Find Unit" (Alt-O, U) from the menu (it should not return a unit at all, but often you now get one of the two errors below).

end. 6. Put the cursor on NullAsStringValue 7. Perform a "Refactor, Find Unit" (Alt-O, U) from the menu (it should return the Variants unit) 8. Close the project 9. Create a new VCL Forms Project 10. Swithch the form view to the code editor view using F12 11. Create a new Unit (which is now Unit2) 12. Paste the Doit method into Unit2 so the unit looks like this: unit Unit2; interface implementation procedure DoIt; var S: string; begin S := TWinControl.ClassName; end; end. 13. Put the cursor on TWinControl 14. Perform a "Refactor, Find Unit" (Alt-O, U) from the menu (it should return the Controls unit, but often you now get one of the two errors below). 15. If the "Find Unit" is asynchronous, then: 15a. Put the cursor on ClassName 15b. Perform a "Refactor, Find Unit" (Alt-O, U) from the menu (it should not return a unit at all, but often you now get one of the two errors below). QC Entry 89089 QC #: Date Reported: Area:41928 3/5/2007 IDE\Refactoring\Introduce Field

Description: Steps: [QC Short Description] Introduce Field with default Visibility creates extraneous code [QC Description] Using the Introduce Field refactoring creates extraneous code. QC Entry 41928

1. Create New | VCL Project 2. Drop TButton. Double-click on Button to create TForm1.Button1Click 3. Add var section 4. Add variable Test: Integer; 5. Right-click on 'Test' 6. Select Refactoring | Introduce Field 7. Add Modeling Support, save units 8. Introduce Field dialog is shown 9. Don't change any values, use default 10. Look at generated code //exp: private { Private declarations } Test: Integer; public var { Public declarations } end; //act: private { Private declarations } private var Test: System.Integer; { Public declarations } end; Orignal public section was replaced with private Test has changed from Test: Integer to Test: System.Integer

-- OLD STEPS -- 1. Install Spacely 2617 2. Create New | VCL Project 3. Drop TButton. Double-click on Button to create TForm1.Button1Click 4. Add var section 5. Add variable Test: Integer; 6. Right-click on 'Test' 7. Select Refactoring | Introduce Field 8. Add Modeling Support, save units 9. Introduce Field dialog is shown 10. Don't change any values, use default 11. Look at generated code Behaviour: exp: to see code like this: public strict private FTest: Integer; act: ended up with code like this: public var strict private Test: System.Integer; Issues: var section created inside of public, not needed Test has changed from Test: Integer to Test: System.Integer Introduce Field dialog gives no indication that strict private is the default Visibility [vkarjakin] 1. additional empty lines after class - submitted another request #252603. 2. var section not needed - see #244493 too.

QC #: Date Reported: Area:66352 9/2/2008 IDE\Refactoring\Introduce Field

Description: Steps:[QC Short Description] Introduce Field can't work [QC Description] can show the dialog for new field. but don't change anything. QC Entry 66352

source code: procedure TForm1.FormCreate(Sender: TObject); var ii: integer; begin end; 1. right click varible ii 2. select Refactor->Introduce Field 3. show a dialog for new field. 4. click ok on the dialog 5. nothing happend.

QC #: Date Reported: Area:91690 2/22/2011 IDE\History View

Description: Steps:[QC Short Description] Diff view shows differences the wrong way [QC Description] The 'Diff' view shows the changes with '+' and '-' signs in front of the changed lines. However, the signs are the wrong way, that '+' indicates the removed line and '-' the added.

Select File - New - Other - Text file (the type is not significant) add a few empty lines and then type 'Old text' add a few empty lines and save. Change the word 'Old' to 'New' Select History - Diff In the top left pane you have header 'Differences From:' and beneath 'File' In the top right pane you have header 'To:' and beneath 'Buffer' In the main pane you see the lines + Old text - New text Note how the '+' and '-' are the wrong way.

It's amazingly easy to make a mistake, compare with driving a car that turns left when the steering wheel is turned right and vv. QC Entry 91690 QC #: Date Reported: Area:77204 8/31/2009 IDE\IDE Insight

Description: Steps:[QC Short Description] The "IDE Insight" action has no glyph [QC Description] It appears the IDE's internal IDE Insight action is missing a few properties. Steps: 1) View, Toolbars, Customize... 2) Select Commands tab 3) Select Categories: All Commands Topmost command in Commands list is "actnIDEInsight". Should be "IDE Insight". Notice the action has no glyph. QC Entry 77204

QC #: Date Reported: Area:96369 7/18/2011 IDE\Version Control\SVN

Description: Steps:[QC Short Description] Inadvertently invoking a 2nd SVN commit window gives an exception error dialog [QC Description] Invoking a 2nd SVN commit window produces a "A component named SvnCommitFrame already exists'. One would think multiple instances would be allowed, or if only a single instance was permitted that the current instance would be shown, instead of a lovely error dialog. QC Entry 96369

1) right click any file in the project manager of a project under SVN version control and select Commit 2) repeat 1) with a different file selected 3) witness error and be amazed this wasn't fixed in service pack 1

QC #: Date Reported: Area:80460 12/17/2009 Install

Description: Steps:[QC Short Description] The default user name and company in the installer are Microsoft under a clean 64-bit OS [QC Description] In a fresh Windows 7 VM, installing the latest build still results in the default user name and user company in the installer being Microsoft/Microsoft. This is on the serial number entry screen. Jordan Russell wrote this in September 2008 in codegear.private.fieldtest.tiburon.build-install in thread "Install Downloads too Much, etc.": > Erik Berry wrote: > > Maybe instead, the location changes > > under a 64-bit OS and IA is looking in the wrong place? > > Yes. 64-bit Vista doesn't correctly set the values under the 32-bit > HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion key (likely a bug); > apps must read from the 64-bit key instead. QC Entry 80460

Get a clean VM of Windows 7 (required, I believe) Install RS 2011 In the serial # entry screen of the installer, the default user name and company are both "Microsoft" [IIRC, Jordan Russell investigated this in one of the last FTs and it only happens in 64-bit and is due to the installer reading from the wrong registry key. And I think it only happens in clean systems, since somehow the entered value is saved/cached for future installs. My memory is fuzzy, though...]

QC #: Date Reported: Area:87371 8/19/2010 Install

Description: Steps:[QC Short Description] FinalBuilder registration fails with reg.codegear.com [QC Description] The FinalBuilder registration did not work for me. My URL looks like this: http://reg.codegear.com/srs6/verify_email.jsp?serial=snip+1+2719997 Suspect DNS problem or simply obsolete URL ?? QC Entry 87371

Clean install of Delphi and C++Builder, including Final Builder Try to start FinalBuilder from the desktop shortcut. Try to register under your serial number.

QC #: Date Reported: Area:87260 8/14/2010 Install

Description: Steps:[QC Short Description] Beyond Compare did not integrate into IDE [QC Description] On my Win7 64bit laptop I uninstalled an old build of Fulcrum, then turned off UAC, rebooted and then installed build 3875. Beyond Compare Lite is in the biin directory, but was not integrated into the IDE. QC Entry 87260

QC #: Date Reported: Area:75854 7/16/2009 Install

Description: Steps:[QC Short Description] CodeGear RAD Studio Icon Name [QC Description] Can we please get the "CodeGear RAD Studio" Icon to include the version number. My windows XP with the Start Menu, MRU list that appears lists multiple "Codegear RAD Studio" Icons since the name for weaver matches 2009. I don't know which one I am launching. QC Entry 75854

QC #: Date Reported: Area:89305 10/28/2010 Install

Description: Steps:[QC Short Description] AQTime etc. are downloaded even if you chose not to install them. [QC Description] Third party products (AQTime, codesite, finalbuilder) are downloaded even if you chose not to install them. They aren't installed indeed, but they're downloaded which takes a couple of minutes. QC Entry 89305

QC #: Date Reported: Area:77160 8/29/2009 Install\User Interface

Description: Steps:[QC Short Description] Cannot paste serial when using installer Upgrade feature [QC Description]

1) Launch "Modify, Repair, Uninstall" from the Start menu. 2) Select the "Upgrade" radio button and press "Next" 3) Select the first cell of the "Serial Number" field and paste the serial number Expected: Serial number boxes are polpulated from the clipboard Actual: Only

The installer now supports copy-paste of serial numbers when performing a new install. The Product Registration screen displayed when an Upgrade is performed, however, does not permit pasting of the serial number. QC Entry 77160

the first serial number box is filled

QC #: Date Reported: Area:89380 11/1/2010 Install\User Interface

Description: Steps:[QC Short Description] I have got How to buy as first impression [QC Description] http://www.embarcadero.com/how-to-buy is the result of running the betatest QC Entry 89380

In the past I got the same result. Now again. It's customer hostile to show it. If You need to close the test it's better to inform us beta testers. 3940 doesn't got dbeexpress working. I think you blocked the testing. Get rid of this link, http://www.embarcadero.com/how-to-buy http://www.embarcadero.com this is the right link to show!

QC #: Date Reported: Area:87009 8/8/2010 Install\User Interface

Description: Steps:[QC Short Description] "Developer Productivity" and description not translated [QC Description] In the select feature dialog the item "Developer productivity" and its description is not translated to German. QC Entry 87009

QC #: Date Reported: Area:87008 8/8/2010 Install\User Interface

Description: Steps:[QC Short Description] Installer Description of AQTime not translated (DE) [QC Description] The description for AQTime in the select featore dialog is not translated to German. QC Entry 87008

QC #: Date Reported: Area:88281 9/22/2010 Install\Uninstall

Description: Steps:[QC Short Description] XE installer does not remove some IntraWeb files [QC Description] The XE installer does not remove some IntraWeb files if you, after installing XE, choose Modify and remove VCL for the Web from the options. QC Entry 88281

1. Install RAD Studio XE with VCL for the Web option 2. Run the installer again and choose modify 3. Remove VCL for the Web option 4. Search for IW*.* - the search result will show you a list of IW*.hpp and IW*.res files

QC #: Date Reported: Area:89251 10/26/2010 Install\Uninstall

Description: Steps:[QC Short Description] Uninstall from Control Panel shows incorrect default of "Modify" [QC Description] When trying to uninstall using "Add or Remove Programs" from Control Panel, the install wizard appears with "Modify" selected instead of "Remove". QC Entry 89251

Open "Add or Remove Programs" from Control Panel Select "Embarcadero Rad Studio XE" Click on "Remove" Exp: Install wizard will be shown with "Remove" selected as in RS 2010 Act: Install wizard is shown with "Modify" selected.

QC #: Date Reported: Area:

87259 8/14/2010 Install\Registry settings

Description: Steps:[QC Short Description] AQTime does not install in Win7 64 [QC Description] On my Win7 64-bit laptop, I uninstalled a previous build of Fulcrum from several weeks ago and then installed build 3875 after turning off UAC and rebooting. AQTime did not install at all as far as I could tell. This is also the case folr build 3881 QC Entry 87259

QC #: Date Reported: Area:66461 9/6/2008 Install\Launcher

Description: Steps:[QC Short Description] Critical crash of international Install [QC Description] I could not install ANY Tiburon build during this field test, and could not localize the root of problem at now. The first looking was a hardvare or any system-parameter dependent cause because the eralier Delphis were install succesfully into same virtual machine (VMware) During the the last days I tested VERY different system parameters even on native Windows' on a laptop. So, I could identify the very serious cause the installation failure. However I could not test any build, which is a very bad situation for me, the root of the problem a very little. The install script could not compilable any other international environment which langs are definitely described as environment. __So, the installation will no succesfull in Hungary and several other countries___ QC Entry 66461

Environment Hungary Lang.: Hungary Start Install --> failure Define as US --> sucessfull Attach: Locality which was provocate the bug: tib_bug_hu.png Locality to succesfull install: tib_bug_us.png Result log of Setup.exe /l=z:\local\gyujto\dvd\Tiburon\Install\setuplog20080906.txt started under Hungarian locailty. See, the abortation at script compilation: setuplog20080906.txt Tested environments: Windows XP Pro English edition with SP3 in VMware virtual machine; Windows XP Pro English edition with SP2 in VMware virtual machine; Windows 2003 Server just updated with automatic updater in VMware virtual machine; VMware is installed on SUSE 9.3, Intel dual 64bit, but 32bit Windows OS' with 1 processor in VMware Windows XP Pro English edition just updated with automatic updater as native install on a laptop 32 bit Intel dcore; All tested with Hungarian locality during all FTs. Because the locality was one of the small set of same conditions in cases of virtual and native machines (in case of XP Pro), and setup was aborted on both, I start to tests by change this same parameters. The locality was the one, which could inhibit the setup

QC #: Date Reported: Area:11150 3/21/2005 Install\Files

Description: Steps:RW32core.dll is not delivered, when ONLY 'Delphi for Win32' personality is installed, // unable to compile .rc file

1) start installation select Delphi for Win32 personality ONLY 2) launch IDE 3) File | New | VCL Form App - Delphi for Win32 4) add rc file to the project 5) Project | Build .. // on Build tab BRCC Command Line -w32 -foD:\tmp\L_P1\res5.res D:\tmp\L_P1\res5.RC [RC Fatal Error] res5.RC(1): Unable to load RW32CORE.DLL

QC #: Date Reported: Area:3189 12/19/2002 Install\Files

Description: Steps:[QC Short Description] SysConst.pas in wrong language [QC Description] I have installed Delphi 7 Pro German, but the installed SysConst.pas is in English. The same happens with RTL SP2 for Delphi 6 Pro. QC Entry 3189

Install Delphi 7 Pro German and check SysConst.pas

QC #: Date Reported: Area:88014 9/13/2010 Install\Files

Description: Steps:[QC Short Description] WbmConst.pas is installed in $(BDS)\source\internet and $(BDS)\source\soap [QC Description] WbmConst.pas is installed in $(BDS)\source\internet and $(BDS)\source\soap (it used to be installed only in $(BDS)\source\Win32\internet in Delphi 2010). It is probably a mistake. This is not a problem in English, the files are identical, but it is a problem in French because a translated file exists in $(BDS)\source\internet\fr but not in $(BDS)\source\soap\fr QC Entry 88014 Added by Sysop <<<<<<<<<<< With 15.0.3923.34648, this issue still exists. >>>>>>>>>>>

QC #: Date Reported: Area:86268 7/14/2010 Database

Description: Steps:[QC Short Description] FormatBcd result differs from FormtCurr and FormatFloat [QC Description] The FormatBcd function does not work when used with literal characters. For example, with '0000-0' format mask, the result shoud be '1010-1' for the Bcd number 10101, but the result is '10101-0'. If the mask contains apostrophes (as the documentation says) the result is wrong too. For the format mask '0000"-"0' the result is '010101-"' when it should be '1010-1' too. The tests has been done with Delphi 2010, Delphi 2007 and Delphi 7, and in all versions the error is present. To reproduce the problem compile the following program and execute it. QC Entry 86268

Regression test added to database suites also at: TDBXPulsarBugsSuite.Native.DB.Test.exe -s:TestRaid_278520 program BugFormatBcd; {$APPTYPE CONSOLE} uses SysUtils, FmtBcd; begin try WriteLn('Expected: 1010-1'); WriteLn('FormatBCD: ',FormatBcd('0000-0', IntegerToBcd(10101)));WriteLn('FormatBCD: ',FormatBcd('0000"-"0', IntegerToBcd(10101)));WriteLn('FormatCurr: ',FormatCurr('0000-0', 10101)); WriteLn('FormatCurr: ',FormatCurr('0000"-"0', 10101)); WriteLn('FormatFloat: ',FormatFloat('0000-0', 10101)); WriteLn('FormatFloat: ',FormatFloat('0000"-"0', 10101)); except on E:Exception do Writeln(E.Classname, ': ', E.Message); end; end.

QC #: Date Reported: Area:88736 10/7/2010 Database

Description: Steps:[QC Short Description] Problem with boolean fields, wrong translation for DE [QC Description] Using Delphi XE Tadotable with MS Access Database connected via JetEngine Driver you get a Display for boolean Fields in the DBGRID as TRUE / FALSCH (a mix of german and english)instead of usually WAHR / FALSCH (German). In all previous Versions of Delphi everything worked fine. QC Entry 88736

Have a look at the file: $(BDS)\source\db\de\DBConsts.pas STextFalse = 'Falsch' STextTrue = 'True' ----> should be 'Wahr'

QC #: Date Reported: Area:91229 1/31/2011 Database

Description: Steps:[QC Short Description] Wrong Translation in DBConsts.pas [QC Description] The is a wrong translation in DBConsts.pas STextFalse = 'Falsch'; // OK STextTrue = 'True'; // Wrong in Delphi 2007 it looks like this: STextFalse = 'Falsch'; STextTrue = 'Wahr'; I change a project from 2007 to XE an now some parts of the program don't work. QC Entry 91229

Added by Sysop <<<<<<<<<< THIS FATAL ISSUE IS NOT FIXED 15.0.3953.35171(Update1) !!!! PLEASE REOPEN RIAD#280757(QC#88736) !!!! AND PLEASE RELEASE HOTFIX. >>>>>>>>>>

QC #: Date Reported: Area:89590 11/11/2010 Database

Description: Steps:[QC Short Description] TDataPacketWriter doesn't support FieldType ftLongWord [QC Description] Hi, Trying to send a dataset with TLongWordField with TDataPacketWriter results in a: DatabaseErrorFmt(SUnknownFieldType, [Field.FieldName]); The ftLongWord must have slipped somehow... See: Provider.pas: Lines 1721... in function TDataPacketWriter.InitPutProcs(ADataSet: TDataSet; The missing case is in nested procedure InitFieldProc(ADataSet: TDataSet; AField: TField; far down in that function is: ftSmallint, ftShortint, ftByte, ftInteger, ftWord, ftBoolean, ftFloat, ftCurrency, ftBCD, ftDate, ftTime, ftDateTime, ftAutoInc, ftLargeint, ftBytes, ftTimeStamp, ftTimeStampOffset, ftFMTBcd, TFieldType.ftSingle: PutProc := PutField; But no ftLongWord any where... QC Entry 89590

Out of context, but you should have no problem following this: DataSet := TPacketDataSet.Create(Self); DSWriter := TDataPacketWriter.Create; with DataSet.FieldDefs.AddFieldDef do begin Name := 'Test'; DataType := ftLongWord; end; with DSWriter do begin PacketOptions := PacketOpts; // with grMetaData set Options := ProvOpts; GetDataPacket(DataSet, RecsOut, Data); // <<= the error is raised from this call chain end; GetDataPacket -> CheckMetaData -> InitPutProcs -> InitFieldProc -> DatbaseErrorFmt when Field.DataType = ftLongWord.

QC #: Date Reported: Area:96332 7/18/2011 Database

Description: Steps:[QC Short Description] FreeOnExecute does not work as expected in TDBXMorphicCommand [QC Description] TDBXMorphicCommand delegates it's calls to an internal TDBXCommand. The current implementation does not free objects which are being added by procedure FreeOnExecute(Value: TObject); during the next execution but not before the command is

This is a code-snippet generated by DataSnap: function TServerDatabaseClient.GetCodes: TDataSet; begin if FGetCodesCommand = nil then begin FGetCodesCommand := FDBXConnection.CreateCommand; <------ This call returns a descendent of TDBXCommand, a TDBXMorphicCommand FGetCodesCommand.CommandType := TDBXCommandTypes.DSServerMethod; FGetCodesCommand.Text := 'TServerDatabase.GetCodes'; FGetCodesCommand.Prepare; end; FGetCodesCommand.ExecuteUpdate; <----- here! Result :=

being destroyed. This leads to massive growing memory consumption. QC Entry 96332

TCustomSQLDataSet.Create(nil, FGetCodesCommand.Parameters[0].Value.GetDBXReader(False), True); Result.Open; if FInstanceOwner then FGetCodesCommand.FreeOnExecute(Result); <---------- Result is being added to FFreeOnCloseList of FGetCodesCommand; end; within the implementation of TDBXCommand.ExecuteUpdate; you notice a call to CommandExecuting; which in turn invokes FreeOnExecuteObjects; Everything is fine. procedure TDBXCommand.ExecuteUpdate; begin if FText = '' then FDBXContext.Error(TDBXErrorCodes.InvalidOperation, SNoStatementToExecute); CommandExecuting; <---------- FFreeOnCloseList will be deleted here DerivedExecuteUpdate; CommandExecuted; end; However... in the above case, FGetCodesCommand := FDBXConnection.CreateCommand; returns a descendent of TDBXCommand: a TDBXMorphicCommand. This one override ExecuteUpdate; as follows: procedure TDBXMorphicCommand.ExecuteUpdate; begin Open; FCommand.ExecuteUpdate; end; You can see that it delegates to an internal Command (FCommand). This internal command does not know about the items which have been added to FFreeOnCloseList as this list is being maintained by the "outer" Command. So nothing gets freed and memory consumption grows.

QC #: Date Reported: Area:

58058 2/10/2008 Database\Data Aware Controls\TDBNavigator

Description: Steps:[QC Short Description] Vertical button layout. [QC Description] Please add an option or property to lay out theTDBNAvigator's navigation buttons vertically instead of horizontally. QC Entry 58058

QC #: Date Reported: Area:

91962 3/3/2011 Database\Data Aware Controls\TDBLookupComboBox

Description: Steps:[QC Short Description] TDBLookupComboBox has no "custom" parent [QC Description] I'm trying to create a custom lookup combo box that handles certain details internally instead of making the programmer deal with them. Unfortunately, since TDBLookupComboBox does not follow the standard VCL convention of having a base class named "TCustomWhatever" with no published properties, it's difficult to implement this control without causing strange effects in the Object Inspector. It would be very nice if there was a "custom" base class I could use so I could keep these unneeded properties in a non-published status. QC Entry 91962

QC #: Date Reported: Area:

51886 9/12/2007 Database\Data Access Controls\TDataSet

Description: Steps:[QC Short Description] Master - Detail relation fails [QC Description] A Master-Detail relation fails under these conditions: - I have two times: TQuery - TDatasetProvider - TClientDataset - both TQueries have one parameter each - there is a master-detail relation between the ClientDatasets defined

1. take a TSQLConnection, connect to MySQL 5.x 2. create two MyISAM Tables with a 1:n relationship 3. use a TQuery / TDatasetProvider / TClientDataSet / TDataSource for each table 4. use the key field that links both tables as a parameter in both Queries 5. Link the ClientDataSets according to the relationship via MasterSource, MasterField and IndexFieldName. 6. Create a button an put this code at the OnCliek-Event: sqlOne.ParamByName('idKey').AsInteger := 2; sqlTwo.ParamByName('idKey').AsInteger := 2; cdsOne.Open; cdsTwo.Open; Error: Cannot acces an TDBXType.Int16 as TDBXType.Int16 (or so) Alternative reproduction: 1. Take a TQuery,

via Mastersource, Masterfield and IndexFieldName. - problem occurs with MySQL and only at runtime QC Entry 51886

put in an SQL String with Parameter 2. open the parameter editor, 3. set the parameter DataType to "ftInteger" 4. set the Value Type to "integer" 5. try to open the query (in design mode) Error: Cannot acces an TDBXType.Int16 as TDBXType.Int16 (or so)

QC #: Date Reported: Area:79480 11/13/2009 Database\TField

Description: Steps:[QC Short Description] TUnsignedAutoIncField does not get registered by any design-time packages [QC Description] D2010 IDE fails to register the new TUnsignedAutoIncField field type in any design-time package. The result is that any 3rd-party database vendor who actually adds support for the fieldtype, ends up giving its users problems. Because, when the user opens a form with such a field, they'll get this dialog: Class TUnsignedAutoIncField not found. Ignore the error and Continue? NOTE: Ignoring the error may cause components to be deleted or property values to be lost. [IGNORE] [CANCEL] [IGNORE ALL] The error also existed in D2009, but for several other fieldtypes. This time around only TUnsignedAutoIncField appears to be missing. QC Entry 79480

QC #: Date Reported: Area:96405 7/20/2011 Database\TField\TBinaryField

Description: Steps:[QC Short Description] TBinaryField.GetAsString causes Access Violation if binary data length is odd [QC Description] function TBinaryField.GetAsString: string; var Len: Integer; Data: Variant; PData: Pointer; begin Data := GetAsByteArray; if VarIsNull(Data) then Result := '' else begin Len := VarArrayHighBound(Data, 1) + 1; PData := VarArrayLock(Data); try SetLength(Result, Len div SizeOf(Char)); Move(PData^, Pointer(Result)^, Len); finally VarArrayUnlock(Data); end; end; end; Here if Len is odd, e.g. 3, then Length of result will be 1 since 3 div 2. Then on Move Access Violation will occur. QC Entry 96405

Len := VarArrayHighBound(Data, 1) + 1; // Len is odd, e.g. 3 ... SetLength(Result, Len div SizeOf(Char)); // Length of result will be 1 since 3 div 2 Added by Sysop <<<<<<<<<<<<< [Workaround from QC] function TBinaryField.GetAsString: string; var Len: Integer; Data: Variant; PData: Pointer; ResLen: Integer; begin Data := GetAsByteArray; if VarIsNull(Data) then Result := '' else begin Len := VarArrayHighBound(Data, 1) + 1; PData := VarArrayLock(Data); try ResLen := Len div SizeOf(Char); if Len mod SizeOf(Char) > 0 then Inc(ResLen); SetLength(Result, ResLen); FillChar(Result, #0, ResLen * SizeOf(Char)); Move(PData^, Pointer(Result)^, Len); finally VarArrayUnlock(Data); end;

end; end; >>>>>>>>>>>>>

QC #: Date Reported: Area:92544 3/24/2011 Database\TField\TFieldDefs

Description: Steps:[QC Short Description] Field type ftExtended not fully implemented. [QC Description] New fieldtype ftExtended not fully implemented which makes it impossible to use. NOTE: Maybe all fields should get a checkup if they are included everywhere necessary. We have problem with the TUnsignedAutoIncField class/fieldtype. QC Entry 92544

1a) Create some delphi code: procedure TfrmMain.btnTestCodeClick(Sender: TObject); var cds: TClientDataSet; begin // cds := TClientDataSet.Create(self); cds.FieldDefs.Add('IntVal', ftInteger); cds.FieldDefs.Add('ExtVal', ftExtended); ShowMessage(IntToStr(cds.FieldDefs.Count)); cds.CreateDataSet(); ShowMessage(IntToStr(cds.FieldDefs.Count)); cds.Free(); end; 2a) The first message box shows "2" for the two field definitions. 3a) The second message box shows "1" for the one field that still exist. The ftExtended field is no more. or 1b) Add a new TClientDataSet component to a form. 2b) Double click on the component and choose to add 2 fields. Add one field as "IntVal" of type Integer, and add one field as "ExtVal" of type Extended. 3b) Close the field editor. 4b) Right click on the TClientDataSet component and choose CREATE DATASET. 5b) An error message is shown as "cdsForm: Field 'ExtVal' not found". My guess is that since there where no type ftExtended in my old Delphi 2007, that when you added the ftExtended type it was not added in all the necessary places.

QC #: Date Reported: Area:52878 10/8/2007 Database\Drivers\InterBase

Description: Steps:The DBX4 InterBase driver is unable to cope with the following query: SELECT * from test where * represents 206 integer columns When the Active property is set to true, an error message "unassigned code" is returned. Normally InterBase returns this when some buffer has overflowed. The dbx driver would need to increase the size of this buffer in order for the query to execute successfully. IBConsole can successfully run this query. Also DBX3 appears to be able to successfully run this query

TDBXHighlanderBugsSuite.Managed.exe connection=ibconnection -s:oTestRaid_255708 or TDBXHighlanderBugsSuite.Native.exe connection=ibconnection -s:oTestRaid_255708 or 1. Connect a TSQLConnection to an InterBase database of your choice. 2. Create the following table from the create statement attached. 3. Connect up a TSQLQuery component to the TSQLConnection and set the SQL property to: SELECT * from test The unassigned code error is returned.

QC #: Date Reported: Area:64499 7/15/2008 Database\DBExpress

Description: Steps:[QC Short Description] TParam does not take TLargeIntField value [QC Description] Most database server has a data that store Int64 data, ie PostgreSQL has BigInt. It matches TLargeIntField. TSQLTable generate TLargeIntField for 8 Byte integer but TParam dont's supports this. And also TParam does not provide AsLargeInt(or AsInt64) property. If provided it, our source can read more easely. QC Entry 64499

-- Method1 procedure Testdbxpg.TestMisc2; var SQLQuery: TSQLQuery; begin SQLQuery := TSQLQuery.Create; SQLQuery.SQLConnection := set your connection; SQLQuery.SQL.Text := 'UPDATE test SET bi=:bi WHERE id=4'; SQLQuery.ParamByName('bi').Value := 9223372036854775807; // MaxInt64 SQLQuery.ExecSQL; // Exception here! end; -- Method2 procedure Test; var P: TParam; F: TLargeintField; begin F := TLargeintField.Create(nil); P := TParam.Create(nil); try P.AssignFieldValue(F, 1); P.GetDataSize; // raise exception here finally F.Free; P.Free; end; end;

QC #: Date Reported: Area:

69964 12/17/2008 Database\DBExpress

Description: Steps:[MSSQL] [QC Short Description] @RETURN_VALUE desappear in dbExpress SQLDataSet and SQLStoredProc [QC Description] I had a project in BDS 2006 and always use parameter @RETURN_VALUE, but using RAD Studio 2009 this parameter desappear. Testing with ADOConnection and ADODataSet or ADOStoredProc this parameter comes in parameters list. QC Entry 69964 From a comment of QC report <<<<<<<<<< Still NOT fixed in RAD Studio 2010! >>>>>>>>>>

TDBXPulsarBugsSuite.Native.DB.Test.exe connection=mssqlconnection -s:TestRaid_267457 -OR- inside data explorer, connect to MSSQL and using SQL Window, execute the following: === CREATE PROCEDURE CheckContactCity (@cityName CHAR(50)) AS BEGIN IF ((SELECT COUNT(*) FROM dbo.Orders WHERE ShipCity = @cityName) > 1) RETURN 1 ELSE RETURN 0 END === Create a Project Add TSQLConnection and set ConnectionName and Parameters to a DataBase in SQLServer Add SQLDataSet or SQLStoredProc set Connection and set procedure name to CheckContactCity The parameter @RETURN_VALUE appears in BDS 2006 version but in RAD Studio 2007 and RAD Studio 2009 doesn´t

QC #: Date Reported: Area:89242 10/26/2010 Database\DBExpress

Description: Steps:[QC Short Description] Access violation in dbxfb.dll [QC Description] I get access violation in dbxfb.dll every time I read value of an ftMemo field of TSQLQuery. After the query opened I can read the value but the second attempt raises access violation every time. I tried to use older version of dbxfb.dll (14.0.3615.26342) and the access violation disappeared. I just replaced the dll. I created a sample application to test it. QC Entry 89242

Added by Sysop <<<<<<<<<<<<< If we read TMemoField TWICE, we get AV at second access. Both FieldValues['memo'] and FieldByName('memo').AsBytes fail. ------------- with Query do begin if Active then Log.Lines.Add(FieldValues['memo']); end; ------------- ------------- with Query do begin if Active then Log.Lines.Add(TEncoding.Default.GetString(FieldByName('memo').AsBytes));end; ------------- >>>>>>>>>>>>>

QC #: Date Reported: Area:67682 10/8/2008 Database\DBExpress

Description: Steps:[QC Short Description] DBByteBuffer.pas missing [QC Description] DBByteBuffer.pas is missing from the BDX source code directory. QC Entry 67682

According to DBByteBuffer.hpp, this unit contains a simple byte buffer class.

QC #: Date Reported: Area:3122 12/12/2002 Database\DBExpress

Description: Steps:[MSSQL] Performance degradation in multi-processor machines with SQL server driver. Multi-threaded application running on multi-processor

Test application using Northwinds database is attached. The application has a choice between dbExpress and ADO. It has a choice of thread count also. This needs to be run on a multi-processor box. Two-threads running on a two processor machine

machine is very slow when result sets from queries or stored procedures are returned. It seems like the row/field fetching is going thru critical section and blocking other threads. So the advantage of multi-threading is lost. The test application creates separate connections from each thread to the database and so they should all be independent. QC Entry 3122

takes twice as long as one thread running on one-processor.

QC #: Date Reported: Area:72473 3/25/2009 Database\DBExpress

Description: Steps:[QC Short Description] Exception 'ag' raised on multiple dbexpress connections. [QC Description] DbExpress connections to a blackfish database work fine in read only mode, but multiple connections including write operations cause "Runtime Error: Exception of type 'ag' was thrown." The update will succeed if ran alone without snapshot transactions. QC Entry 72473

Create a simple one table blackfish database. Create a service which randomly accesses the database using a BeginTransaction( TDBXIsolations.SnapShot ) transaction (read only). Works a treat. Create an applet to signal service to alter table. 'UPDATE T1 SET F1 = 1 WHERE F1 <> 1' Exception raised: Runtime Error: Exception of type 'ag' was thrown.

QC #: Date Reported: Area:90115 12/4/2010 Database\DBExpress

Description: Steps:[QC Short Description] Please certify the current Firebird dbExpress driver for Firebird 2.5 [QC Description] As of my current knowledge the current Firebird dbExpress driver has been certified for Firebird 2.1 which was current in summer when it was released. Meanwhile Firebird 2.5 has been released. So please do some tests and certification for the current driver for this version of Firebird. The tests need to be conducted anyway for the next Delphi release so they could be conducted now already and it the driver passes those it could be certified (without claiming support for any of the new Firebird features, but that's ok). If the driver doesn't pass the tests state this aswell so we users do not waste out time and do the necessary changes either for a Update 2 of Delphi XE or for the next version of Delphi where this support should be included anyway. QC Entry 90115

QC #: Date Reported: Area:96474 7/21/2011 Database\DBExpress

Description: Steps:[QC Short Description] "DBX Error: Driver could not be properly initialized" without CoInitialize in a console application [QC Description] An attempt to open a dbXpress connection fails with the following message: Exception class TDBXError with message 'DBX Error: Driver could not be properly initialized. Client library may be missing, not installed properly, of the wrong version, or the driver may be missing from the system path.' The cause of the problem is absence of the call of the CoInitialize function, but the error message does not provide enough information to identify the cause of the error. It also provides false information because the real problem is neither with client library nor its version

1. Unpack the attached project 2. Compile and run. Expected behavior: Either program works as it is written according to the help or fails but produces a meaningful error message. Actual behavior: Program fails and produces a meaningless error message.

nor the driver. This can happen in a console application with very high probability. I suggest either to change the error message or update the documentation and specify that CoInitialize is required to work with dbXpress. QC Entry 96474 QC #: Date Reported: Area:

96506 7/21/2011 Database\DBExpress\TSQLConnection

Description: Steps:[QC Short Description] Using DBXPool with Connect Timeout Corrupts Memory [QC Description] When my DataSnap service tries to connect to the a database where SQLServer is not available, it times out. It then waits 5 seconds and tries to connect again. The moment it calls the TSQLServer.Open method the second time, the service process is immediately terminates without warning. It doesn't even raise an exception in the Delphi debugger. The process just disappears. The Windows System Event log shows: "The ... service terminated unexpectedly" with event id 7034. If I do not set DelegateConnection to DBXPool, then every failed attempt to connect to the database raises a timeout exception. This is the behavior that I want, but I also need to use DBXPool. I created a simple program to recreate the problem, but could not get the simple programs to disappear like my production service does. However, there is still something odd happening because when I use the DBXPool as a DelegateConnection, it will timeout on the first attempt to connect, and then on the second call it will simply succeed,even though there is *no* database server avaialble and it would therefore be impossible for it to be connected. My guess is that memory is being corrupted somewhere and with my service it just happens to kill the process, but with the simple application it does not. In either case, it seems that the DBXPool is to blame. QC Entry 96506

1. Compile the desktop application 2. Stop any instances of SQLServer that are running on the local machine 3. Run the app 4. Click the first button (With DBXPool) a few times You will see it fail once, then it will show the 'connected' message even though it isn't connected. 5. Click the second button (W/O DBXPool) a few times. It will always show a timeout exception.

QC #: Date Reported: Area:

90627 1/2/2011 Database\DBExpress\TSQLConnection

Description: Steps:[QC Short Description] TSQLConnection requires presence of dbxdrivers.ini [QC Description] TSQLConnection only works properly if a dbxdrivers.ini file with the right settings is present in either the application directory (where according to UAC rules a settings file shouldn't be) or in one of two locations two registry keys point to, which is problematic as well since those settings files would then be shared between different applications on the same computer which could lead to conflicts. Requiring a dbxdrivers.ini file also defeats the possibility to change parameters of a TSQLConnection isntance at runtime. It is simply bad design and was introduced after Delphi 2006 at least without any clear indication why this was necessary. This issue als is discussed here: NNTP: forums.embarcadero.com embarcadero.public.delphi.database.dbexpress:2078

1. Create a simple dbexpress application where a working db?connection is being used to fetch some records from a given database. Build the application in a way that it generates a single exe file. Build the application in such a way that it would work on a 2nd PC which doesn't have a dbxdrivers.ini 2. Ensure the application runs properly on the development PC 3. install all necessary database client software on a "fresh" PC 4. copy over your exe file and the necessary dbExpress driver dll but no dbxdrivers.ini 5. run the application on the 2nd PC and notice that it fails due to a missing dbxdrivers.ini

HTTP version: https://forums.embarcadero.com/thread.jspa?threadID=47893&tstart=0 Read especially the website linked to where Andreas Hausladen explains more about it and that this doesn't seem to be dependand on the used database driver. QC Entry 90627 QC #: Date Reported: Area:41186 2/22/2007 Database\DBExpress\TSQLQuery

Description: Steps:[QC Short Description] LoadFromFile Method InOp [QC Description] When building database from SQL scripts, using SQLQuery.SQL.LoadFromFile. Data that component recieves is corrupted. Method had worked in D7 Ent. QC Entry 41186

[qa update] TDBXBugsSuite.Native.DB.Test.exe -s:oTestRaid_246230 -or- Build an app with Button, OpenDialog, SQLQuery (dbx) and 2 Memos In the Button's OnClick Event : Select and Load a file into the first Memo (Memo.Lines.LoadFromFile() Load the same file into the TSQLQuery (SQLQuery.SQL.LoadFromFile() Then dump the data from SQLQuery into the second Memo Memo2.Text := SQLQuery.SQL.Text or SQLQuery. or any other way to review data that was loaded. The data is not the same.

QC #: Date Reported: Area: 64475 7/15/2008 Database\DBExpress\TSQLQuery

Description: Steps: [Interbase] [QC Short Description] Can't insert empty BLOB field into InterBase using DBExpress [QC Description] I use DBExpress component to work with InterBase 2007 I have a table with BLOB NOT NULL column. If I insert a row with empty BLOB, the method TSQLQuery.ExecSQL throws the exception: TDBXError with message 'validation error for column FDATA, value "***null***"' If I insert not empty BLOB - ok If I use TIBQuery for the same - ok If I use previous (C++ Builder 6.0 Update 4 Build 10.166) with DBExpress - ok QC Entry 64475

TDBXWeaverBugsSuite.Managed.DB.Test.exe connection=ibconnection -s:oTestRaid_262549 TDBXWeaverBugsSuite.Native.DB.Test.exe connection=ibconnection -s:TestRaid_262549 ==or== Source: // Create Connection TSQLConnection* pCon = new TSQLConnection(NULL); pCon->DriverName = "Interbase"; pCon->LibraryName = "dbxint30.dll"; pCon->VendorLib = "gds32.dll"; pCon->GetDriverFunc = "getSQLDriverINTERBASE"; pCon->Params->Add("Database=F:\\work\\Autobuild\\Current\\Apacs30\\exe\\db\\demodb\\APACS3000DEMORUS.IB");pCon->Params->Add("User_Name=SYSDBA"); pCon->Params->Add("Password=masterkey"); pCon->Params->Add("ServerCharSet=WIN1251"); pCon->KeepConnection = true; pCon->LoginPrompt = false; pCon->Connected = true; TSQLQuery* pQuery = new TSQLQuery(NULL); pQuery->SQLConnection = pCon; pQuery->SQL->Add(AnsiString("INSERT INTO TAPCFILE (FID0, FID1, FDATA) VALUES (0, 29, :param1)")); TParam* pParam = pQuery->Params->FindParam("param1"); pParam->ParamType = ptInput; // Insert BLOB with zero size

char* pBinBuf = NULL; int nSize = 0; pParam->DataType = ftBlob; pParam->SetBlobData(pBinBuf, nSize); // Throw exception pQuery->ExecSQL(false); TAPCFILE table metadata CREATE TABLE "TAPCFILE" ( "FDATA" BLOB SUB_TYPE 0 SEGMENT SIZE 80 NOT NULL, "FID0" SMALLINT NOT NULL, "FID1" INTEGER NOT NULL, CONSTRAINT "PK_TAPCFILE" PRIMARY KEY ("FID0", "FID1") );

QC #: Date Reported: Area:91187 1/28/2011 Database\DBExpress\TFMTBcd

Description: Steps:[QC Short Description] Assigning Null value results in Invalid Precision value [QC Description] In Delphi 2009, the decimal fields are having TFMTBCDFIELD type and a variant of type NULL cannot be set to this fields, of type TFMTBCDFIELD as it will throw an error "invalid precision value SQLSTATE = HY104". We would like to assign NULL value to an TFMTBCD filed. Added by Sysop <<<< Please see comments of QC for more details. >>>> QC Entry 91187

Assign NULL value to TFMTBCD field. Added by Sysop <<<<<<< Hi Tomohiro Takahashi, as you wished here is a sample project. Hope you can find the error. My wish is to set a decimal field in DB2 which is mapped as fmtbcd field in Delphi explicit to NULL. Thanks Kathrin >>>>>>>

QC #: Date Reported: Area:

75063 6/18/2009 Database\DBExpress\TSqlTimeStamp

Description: Steps:[QC Short Description] Failure to add two TSQLTimeStamp variants [QC Description] Unit SqlTimSt, methods TSQLTimeStampData.DoAdd and DoSubtract have the similar bugs: procedure TSQLTimeStampData.DoSubtract(const ADateTime: TSQLTimeStampData); begin ...... Dec(FDateTime.Hour, ADateTime.Month); ...... end; procedure TSQLTimeStampData.DoAdd(const ADateTime: TSQLTimeStampData); begin ...... Inc(FDateTime.Hour, ADateTime.Month); ...... end; There FDateTime.Hour must be replaced with FDateTime.Month. QC Entry 75063

Added by USc: compile and execute the following console application expected: PASS #1 PASS #2 actual: FAIL #1 FAIL #2 program SqlTimStTest; {$APPTYPE CONSOLE} uses SysUtils, SqlTimSt; var TimeStamp1, TimeStamp2: Variant; begin TimeStamp1 := VarSQLTimeStampCreate(EncodeDate(2000, 1, 1)); TimeStamp2 := VarSQLTimeStampCreate(EncodeDate(1, 1, 1)); TimeStamp1 := TimeStamp1 + TimeStamp2; if TimeStamp1 = EncodeDate(2001, 2, 2) then WriteLn('PASS #1') else WriteLn('FAIL #1'); TimeStamp1 := VarSQLTimeStampCreate(EncodeDate(2001, 2, 2)); TimeStamp2 := VarSQLTimeStampCreate(EncodeDate(1, 1, 1)); TimeStamp1 := TimeStamp1 - TimeStamp2; if TimeStamp1 = EncodeDate(2000, 01, 01) then WriteLn('PASS #2') else WriteLn('FAIL #2'); end.

QC #: Date Reported: Area:93243 4/19/2011 Database\dbExpressCore

Description: Steps:[QC Short Description] BytesToWideStr is not enough memory in DBXPlatform.pas [QC Description] in DBXPlatform.pas , class function TDBXPlatform.BytesToWideStr(const Value: TBytes): UnicodeString; var Count: Integer; Ch: WideChar; ByteIndex: Integer; CharIndex: Integer; WideChars: TDBXWideChars; begin Count := Length(Value); SetLength(WideChars, Count div 2); // error SetLength(WideChars, Count div 2 + Count mod 2); //enough memory .... there are two places: line 1655 & 1749 QC Entry 93243

This code works as expected. <<<<<< procedure TForm4.Button2Click(Sender: TObject); var bs: TBytes; begin SetLength(bs, 2); bs[0]:= byte('1'); bs[1]:= byte('2'); ShowMessage(TDBXPlatform.BytesToWideStr(bs)); end; >>>>>> But, when passing invalid byte array(e.g., just 1 byte), it causes AV. <<<<<< procedure TForm4.Button1Click(Sender: TObject); var bs: TBytes; begin SetLength(bs, 1); bs[0]:= byte('1'); ShowMessage(TDBXPlatform.BytesToWideStr(bs)); // AV occurs end; >>>>>> class function TDBXPlatform.BytesToWideStr(const Value: TBytes): UnicodeString; var Count: Integer; Ch: WideChar; ByteIndex: Integer; CharIndex: Integer; begin Count := Length(Value); SetLength(Result, Count div 2); //<-- if Value has 1 byte, the length of Result is 0, it should be 1. //SetLength(WideChars, Count div 2 + Count mod 2); is ok ByteIndex := 0; CharIndex := 1; while ByteIndex < Count do begin //------- if value has 1 byte, what is Value[ByteIndex+1])? or what is Value[1]? ********************** Ch := WideChar((Integer(Value[ByteIndex+1]) shl 8) + Integer(Value[ByteIndex])); Result[CharIndex] := Ch; if Integer(ch) = 0 then begin SetLength(Result, CharIndex-1); Exit; end; inc(CharIndex); inc(ByteIndex, 2); end; end;

QC #: Date Reported: Area:89809 11/19/2010 Database\dbExpressCore

Description: Steps:[QC Short Description] Runtime error using DBXClientDriver.bpl in application built with runtime package [QC Description] I have an DBExpress application built with runtime packages. Most packages are loaded dynamically in runtime include DBXClientDriver.bpl. These runtime packages may load and unload during runtime. I found out DBXClientDriver.bpl package has problem using in load/unload behavior. It will cause runtime error while the DBXClientDriver.bpl is unload. Please try the sample attachment to replay the problem I face. QC Entry 89809

1. Extract the sample zip attachment 2. Build and Run in Delphi XE Update 1 3. Press Button1 in main form ------------ procedure TForm27.Button1Click(Sender: TObject); var P: THandle; C: TSQLConnection; begin P := LoadPackage('DBXClientDriver150.bpl'); C := TSQLConnection.Create(nil); try C.DriverName := 'DataSnap'; finally C.Free; end; UnloadPackage(P); end; ------------ 4. Close the main form to terminate application 5. Wait for a while and Runtime error prompt out

QC #: Date Reported: Area:

88514 9/30/2010 Database\dbExpressCore

Description: Steps:[QC Short Description] No argument for format '%s' [QC Description] In DBXMetaDataWriter.pas in the function TDBXBaseMetaDataWriter.FindDecimalTypeName there have all calls to the Format function wrong parameters for Args. There is always needed the Product. It raises always the error "No argument for format '%s'". 1471 if BestColumnSize < PrecisionRequired then 1472 raise TDBXMetaDataError.Create(Format(SCannotHoldWantedPrecision, [ColumnName,BestTypeName,IntToStr(BestColumnSize),IntToStr(PrecisionRequired)]));

Added by Sysop <<<<<<<<<<<<<<<<< RDBMS: Firebird 2.1.3 With attached code, create a Firebird database in the source directory with name test.fdb. Compile the soure and start it. The error happens. >>>>>>>>>>>>>>>>>

1471 if BestColumnSize < PrecisionRequired then 1472 raise TDBXMetaDataError.Create(Format(SCannotHoldWantedPrecision, [ColumnName,BestTypeName,IntToStr(BestColumnSize),IntToStr(PrecisionRequired)]));1473 if BestMaxScale < ScaleRequired then 1474 raise TDBXMetaDataError.Create(Format(SCannotHoldWantedScale, [ColumnName,BestTypeName,IntToStr(BestMaxScale),IntToStr(ScaleRequired)])) 1475 else 1476 raise TDBXMetaDataError.Create(Format(SCannotBeUsedForAutoIncrement, [BestTypeName,ColumnName])); The resourcestrings: 0276 SCannotBeUsedForAutoIncrement = 'The best type match in %s for the column: %s is %s. But is cannot be used for an auto increment column.'; 0281 SCannotHoldWantedPrecision = 'The best type match in %s for the column: %s is %s. But the max precision is: %s which is less than the specified: %s.'; 0282 SCannotHoldWantedScale = 'The best type match in %s for the column: %s is %s. But the max scale is: %s which is less than the specified: %s.'; QC Entry 88514 QC #: Date Reported: Area:88657 10/5/2010 Database\dbExpressCore

Description: Steps:[QC Short Description] Memoryleaks in MetaDataProvider [QC Description] There are a lot of memoryleaks in unit DBXMetaProvider, DBXMetaDataWriter. for example: function TDBXMetaDataProvider.MakeCreateTableSql(const Table: TDBXTablesTableStorage; const Columns: TDBXColumnsTableStorage): UnicodeString; var Builder: TDBXStringBuffer; Sql: UnicodeString; begin Builder := TDBXStringBuffer.Create; FWriter.MakeSqlCreate(Builder, Table, Columns); Sql := Builder.ToString; FreeAndNil(Builder); Result := Sql; end; this is right: function TDBXMetaDataProvider.MakeCreateTableSql(const Table: TDBXTablesTableStorage; const Columns: TDBXColumnsTableStorage): UnicodeString; var Builder: TDBXStringBuffer; Sql: UnicodeString; begin Builder := TDBXStringBuffer.Create; try FWriter.MakeSqlCreate(Builder, Table, Columns); Sql := Builder.ToString; finally FreeAndNil(Builder); end; Result := Sql; end; Use try finally to alloc mem and free mem to write solid code. This kind of code writing is over the whole units. Hey, is there a garbage collector in Delphi? Executing the appending code results in this errormessage:

Firebird 2.1.3 must be installed. Compile the attachment, run it and see the error message.

--------------------------- Unexpected Memory Leak --------------------------- An unexpected memory leak has occurred. The unexpected small block leaks are: 13 - 20 bytes: TDBXDataSetRow x 1, TList x 11, TDBXStringBuffer x 1, UnicodeString x 1, Unknown x 1 21 - 28 bytes: EConvertError x 1, UnicodeString x 19, Unknown x 1 29 - 36 bytes: TDBXBooleanValue x 6, TDBXInt32Value x 5, TAggregates x 1, TParams x 1, TCheckConstraints x 1, TFields x 2, UnicodeString x 22 37 - 44 bytes: TDBXWideStringBuilderValue x 6, TFieldDef x 17, UnicodeString x 6 53 - 60 bytes: TDBXClientDataSetTable x 1, TIndexDefs x 1, TMasterDataLink x 1 61 - 68 bytes: TFieldDefs x 1 69 - 76 bytes: TDBXValueType x 17, UnicodeString x 1, Unknown x 2 77 - 84 bytes: TFieldList x 1, TFieldDefList x 1 173 - 188 bytes: Unknown x 3 205 - 220 bytes: Unknown x 1 237 - 252 bytes: TBooleanField x 6, TWideStringField x 6, Unknown x 2 253 - 268 bytes: TIntegerField x 5 477 - 524 bytes: Unknown x 6 733 - 796 bytes: TClientDataSet x 1 The sizes of unexpected leaked medium and large blocks are: 3372, 3372, 3372, 3372, 3372, 3372, 3372, 3372 --------------------------- OK --------------------------- QC Entry 88657 QC #: Date Reported: Area:91457 2/9/2011 Database\dbExpressCore

Description: Steps:[QC Short Description] dbExpress Does Not Work With Case Sensitive Collation In SQL Server [QC Description] THIS WAS PREVIOUSLY REPORTED AS QC#80874(Internal#274345) but was closed as not reproducible. Please, if you can't reproduce it, call me on +44 (0)1743 453146 and I will talk you through the problem and how to replicate it! Using the new dbExpress drivers with XE and an MSSQL case sensitive database (a database with a collation that is case sensitive). As far as I can see the dbExpress code to communicate with MSSQL

Create a new SQL Server Database and set the Collation to a case sensitive option like Latin1_General_CS_AI or in fact any _CS (i.e. Case Sensitive) collation and then try to access the database tables through the Data Explorer. Errors will appear everwhere because the dbExpress code access the system table names as uppercase names even though some of them are not uppercase. The theory can be tested by navigating a case sensitive DB using Database Explorer and trying to navigate to see the fields within a table (this generates a "SQL State: 42S02, SQL Error Code: 208 Invalid object name 'SYSCOMMENTS'" because it should be looking at "syscomments" in lower case)

is using UPPER CASE table names and column names and this only works if the database is case insensitive. In actual fact the tables in question SYSCOMMENTS and SYSTYPES (and all the associated field name) should be in lowercase and the fact that it works at all is more luck than judgement. In previous versions of dbx for MSSQL the code used sp_columns_rowset to get a list of column names for a table and for some reason this has now been amended and hard coded as upper case joins (DBXMsSqlMetaDataReader.pas) This problem extends throughout the functionality of dbExpress because you can then no longer look at meta data and therefore none of the ApplyUpdates functionality works because the code cannot determine what the primary keys are etc. QC Entry 91457 QC #: Date Reported: Area:64447 7/19/2008 Database\Data Explorer

Description: Steps:[QC Short Description] Bug in DataExplorer program [QC Description] I have a database in Oracle 10g and there is field of type NUMBER(9,3) in one of the tables in the database. I displayed this table using DataExplore.exe (located in c:\Program Files\CodeGear\RAD Studio\5.0\bin\ directory) and the above mentioned field was displayed without decimal point. Eg. the content of the field was 4.12 and it was displayed as '412'. The same error also appears in my own program and because of this I get "BCD overflow" error message when the number contains 6 integer and 3 fractional digit. QC Entry 64630

TDBXTiburonBugsSuite.Native.DB.Test.exe -s:oTestRaid_262540 connection=oracleconnection Please see Todo comment before enabling this test. Original steps: ------------------- 1. Create a table in an Oracle 10g database, that contains a field of type NUMBER(9,3). 2. Assign a value (eg. 4.12) to the above mentioned field. 3. Run the c:\Program Files\CodeGear\RAD Studio\5.0\bin\DataExplore.exe program and display the above mentioned table. The '412' incorrect value will be displayed instead of '4.12'.

QC #: Date Reported: Area:81335 1/20/2010 Database\DataSnap

Description: Steps:[QC Short Description] Add DataSnap 2010 HTTPS / SSL client side support [QC Description] Please extend the communication protocol abilities of DataSnap 2010 clients with HTTPS / SSL support. Right now we only have TCP and (new in 2010) HTTP, but we need secured HTTPS support. Since deployment can be done as DataSnap ISAPI server on IIS, the server-side HTTPS / SSL support is not as important as client side (we can let IIS do what it's good at). But for client side, we need HTTPS support. Please. QC Entry 81335

Only TCP/IP and HTTP are available as communication protocol, not HTTPS

QC #: Date Reported: Area:88217 9/20/2010 Database\DataSnap

Description: Steps:[QC Short Description] TJSONMarshal.Marshal uses localized decimal separator for floats [QC Description] [This is a duplicate of QC 81143, because I was unable to attach a demo project there.] TJSONMarshal.Marshal uses the localized decimal separator for

Run Server.exe and Client.exe from the attached project group. Both programs are set up to use the current decimal separator. If it is a dot pressing Button1 in the Client.exe window works just fine and the TMemo below the button is filled with the JSON string and the label is set to the retrieved Double value. To reproduce the error in this case use the radio buttons to use a comma in both programs.

encoding of floating point values. This leads to data that cannot be parsed on the receiving side if the current decimal separator is a comma. Instead a TDBXError exception is raised, containing the text 'JSON byte stream cannot be parsed correctly into a JSON value'. QC Entry 88217 QC #: Date Reported: Area:92921 4/7/2011 Database\DataSnap

Description: Steps:[QC Short Description] DataSnap Client/Server multithread - Fail. [QC Description] Running a datasnap server exposing a method that return a TObject descendant fails when accessed from a multithreaded client. QC Entry 92921 Added by Sysop <<<<<<<< This fatal issue is reproducible easily by launching multiple client processes(e.g., 10 clients). In the case, each client has just one thread(one connection). Then please wait ten seconds, DataSnap server crashes with AV. >>>>>>>>

Create a std. DataSnap server application using a TDatamodule. Add a simple method - GetMyObject - that returns a TObject descendant. Ie TMyObject with a single property MyString of type String. Create a simple VCL Forms client application with a TSQLConnection for the datasnap connection. Use the unit with the shared datastructure - MyObject from before. Let the client create 2 or more threads that access the server - calling GetMyObject - via the autogenerated proxy class. This will eventually fail! When the project fails ... it will typically fail with an "invalid pointer operation .." in the client. Followed by an A/V in the server. Please ajust client threads to 1 and press start threads.... it will run forever ... add another (press the button again) and watch it fail ...

QC #: Date Reported: Area:92921 4/19/2011 11:10:03 AM Database\DataSnap

Description: Steps:[QC Short Description] DataSnap Client/Server multithread - Fail. [QC Description] Running a datasnap server exposing a method that return a TObject descendant fails when accessed from a multithreaded client. Added by Sysop <<<<<<<< This fatal issue is reproducible easily by launching multiple client processes(e.g., 10 clients). In the case, each client has just one thread(one connection). Then please wait ten seconds, DataSnap server crashes with AV. >>>>>>>> QC Entry 92921

Create a std. DataSnap server application using a TDatamodule. Add a simple method - GetMyObject - that returns a TObject descendant. Ie TMyObject with a single property MyString of type String. Create a simple VCL Forms client application with a TSQLConnection for the datasnap connection. Use the unit with the shared datastructure - MyObject from before. Let the client create 2 or more threads that access the server - calling GetMyObject - via the autogenerated proxy class. This will eventually fail! When the project fails ... it will typically fail with an "invalid pointer operation .." in the client. Followed by an A/V in the server. Please ajust client threads to 1 and press start threads.... it will run forever ... add another (press the button again) and watch it fail ...

QC #: Date Reported: Area:93561 5/4/2011 Database\DataSnap

Description: Steps:[QC Short Description] TJSONObject.ToString doesn't properly handle strings with embedded double quotes [QC Description] TJSONObject doesn't properly handle string with embedded double quote altough ToBytes does it properly. QC Entry 93561

TMyClass = class public Value : String; end; MyClass1 := TMyClass.Create; MyClass1.Value := 'Hello "World" !'; JSONValue1 := Marshaler.Marshal(MyClass1); JSONString1 := JSONValue1.ToString; WriteLn(JSONString1); This will print: {"type":"MarshalingTest.TMyClass","id":1,"fields":{"Value":"Hello "World" !"}} It should be (Note the backslash before the double quotes): {"type":"MarshalingTest.TMyClass","id":1,"fields":{"Value":"Hello \"World\" !"}}

QC #: Date Reported: Area:91031 1/21/2011 Database\DataSnap

Description: Steps:[QC Short Description] TDSCustomProxyWriter IncludeClass property doesn't work [QC Description]

There is a problem with the proxy generator, the "include Class" doesn't work. Check out DSProxyWriter.pas, TDSCustomProxyWriter.InclusionTest.There is no way for a false condition to occur if there is a list of Includes. Function starts out with result := true, and can only exit(true), there is no false. What should happen is: function TDSCustomProxyWriter.InclusionTest [..] if Includes <> nil then begin for index := 0 to Length(Includes) - 1 do begin if IsMatch(Includes[Index]) then begin Exit(True); end; end; Result := False; // Added this fail condition end; end; QC Entry 91031 QC #: Date Reported: Area:79136 10/31/2009 Database\DataSnap

Description: Steps:[QC Short Description] DBXJSON.TJSONString.Hex() Stupid code. [QC Description] class function TJSONString.Hex(const Digit: Integer): Byte; var HexData: TBytes; begin SetLength(HexData,16); HexData[0] := Ord('0'); HexData[1] := Ord('1'); HexData[2] := Ord('2'); HexData[3] := Ord('3'); HexData[4] := Ord('4'); HexData[5] := Ord('5'); HexData[6] := Ord('6'); HexData[7] := Ord('7'); HexData[8] := Ord('8'); HexData[9] := Ord('9'); HexData[10] := Ord('A'); HexData[11] := Ord('B'); HexData[12] := Ord('C'); HexData[13] := Ord('D'); HexData[14] := Ord('E'); HexData[15] := Ord('F'); Result := HexData[Digit]; end; Stupid code. Why HexData not const? QC Entry 79136

QC #: Date Reported: Area:89301 10/28/2010 Database\DataSnap\Client

Description: Steps:[QC Short Description] TDSClientCallbackChannelManager does not contain or expose User and Password [QC Description] The TDSClientCallbackChannelManager component does not contain

Build Channel Server Project, include Authentication Manager and only allow certain username / password combinations. Build DBX Client Channels and use the TDSClientCallbackChannelManager to make a connection to the server. Since no DSAuthUser or DSAuthPassword information can be specified, none will be used for the connection, so it will fail.

or expose the DSAuthUser and DSAuthPassword properties, which means that if you want to make a channel callback connection to a server that requires authentication, you are out of luck and will get an error (access denied because the authentication manager did not allow you access). QC Entry 89301 QC #: Date Reported: Area:85467 6/15/2010 Database\DataSnap\Client

Description: Steps:[QC Short Description] Datasnap 2010 client can't connect across a proxy, no way to set one [QC Description] A datasnap client can't work across an HTTP proxy because there is no way to set one. Although it internally use a TidHTTP component which has proxy support, a DatasnapConnection configuration does not allow to set proxy parameters. Probably some tricks could be used to access the private TidHTTP instance, but this should be a standard feature of any http connection, due to the broad use of proxy servers inside business environments to control HTTP traffic. QC Entry 85467

QC #: Date Reported: Area:88431 9/27/2010 Database\DataSnap\Server

Description: Steps:[QC Short Description] add DSAuth to uses clause of ServerMethodsUnit [QC Description] If TRoleAuth type (from the DSAuth unit) is unknown, then the attribute will be ignored by the compiler, producing only a "unsupported language feature" warning. Please add the DSAuth unit to the uses clause of the ServerMethodsUnit template, so it's always there. QC Entry 88431

Part of the new authorization functionality is the ability to mark both server methods and/or the entire server method class with the TRoleAuth attribute to tell which role(s) is authorised, and which role(s) explicitly isn't. Syntax example: type {$METHODINFO ON} TServerMethods1 = class(TComponent) private { Private declarations } public { Public declarations } function EchoString(Value: string): string; [TRoleAuth('admin', 'guest')] function ReverseString(Value: string): string; end; {$METHODINFO OFF} Here, the ReverseString function is only allowed for user 'admin' while user 'guest' is not allowed to call it (and other users are not specified, so they will also be able to call it, or so it seems). When adding the attribute to the class definition, we get a compiler warning (not an error, but a warning "unsupported language feature"). The warning is caused by the fact that the compiler doesn't know about the TRoleAuth type at this point (by default, the unit DSAuth is not in the uses clause), and the actual effect is that this custom attribute is ignored, so no authorization is done on the ReverseString, and even 'guest' can call it now. Workaround: modify this particular warning ("Unsupported language feature") in the Build Configuration and turn it into an error, so people will see it as an error and not a warning. Manual Fix: add the DSAuth unit to the uses clause. Embarcadero requested fix: add the DSAuth unit to the uses clause of the ServerMethodsUnit template, so it's always there... Thanks!

QC #: Date Reported: Area:90842 1/12/2011 Database\DataSnap\Server

Description: Steps:[QC Short Description] TWebFileDispatcher send wrogn ContentType for cached documents [QC Description] When you ask a TWebFileDispatcher for the files, if they are cached it they are returned as "NOT MODIFIED" but you'll also get back the defautl "text/html" in the borwser. Chrome marks this as a warning in the javascript console, but the page works anyway. QC Entry 90842

Use the wizard to create a DataSnap REST Server application. Compile and run as is. Open in the browser (at elast Chrome), looking at the javaScript Console. Alll fine. Refresh the page, you start to see warnings.

QC #: Date Reported: Area:90841 1/12/2011 Database\DataSnap\Server

Description: Steps:[QC Short Description] json-min.js causes problems with jQuery plugins [QC Description] The bug I'm experiencing is between the "json-min.js" file added by the Delphi wizard and some of the jQuery components (but not the core jQuery) itself. json-min.js is a rather out-of-standard JS library, causing problems with other JS libraries. Namely I had serious issues with jQuery and replaced it with json2.js from http://www.JSON.org/json2.js I also fixed the other JS libraries in DataSnap REST accordingly. Can attach a demo I already emailed to Steve Axtell <[email protected]> Mathew Delong <[email protected]> who asked me to open the QC case... Can also send the modified code with the fixes, if useful, but I'll blog about this as well. QC Entry 90841

Create a DataSnap REST Application wizard generated program with these changes: - added jquery plus a couple of addins to the JS folder - references those in the ReverseString.html file - added one start up line that calls the validation tool, and causes the error (you see the error only in a JavaScript console in the browser!) - the error goes away if you remove the json2-min.js

QC #: Date Reported: Area:66503 9/8/2008 Database\DataSnap\Server

Description: Steps:[QC Short Description] Starting 2 servers using same port causes unhandled win32 exception [QC Description] Starting 2 different Datasnap servers that have the same port number assigned causes an Unhandled Win32 execption. There should be a more graceful way of handling this, perhaps as simple as displaying a warning message and terminating the 2nd server. QC Entry 66503

Create 2 different servers, both with a TDSTCPServerTransport on it, assigned to the same port number When you start the 2nd one, it causes an "Unhandled Win32 Execption" and kicks off whatever debugger you have configured.

QC #: Date Reported: Area:91030 1/21/2011 Database\DataSnap\Server

Description: Steps:[QC Short Description] Datasnap: DSConnectEventObject.ChannelInfo.Info reports localIP not RemoteIP [QC Description] It seems that there is a bug in the reporting the IP address of the conneting client. https://forums.embarcadero.com/thread.jspa?threadID=45750&tstart=0 QC Entry 91030

procedure TServerContainer.DSServer1Connect( DSConnectEventObject: TDSConnectEventObject); var IPAddress : string; s : string; begin //To obtain the IP when a client is connecting, you can add an OnConnect event to the TDSServer component. In the event, get the IP with this code: IPAddress := DSConnectEventObject.ChannelInfo.Info; //You could then store the IP address in the current session, for later use. To do this, use the following code: //TDSSessionManager.GetThreadSession.PutData('RemoteIP', IPAddress); //However, this may not be necessary, as the IP may already be stored in the session. //To get the IP from the session from within a server method, call this (requiring the DSService unit): //TDSSessionManager.GetThreadSession.GetData('RemoteIP') end;

QC #: Date Reported: Area:91526 2/12/2011 Database\DataSnap\Server

Description: Steps:[QC Short Description] Memory leak occurred when datasnap server exe closed [QC Description]

1.create datasnap server project with wizard. (Setting to use Data Module) 2.change DSServerClass1.LifeCycle to 'Invocation',and turn on ReportMemoryLeaksOnShutdown switch in project file.

Added by Sysop <<<<<<<< Memory leaks are TDSProviderDataModuleAdapter instances. >>>>>>>> I created a datasnap server project with delphi xe wizard,all set in wizard was not changed,except DSServerClass1.LifeCycle was changed to 'Invocation'.And then ,i created a VCL client project and added ClientClassesUnit1 unit with wizard too. In my client program ,i simply call server method 'EchoString', it is work.But when i close server program,a memory leak occurred.Of course, i turned on the ReportMemoryLeaksOnShutdown switch in my server project. QC Entry 91526

3.Create a vcl client project,and add ClientClassesUnit1 unit with client module wizard. 4.Add a button and a edit control to client main form. 5.In button click event, call server method EchoString, show return string in edit. 6.Close client program, close server program. 7.Memory leak occurred when close server. Added by Sysop <<<<<<<< Memory leaks are TDSProviderDataModuleAdapter instances. >>>>>>>>

QC #: Date Reported: Area:69556 12/3/2008 Database\DataSnap\Server

Description: Steps:[QC Short Description] DSTCPServerTransport.PoolSize has wrong default [QC Description] The default value of the property (10, also according to the documentation) is not set in the constructor. Not only 10 is not th default, but if you set it, it is not streamed (as it is declared as the default value). Not a big deal but annoying. Kind of a components 101 mistake <g>.QC Entry 69556

QC #: Date Reported: Area:97109 8/3/2011 11:26:55 AM Database\Amazon

Description: Steps:Indy abstraction layer implementation does not correctly instantiate SSL IO Handler Note: this affects both Amzon and Azure cloud services Comments from Andre Mussche on forums: However, I had to use HTTP protocol, HTTPS gives error: ======================================== First chance exception at $76C5B9BC. Exception class EIdIOHandlerPropInvalid with message 'IOHandler value is not valid'. Process Project1.exe (3304) IdHTTP.TIdCustomHTTP.SetHostAndPort IdHTTP.TIdCustomHTTP.ConnectToHost($206F540,$2058A90) IdHTTP.TIdCustomHTTP.DoRequest(???,'https://s3.amazonaws.com',nil,$20A3460,(...)) IdHTTP.TIdCustomHTTP.Get('https://s3.amazonaws.com',???,(...)) IdHTTP.TIdCustomHTTP.Get('https://s3.amazonaws.com',???) IndyPeerImpl.TIdHTTPPeer.DoGet('https://s3.amazonaws.com',$20A3460) Data.Cloud.CloudAPI.TCloudHTTP.Get('https://s3.amazonaws.com',???) Data.Cloud.CloudAPI.TCloudService.IssueGetRequest('https://s3.amazonaws.com',???,nil,'/',$203EE60,'') Data.Cloud.AmazonAPI.TAmazonStorageService.ListBucketsXML($203EE60) Data.Cloud.AmazonAPI.TAmazonStorageService.ListBuckets(???) Unit1.TForm1.Button1Click($202E0D0) if TextIsSame(URL.Protocol, 'HTTPS') then begin {do not localize} // Just check can we do SSL if not (IOHandler is TIdSSLIOHandlerSocketBase) then begin raise EIdIOHandlerPropInvalid.Create(RSIOHandlerPropInvalid); end; ======================================== IOHandler = nil

open sample at tptest\projects\database\samples\AzureAPITest\CloudAPITest.dpr open the form unit and change both Azure and Amazon components to use https protocol instead of http run on amazon tab, go into blobs, buckets, get, list buckets exp: lists without error act: error message saying iohandler is invalid on azure tab, go into blobs, blobls, list blobs exp: lists without error act: error message saying iohandler is invalid

QC #: Date Reported: Area:76302 7/24/2009 11:04:26 AM International\Other

Description: Steps:

[Related with RAD-881] BDS Language configuration tool ($(BDS)\bin\BDSSetLang.exe) caption is 'Form4' (ORIGINAL), it should be more appropriate caption, please see attached screen shot.

- install product with all language (EN, DE, FR, JA) - $(BDS)\bin\BDSSetLang.exe /I // ACT: caption is 'Form4' // see also 271462_translation_status.png

QC #: Date Reported: Area:89616 11/12/2010 VCL

Description: Steps:[QC Short Description] HTMLHelpViewer.pas bug in initialization finalization methods [QC Description] Read my previous bug #78998 and try to read it this time, instead of declaring it duplicate and then forgetting it. http://qc.embarcadero.com/wc/qcmain.aspx?d=78998 This bug is there since you created HTMLHelpViewer.pas ... INCREDIBLE! You also putted a comment noticing that the call fails to set the cookie, but you never noticed that you called it wrong with that & operator! Please, for Delphi XE Update 1 do yourselves a favour and copy paste my code. QC Entry 89616

No need. It is a random bug.

QC #: Date Reported: Area:96793 7/28/2011 VCL\Additional Controls

Description: Steps:[QC Short Description] TGridPanel raises EListError after column/row deletion [QC Description] See steps. QC Entry 96793

1. Start new VCL Forms Application project 2. Place a TGridPanel on the form (2x2 cells by default). 3. Place two TButton controls at the second row of gridpanel (place two buttons, and set Row property of both controls to 1). 4. Open the RowCollection editor of gridpanel, and delete the first row (Row0). 5. Save project, and look at the DFM. GridPanel1.ControlCollection items still have Row=1. It's wrong. 6. EListError exception raised with message 'List index out of bounds (1)' when you try any of the following: a) Compile and Run b) Reopen the form in IDE c) Select one of the button controls in IDE

QC #: Date Reported: Area:92149 3/9/2011 VCL\Additional Controls\TBitBtn

Description: Steps:[QC Short Description] When changed Windows theme (Classic) at runtime while application is running, the image of TBitBtn is vanished. [QC Description] When changed Windows theme (Classic) at runtime while application is running, the image of TBitBtn is vanished. Please see Steps. QC Entry 92149

1.Enable Windows themes. 2.Run test.exe. (Attachments) 3.Disable Windows themes at runtime while test.exe is running. (Window Classic) EXP: The image is displayed. ACT: The image is not displayed. Added by Sysop <<<<<<<<<<< Please see comment of QC for FIX. >>>>>>>>>>>

QC #: Date Reported: Area:

92385 3/18/2011 VCL\Additional Controls\TSpeedButton

Description: Steps:[QC Short Description] TSpeedButton and TBitBtn don't draw glyphs

Run attached application, then change any Windows theme to "Windows Classic" while application is running and note disappearing

[QC Description] TSpeedButton and TBitBtn don't draw glyphs after Windows theme is changed to "Classic" when application is running. Added by Sysop <<<<< This issue is same as(similar to) QC#92149. >>>>> QC Entry 92385

glyphs. To see glyphs again application must be re-started. Tested on Windows XP and 7.

QC #: Date Reported: Area:

96892 7/29/2011 VCL\Additional Controls\TDrawGrid

Description: Steps:[QC Short Description] Make TCustomGrid.SelectionMoved virtual [QC Description] We have created a virtual grid component based on TCustomDrawGrid for our application. In our grid you can focus individual cells (goRowSelect is off) however the current focused row is highlighted. We now want to highlight the the rows which are in the selection. The only way I can see to do this is to override TCustomGrid.SelectionMoved so it can invalidate the rows included in the selection. To make this possible, could you please make the TCustomGrid.SelectionMoved() procedure virtual and give it protected visibility. This should not break any existing code. QC Entry 96892

QC #: Date Reported: Area:71112 2/3/2009 VCL\Core VCL Classes\TThread

Description: Steps:[QC Short Description] Deadlock in TThread destructor when constructor raises exception when CreateSuspended is False [QC Description] If the CreateSuspended parameter of the TThread constructor is set to False, and then any derived class constructor raises an exception, the TThread destructor deadlocks. This problem was introduced in D6 and still exists in D2009. The reason for the deadlock is because the TThread destructor does not resume the suspended OS thread when CreateSuspended is False: destructor TThread.Destroy; begin if (FThreadID <> 0) and not FFinished and not FExternalThread thenbegin Terminate; if FCreateSuspended then // <-- here Resume; <-- not called WaitFor; end; ... end; To fix this, the TThread constructor should be setting the FSuspended member to True when creating a new OS thread object (since it is always created in an suspended state), and then the destructor needs to check the FSuspended member instead of the FCreateSuspended member, ie: constructor TThread.Create(CreateSuspended: Boolean);

program ThreadDeadlockApp; {$APPTYPE CONSOLE} uses Classes, Dialogs, SysUtils; type TTestThread = class(TThread) protected procedure Execute; override; public constructor Create(CreateSuspended: Boolean); end; constructor TTestThread.Create(CreateSuspended: Boolean); begin inherited; raise Exception.Create(''); // can be any exception end; procedure TTestThread.Execute; begin end; begin try TTestThread.Create(True); except ShowMessage('ok'); // this is reached fine end; try TTestThread.Create(False); except ShowMessage('ok'); // this is never reached end; end.

{$IFDEF LINUX} var ErrCode: Integer; {$ENDIF} begin inherited Create; AddThread; if not FExternalThread then begin FSuspended := True; <-- here FCreateSuspended := CreateSuspended; {$IFDEF MSWINDOWS} FHandle := BeginThread(nil, 0, @ThreadProc, Pointer(Self), CREATE_SUSPENDED, FThreadID); if FHandle = 0 then raise EThread.CreateResFmt(@SThreadCreateError, [SysErrorMessage(GetLastError)]); {$ENDIF} {$IFDEF LINUX} sem_init(FCreateSuspendedSem, False, 0); ErrCode := BeginThread(nil, @ThreadProc, Pointer(Self), FThreadID); if ErrCode <> 0 then raise EThread.CreateResFmt(@SThreadCreateError, [SysErrorMessage(ErrCode)]); {$ENDIF} end else begin FSuspended := False; FCreateSuspended := False; {$IFDEF MSWINDOWS} FHandle := Windows.GetCurrentThread; FThreadId := Windows.GetCurrentThreadId; {$ENDIF} end; end; destructor TThread.Destroy; begin if (FThreadID <> 0) and not FFinished and not FExternalThread thenbegin Terminate; if FSuspended then Resume; WaitFor; end; RemoveQueuedEvents(Self, nil); {$IFDEF MSWINDOWS} if (FHandle <> 0) and not FExternalThread then CloseHandle(FHandle); {$ENDIF} {$IFDEF LINUX} // This final check is to ensure that even if the thread was never waited on // its resources will be freed. if (FThreadID <> 0) and not FExternalThread then pthread_detach(FThreadID); sem_destroy(FCreateSuspendedSem); {$ENDIF} inherited Destroy; FFatalException.Free; RemoveThread; end; QC Entry 71112 QC #: Date Reported: Area:9862 12/10/2004 VCL\Core VCL Classes\TThread

Description: Steps:[QC Short Description] Make TThread handle naming the thread during debugging nicer [QC Description]

TThread uses RaiseException() to pass a name string to the debugger for displaying per-thread names in the Threads window. The generated code is not friendly to developers who use the generated TThread descendant code as a base class for other descendant classes. Those classes are not able to name themselves properly, unless they call their own RaiseException() code manually. The RaiseException() code can easily be abstracted away inside of TThread itself by adding a Name property to TThread. See the Workaround section for a possible implementation. QC Entry 9862 QC #: Date Reported: Area:

4166 4/21/2003 VCL\Core VCL Classes\TWinControl

Description: Steps:[QC Short Description] Displaying JPEG file with 1 pixel height fails in Graphic.pas unit [Reproduced on D7] [QC Description] There was a change in Graphics.pas between Delphi versions 4 and 6 in function TBitmap.GetScanLine. Now a JPEG file that is 1 pixel in height will fail with an invalid scanline operation. The problem line in the function is: if (Row < 0) or (Row >= bmHeight) then A possible fix (that works) is if (Row < 0) or ((Row >= bmHeight) and (bmHeight > 1)) then QC Entry 4166

As a quick verify 1. Build a jpg image with a 1 pixel height, width does not matter. 2. Create a new application 3. Add jpeg to the uses clazse 4. Add an image 5. Add a button 6. Add procedure TForm1.Button1Click(Sender: TObject); begin Image1.Picture.LoadFromFile('c:\j1.jpg'); end; Run the app.

QC #: Date Reported: Area:

95115 6/14/2011 VCL\Core VCL Classes\TWinControl

Description: Steps:[QC Short Description] VCL should call BufferedPaintInit before the first call to BeginBufferedPaint [QC Description] According to http://msdn.microsoft.com/en-us/library/bb773257(VS.85).aspx each thread that uses BeginBufferedPaint should also call BufferedPaintInit before the first call to BeginBufferedPaint, because "Failure to call BufferedPaintInit may result in degraded performance due to internal data being initialized and destroyed for each buffered paint operation." http://msdn.microsoft.com/en-us/library/bb773266(v=VS.85).aspx recommends to call BufferedPaintInit when the main form is created, and BufferedPaintUninit when the main form is destroyed. The VCL calls BeginBufferedPaint in TWinControl.WMPaint. It never calls BufferedPaintInit. QC Entry 95115

QC #: Date Reported: Area:

88415 9/26/2010 VCL\Core VCL Classes\TApplicationEvents

Description: Steps:[QC Short Description] OnModalBegin and OnModalEnd do not function [QC Description] In Visata 64 bit no OnModalBegin and OnModalEnd event is fired when any other Windows theme than "Windows Classic" is active Added by Sysop <<<<<<<<<<< When using Common dialog box(e.g., MessageDlg) and setting

Added by Sysop <<<<<<<<<<<<<<<<<< procedure TMainForm.Button1Click(Sender: TObject); begin UseLatestCommonDialogs := True; MessageDlg('Main form dimmed!', mtInformation, [mbOK], 0, mbOK); end; >>>>>>>>>>>>>>>>>>

UseLatestCommonDialogs to True(this is default), OnModalBegin and OnModalEnd are not fired. >>>>>>>>>>> QC Entry 88415 QC #: Date Reported: Area:89435 11/4/2010 VCL\Graphics\TPNGImage

Description: Steps:[QC Short Description] TPngImage performance [QC Description] You can speed up access to some, frequently used, TPngImage properties. For example Pixels property. The "as" operator is used too widely. In many cases, it can be replaced by typecasting. For example: function TPngImage.GetHeader: TChunkIHDR; begin {If there is a TChunkIHDR returns it, otherwise returns nil} if (Chunks.Count <> 0) and (Chunks.Item[0] is TChunkIHDR) then Result := Chunks.Item[0] as TChunkIHDR //!!! else begin {No header, throw error message} RaiseError(EPNGHeaderNotPresent, EPNGHeaderNotPresentText);Result := nil end end; Can be replaced by: function TPngImage.GetHeader: TChunkIHDR; begin {If there is a TChunkIHDR returns it, otherwise returns nil} if (Chunks.Count <> 0) and (Chunks.Item[0] is TChunkIHDR) then Result := TChunkIHDR(Chunks.Item[0]) else begin {No header, throw error message} RaiseError(EPNGHeaderNotPresent, EPNGHeaderNotPresentText);Result := nil end end; Or, better (without double calling TPNGList.GetItem): function TPngImage.GetHeader: TChunkIHDR; var Chunk: TChunk; begin if (Chunks.Count <> 0) then begin Chunk := Chunks.Item[0]; if (Chunk is TChunkIHDR) then begin Result := TChunkIHDR(Chunk); Exit; end; end; RaiseError(EPNGHeaderNotPresent, EPNGHeaderNotPresentText);Result := nil end; QC Entry 89435

QC #: Date Reported: Area:89798 11/18/2010 VCL\Dialog Controls

Description: Steps:[QC Short Description] TTaskDialog fails under Windows Class

Show a Vista task dialog under the Windows classic theme

[QC Description] TCustomTaskDialog.DoExecute includes this line: if not ThemeServices.ThemesEnabled then raise Exception.CreateResFmt({$IFNDEF CLR}@{$ENDIF}SXPThemesRequired, [ClassName]); This means that it cannot work under Windows Classic. I suspect that the code should test ThemesAvailable. Added by Sysop <<<<<<<<<<< The error in the code is that the author mistakenly believes that the Vista TaskDialog requires themes to be enabled, but Vista TaskDialog works perfectly well when they are not, e.g. in Windows classic theme. >>>>>>>>>>> QC Entry 89798 QC #: Date Reported: Area:94160 5/24/2011 VCL\Dialog Controls\TOpenDialog

Description: Steps:[QC Short Description] TOpenDialog fails when visual themes are disabled in compatibility mode [QC Description] If a user for some reason turns on the "disable visual themes" option in the compatibility mode section of a Delphi XE application, then TOpenDialog.Execute does nothing. No dialog is shown. No exception is raised. This occurs on Windows 7 x64. I have not tested on other versions of Windows. Added by Sysop <<<<<< This issue is related to UseLatestCommonDialogs property. Please see comments of QC for more information. >>>>>> QC Entry 94160

1. Start a new VCL application. 2. Drop a TButton and TOpenDialog on the form. 3. Assign the button's OnClick event handler to call OpenDialog1.Execute 4. Compile the application. 5. Right-click the Project1.exe file in Windows Explorer and select Properties. 6. On the Compatibility tab in the .exe's Properties, check "disable visual themes". 7. OK the properties window. 8. Run Project1.exe 9. Click the button Expected: File open dialog is shown Actual: Nothing happens

QC #: Date Reported: Area:87323 8/17/2010 VCL\Registry / INI Objects

Description: Steps:[QC Short Description] TRegistry.Delete key does not work for 64bit keys [QC Description] TRegistry.DeleteKey cannot delete 64bit keys, even if KEY_WOW64_64KEY was supplied. The reason is that DeleteKey uses RegDeleteKey which fails on this flag with 87 (invalid parameter). To remedy that RegDeleteKeyEx must be used which is only available in XP 64bit and Vista (32+64bit). This is NOT a duplicate of qc #23429 QC Entry 87323

1. Use 64bit Windows (XP, Vista, Win7) 2. Create a key with MS Registry Editor (64bit) HKEY_LOCAL_MACHINE\SOFTWARE\TEST_THIS_QC 3. Run this app: uses Windows, Registry; var Reg: TRegistry; begin Reg := TRegistry.Create(KEY_ALL_ACCESS OR KEY_WOW64_64KEY {$100}); Reg.RootKey := HKEY_LOCAL_MACHINE; if not Reg.DeleteKey('\SOFTWARE\TEST_THIS_QC') then raiseLastOsError;

QC #: Date Reported: Area:86876 8/3/2010 VCL\Standard Controls\TMainMenu

Description: Steps:[QC Short Description] Incorrect painting of hot item on menu using Vista/7 themes [QC Description] Recent versions of Delphi do a decent job of supporting the new style menus introduced in Vista.

However, there is a minor flaw in the way the menu highlight is drawn. The code in Menus.pas draws the menu highlight after drawing the glyph. This results in the menu highlight being blended over the top of the glyph. In fact the opposite is what is required, namely the glyph being blended over the top of the menu highlight. This can be seen, for example, in the RAD Studio IDE which clearly is built from the same flawed Delphi code. The solution is trivial. Just move the code which draws the menu highlight (the call to DrawThemeBackground with MPI_HOT parameter) before the code which draws the glyph. Incidentally, you may be aware that Vista/7 themed menus can be obtained, with glyphs, without using owner draw code. The trick is to set MenuItemInfo.hbmpItem to be a PARGB32 bitmap in TMenuItem.AppendTo. This would, for me, be a much preferable approach to supported Vista/7 themed menus. The advantage is that using system drawn menus makes your code more robust to future releases of Windows which may change things once again. In addition, you get the system native code for greying out menu glyphs and thus making your app as native as possible. QC Entry 86876 QC #: Date Reported: Area:89920 11/24/2010 VCL\Standard Controls\TMainMenu

Description: Steps:[QC Short Description] Vista disabled menu items drawn incorrectly [QC Description] This report is related to 86876. That report describes the fact that the call to DrawThemeBackground for (MENU_POPUP_ITEM, MPI_HOT) is drawn in wrong sequence. I have also realised that it is a mistake always to pass MPI_HOT. When the menu item is disabled you should pass MPI_DISABLEDHOT. This is why disabled menu items are drawn, incorrectly, with a blue hot highlight instead of being grey as nature intended. As I stated in 86876, the ideal solution would be to avoid owner draw altogether. QC Entry 89920

QC #: Date Reported: Area:63171 6/11/2008 VCL\Win 32 Controls\TImageList

Description: Steps:[QC Short Description] When adding a large PNG image to an imagelist, there is no prompt for slicing the image into smaller images [QC Description] When you select the Add button on the ImageList component editor and choose a BMP image that is larger than the imagelists image dimensions, a dialog is displayed asking if you want to separate the image into separate images. When you select the Add button on the ImageList component editor and choose a PNG image that is larger than the image lists image dimensions, there is no offer to separate the png into separate images. QC Entry 63171

BMP Test 1. Create a new VCL application 2. Add an TImageList to the form 3. Double click the TImageList to show the component editor 4. Select the Add button and select a BMP image that has the dimensions of 32x32 exp: Dialog asking if I want to add this image as 4 separate images act: Dialog asking if I want to add this image as 4 separate images PNG Test 1. Create a new VCL application 2. Add an TImageList to the form 3. Double click the TImageList to show the component editor 4. Select the Add button and select a PNG image that has the dimensions of 32x32 exp: Dialog asking if I want to add this image as 4 separate images act: image added as a single image that has been resized to fit in the image list dimensions

QC #: Date Reported: Area:92915 4/7/2011 VCL\Win 32 Controls\TImageList

Description: Steps:[QC Short Description] No event OnChange

1. Throw on the form TImageList 2. Assigns an event handler onChange 3. Perform a Move method 4. The event is not triggered.

[QC Description] Added by Sysop <<<<<<< This is a regression in Delphi XE. >>>>>>> Does not fire event 'onChange' after the execution of the method TImageList.Move. This error appeared only in Delphi XE, before it worked twice. QC Entry 92915

See attached file. Handler events ImageList1.onChange adds rows to Memo1 (left). At the bottom of the image portrayed ImageList1. Button on the right have different changes in ImageList1. 0. Open the file TestImageList.dpr. 1. Compile and run the application. 2. Push the button at the top right Move (1, 2) 3. If the application is compiled in Delphi XE, we see that the addition of strings does not occur, ie event does not fire. While the bottom is that the images 1 and 2 are swapped. In earlier versions of this event is triggered twice. IMHO, should be triggered once! 4. Trying to press other buttons to verify proper operation. Delete and AddIcon working properly. I suggest the developers to independently verify the correctness of the other methods that alter ImageList1.

QC #: Date Reported: Area:97696 8/16/2011 VCL\Win 32 Controls\TRichEdit

Description: Steps:[QC Short Description] Unwanted null characters when loadng files/streams into a TRichEdit [QC Description] When the TRichEdit.PlainText property is True, TRichEdit's LoadFrom...() methods attempt to load data as Ansi and decode it to Unicode. During that process, the data is read in chunks and each chunk is decoded. In ComCtrls.StreamLoad(), a check a made to see if a chunk ends with a #13 byte, and if so then replaces it with a #00 byte, BUT it does not adjust the chunk length accordingly, so that #00 byte gets included in the Unicode decoding, which produces a null character. The RichEdit does not display the character, but it is present in the TRichEdit.Text property. If the data has line breaks that occur at even multiples of the chunk length (2045-2046 bytes), they produce null characters. When I ran all three of the attached HTML files through the LoadFromFile() method, the #13->#00 replacement happens exactly once for each file. QC Entry 97696

The attached D2009 project includes 3 HTML files reproduce the problem. The problem still exists in later versions.

QC #: Date Reported: Area:91236 1/31/2011 VCL\Win 32 Controls\TTreeView

Description: Steps:[QC Short Description] Regression: Node editor modifies silently the caption of the first node [QC Description] The TTreeView node editor modifies silently the caption of the first node. This is regression from Delphi 2010. -> see steps QC Entry 91236

1. save the attached test case 2. start Delphi 3. open TreeViewNodeEditTest.dpr 4. call the node editor for the TTreeView on the main form (editor of property Items or "Items Editor..." from the Form Designers popup menu) 5. edit the caption of the second node 6. close the node editor with OK expected: the caption of the first node is still "Please do not touch me!!!" actual: the caption is "Edit my caption" Already after step 4. the caption is changed and the only chance not to touch the first nodes caption seems to press Cancel. Interestingly there is no such problem when using $(BDS)\source\Property Editors\NodeEdit.pas at runtime. Alternative steps without test case: A1. create a new VCL Forms application A2. add a TTreeView to the form A3. call the node editor A4. add two nodes A and B A5. OK A6. call the node editor again A7. edit the caption of second node A8. close the node editor with OK expected: the caption of the first node is still "A" actual: the caption is "B" Already after step A6. the caption is changed and the only chance not to touch the first nodes caption seems to press Cancel.

QC #: Date Reported: Area:91574 2/15/2011 VCL\Win 32 Controls\TListView

Description: Steps:[QC Short Description] OnColumnRightClick is not called on a second monitor [QC Description] The TListView event OnColumnRightClick is not called my second monitor. Code from ComCtrls.pas: NM_RCLICK:

The ViewStyle must be set to vsReport. Right click on a listview column in a monitor with negative x or y value. Code to use: void __fastcall TForm1::ListView1ColumnRightClick(TObject *Sender, TListColumn *Column, TPoint &Point) { Application->MessageBoxW(L"Hi", L"", MB_OK); } The message will not appear on the second monitor.

begin P := Point(LoWord(GetMessagePos), HiWord(GetMessagePos)); From the GetMessagePos Help: "Important Do not use the LOWORD or HIWORD macros to extract the x- and y- coordinates of the cursor position because these macros return incorrect results on systems with multiple monitors. Systems with multiple monitors can have negative x- and y- coordinates, and LOWORD and HIWORD treat the coordinates as unsigned quantities." Solution: Since I code in C++ I used the MAKEPOINTS macro, like this: DWORD LPosition = GetMessagePos(); POINTS P = MAKEPOINTS(LPosition); QC Entry 91574 QC #: Date Reported: Area:90345 12/15/2010 VCL\Win 32 Controls\TStatusBar

Description: Steps:[QC Short Description] [REGRESSION] StatusBar panels draw with contents of menu items on WinXP. [QC Description] This issue is regression of QC#83417. The contents of menu items get drawn into custom status bar panels.The built executables work correctly on Windows Vista, 7 but break on WinXP. QC Entry 90345

Please see comments and [Attachments] of QC#83417 for more detail. Create a new VCL forms application. Place a menu with some items onto the main form. Place a status bar with one text panel and one ownerdrawn panel onto the form. Make the status bar use double buffering. Implement the panel draw method to paint the second panel red. Compile and run on Windows XP.

QC #: Date Reported: Area:87897 9/8/2010 VCL\Win 32 Controls\TCoolBar

Description: Steps:[QC Short Description] TCoolBar does not work without "Runtime themes enabled" [QC Description] A TCoolBar placed in an application that does not have "Runtime themes enabled" on the project will not paint correctly or allow repositioning of the bands. QC Entry 87897 Added by Sysop <<<<<<<<<< Please see comment for fix/workaround. >>>>>>>>>>

1. Create a new VCL Forms Application project, and set the Options -> Application -> Enable runtime themes to false. 2. Add a TCoolBar to the form. 3. Add some components to the TCoolBar, like a TToolBar or TPanel. 4. Run the application and see the failure.

QC #: Date Reported: Area:

93545 5/4/2011 VCL\Win 32 Controls\TComboBoxEx

Description: Steps:[QC Short Description] Painting problems ComboBoxEx on PageControl [QC Description] A ComboBoxEx placed in a PageControl is not properly painted when changing the Page. QC Entry 93545

1. Place a PageControl with two pages on a form. 2. Place a ComboBoxEx on page 1 3. Add an item (best with a transparent Image using ImageList) 4. Place a Label on page 2 (same position as the ComboBoxEx on page 1) 4. Start project 5. Select an item in ComboBoxEx 6. Change to PageControl page 2 7. Change back to page 1 Result: The background of ComboBoxEx ist not properly painted. You can see the label from page 2. I attached a simple sample project.

QC #: Date Reported: Area:

86069 7/8/2010 VCL\Touch Controls\TTouchKeyboard

Description: Steps:[QC Short Description]

InternalToUnicode issue [QC Description] These lines were added to InternalToUnicode() (KeyboardTypes.pas) in order to fix QC 77179, 77069, 76712: // Fix painting on Windows XP. if not(CheckWin32Version(6, 0)) and (TempStr <> '''') then Result := TempStr[1] else This isn't quite right: (TempStr <> '''') should be (TempStr <> ''), it's purpose is to avoid TempStr[1] causing an error. This is unlikely to ever happen, but you never know. I think I've suggested this code. I copied it from my RTL/VCL fixing program, where it's a string literal, hence the double quotes. I apologize ;-) QC Entry 86069 QC #: Date Reported: Area:47465 6/13/2007 Debugger

Description: Steps:[QC Short Description] Debugger asserts when remote debugger stalls [QC Description] When remote debugging, the remote service is failing (if not debugged, the process just disappears) and this causes the IDE to stop responding. I then close the remote debugger using the Exit option, and the client IDE then gives an assert: "Debugger assertion failure: "obj" in ..\win32src\rproxy.cpp at line 517. Continue execution?" The only option is OK, and the IDE disappears immediately after clicking it. It wouldn't be so bad if the remote PC details were remembered on the initial attach. QC Entry 47465

I am investigating this to see if I can reproduce the issue -Angel

QC #: Date Reported: Area:79333 11/8/2009 Debugger

Description: Steps:[QC Short Description] Problem with compiled exe running from shared folder [QC Description] When a client-application (compiled with D2010) is started from a shared folder and the network-connection is lost there's no clean shutdown - see below. That happens even if the share folder is reachable again at the moment of closing (for example: temporary dropouts in WLAN ...). The problem: Windows Vista - the project1.exe will not be destroyed correctly - it's closed, means no longer visible, but still visible in taskmanager- after a few seconds it consumes 50% of cpu - you have to kill it in taskmanager Win XP - you get a windows-problem warning on closing, but the process is correctly removed It doesn't happen, when the same project is compiled with D2006. I think you can reproduce it with a few steps.

a) Create the simplest project as possible: new application, compile and run b) Start the project1.exe from a shared folder on another computer c) Deactivate network (remove lan-cable, wlan ...) so that the share is unreachable d) Close the application Try the same with D2006 and everything is ok.

QC Entry 79333 QC #: Date Reported: Area:74949 6/16/2009 Debugger

Description: Steps:[QC Short Description] Debug visualizers should be "recursive" [QC Description] The visualizer for TDateTime is a great idea. However, after trying it on a local variable of TDateTime, the next thing I did was try a local variable of type "array of TDateTime". I wasn't too surprised to see an array of "crazy numbers". It would be very nice to make replacer visualizers "recursive". In other words, if we've said that TDateTime should be displayed as an actual date/time (as opposed to a float), then this should apply to all TDateTime values, even those in arrays, records, fields, etc. QC Entry 74949

QC #: Date Reported: Area:89366 11/1/2010 Debugger\Stepping

Description: Steps:[QC Short Description] Stepping oddities with TDictionary [QC Description] There are stepping oddities with TDictionary. This issue repeats already with D2010, but not with D2009. -> see steps QC Entry 89366

Steps #1: - save the following program and unit or the attachment - open SvnTreeTest.dpr - make sure "Use debug .dcus" is disabled - put a breakpoint on line 13 in SvnTreeTest.dpr ("D := TDictionary...") -run - press repeatedly F7 and see what is happening expected: lines order 1. SvnTreeTest.dpr line 14 2. SvnTreeTest.dpr line 15 3. SvnTreeTest.dpr line 17 actual: 1. SvnTree.pas line 14 2. SvnTree.pas line 14 3. SvnTree.pas line 14 4. SvnTree.pas line 14 5. SvnTreeTest.dpr line 14 6. SvnTreeTest.dpr line 15 7. SvnTree.pas line 14 8. SvnTree.pas line 14 9. SvnTree.pas line 14 10. SvnTreeTest.dpr line 17 Steps #2: - open SvnTreeTest.dpr - put a breakpoint on line 14 in SvnTree.pas ("begin" of "constructor TCustomSvnTreeItem<T>.Create") - run - press repeatedly F9 till execution is finished expected: debugger never stops in SvnTree.pas actual: with "Use debug .dcus" disabled debugger stops 11 times in SvnTree.pas with "Use debug .dcus" enabled debugger stops onces in SvnTree.pas There error goes away in both cases when commenting out "C: TCustomSvnTreeItem<TObject>". program SvnTreeTest; {$APPTYPE CONSOLE} uses SvnTree, Generics.Collections; var C: TCustomSvnTreeItem<TObject>; D: TDictionary<string, string>; Bar: string; begin D := TDictionary<string, string>.Create; try if D.TryGetValue('Foo', Bar) then; finally D.Free; end; end. unit SvnTree; interface type TCustomSvnTreeItem<T> = class(TObject) public constructor Create; end; implementation constructor TCustomSvnTreeItem<T>.Create; begin inherited Create; end; end.

QC #: Date Reported: Area:88473 9/28/2010 Debugger\Breakpoints

Description: Steps:[QC Short Description] Automated Incident Report [QC Description] Access violation at address 2066415C in module 'dbkdebugide150.bpl'. Write of address 00000068. I was updating a data breakpoint to a different address. A dialog popped up warning about about it being misaligned and I canceled it planning to set it again to the correct address. The execption dialog popped up after I canceled the action. QC Entry 88473

1. copy the sample program below 2. when breakpoint is hit, add data breakpoint for &p[0], and close the data breakpoint dialog 3. in the breakpoint list window, select &p[0] data breakpoint, and press Enter, this should bring you to edit dialog for this breakpoint 4. change the address to p+3 5. at this point it should prompt you for misaligned warning, hit cancel 6. two bugs here: a. make sure the current data breakpoint does not get deleted b. make sure not AV 7. press F9, it should hit the data breakpoint program Project9;

{$APPTYPE CONSOLE} uses SysUtils; var i: integer; p: PByte; begin System.GetMem(p, 100); i := 0; // add line breakpoint here p[0] := 1; writeln('abc'); // press F9 should stop here.... p[0] := 2; writeln('def'); p[3] := 3; p[4] := 4; try foo2(); foo; except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; end.

QC #: Date Reported: Area:87444 8/22/2010 Debugger\Evaluator\Delphi

Description: Steps:[QC Short Description] Evaluate / Modify fails with pointer arithmetic [QC Description] program Project1; {$APPTYPE CONSOLE} type TRecord = record f1: Integer; f2: Double; end; var rRec: TRecord; begin Writeln(Integer(@rRec.f2) - Integer(@rRec)); end. Put breakpoint on line with Writeln, press Ctrl+F7, type there Integer(@rRec.f2) - Integer(@rRec), press Enter. The result is invalid = -1214224007. The Writeln output is correct. The same in Delphi 2010 works correctly. QC Entry 87444

The description provides everything to reproduce the issue. Additional example by USc: - create a new Delphi console app with the following content - put a breakpoint on line 10 ("if IntPtr <> 0 then;") - in the Watch List add a watch for "IntPtr = Integer(@Int)" expected: Watch List shows "IntPtr = Integer(@Int) | True" actual: Watch List shows "IntPtr = Integer(@Int) | False" Additional notes: - same problem when using Longword, Cardinal, Pointer and Int32 - works with Int64 program Project49; {$APPTYPE CONSOLE} var Int, IntPtr: Integer; begin Int := 123; IntPtr := Integer(@Int); if IntPtr <> 0 then; end.

QC #: Date Reported: Area:22101 12/8/2005 Debugger\Call Stack

Description: Steps:[QC Short Description] Win32 project with packages.Call stack incomplete for errors in vcl [QC Description] I create a simple win32 project with runtime packages options checked. I have a Form, a button and in button OnClick:

Self.Controls[3].Top := 1; A statement that will raise an exception. At runtime the call stack is: kernel32.RaiseException TList.Get+$3c and does not contain the location in my sources where the error located. It should have been: kernel32.RaiseException TList.Get+$3c TForm1.Button1Click The main reason i think is that debug info is stripped of from the vcl runtime packages. The reason is obscure to me. The sources for vcl are available but you cannot recompile these packages with debug info as there are no dpk projects included. This lack of debugger support makes applications based on runtime packages be a real pain to debug. This is true since Delphi 2 and it was supposed to be fixed in Delphi 2005. Sometimes the projects are developed in such a way, so there is impossible to be compiled without runtime packages and work. In that cases, this missing functionality is a real Show Stopper, that made my team look for thirdparty tools. These tools rely in TD32 info for getting the full call stack in cases when the IDE debugger fails. Why is Borland not implementing the same functionality? QC Entry 22101 QC #: Date Reported: Area:49059 7/15/2007 Debugger\Inspector

Description: Steps:[QC Short Description] Allow users to create their own Debug Inspectors for objects [QC Description] Allow Delphi users to add in their own debug inspectors and "register" their debug inspectors into the delphi IDE for a given class or interface. This would allow us to make much more intelligent inspectors to show us the data contained in our classes in a much more intelligent way while debugging. For example, the one that really should ship with Delphi would be a custom inspector for IXMLNode. Instead of showing us default debugging information about IXMLNode, we could have a custom inspector actually show us the data contained by IXMLNode. Looking at the sample code below, we could have a break point on the showmessage line and we could inspect variable lNode. Instead of showing us this: lNode | TXMLNode($A52690) as IXMLNodeAccess the custom inspector would show us something similar to what XMLSpy shows us where we could drill down through the XML DOM and actually see the data contained in the lNode. See the attached screen shots for an example of what this could look like. Maybe for this example, Borland could actually get with the Altova folks to take their XML Spy browser and fold it in as a custom inspector. This is just one example, the real purpose of this request is to allow delphi users the ability to add in their own custom inspectors. procedure TForm4.Button1Click(Sender: TObject);

var lNode: IXMLNode; begin XMLDocument1.Active := true; lNode:=XMLDocument1.Node; showmessage(lNode.xml); end; QC Entry 49059 QC #: Date Reported: Area:97611 8/14/2011 Debugger\CPU

Description: Steps:[QC Short Description] Entire CPU screen crashes [QC Description] Build the code, set breakpoint on first line. open entire cpu step through one line at a time before you get to the end, the whole IDE crashes. Even the built-in report thing crashed QC Entry 97611

procedure TForm1.PaintBox1Paint(Sender: TObject); var T, K, X, A, B, AA, BB : extended80; S : string; C : tColor; begin A := EncodeDate ( 2011, 7, 3 ) + EncodeTime (22,32,0,0) +3/24; B := EncodeDate ( 2012, 11, 29 ) + EncodeTime (18,0,0,0 ) +4/24; AA := 318.6; BB := AA - 50; X := GetUtcTimeFromSystemClock; T := X * ( secsperday / 11 ); C := RGB ( round ( 128 + 127 * sin ( t ) ), round ( 128 + 127 * sin ( t + 2*pi/3 ) ), round ( 128 + 127 * sin ( t + 4*pi/3 ) ) ); /// this is the line that crashes the Entire CPU X := AA + ( BB - AA ) * ( X - A ) / ( B - A ); K := X * 0.45359237; S := formatfloat ( '000.00000000', x );//floattostr ( X ); { + #13 + floattostr ( K ) + #13 + datetimetostr ( GetUtcTimeFromSystemClock ) + #13 + #13 + floattostr (( BB - AA ) / ( B - A ) /secsperday) + #13 + #13 + floattostr (0.45359237*( BB - AA ) / ( B - A ) /secsperday);} if BM = nil then BM := tBitmap . Create; BM . Width := PaintBox1 . Width; BM . Height := Paintbox1 . Height; with Bm, canvas do begin brush . color := clblack; rectangle ( -1, -1, width+1, height+1 ); font . color := C;//clLime; font . name := 'Verdana'; font . size := width div 16; textout ( ( width - textwidth ( S ) )div 2, ( height - textheight(S) )div 2, S ); end; Paintbox1 . canvas . draw ( 0, 0, bm ); end;

QC #: Date Reported: Area:12810 5/14/2005 Debugger\CPU

Description: Steps:[QC Short Description] Disassembly pane not updated on breakpoint [QC Description] If you have the CPU window open before you take a breakpoint, the disassembly pane is not automatically synced to the current EIP. QC Entry 12810

1) Close all open projects. Make sure the CPU window is closed. 2) Open the project. 3) Set a breakpoint on the only line of code in the Button1 event handler. 4) Run the project. 5) Press the button. 6) Breakpoint taken. 7) Open the CPU window. 8) You should see the highlight on the proper line in the disassembly pane. 9) Use your mouse wheel to scroll up until the line Main.cpp 17 is visible. 10) Click on the Main.cpp tab to view the source code. 11) Continue the app. 12) Press the button to break again. 13) Click on the CPU tab. 14) The highlighted line is still Main.cpp 16 rather than the correct line (Main.cpp 20).

QC #: Date Reported: Area:40421 2/12/2007 Debugger\CPU

Description: Steps:[QC Short Description] Sometimes debugger switches from CPU view to source code if source code file wasn't open. [QC Description] In some cases when you debug something in CPU view debugger switches to source code. Very often it happend on interfaces when execution point jumps to file which is not opened in IDE. QC Entry 40421

1. Open attached project. 2. Check that breakpoint exists on line Cls.Test2(Nil, Nil); and there is no file opened except .dpr file. 3. Run application. 4. Switch to CPU view. You will see something like this: Project1.dpr.11: Cls.Test2(Nil, Nil); 004050D6 33C9 xor ecx,ecx 004050D8 33D2 xor edx,edx 004050DA A1E8974000 mov eax,[$004097e8] 004050DF 8B18 mov ebx,[eax] 004050E1 FF530C call dword ptr [ebx+$0c] 5. Press F7 5 times and after executing line call dword ptr [ebx+$0c] IDE will open Unit1 and highlight line #15. If Unit1 was open IDE will not switch to Unit1 and will stay in CPU mode and show something like this: 004040E5 83C0F4 add eax,-$0c 004040E8 E9FF000000 jmp TSomeClass.Test2 and this behaviour is correct.

QC #: Date Reported: Area:81604 1/28/2010 Debugger\Debugger UI

Description: Steps:[QC Short Description] The inspector for TStrings does not take StrictDelimiter into account [QC Description] When there is a space in one of the string in the list, it will show up as the next string. Added by Sysop <<<<<<<<<<<<<< This issue is about 'TStrings Visualizer'. >>>>>>>>>>>>>> QC Entry 81604

aStringList: TStringList; aStringList.Delimiter := ';'; aStringList.StrictDelimiter := true; aStringList.DelimitedText := 'FIELD_ONE;FIELD_TWO ASC'; Now, aString.Count equals 2, ok. The inspector will show: [0] FIELD_ONE [1] FIELD_TWO [2] ASC Regards, /D

QC #: Date Reported: Area:88905 10/13/2010 AddOn\TChart

Description: Steps:[QC Short Description] Dcc error file not found tee*.dfm [QC Description] On a project I am converting from Delphi 2007 to the Delphi XE, after adressing all the regular unicode issues, compiling failed at the linker stage reporting [DCC Error] E1026 File not found: 'TeeBackImage.DFM' [DCC Error] E1026 File not found: 'TeeEmbossEditor.DFM' [DCC Error] E1026 File not found: 'TeeMouseCursor.DFM' These files are indeed missing from the Lib directory. I have managed to trace this into being caused by a print preview function for a TChart I used. This calls the ChartPreview function from the TeeEdiGene unit. This worked fine in Delphi 2007 (with TeeChart 7.11), but does no longer now. For us, this looked like a showstopper for converting the project to XE. Please either provide the missing files, or at least modify the documentation to point to the workaround (see below). QC Entry 88905

1. Create a new VCL Forms application. 2. Drop a TChart and a TButton on the form 3. Add "uses TeeEdiGene;" to the implementation. 4. In the button's onclick event handler, call: ChartPreview (Self, Chart1); 5. Compile and run project. Expected: project compiles and runs. Actual result: linker fails with the 3 messages mentioned above.

QC #: Date Reported: Area:48030 6/25/2007 AddOn\TChart

Description: Steps:[QC Short Description] TeeChart issue [QC Description] function DBChart1GetAxisLabel(Sender:TChartAxis; Series:TChartSeries; ValueIndex: LongInt; Var LabelText: String) issue in Delphi2007. The LabelText I got are weird/incorrect. However, there is no problem in Delphi7. Both the source code are same. As I know, the TeeChart version in Delphi7 is 4.04, but in delphi 2007 is version 7.10. How can I get the labelText correctly? thanks QC Entry 48030

Tested on build 16.0.4160.39608 - add functions: procedure TForm1.FormCreate(Sender: TObject); begin DBChart1.OnGetAxisLabel := DoGetAxisLabel; end; procedure TForm1.DoGetAxisLabel( Sender:TChartAxis; Series:TChartSeries; ValueIndex:Integer; Var LabelText:String); var X: TDateTime; begin if TryStrToDateTime(LabelText,X) then if DateUtils.TimeOf(X) = 0 then LabelText := FormatDateTime('MMM.yyyy',X) else LabelText := FormatDateTime('hh:nn',X); end; - run for Win64 platform Expected: the labels are correct Actual: the labels look incorrect, see attachments Note: on Win32 labels are correct

QC #: Date Reported: Area:88720 10/6/2010 AddOn\TChart

Description: Steps:[QC Short Description] TChart Date rendering issue [QC Description] If the TChart has a single TLineSeries with a dates and a values the Chart component renders the dates on the horizontal axis nicely. If a second TLineSeries is added, the horizontal axis seems to do the drawing twice, overlapping the previous dates. The date can't be red properly anymore. Delphi 2010 doesn't have this problem and is introduced in Delphi XE. QC Entry 88720

Attachments doesn't seem to work for me. Here's the code. unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, TeEngine, Series, StdCtrls, ExtCtrls, TeeProcs, Chart, TeeGDIPlus; type TForm1 = class(TForm) Chart1: TChart; Button1: TButton; Series1: TLineSeries; Button2: TButton; procedure Button1Click(Sender: TObject); procedure AddRandomLineSeries; procedure FormCreate(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.AddRandomLineSeries; var i:integer; s: TLineSeries; begin s := TLineSeries.Create(Chart1); s.Clear; for i:=0 to 199 do s.Add(Random(500), DateToStr(Now + i)); Chart1.AddSeries(s); end; procedure TForm1.Button1Click(Sender: TObject); begin Chart1.RemoveAllSeries; AddRandomLineSeries; end; procedure TForm1.Button2Click(Sender: TObject); begin Chart1.RemoveAllSeries; AddRandomLineSeries; AddRandomLineSeries; end; procedure TForm1.FormCreate(Sender: TObject); begin Randomize; end; end.

QC #: Date Reported: Area:88100 9/15/2010 AddOn\TChart\TChart

Description: Steps:[QC Short Description] TChart default series colours have changed from previous versions [QC Description] TChart v2010.01.10814 Win32 as included in Delphi XE Pro. Up to and including D2010, TChart default colours for added Series were red, green, yellow, blue - the TeeChart Classic set. From Delphi XE, the colours are now white, yellow, orange, ... (the Mac OS set). Interestingly, I can see these different named sets of colours from a drop down when you add a series to a TChart at design time. Making a different choice here changes the chart colours at design time, but not when the program runs. Please revert the default colours to the previous set or provide a single property to set the TChart colour set. Our customers have got very used the series being in particular colours. QC Entry 88100

Open D2010 or earlier. Choose new VCL Forms app. Add a TChart to the form. Add 3 line series. Note the colours. Repeat using Delphi XE. Note the colour set is no longer the same. (can also be reproduced programmatically). ------------------------------- When adding a line series make sure that TeeChart is selected in the drop down menu The colors of the line series are different at runtime than design time

QC #: Date Reported: Area:87756 9/3/2010 AddOn\IntraWeb

Description: Steps:[QC Short Description] Chinese(big5/UTF-8) problem with RAD Studio/Delphi 2010 & IntraWeb 10.0.23 [QC Description] This report is related to #77696. I'm now running IW 10.0.23 (upgraded from IW 10.0.17 which came with RAD Studio 2010). The following scenario happened: At design time I put a TIWLabel on the main form and gave it a caption: "????:" - 4 Traditional Chinese characters plus a colon. However at run time it came out to be: "???:" - 3 Traditional Chinese characters plus a colon - i.e. 1 Traditional Chinese character missing. I've attached the code sample which would reproduce the error. Would really appreciate it if anyone could help!

Added by Sysop <<<<<<<<<<< This issue seems to be same as RAID#278837. InraWeb 10.0.23 has this bug... We need to release update version of IntraWeb 10. >>>>>>>>>>> Added by Sysop <<<<<<<<<<< This issue also occurs with Japanese string, if a Unicode character(WideChar/UTF-16) contains 0x20, 0x0D or 0x0A. InraWeb 10.0.23 has this bug... >>>>>>>>>>>

Best regards QC Entry 87756 QC #: Date Reported: Area:83879 4/15/2010 AddOn\RAVE

Description: Steps:[QC Short Description] Rave AV when trying to print images using a TRvDataSetConnection [QC Description] When trying to print images (bitmaps) with rave 7.7 BE, the application crashes when transferring the image data to the report engine using a TRvDataSetConnection (the same error occurs when using a TRvCustomConnection). QC Entry 83879

See the attached demo project. Compile the project with Delphi 2010 and press the print button.

QC #: Date Reported: Area:70407 1/10/2009 AddOn\RAVE

Description: Steps:[QC Short Description] Rave and Memo with/without RTF [QC Description] Display of Memo (assigned to TMemoField or TWideMemofield) with RTF or Plaintext is wrong. The text in Memofields contains any character or graphics like rectangles at the end. QC Entry 70407

1. Create TDataset with Memo/or WideMemo 2. Load valid RTF and Plain-Text into dataset 3. Create a report and assign the data to Datamemo component. 4. Run Report

QC #: Date Reported: Area:75724 7/13/2009 AddOn\RAVE

Description: Steps:[QC Short Description] D2009 with Rave 7.6.2 MemoLinesLeft Out of Memory/Infinite Loop Error [QC Description] I am converting an application from Delphi 7 to Delphi 2009. My application used Rave BEX 5.1.3. I am converting things over to the bundled version 7.6.2. Some reports are running into Out of Memory errors during calls to TMemoBuf.MemoLinesLeft. The reports worked fine in Delphi 7 and BEX 5.1.3. I have attached a small sample app the replicates the problem. QC Entry 75724

See sample app and click the button.

QC #: Date Reported: Area:75368 6/29/2009 AddOn\RAVE

Description: Steps:[QC Short Description] Problem with RvSystem.SystemPrinter.Copies [QC Description] I recently upgraded from Delphi 2006 with Rave 6.5 BE to RAD Studio 2009 with Rave 7.5 BE. I have upgraded one of my old applications to compile and run under 2009. The problem I have is that some of my reports have to print duplicate copies. The way I have done this is as follows: Added a RvSystem component to my form. Set the RvSystem.SystemPrinter.Copies = 2

Added a RvSystem component to my form. Set the RvSystem.SystemPrinter.Copies = 2 In my RvProject I set my Engine property to point to the RvSystem that I added. Execute the RvProject

In my RvProject I set my Engine property to point to the RvSystem that I added. This work fine in the older version. In the new version it only prints 1 copy of the report. Please could you help me ASAP? QC Entry 75368 QC #: Date Reported: Area:72710 4/3/2009 AddOn\RAVE

Description: Steps:[QC Short Description] TRvRenderPreview - Memory Leak [QC Description] When adding a Rave TRvRenderPreview component on an empty form. Closing that form, means Freeing the components, results in a memory leak. QC Entry 72710

1. Create a VCL form application. 2. Put the TRvRenderPreview component on that form. 3. Set the ReportMemoryLeakOnShutdown before the Application.Initialize; line 4. Run the applaction. 5. Close the application. Result (Malfunction): --------------------------- Unexpected Memory Leak --------------------------- An unexpected memory leak has occurred. The unexpected small block leaks are: 21 - 28 bytes: TBrush x 1 29 - 36 bytes: TPen x 1, Unknown x 2 37 - 44 bytes: TFont x 1 61 - 68 bytes: TBitmap x 1 101 - 108 bytes: TBitmapCanvas x 1 117 - 124 bytes: TBitmapImage x 1 149 - 156 bytes: Unknown x 1 --------------------------- OK ---------------------------

QC #: Date Reported: Area:82093 2/12/2010 AddOn\RAVE

Description: Steps:[QC Short Description] Exception occur when Rave Events are using. [QC Description] Exception occur when StrToInt, IntToStr and so on are using in Rave Events. QC Entry 82093

Press Button1 in the attachment project. See CalcText1_OnGetText in Project1.rav. === still reproducible on 16.0.4223.41907, rave build 100610 - click the button and the report in Preview Result: Access violation at address 00407B04 in module 'Project1.exe'. Read of address 00000025.

QC #: Date Reported: Area:86474 7/21/2010 AddOn\RAVE

Description: Steps:[QC Short Description] Replace Nevrona Rave Report with Fast Report [QC Description] Replace Rave Report with the more modern and actual Fast Report: http://fast-report.com/en/products/report-generator-for-delphi-fastreport-4.html QC Entry 86474

Rave and FastReports are included together in Pulsar

QC #: Date Reported: Area:89645 11/13/2010 AddOn\AQTime

Description: Steps:[QC Short Description] Delphi XE hangs when loading AQtime7BDS8 [QC Description] Platform Windows 7 Delphi XE (and RAD Studio XE) hangs when loading AQtime7BDS8. This problem has appeared recently, when first installed it worked ok. Reinstalled RAD Studio but that didn't resolve the problem.

The copy on my laptop continues to work without problem. The only significant change I've made to my system is the installation of Microsoft Office 2010. (My laptop stills run Microsoft Office 2007). QC Entry 89645 QC #: Date Reported: Area:73179 4/21/2009 Internet

Description: Steps:[QC Short Description] HTMLEncode in HTTPApp.pas does not work [QC Description] The HTMLEncode(...) function in HttpApp.pas fails in Delphi 2009 because it does not handle unicode strings properly. #0#0 characters are inserted in the encoding string and the result is erronous. QC Entry 73179 Added by Sysop <<<<<<<<<< From a comment of QC --- Not fixed in Delphi 2010. --- >>>>>>>>>>

Try to encode a string containing a '&' for example. Added by Sysop <<<<<<<<<<<<<<<<<<<<<<<<<<<<< Here is the function I created which solves the problem. I call it HTMLEncode also, so the unit it's in must be last in your uses clause to use this version. Or, you could just put it in the unit that needs it. function HTMLEncode( const Input: String ): String; var I: Integer; Output: String; begin Output := Input; I := 1; while I <= Length( Output ) do if Output[ I ] = '"' then begin Delete( Output, I, 1 ); Insert( '"', Output, I ); Inc( I, 5 ); end else if Output[ I ] = '<' then begin Delete( Output, I, 1 ); Insert( '<', Output, I ); Inc( I, 4 ); end else if Output[ I ] = '>' then begin Delete( Output, I, 1 ); Insert( '>', Output, I ); Inc( I, 4 ); end else if Output[ I ] = '&' then begin Insert( 'amp;', Output, I + 1 ); Inc( I, 4 ); end else Inc( I ); Result := Output; end; >>>>>>>>>>>>>>>>>>>>>>>>>>>>>

QC #: Date Reported: Area:87435 8/22/2010 Internet

Description: Steps:[QC Short Description] HTTPApp.HTMLDecode() does not support surrogate pair. [QC Description] HTTPApp.HTMLDecode() does not support surrogate pair. Numeric character reference is not correctly converted with surrogate pair. QC Entry 87435

uses ..., HTTPApp; var Src, Dst: String; begin Src := '𠮷'; // U+20BB7 (#$D842 #$DFB7) Dst := HTTPApp.HTMLDecode(Src); ShowMessage(Format('%s #$%x #$%x', [Src, Word(Dst[1]), Word(Dst[2])]));

end; EXP: 𠮷 #$D842 #$DFB7 ACT: 𠮷 #$BB7 #$0 Added by Sysop <<<<<<<<< Another example, str := HTTPApp.HTMLDecode('𦿶'); fails to convert the entity to support surrogate pair(16bit x2). >>>>>>>>>

QC #: Date Reported: Area:94495 5/30/2011 Compatibility\Previous -> Current

Description: Steps:[QC Short Description] Strings in Variants are not COM-compatible. [QC Description] Let us have a variable V: Variant, V := 'string', and have a variable VObj: Variant containing a COM object. Now if we try to invoke VObj.SomeMethod(V), we get an exception telling us that V contains a non OLE-compatible value (to be specific, it's a varUString value). Note that with varString in V, such an invocation works well, just like in Delphi 2007. So this ruins "string"-based code when migrating in Delphi XE :( I have a suspicion that this could be related to parsing varStrArg parameters in ComObj.DispatchInvoke() and in Variants.pas, as there is no additional processing for varUString there. But it's just an idea.QC Entry 94495

Execute the following code: program Project3; {$APPTYPE CONSOLE} uses SysUtils, ComObj; var WS, V: Variant; begin CoInitializeEx(nil,0); try WS := CreateOleObject('WScript.Shell'); WS.popup('!!!'); V := '!!!'; WS.popup(V); except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; end. The 1st popup works fine, the 2nd raises an exception. If we change (V:='!!!') to (V:=ansistring('!!!')), or change V's type to OleVariant, the code works.

QC #: Date Reported: Area:5975 9/17/2003 ActiveX

Description: Steps:[QC Short Description] Indexed properties not handled correct in component wrapper [QC Description] When creating a property that has an additional parameter as index, the component wrapper generates wrong code to set the property. (ok, it generates a warning too) QC Entry 5975

- Create the following property for an interface: HRESULT _stdcall Testprop([in] long Index1, [in] long Index2, [out, retval] BSTR * Value ); [ propput, id(0x000000CA) ] HRESULT _stdcall Testprop([in] long Index1, [in] long Index2, [in] BSTR Value ); - create a new project and import the type lib into this project, choose the option to generate a component wrapper the generated code for this property looks like this: procedure TTestServerProperties.Set_Testprop(Index1: Integer; Index2: Integer; const Value: WideString); { Warning: The property Testprop has a setter and a getter whose types do not match. Delphi was unable to generate a property of this sort and so is using a Variant as a passthrough. } var InterfaceVariant: OleVariant;

begin InterfaceVariant := DefaultInterface; InterfaceVariant.Testprop := Value; end; This code should be: InterfaceVariant := DefaultInterface; InterfaceVariant.Testprop[Index1, Index2] := Value; ------------------------------------------------------------------------------------------------------------------- The problem also occurs in the case of one index and a value: Property definition: [propget, id(0x00000065)] HRESULT _stdcall TestProp([in] long Index1, [out, retval] BSTR* Value); [propput, id(0x00000065)] HRESULT _stdcall TestProp([in] long Index1, [in] BSTR Value); Generated code : function TPropTest.Set_TestProp(Index1: Integer; const Value: WideString): HResult; { Warning: The property TestProp has a setter and a getter whose types do not match. Delphi was unable to generate a property of this sort and so is using a Variant as a passthrough. } var InterfaceVariant: OleVariant; begin InterfaceVariant := DefaultInterface; InterfaceVariant.TestProp := Value; Result := S_OK; end;

QC #: Date Reported: Area:4404 5/13/2003 ActiveX

Description: Steps:[QC Short Description] Wrong imports of some OleLoadPicture functions [QC Description] There are a bunch of imports declared in ActiveX, which are obviously wrong. Although the MS Platform SDK documents it the same way, the following functions are NOT exported from the OLEPRO32.DLL: OleLoadPictureEx OleLoadPictureFile OleLoadPictureFileEx OleLoadPicturePath OleSavePicture Instead, they are exported from OLEAUT32.DLL, as you can easily verify with depends.exe. JensG QC Entry 4404

- Create a VCL Form App. - Add ActiveX to the 'uses' clause - Add a Button and in the Click event add the following code: procedure TestOleFuncs(ACall: Boolean); var op: TOCPFIParams; c: Cardinal; fd: tagFONTDESC; pd: tagPICTDESC; v: OleVariant; id: IDispatch; p: Pointer; begin if ACall then begin OleCreatePropertyFrame(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); OleCreatePropertyFrameIndirect(op); OleTranslateColor(0, 0, c); OleCreateFontIndirect(fd, GUID_NULL, c); OleCreatePictureIndirect(pd, GUID_NULL, True, c); OleLoadPicture(nil, 0, True, GUID_NULL, c); OleLoadPicturePath(0, nil, 0, 0, GUID_NULL, p); OleLoadPictureFile(v, id); OleSavePictureFile(id, nil); end; end; procedure TForm7.Button3Click(Sender: TObject); begin TestOleFuncs(False); end;

- Build and Run exp: Can successfully run the application. act: Errors at runtime about being unable to find certain entry-points in olepro32.dll

QC #: Date Reported: Area:61255 4/22/2008 ActiveX

Description: Steps:[QC Short Description] Import Type Library generated code corrupts EmptyParam [QC Description] Delphi code generated when importing type libraries with optional out parameters contains serious errors that corrupts the global EmptyParam, which in turn can cause strange and unpredictable errors when it is used e.g. in ADO database connections. In TWebBrowser these three ExecWB procedures are defined (can be auto- generated by importing Microsoft Internet Controls): procedure ExecWB(cmdID: OLECMDID; cmdexecopt: OLECMDEXECOPT); overload; procedure ExecWB(cmdID: OLECMDID; cmdexecopt: OLECMDEXECOPT; var pvaIn: OleVariant); overload; procedure ExecWB(cmdID: OLECMDID; cmdexecopt: OLECMDEXECOPT; var pvaIn: OleVariant; var pvaOut: OleVariant); overload; The implementation of the first one looks like this: procedure TWebBrowser.ExecWB(cmdID: OLECMDID; cmdexecopt: OLECMDEXECOPT); begin DefaultInterface.ExecWB(cmdID, cmdexecopt, EmptyParam, EmptyParam); end; The flaw is that EmptyParam is passed directly as pvaOut. When the call returns, EmptyParam no longer has the special value it was initialized to and therefore no longer is empty. In our case the changed EmptyParam caused a column to be updated in the DB to NULL although a real value was given as a parameter, when using ADO. Other queries failed with strange errors of mismatching types etc. At least any parameter defined as an out (or var) parameter should get a local variable in the function that is initialized to EmptyParam before it's passed on. Another peculiarity is that there are two EmptyParam declared. One in Variants.pas and one in OleCtrl.pas. The one in OleCltr.pas is assigned from the Variants.pas version during initialization, but thereafter lives it's own life. TWebBrowser uses the EmptyParam defined in Variants.pas. QC Entry 61255

How to check that EmptyParam is changed: 1. Start Delphi 2007. 2. Create a new application "File->New->VCL Forms Application - Delphi for Win32". 3. Drop a TWebBrowser on the form in Unit1. 4. Add an OnCreate-event to the form that initializes the web-browser, e.g.: procedure TForm1.FormCreate(Sender: TObject); begin WebBrowser1.Navigate( 'http://www.google.com' ); end; 5. Add a button and in it's OnClick-event put the following: procedure TForm1.Button1Click(Sender: TObject); begin if not VarIsEmptyParam(Variants.EmptyParam) then ShowMessage('EmptyParam initial check failed!'); WebBrowser1.ExecWB(OLECMDID_COPY, 0); if not VarIsEmptyParam(Variants.EmptyParam) then ShowMessage('EmptyParam changed by ExecWB!'); end; 6. Run the program and wait for the web page to load. 7. Press the button. Expected: Code executed without any message shown. Experienced: The message "EmptyParam changed by ExecWB!" is shown, i.e. the EmptyParam is no longer empty!. How to generate the illegal type library code: 1. Start Delphi 2007 2. Select the menu item Component->Import Component... 3. On the first page ("Type of Component") of the "Import Component" window choose "Import Type Library" and press Next. 4. On the "Registered Type Libraries" page select the type library containing Microsoft Internet Controls and click Next. On my 64-bit Vista with IE7 it's named "Microsoft Browser Helpers" and found in the file C:\Windows\SysWOW64\ieframe.dll, but if you have an older IE-installed it might be in SHDocVw.dll. 5. Click Finish to genereate the unit SHDocVw_TLB. 6. Locate the three implementations for TCppWebBrowser.ExecWB: procedure TCppWebBrowser.ExecWB(cmdID: OLECMDID; cmdexecopt: OLECMDEXECOPT); procedure TCppWebBrowser.ExecWB(cmdID: OLECMDID; cmdexecopt: OLECMDEXECOPT; var pvaIn: OleVariant); procedure TCppWebBrowser.ExecWB(cmdID: OLECMDID; cmdexecopt: OLECMDEXECOPT; var pvaIn: OleVariant; var pvaOut: OleVariant); Examine the one taking only two parameters: procedure TCppWebBrowser.ExecWB(cmdID: OLECMDID; cmdexecopt: OLECMDEXECOPT); begin DefaultInterface.ExecWB(cmdID, cmdexecopt, EmptyParam, EmptyParam); end; The procedure calls DefaultInterface.ExecWB and directly sends the global EmptyParam as parameters for the two extra parameters. These are however var- parameters (one is named pvaIn, the other ovaOut), which means that value of EmptyParam might be (and in reality also is) changed, which causes serious problems in other code using COM.

QC #: Date Reported: Area:

73326 4/24/2009 ActiveX

Description: Steps:[QC Short Description] Registered Type Libraries viewer usability improvements [QC Description] A few usability improvements could make the Registered Type Libraries viewer much more useful: - Context menu entries "Copy filename" and "Copy GUID" (and, of course, "Unregister") - On double-click, open the selected type library in the TLB viewer (i.e. do what happens when the DLL or TLB file is dragged to the IDE)QC Entry 73326

QC #: Date Reported: Area:2670 10/16/2002 ActiveX\Framework

Description: Steps:TAutoIntfObject.InterfaceSupportsErrorInfo compares the passed GUID against DispIID which is read-only, private and NEVER initialized by TAutoIntfObject. As such InterfaceSupportsErrorInfo always returns False which prevents D6 from returning IErrorInfo object back to VC client. This existed in D5 and exists in D7 as well. QC Entry 2670

this is from the QC "workaround" page: As a workaround you must create a complete copy of the TAutoIntfObject class because the FDispIID variable is declare as private. Copy the TAutoIntfObject class declaration and all of the implementing code form ComObj.pas, giving your version of the class an appropriate name. The code below came from D6 Update #2. You should make your copy from your own comobj.pas. In the constructor add the line: FDispIID := DispIntf; TSKAutoIntfObject = class(TInterfacedObject, IDispatch, ISupportErrorInfo) private FDispTypeInfo: ITypeInfo; FDispIntfEntry: PInterfaceEntry; FDispIID: TGUID; protected { IDispatch } function GetIDsOfNames(const IID: TGUID; Names: Pointer; NameCount, LocaleID: Integer; DispIDs: Pointer): HResult; stdcall; function GetTypeInfo(Index, LocaleID: Integer; out TypeInfo): HResult; stdcall; function GetTypeInfoCount(out Count: Integer): HResult; stdcall; function Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer;Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult; stdcall; { ISupportErrorInfo } function InterfaceSupportsErrorInfo(const iid: TIID): HResult; stdcall;public constructor Create(const TypeLib: ITypeLib; const DispIntf: TGUID);{$IFDEF MSWINDOWS} function SafeCallException(ExceptObject: TObject; ExceptAddr: Pointer): HResult; override; {$ENDIF} property DispIntfEntry: PInterfaceEntry read FDispIntfEntry; property DispTypeInfo: ITypeInfo read FDispTypeInfo; property DispIID: TGUID read FDispIID; end; { TSKAutoIntfObject } constructor TSKAutoIntfObject.Create(const TypeLib: ITypeLib; const DispIntf: TGUID); begin inherited Create; OleCheck(TypeLib.GetTypeInfoOfGuid(DispIntf, FDispTypeInfo)); FDispIntfEntry := GetInterfaceEntry(DispIntf); FDispIID := DispIntf; // Fix for QC bug # 2670

end;

QC #: Date Reported: Area:45088 4/26/2007 ActiveX\Framework

Description: Steps:[QC Short Description] TOleControl incorrectly calculates position rectangle, and it's descendants may become invisible [QC Description] Now that's a good bug... TOleControl.SetBounds method incorrectly calculates rectangle for passing it as a parameter to SetObjectRects method of it's ActiveX control IOleInplaceObject interface. This is the code from OleCtrls.pas: if FOleInplaceObject <> nil then begin LRect := Rect(Left, Top, AWidth, AHeight); FOleInplaceObject.SetObjectRects(LRect, LRect); end; But Rect function expects it's two last parameters to be Right and Bottom, not Width and Height! Those, LRect is calculated totally incorrectly. As long as resulting LRect is not empty, control resizes and positions correctly anyway, because in TOleControl.SetBounds it's bounds are corrected later by a call to inherited TWinControl.SetBounds. But if Left >= AWidth, or Top >= AHeight, then resulting LRect is treated as empty, and SetObjectRects can make control's window invisible (at least this is what Web Browser control does), and this is not corrected already. The control disappears from the screen. This problem affects both design and run time. I've found this bug when using TWebBrowser, but it should affect other descendants of TOleControl, too. In Delphi 7, there is no such problem, because there TOleControl.SetBounds didn't contain a call to IOleInplaceObject.SetObjectRects at all. Also, note that in current OleCtrls.pas code, bounds parameters passed to Rect function are a mixture of old ones - Left, Top, and new ones - AWidth, AHeight. This can be a bug, too, yet I'm not sure. Even if the code is corrected (by, say, replacing a call to Rect function with similar call to Bounds function), it still will produce incorrect bounds rectangle when we both resize and move control in one call to SetBounds. So I would also replace Left and Top with ALeft and ATop. QC Entry 45088

1. Create new VCL application, drop a TWebBrowser component on a form and position it so that it's Left > Width, or Top > Height (or both). Move it to the form's right bottom corner, for instance. 2. Now resize TWebBrowser object - decrease it's width or height a little, with mouse or from Object Inspector, doesn't matter. It disappears from the screen! Even when you select it explicitly from Object Browser, you can't see the control anymore.

QC #: Date Reported: Area:29179 5/17/2006 ActiveX\Framework

Description: Steps:[QC Short Description] Incorrect import of CoGetObject [QC Description] SYMPTOM: the usage of the CoGetObject function fails in all cases with MK_E_SYNTAX, although the syntax seems to be correct. CAUSE: The import declaration of CoGetObject is wrong. In the original header files, the first parameter szName is a LPCWSTR, which translates into PWideChar, not PWideString.

The import declaration of CoGetObject is wrong. In the original header files, the first parameter szName is a LPCWSTR, which translates into PWideChar, not PWideString. WORKAROUND: Use the following import instead of the one in unit ActiveX: function CoGetObject( pszName: PWideChar; pBindOptions: PBindOpts; const iid: TIID; ppv: Pointer): HResult; stdcall; external 'ole32.dll' name 'CoGetObject';

WORKAROUND: Use the following import instead of the one in unit ActiveX: function CoGetObject( pszName: PWideChar; pBindOptions: PBindOpts; const iid: TIID; ppv: Pointer): HResult; stdcall; external 'ole32.dll' name 'CoGetObject'; QC Entry 29179 QC #: Date Reported: Area:69057 11/18/2008 ActiveX\Framework\Variants

Description: Steps:[QC Short Description] ComObj unit doesn't support varUString [QC Description] The ComObj unit has two references to the varString type (converting AnsiString to WideString). However, it does not have *any* references to varUString (for converting UnicodeString to WideString). Thus, when attempting to use a dispatch interface, one must explicitly cast string/UnicodeString arguments to WideString (or to OleVariant) because ComObj won't do it for you. Clearly, it should. QC Entry 69057

QC #: Date Reported: Area:

86712 7/29/2010 ActiveX\Framework\Variants\Variant

Description: Steps:[QC Short Description] UnicodeString always passed to _DispInvoke() by value [QC Description] Look at the codegen for an exemplary late-binding call like this one:// ----- var V: Variant; S: String; W: WideString; begin V.Connect (S, W); end; // ----- Delphi 2006: // ----- Unit1.pas.32: V.Connect (S, W); 0046FB51 8D45F8 lea eax,[ebp-$08] 0046FB54 50 push eax 0046FB55 8D45FC lea eax,[ebp-$04] 0046FB58 50 push eax 0046FB59 68A0FB4600 push $0046fba0 0046FB5E 8D45E8 lea eax,[ebp-$18] 0046FB61 50 push eax 0046FB62 6A00 push $00 0046FB64 E86F10FAFF call @DispInvoke 0046FB69 83C414 add esp,$14 // ----- Delphi 2010: // ----- Unit2.pas.32: V.Connect (S, W); 004A3C7E 8D45F8 lea eax,[ebp-$08] 004A3C81 50 push eax 004A3C82 8D45E4 lea eax,[ebp-$1c] 004A3C85 8B55FC mov edx,[ebp-$04] 004A3C88 E8DB2DF6FF call @WStrFromUStr 004A3C8D 8B45E4 mov eax,[ebp-$1c] 004A3C90 50 push eax

004A3C91 68E03C4A00 push $004a3ce0 004A3C96 8D45E8 lea eax,[ebp-$18] 004A3C99 50 push eax 004A3C9A 6A00 push $00 004A3C9C E8FB73F7FF call @DispInvoke 004A3CA1 83C414 add esp,$14 // ----- In Delphi 2006, the argument types passed to _DispInvoke() (TCallDesc.ArgTypes[]) are "varStrArg or $80, varOleStr or $80" or "$C8, $88"; the $80 indicates "by reference", and varStrArg is a special string type defined in ComObj.pas. ComObj.DispatchInvoke() handles varStrArg arguments specially in that it silently converts them back and forth. In Delphi 2010, the argument types are "varOleStr, varOleStr or $80"; as you can see in the disassembly the UnicodeString is passed by value. There's neither a special flag nor special handling for UnicodeString types in ComObj. This could be fixed by adding a new special string type flag for UnicodeString, handling it in ComObj.pas and adjusting the compiler codegen a bit. QC Entry 86712 QC #: Date Reported: Area:

52398 9/22/2007 ActiveX\IDE\Import ActiveX Control/Type Library

Description: Steps:[QC Short Description] On Vista Microsoft Script Control ActiveX component cannot be imported [QC Description] If you try to import this component, it wll result in an Error loading type library/DLL This also happens under Delphi 7. QC Entry 52398

0. Windows Vista 1. Select Component/Import Component 2. Select Import ActiveX Control as the component type 3. Select Microsoft Script Control 1.0 4. Click Next This will result in Error loading type library/DLL. [cbf: for this ocx (only) the FileName in the import list is wrapped in double-quotes (see attached .bmp). If I "Add" the ocx it is not wrapped in double-quotes and there is no load error when importing]

QC #: Date Reported: Area:88763 10/7/2010 ActiveX\IDE\Wizards\COM Object

Description: Steps:[QC Short Description] The COM Object Wizard crashes [QC Description] Access violation at address 5003A118 in module 'rtl150.bpl'. Read of address D11011AE. The COM Object Wizard crashes when clicking OK if I have opted to create a COM object that implements an existing Interface. Added by Sysop <<<<<<<<<<< Please see comment of QC report for more details. And, this issue is related to QC#87322(InternalTracking#280792). >>>>>>>>>>> QC Entry 88763

I went to File > New > Other... and select Delphi Projects > ActiveX > COM Object (Note that I did have a saved, empty ActiveX library that I was intending to add the COM object to). I filled out the COM Object Wizard, but I clicked the ellipses to find another interface to implement. When the search finished, I typed in the Search bar the first part of the interface I wanted to find. I found it, clicked OK, and it brought me back to the COM Object Wizard. Satifisfied with my choices, I clicked OK and got this error.

I have repeated this process two other times with the same result, selecting different interfaces each time.

QC #: Date Reported: Area:72637 4/1/2009 ActiveX\Type Library Editor

Description: Steps:[QC Short Description] SafeCall function mapping does not work [QC Description] When upgrading a project from Delphi 2007 to Delphi 2009 the generated pas file for the type library does not seem to follow the safecall calling convension. The previous version of Delphi used to generate procedures with safecall and this version generates functions with result of type HResult; stdcall;. SafeCall function mapping is set to "All V-table interfaces" and I've restarted the project(and the Delphi application(IDE)). To generate the safecall code It takes some indeterminate sequence like this: change the option to somehing other than "All V-table interfaces". Restart the IDE. Open Project. Generate _tlb.pas file. Close project. Change option to "All V-table interfaces". Restart Ide. Start project. Generate "_tlb.pas" file. QC Entry 72637

1. Go to Tools->Options->Environment Options->Delphi Options->Type Library and set Set SafeCallfunction mapping to "All v-table interfaces" 2. Restart the IDE 3. Create new Delphi project "ActiveX Library" 4. Create new interface IUnknown 5. Create new method. 6. Save using the default names. 6. Look at the generated "Project1_tlb.pas" file

QC #: Date Reported: Area:7725 3/25/2004 ActiveX\Type Library Editor

Description: Steps:[QC Short Description] Type library editor does not accept optional parameters in properties [QC Description] For example this is from the Microsoft Web Components Type Library (similar to the Excel one) for the Interface "Range" function _Default(optionalin Row, Column: OleVariant): OleVariant [propget, dispid $00000000, helpcontext $06006001']; safecall; procedure _Default(optionalin Row, Column: OleVariant; var: OleVariant) [propput, dispid $00000000, helpcontext $06006001']; safecall; The Type Library editor complains about I"Invalid Flag Combination", whilst this is valid. At worst the Editor should ignore but preserve the flags. These flags make it possible to write in VBA: Set R = Range("A1") R = 5 Also if you remove the parameter flags the Editor, accepts the definition, but does recognise the property as "default", despite the dispid being 0. Is this a separate bug?? QC Entry 7725

The Steps to reproduce are as follows. 1) Create a new Type Library 2) Add an Interface 3) Add a Read/Write Property of any type 4) Add two parameters to the property of type OleVariant 5) Set the modifier of these two parameters to optionalin 6) Try to save the type library and the error message about "Invalid Modifiers" flashes at the StatusBar of the Type Library Editor

QC #: Date Reported: Area:69078 11/18/2008 ActiveX\Type Library Editor

Description: Steps:[QC Short Description] Type Library Auto Expand [QC Description] Can this be turned off? I have 50 ActiveForms in my ActiveX Library and finding an interface is extremely hard QC Entry 69078

1. Create a new ActiveX Object (Automation Object is fine) 2. Add some methods to the interface NOTE: THE TLE Automatically expands (Opens) all nodes of the Tree. This should be customizable.

QC #: Date Reported: Area:87502 8/24/2010 ActiveX\Type Library Editor

Description: Steps:[QC Short Description] safecall options missing [QC Description] Tools/Options Delphi Options/Type Library The options to control the generation of safecall vs. stdcall in the _tlb.pas have been removed. This is to control the equivalent of the -pT+ command-line option of gentlb.exe QC Entry 87502

QC #: Date Reported: Area:88995 10/15/2010 ActiveX\Type Library Editor

Description: Steps:[QC Short Description] SafeCall function mapping not honored [QC Description] This issue addresses QC reports 68286 and 72637. Both have been closed, when in reality they have not been fixed. This is now version XE (2011). The last time this really worked was Delphi 2007. COM programmers have been getting headaches with Delphi 2009, 2010, and XE. That's a lot of versions for this functionality to not work when it actually used to. Also, the workarounds suggested in those QC reports don't work for me. In Tools > Options > Environment Options > Delphi Options > Type Library, there is a "SafeCall function mapping" group box. There are three values: All v-table interfaces, Only dual interfaces, and Do not map. The point behind the "All v-table interfaces" options is explained here: Objects in COM implement Interfaces. Those interfaces can declare methods (procedures which don't return anything), functions (which return COM types or other interfaces), and properties (which allow you to get/set COM types or other interfaces). Ideally, when we program with COM objects and interfaces in Delphi, we want the code to look familiar. Therefore, if we set a property on an interface, we expect the property to be on the left side of an assignment operator ( := ). Likewise, if we call an interface function, we have the result of that function being assigned on the left side of an assignment operator. If we want the value of a property, then we just use that property's name in code. That is the purpose of the safecall option above. It declares all members of object interfaces with the safecall function and those members can be used how we expect them with normal Delphi syntax. But Delphi 2009, 2010, and XE seem to ignore the setting. If you import a type library with using Delphi 2007 or earlier (not 8), and that type library declares an IEnvelope interface, it will declare a Get_Width function that returns a Double, a Set_Width procedure that takes a Double, and a Width property that you can get or set with a Double. But these versions of Delphi don't generate _TLB files like that. They will import the same interface with a Get_Width function with an OUT parameter of type Double, and the function itself returns an HRESULT. The Set_Width method is ALSO declared as a function that takes a Double and returns an HRESULT. And the Width property itself, is nowhere to be found. Can you see the difference in resulting coding styles?

With SafeCall mapping successfully used in Delphi: pEnvelope.Width := pEnvelope.Width * 2 Without SafeCall mapping successfully used in Delphi: var dWidth: Double; begin pEnvelope.Get_Width( dWidth ); pEnvelope.Set_Width( dWidth * 2 ); Now, this issue can be overcome somewhat by using the type library importer (tlibimp) with the -Pt switch set to +. But the Type Library Editor doesn't honor this setting. If you create a new object (or like me, load one that was working in 2007) and you Refresh or create new objects that implement interfaces, then the resulting methods in your object are Get_ and Set_ functions that return HRESULTS, despite the setting in the Tools > Options dialog. And this is just bad. I don't like it, and I'll keep using Delphi 2007 for my COM development until this gets good and fixed! Whether or not the QCs on this matter are closed or not, I'll use XE for COM when it's actually fixed. If Embarcadero is intentionally trying to throw me on .NET bandwagon, it won't work. Signed, Disappointed Delphi fan "Roj" So many other things are great about Delphi that I wouldn't switch. But to break something that worked before just makes me whine. Notice that it stopped breaking in the very version of Delphi that introduced the .ridl format. I sincerely don't know if that's a coincidence. QC Entry 88995 QC #: Date Reported: Area:

87322 8/17/2010 ActiveX\Type Library Editor\Uses page

Description: Steps:[QC Short Description] Type Library Editor cannot display type libs registered with hex (non-digit) version number [QC Description] Occurs in at least 3 versions of Delphi - tested in D6, D2006, and D2010 The ESRI ArcGIS 10 type libs are registered in the registry with version number a.0 The TLB Editor Uses page will not display these type libs, unless you add/change the version number key in the registry to 1.0 (or some other numeric value). The Import Type Library wizard, in contrast, lists these TLBs with no problem. The TLB Editor needs to recognise a.0 as a valid version number. QC Entry 87322

This type lib will not be displayed in the TLB Editor Uses list: [HKEY_CLASSES_ROOT\TypeLib\{40499F24-596F-45D2-ACE1-A251E2990017}\a.0\0\win32] @="C:\\Program Files\\ArcGIS\\Desktop10.0\\com\\esriArcMapUI.olb" Add this key, however, and it will display fine: [HKEY_CLASSES_ROOT\TypeLib\{40499F24-596F-45D2-ACE1-A251E2990017}\1.0\0\win32] @="C:\\Program Files\\ArcGIS\\Desktop10.0\\com\\esriArcMapUI.olb"

QC #: Date Reported: Area:87292 8/16/2010 Midas\TClientDataSet

Description: Steps:[QC Short Description] Aggregate Returns Summing Errors [QC Description] Using an aggreate in a TClientDataSet at times returns an error for

TDBXFulcrumBugsSuite.Native.Db.Test.exe -s:TestRaid_279838 -OR- Since this appears to be a dynamic problem see attached example.

summed values, in my case did not check other aggregates. For example in a cds with 4 values, each value represents an Index, the sum of a field will return a sum of 2 index entries. The aggregate appears to not always follow the Index. Hence some index values appear to be linked, however not all. If you Filter the dataset on the Index, it will return the correct value. If turn off the aggregates, switch the index, restore the index then set the aggregates to active, it will then (from initial study) return the correct value. If you close and the open the CDS, you get the correct value. This appears to be a dynamic problem, were the index used by the aggregate does not follow the index used for selecting and sorting the data QC Entry 87292

1)Build and run example then 2)Click Start and 8 records will be processed, each entery has 2 records 3) Examine the results The upper grid is hooked to the data in a second CDS via a provider and yields the correct results The lower grid is hooked to the main CDS notice that the AggFT_Amt does not match FT_Amt of all entries and AggAdd doesn't match LFMJ_Added. 4) If you press Reset check 'Reset Index After Post' you will get the correct results. The Reset Index does 1) Turn Off aggregates 2) Switch Index 3) Restore Index 4) Turn On Aggregates I also found will building this, the cross linked values have other triggers if you uncheck 'Post Alternate Amount' this will not fail If you check 'Post Secondary Values' the cross linking is different.

QC #: Date Reported: Area:88012 9/13/2010 Midas\TClientDataSet

Description: Steps:[QC Short Description] Assignment to XMLData results in Buffer Overflow [QC Description] Assignment to XMLData may cause a Buffer Overflow. DSXML_W::ReadStr (dsxmlfld.cpp) does not count Non-ASCII chars. As a result the allocated buffer is too small and a buffer overflow occurs. Line 588-590: if ((mbcsLength != 0) && pStr) for (int Ind = 0; Ind < mbcsLength; Ind++) pStr[j++] = mbcsBuf[Ind]; j must be incremented even if pStr is NULL. QC Entry 88012

Run the following program. program midasBug; uses Classes, Forms, DB, DBClient, midaslib; var cds: TClientDataSet; s: string; begin Application.Initialize; cds := TClientDataSet.Create(nil); cds.FieldDefs.Add('TEST', ftMemo); cds.CreateDataSet; cds.AppendRecord([stringOfChar(AnsiChar('?'), 250)]); // more than 128 Characters, some Non-ASCII characters s := cds.XMLData; cds.XMLData := s; // Buffer Overflow end.

QC #: Date Reported: Area:89902 11/23/2010 Midas\TClientDataSet

Description: Steps:[QC Short Description] Aggregate Field functions failure with TWideStringField [QC Description] Min, Max do not work with TAggregateField when the aggregate is done on TWideStringField. I do not know what else does not work but could you guys run all your unit test for TStringField on TWideStringField. QC Entry 89902

Please see the attached demo.

QC #: Date Reported: Area:89530 11/9/2010 Midas\TSocketConnection

Description: Steps:[QC Short Description] SocketConnection message "Object not available" [QC Description] I can’t create classic DataSnap project, based on COM technologies in Builder XE. After /regserver my server the ServerName dropdown list is empty in SocketConnection component. I have tried to fill in ServerName and ServerGuid on my own, getting data from registry. I try to do Connected=true in SocketConnection component, I get a message "Object not available". QC Entry 89530

Create and register datasnap server /regserver Then I launch scktsrvr.exe, which XE includes then in the client project I fill in property address and port in SocketConnection component, after this I want to pick the name of my registered server, but dropdown list is empty in property ServerName of SocketConnection component.

QC #: Date Reported: Area:93003 4/12/2011 Compiler\Delphi

Description: Steps:[QC Short Description] Internal error T801 when working with enum size 4 [QC Description] I have ported some C++ code that requires that enumeration size is 4 ({$MINENUMSIZE 4}). The compiler fails to compile with an internal error T801 if I try to use low (TInterval) or high (TInterval) if TInterval is an interval of values from the enumeration. Michel QC Entry 93003

This fails to compile with the internal error T801 program InternalErrorT801; {$APPTYPE CONSOLE} {$MINENUMSIZE 4} type TMyEnum = (One, Two, Three); {$MINENUMSIZE 1} type TInterval = One .. Two; var lEnum : TMyEnum; begin lEnum := Low(TInterval); WriteLn('PASS'); // on compile end.

QC #: Date Reported: Area:90344 12/15/2010 Compiler\Delphi

Description: Steps:[QC Short Description] Compiling a simple class helper failed with Internal Error C10343 [QC Description] See steps or open the test case project I attached and try to compile.QC Entry 90344

0. Open Delphi XE (Update 1, 15.0.3953.35171) 1. Create a new VCL Forms application 2. Add new unit (unit2.pas), enter the following code: ---------------- unit Unit2; interface uses Unit3, // Internal Error disappears if you remove Unit3 from uses list Classes; type TMyStream = class(TStream) end; implementation end. ---------------- 3. Add new unit (unit3.pas), enter the following code: ---------------- unit Unit3; interface uses SysUtils, Classes; type TMyHelper = class helper for TStream public // Try different parameter types: Integer is OK, but Int64 or Currency causes Internal Error C10343 procedure MyMethod(C: Int64); end; implementation procedure TMyHelper.MyMethod(C: Int64); begin Write(C, 0); // Internal Error disappears if you remove this line end; end. ---------------- 4. Try to compile. 5. Compiler failed with Internal Error C10343

QC #: Date Reported: Area:62083 5/13/2008 Compiler\Delphi

Description: Steps:[QC Short Description] Inlining of nested/local procedures [QC Description] Even though local/nested procedures can be marked as inline the code is not inlined QC Entry 62083

function Inline1(i:integer):integer; inline; begin result := i + 1; end; function Test; function Inline2(i:integer):integer; inline; begin result := i + 1; end; var x:integer; begin x := 0; x := Inline1(x); x := Inline2(x); end; -- The call to Inline1 is inlined but not the call to Inline2

QC #: Date Reported: Area:93814 5/12/2011 Compiler\Delphi

Description: Steps:[QC Short Description] Internal Error: URW6448 [QC Description] In the declaration of "reference to function" default function parameter value accepted but it causes internal error on second time compiling project (I mean using command "Make" or "CTRL+F9"). If you will clean and build again this error will disappear until next compilation. In Delphi XE compiler shows following: [DCC Fatal Error] Project1.dpr(5): F2084 Internal Error: URW6448 In Delphi 2010 compiler shows following: [DCC Fatal Error] Project1.dpr(5): F2084 Internal Error: URW6099 QC Entry 93814

1. Create new VCL forms application. 2. Double click on form's OnCreate event. 3. Replace your form's unit code by following: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; type TFuncTest = reference to function(Some: integer = 1): TObject; TTestClass = class public TestFuncRef: TFuncTest; end; TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private { Private declarations } public MyObj: TTestClass; function TestFunc(Some: integer = 1): TObject; end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin MyObj := TTestClass.Create; MyObj.TestFuncRef := TestFunc; end; function TForm1.TestFunc(Some: integer): TObject; begin Result := nil; end; end. 4. Build project. 5. Try now just compile using Make command or key combination CTRL+F9. Compiler will show fatal internal error on first or second compilation attempt.

QC #: Date Reported: Area:96432 7/20/2011 Compiler\Delphi

Description: Steps:[QC Short Description] Inline function in DPR unit gets an AV after program closing [QC Description] When you call an Inline function from begin..end block in the DPR unit you will get an AV after program closing. In the attached project this function named as GetEnvVar(). If you remove "inline" word from the declaration of this function, AV does not occur. See Unit2.pas: function GetEnvVar(const AName: AnsiString; AKey: Word): string; inline; QC Entry 96432

1.Call an inline function from Delphi project file (DPR). 2.Close an application. Added by Sysop <<<<<<<< [Project1 .dpr] ---------------- ... ... begin Application.Initialize; Application.MainFormOnTaskbar := True; // {$o-} S := Unit2.Encrypt('EXPIRED', 47349); Unit2.GetEnvVar(S, 47349); Application.CreateForm(TForm1, Form1); Application.Run; end. ---------------- [Unit2.pas] ---------------- ... function GetEnvVar(const AName: AnsiString; AKey: Word): string; inline; ... >>>>>>>>

QC #: Date Reported: Area:91067 1/24/2011 Compiler\Delphi

Description: Steps:[QC Short Description] Internal error(s) + IDE restart required when too many included files ($I) [QC Description] When you have too many included files in a unit, compilation fails + you have to restart the IDE to be able to compile anything further. The first time you compile you get error: [DCC Fatal Error] Unit2.pas(1020): F2084 Internal Error: AV0701B16C-W636E692E-1 And then attempting to compile anything further without closing down the IDE gives: [DCC Fatal Error] Exception EAccessViolation: Access violation at address 0701B16C in module 'dcc140.dll'. Write of address 00000000[DCC Error] Catastrophic failure (Exception from HRESULT: 0x8000FFFF (E_UNEXPECTED)) QC Entry 91067 Added by Sysop <<<<<<<<<< This issue still occurs on Delphi XE(w/ Update1). >>>>>>>>>>

Create a file with a lot of included files. eg. You could require a lot of included files if you decided to put the calling convention for a library into a separate file: // OpenGL header (1000+ procedural types) PFNGLUNIFORM1FPROC = procedure(location: GLint; v0: GLfloat); {$I GLConv.inc} PFNGLUNIFORM2FPROC = procedure(location: GLint; v0: GLfloat; v1: GLfloat); {$I GLConv.inc} PFNGLUNIFORM3FPROC = procedure(location: GLint; v0: GLfloat; v1: GLfloat; v2: GLfloat); {$I GLConv.inc} PFNGLUNIFORM4FPROC = procedure(location: GLint; v0: GLfloat; v1: GLfloat; v2: GLfloat; v3: GLfloat); {$I GLConv.inc} ... // GLConv.inc {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF UNIX} cdecl; {$ENDIF}

QC #: Date Reported: Area:93633 5/6/2011 Compiler\Delphi

Description: Steps:[QC Short Description] Same address to two fields in the same object [QC Description] When creating an object two fields gets the same address. One field is defined in a baseclass and the other field is defined in an inherited class. QC Entry 93633 Added by Sysop <<<<<< This is a regression. With Delphi 2009, this code works fine. >>>>>>

Just run the attached program and the error will show. ... ... type TStructItem = class( TObject ); TStructList<T: class> = class( TObjectList<T> ) private FModer: TStructItem; procedure SetModer(const Value: TStructItem); public constructor Create( EttItem: TStructItem ); reintroduce; property Moder: TStructItem read FModer write SetModer; end; TProdukt = class(TStructItem); TProduktList = class( TStructList<TProdukt> ) private FAktuell: integer; procedure SetAktuell(const Value: integer);

public property Aktuell: Integer read FAktuell write SetAktuell; end; TOffertOrder = class( TStructItem ) public Produkt: TProduktList; constructor Create; reintroduce; end; ... ... constructor TOffertOrder.Create; var adr1, adr2: pointer; begin Produkt := TProduktList.Create( Self ); adr1 := @Produkt.FModer; adr2 := @Produkt.FAktuell; if adr1 = adr2 then MessageDlg('The adress to Produkt.FModer and Produkt.FAktuell are the same!!!???', mtInformation, [mbOK], 0); end; ... ...

QC #: Date Reported: Area:87615 8/29/2010 Compiler\Delphi\BASM

Description: Steps:[QC Short Description] PCLMULQDQ instruction not supported [QC Description] BASM does not support the PCLMULQDQ instruction. This instruction is defined as PCLMULQDQ xmm1, xmm2/m128, imm8 66 0F 3A 44 /r ib Reference: Intel? 64 and IA-32 Architectures Software Developer? Manual Volume 2B: Instruction Set Reference, N-Z June 2010 QC Entry 87615

Instructions like the below should compile but don't: asm pclmulqdq xmm1, xmm2, 00010001b pclmulqdq xmm0, [eax], 00010001b pclmulqdq xmm1, [esi+ecx*4], 00010001b end;

QC #: Date Reported: Area:93021 4/12/2011 Compiler\Delphi\BASM

Description: Steps:[QC Short Description] Incorrect choice of NEAR jump with .align 16 directive [QC Description] When a jump is coded in BASM, if offset is in the range [-$80..$7F] a near jump is used. However in some case if in between the jump there is a .align 16 directive that will cause extra addition of code, an overflow may occur. See steps for detailed code sample reproducing the issue. QC Entry 93021 [PulsarBeta]

program Project4; {$APPTYPE CONSOLE} uses SysUtils; {$CODEALIGN 16} procedure DoNothingAsm(v: integer); asm nop nop nop nop nop cmp v, 0 jg @good_jump jmp @miss_jump // EB82 <- incorrectly coded as near jump -126 // a bunch of $7C NOP, just to simulate an offset that should be < $80, // but .align 16 directive will add extra 13 bytes of code that will cause // the near jump to overflow db $90,$90,$90,$90,$90,$90,$90,$90,$90,$90,$90,$90,$90,$90,$90,$90 db $90,$90,$90,$90,$90,$90,$90,$90,$90,$90,$90,$90,$90,$90,$90,$90 db $90,$90,$90,$90,$90,$90,$90,$90,$90,$90,$90,$90,$90,$90,$90,$90 db $90,$90,$90,$90,$90,$90,$90,$90,$90,$90,$90,$90,$90,$90,$90,$90 db $90,$90,$90,$90,$90,$90,$90,$90,$90,$90,$90,$90,$90,$90,$90,$90 db $90,$90,$90,$90,$90,$90,$90,$90,$90,$90,$90,$90,$90,$90,$90,$90 db $90,$90,$90,$90,$90,$90,$90,$90,$90,$90,$90,$90,$90,$90,$90,$90 db $90,$90,$90,$90,$90,$90,$90,$90,$90,$90,$90,$90,$90 .align 16

@good_jump: nop nop @miss_jump: end; begin try DoNothingAsm(0); // Expected behaviour : do nothing, actual : crash ! except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; end.

QC #: Date Reported: Area:4530 5/22/2003 Compiler\Delphi\BASM

Description: Steps:I'd like the ability to specify alignment inside blocks of asm code, and I'd like the implementation to mimic the way TASM allows code alignment, that being, via the ALIGN keyword. The BASM already supports DB, DW and DD, as well as some other keywords that have a history with TASM (TYPE returning the size of a specified type, for example), so this seems more logical than using a compiler directive, especially for BASM code. An example of how this might look in the 'Steps'. The place to note the difference is in the line before '@@1:'. The syntax for ALIGN would be-- ALIGN [boundary] Where [boundary] is an optional power of two address boundary (2, 4, 8, etc). If no address boundary is given, then a default is used (perhaps the record field alignment specified in the project options?). If this is implemented, it'd be nice if the EVEN keyword were also implemented (I believe EVEN essentially maps to ALIGN 2). QC Entry 4530

{ Just an example of some code with an ALIGN used inside the assembly } function PosChar(Ch: AnsiChar; const S: AnsiString): integer; register; asm { -> AL Ch } { EDX S } { <- EAX Result } OR EDX, EDX JZ @@Error MOV ECX, EDX // save original pointer ALIGN 16 // align label on 16 byte boundary @@1: CMP BYTE PTR [EDX], 0 JE @@Error CMP BYTE PTR [EDX], AL JE @@2 INC EDX JMP @@1 @@2: MOV EAX, EDX SUB EAX, ECX INC EAX RET @@Error2: SUB EAX, EAX @@Error: end;

QC #: Date Reported: Area:73745 5/8/2009 Compiler\Delphi\BASM

Description: Steps:[QC Short Description] Request for a .ALIGN directive is BASM [QC Description] To write optimized assembler code with BASM, It is very important to have a .ALIGN 16 directive in Delphi, capable to align CODE/DATA on a 16 bytes boundary This is true for both 32 and 64 bits mode, and even mandatory in some case for 64 bits. Quote extracted from Intel® 64 and IA-32 Architectures Optimization Reference Manual " Assembly/Compiler Coding Rule 12. (M impact, H generality) All branch targets should be 16-byte aligned. " This imply the necessity of a .ALIGN directive in BASM See Steps for a sample QC Entry 73745

this piece of assembler code represent what is needed: asm MOV ECX, $1000 .ALIGN 16 <--- Currently unsupported in BASM @loop_start: MOV EAX, [EBX + (ECX*4)] <---- Better performance if this opcode start on a 16 bytes boundary IMUL EAX, [EDX + (ECX*4)] SUB EAX, [ESI + (ECX*4)] MOV [EDX + (ECX*4)], EAX DEC ECX JNZ @loop_start end; please note that .ALIGN16 directive either insert NOP, or 2,3,4 bytes opcodes equivalent to NOP, such as OR EAX, EAX, or event insert if needed a JMP @loop_start - which is imho not a good idea.

QC #: Date Reported: Area:87616 8/29/2010 Compiler\Delphi\BASM

Description: Steps:[QC Short Description] AES assembly instructions are not supported [QC Description] BASM does not support the AES instructions: AESENC AESENCLAST

If AES instructions were supported, code like the following would be expected to compile: asm aesenc xmm0, xmm1 aesenc xmm0, [esi+ecx*4] aesenc xmm0, [eax] aesenclast xmm0, xmm1 aesenclast xmm0, [esi+ecx*4] aesenclast xmm1, [eax] aesdec xmm0, xmm1 aesdec xmm0, [esi+ecx*4] aesdec xmm1, [eax] aesdeclast xmm0, xmm1 aesdeclast xmm0, [esi+ecx*4] aesdeclast xmm3, [edx] aesimc xmm0, xmm1 aesimc xmm0, [esi+ecx*4] aesimc xmm1, [eax] aeskeygenassist xmm0, xmm1, 8 aeskeygenassist xmm0,

AESDEC AESDECLAST AESIMC AESKEYGENASSIST These instructions are described here: Intel? 64 and IA-32 Architectures Software Developer? Manual Volume 2A: Instruction Set Reference, A-M June 2010 QC Entry 87616

[esi+ecx*4], 8 aeskeygenassist xmm1, [eax], 8 end;

QC #: Date Reported: Area:29663 5/30/2006 Compiler\Delphi\TD Debug Info

Description: Steps:[QC Short Description] DBG1553 when "Include TD32 debug info" checked [QC Description] When Include TD32 debug info is checked in Project, Options, Linker page, "[Pascal Fatal Error] F2084 Internal Error: DBG1553" occurs. QC Entry 29663

- It appears that as soon as anything is placed in the ToSet procedure this error is generated. I suspect it has something to do with the untyped var AValue - This same code generates [Fatal Error] Internal Error DBG1384 in Delphi 6.03 program prj1384; {$APPTYPE CONSOLE} uses SysUtils, TypInfo; type TMyType = (tOne, tTwo, tThree); TMySet = set of TMyType; var setTmp : TMySet; procedure ToSet(const AString : WideString; const ASetType : PTypeInfo; var AValue); const WHITESPACE = [WideChar(#0)..WideChar(' ')]; //DBG1384 caused as soon as we declare a const begin end; begin ToSet('[tOne]', TypeInfo(TMySet), setTmp); end.

QC #: Date Reported: Area:

90984 1/20/2011 Compiler\Delphi\Code Generation/Optimization

Description: Steps:[QC Short Description] Compiler freezes on correct code with some try, except, finally blocks. [QC Description] By USc: Using inline in connection with Exit may cause an endless loop in the compiler. The issue exists at least since D2007, but affects the QC reporter first with DXE, because between D2010 and DXE a call to Exit has been added in SysUtils.DeleteFile. -> see steps QC Entry 90984

Steps by USc: - save the following program - dcc32 QC90984.dpr expected: compilation finish in a few seconds actual: compilation "never" finishs Removing the inline directive or compiling with inline off (dcc32 QC90984.dpr --inline:off) makes it compiling. program QC90984; {$APPTYPE CONSOLE} //Delphi XE's SysUtils.DeleteFile does use Exit on Windows // in contrast to prior versions function DeleteFile(const FileName: string): Boolean; inline; begin Result := False; if not Result then Exit; end; function TransformDatabase(ASource, ADestination: string): Boolean; var Temp: string; begin // some code try Result := False; Temp := 'Tempfile.dat'; // some code try // some code try // some code except Exit; end; finally DeleteFile(Temp); end; Result := True; finally // some code end; end; begin WriteLn('PASS'); // on compile end. Original Steps: 1. Create new Delphi application with one form TForm1. 2. Insert function TransformDatabase into this form. function TForm1.TransformDatabase(ASource, ADestination: string): Boolean; var Temp: string; begin // some code try Result := False; Temp := 'Tempfile.dat'; // some code try // some code try // some code except

on E: Exception do begin // some code Exit; end else raise; end; finally DeleteFile(Temp); end; Result := True; finally // some code end; end; 3. Press F9 and wait. Compiler stops working after few lines of code and Delphi has to be terminated. Compiler is successful, if line with function DeleteFile is commented. The same code can be compiled without any problem in Delphi 2007.

QC #: Date Reported: Area:

26999 4/5/2006 Compiler\Delphi\Code Generation/Optimization

Description: Steps:[QC Short Description] Add operator inlining [QC Description] Currently, operator methods can not be inlined, despite the "inline" directive being accepted. I feel it would be useful to add such support. For example in this type: type TIPv4Address = {$IF RECORDS_WITH_METHODS}record{$ELSE}object{$IFEND} private Data: UInt32; FBytes: TIPv4Bytes; procedure UpdateData; inline; procedure UpdateBytes; inline; procedure SetData(const I: UInt32); inline; procedure SetBytes(const B: TIPv4Bytes); inline; function IsRoutable: Boolean; {$IFOPT D-}inline;{$ENDIF} function GetAddrType: TIPv4AddressType; {$IFOPT D-}inline;{$ENDIF} public {$IF OPERATOR_OVERLOADS} class operator Implicit(const S: AnsiString): TIPv4Address; inline;//<- doesn't really work class operator Implicit(const I: UInt32): TIPv4Address; inline; class operator Inc(const A: TIPv4Address): TIPv4Address; inline; class operator Dec(const A: TIPv4Address): TIPv4Address; inline; {$IFEND} procedure FromString(S: AnsiString); function ToString: AnsiString; inline; property AsInteger: UInt32 read Data write SetData; property Bytes: TIPv4Bytes read FBytes write SetBytes; property Routable: Boolean read IsRoutable; property AddressType: TIPv4AddressType read GetAddrType; procedure Assign(const A: TIPv4Address); end; class operator TIPv4Address.Implicit(const S: AnsiString): TIPv4Address; begin Result.FromString(S); end; class operator TIPv4Address.Implicit(const I: UInt32): TIPv4Address;begin Result.AsInteger := I; end; QC Entry 26999

Load the attached program into the IDE. Set a breakpoint on the line that reads "Value := 'Hello';" Run the program until the breakpoint is reached. Launch the CPU view and see that references to the implicit operators are not inlined but rather are calls. program BTS242167; {$APPTYPE CONSOLE} type TIPv4Address = record private Data: Cardinal; public class operator Implicit(const S: AnsiString): TIPv4Address; inline;//<- doesn't really work class operator Implicit(const I: Cardinal): TIPv4Address; inline; procedure FromString(S: AnsiString); property AsInteger: Cardinal read Data write Data; //SetData; end; procedure TIPv4Address.FromString(S: AnsiString); begin end; class operator TIPv4Address.Implicit(const S: AnsiString): TIPv4Address; begin Result.FromString(S); end; class operator TIPv4Address.Implicit(const I: Cardinal): TIPv4Address; begin Result.AsInteger := I; end; procedure Use(var Value); begin end; var Value: TIPv4Address; begin Value := 'Hello'; Value := 42; Use(Value); end.

QC #: Date Reported: Area:

91586 2/16/2011 Compiler\Delphi\Code Generation/Optimization

Description: Steps:

[QC Short Description] Bug in code optimization QC Entry 91586

This is a strange behaviour in Delphi 2010 that was different in Delphi 7: Example: I have a class 'TestClass'. This TestClass has three public methods: Method a, b and c. Method a uses an external function defined in a.dll. Method b uses an external function defined in b.dll. Method c uses an external function defined in c.dll. Now i create a new project that uses my TestClass, but it only uses Method a. Now the strange thing: Using Delphi 7: I only have to provide a.dll together with my application because Methods b and c are removed due to optimization. Using Delphi 2010: I must provide a.dll, b.dll and c.dll, although Methods b and c are never used. This compiler does not remove the unused methods b and c. I did not find any setting to change this so i suppose this to be a bug.

QC #: Date Reported: Area:91327 2/4/2011 Compiler\Delphi\Errors - Warnings

Description: Steps:REGRESSION FROM D2007 [QC Short Description] F2084 Internal Error: C10343 error triggered in completely valid code that works with Delphi 2007 [QC Description] Trying to compile a valid program results in internal error. Delphi compiler than stays in a weird state that will not compile any code at all. QC Entry 91327

Create simple project. program F2048; uses Classes, StreamEnh; type TTest = class(TStream) end; begin end. Create unit StreamEnh. unit StreamEnh; interface uses SysUtils, Classes; type TGpStreamEnhancer = class helper for TStream public procedure BE_WriteDWord(const dw: cardinal); procedure BE_WriteHuge(const h: Int64); end; implementation procedure TGpStreamEnhancer.BE_WriteDWord(const dw: cardinal); begin end; procedure TGpStreamEnhancer.BE_WriteHuge(const h: Int64); begin BE_WriteDWord(Int64Rec(h).Hi); BE_WriteDWord(Int64Rec(h).Lo); end; end. Rebuild. (Shift-F9) Expected: Program should compile. Reality: [DCC Fatal Error] F2048.dpr(1): F2084 Internal Error: C10343 Funny things happen if you don’t restart the Delphi. Try recompiling: [DCC Fatal Error] F2048.dpr(9): F2084 Internal Error: O826

QC #: Date Reported: Area:76845 8/19/2009 Compiler\Delphi\Language

Description: Steps:[QC Short Description] Scoped enums cannot be used for subset declarations [QC Description] The following code should be compilable, but DCC fails with an error:// ----- program test; {$SCOPEDENUMS ON} type TSomeOrdinal = (One, Two, Three); TSomeOrdinals = set of TSomeOrdinal.One..TSomeOrdinal.Two; // <-- expected ';' but found '.' begin end. // ----- QC Entry 76845

Compile the attached application below. See the following unexpected compile-time error messages indicating failure. BTS272560.dpr(10) Error: E2029 ';' expected but '.' found BTS272560.dpr(10) Error: E2029 ';' expected but '.' found program BTS272560; { Scoped enums cannot be used for subset declarations } {$APPTYPE CONSOLE} {$SCOPEDENUMS ON} type TSomeOrdinal = (One, Two, Three); TSomeOrdinals = set of TSomeOrdinal.One..TSomeOrdinal.Two; //#1// // ^^^ expected ';' but found '.' begin WriteLn('PASS'); //PASS on compile// end.

QC #: Date Reported: Area:87821 9/6/2010 Compiler\Delphi\Language

Description: Steps:[QC Short Description] packed object not supported QC Entry 87821

type tobj = packed object f1: byte; f2: byte; end; [DCC Error] Unit1.pas(21): E2006 PACKED not allowed here (reproduced in D2010 also, but in D2009 was supported) Why? If you want to kill OBJECT, you must make an adequate substitute, for example improve RECORD for inheritance. I can't refuse of use OBJECT and I

Added by Sysop <<<<<<<<<< > In D7(build 4.453) it works fine. >>>>>>>>>>

need PACKED feature.

QC #: Date Reported: Area:6610 12/11/2003 Compiler\Delphi\Language

Description: Steps:[QC Short Description] Allow procedure/function declarations to specify their entry point code alignment [QC Description] This report requests that a new procedure/function directive be added that allows the developer to specify the alignment of the procedure/function. The new directive would be "align", and this directive would accept an integer value following the directive that specifies how to align the procedure/function. For example-- procedure AlignTest(A, B, C: integer); align 32; begin // code end; Would align AlignTest on a 32-byte boundary, while-- procedure AlignTest2(A, B, C: integer); align 512; begin // code end; Would align AlignTest2 on a 512-byte boundary. The value following should conceivably always be a power of 2 (but I do not believe it should be necessary to require this). If a calling convention is specified, this new directive would behave similar to the varargs directive in that no semi-colon would be used to seperate it from the calling convention. E.g. - procedure AlignTest3(A, B, C: integer); cdecl align 64; begin // code end; Would be correct. QC Entry 6610

QC #: Date Reported: Area:67693 10/8/2008 Compiler\Delphi\Language\Variants

Description: Steps:Constant values of type Int64 are not handled properly when passed to dispatch methods of variants.

Compile and run the attached application below. See that the following program output is generated. 1024 18540119686382592 1024 is output for the first call to srvr.test(i64) and is the expected output. However, the the second call involving srvr.test(Int64(1024)) does not produce this result. Var srvr : Variant; i64 : Int64; begin try srvr := IDispatch(TDispItem.Create); i64 := 1024; srvr.test(i64); srvr.test(Int64(1024));

except on E:Exception do Writeln(E.Classname, ': ', E.Message); end; end.

QC #: Date Reported: Area:88807 10/9/2010 Compiler\Delphi\Language\Variants

Description: Steps:[QC Short Description] VarClear Memory Error on app shutdown. [QC Description] VarClear incorrect works with specific size variant array QC Entry 88807

Just run this application (it will work at D2007): See that a memory error is raised upon application shutdown. program varArrayBug; {$APPTYPE CONSOLE} uses SysUtils, variants; procedure Test; var v1: Variant; begin v1 := VarArrayCreate([0,-1,0,1], varVariant); end; begin Test; end.

QC #: Date Reported: Area:73610 5/4/2009 Compiler\Delphi\Language\Variants

Description: Steps:[QC Short Description] Variant and int64 typecasting doesn't compile [QC Description] Example: function Test(const Value: Variant): Int64; begin Result := Int64(Value); end; Expected: Successful compilation Result: E2089 Invalid typecast QC Entry 73610

QC #: Date Reported: Area:

91074 1/24/2011 Compiler\Delphi\Language\Overloading

Description: Steps:[QC Short Description] Slice function causes E2193 [QC Description] Delphi XE Compiler reports E2193(Slice standard function only allowed as open array argument) when it compiles the code below. Delphi 7 Compiler can compile this code without errors. uses Math; type IntegerArray = array [1..10] OF Double;

Please see the Comment from me. Added by Sysop <<<<<<<<<<<<< I confirmed that QC#4058 is not fixed with your code and last Japanese version of Delphi 7(Delphi 7.1 update1). The confusing point of problrm is: Sum and Mean of Delphi 7 RTL are not overloaded but Sum and Mean of Delphi XE RTL are overloaded. QC#91074 may be duplicated and QC#4058 must be re-opened !

var SliceMe : array [1..200] OF Double; procedure TForm4.Button1Click(Sender: TObject); begin mean(SLICE(SliceMe, 5)); end; After the problem occurred, I copied the source code of "means" from runtime source file into the code above, the error disappeared. QC Entry 91074

>>>>>>>>>>>>>

QC #: Date Reported: Area:

87298 8/16/2010 Compiler\Delphi\Language\Overloading\Global

Description: Steps:[QC Short Description] REGRESSION: Ambiguous overload error with Math.Sum breaks existing code [QC Description] The following code used to compile under D2010 but breaks under the FT. QC Entry 87298

Compile the attached application below. See the following compile-time errors indicating failure. Error: E2251 Ambiguous overloaded call to 'Sum' + Math.pas(3305) Related method: function Sum(const array of Single): Single; + Math.pas(3351) Related method: function Sum(const array of Double): Double; + Math.pas(3397) Related method: function Sum(const array of Extended): Extended; program BTS279826; { Ambiguous overload error with Math.Sum breaks existing code } {$APPTYPE CONSOLE} uses Math; function DoSum(var data: array of Byte): integer; begin Sum([data[0], data[1], data[2]]); end; begin try WriteLn('PASS'); //PASS on compile// except on E: TObject do Writeln('FAIL - ', E.ClassName); end; end.

QC #: Date Reported: Area:82677 3/4/2010 Compiler\Delphi\Other Compiler

Description: Steps:[QC Short Description] write / writeln does not work with array of char [QC Description] When you supply an array of char (or WideChar) as parameter to a write or writeln statement, a compiler error E2054 results. Using an array of AnsiChar instead compiles just fine. QC Entry 82677

var a : array [0..1] of AnsiChar; c : array [0..1] of char; begin a := 'AA'; c := 'CC'; writeln (a); {compiles} writeln (c); {does not compile, E2054} writeln (string (c)); {work around} end.

QC #: Date Reported: Area:92737 3/31/2011 Compiler\Delphi\Other Compiler

Description: Steps:

[QC Short Description] Generate XML Documentation. F2084 Internal Error: AV221BDF22-R00000000-0 [QC Description] If we are trying to create documentation for inherited property, the compiler gives this error F2084 Internal Error: AV221BDF22-R00000000-0 (address can be different). After that, even if you remove the problematic comment, the error remains. Need to restart IDE. The same thing happens, and Delphi 2009-2010. Others not tested. The same error is obtained using the compiler command line (dcc32)QC Entry 92737

1. Create a simple project. 2. Includes an option to Generate XML Documentation 3. Add a comment. 4. Compile 5. If we remove the symbols (* and *) in any line, when compiling an error. unit Unit1; interface uses Windows, Controls; type {$REGION 'A description of the class'} /// <summary>Adescription ofthe class</summary> {$ENDREGION} TSpeedButtonCep = class(TGraphicControl) private FMyProperty: integer; procedure SetMyProperty(const Value: integer); published {$REGION 'Description for some of my properties'} /// <summary>Description for some of my properties</summary> /// <seealso cref="Windows.SelectObject">This link is working properly</seealso> /// <seealso cref="SelectObject">This link is working properly</seealso> (* /// <seealso cref="Unit1.TSpeedButtonCep.Color">But the link leads to an error [DCC Fatal Error] Unit1.pas (40): F2084 Internal Error: AV221BDF22-R00000000-0</seealso>*) (* /// <seealso cref="TSpeedButtonCep.Color">But the link leads to an error [DCC Fatal Error] Unit1.pas (40): F2084 Internal Error: AV221BDF22-R00000000-0</seealso>*) (* /// <seealso cref="Color">But the link leads to an error [DCC Fatal Error] Unit1.pas (40): F2084 Internal Error: AV221BDF22-R00000000-0</seealso>*) {$ENDREGION} property MyProperty: integer read FMyProperty write SetMyProperty; {$REGION 'Description for some inherited properties'} /// <summary>Description for some inherited properties</summary> /// <seealso cref="MyProperty">This link is working properly</seealso> {$ENDREGION} property Color; end; implementation { TSpeedButtonCep } procedure TSpeedButtonCep.SetMyProperty(const Value: integer); begin FMyProperty := Value; end; end.

QC #: Date Reported: Area:75462 7/2/2009 Compiler\Delphi\Execution

Description: Steps:[QC Short Description] F2048 Internal Error: URW1104 [QC Description] REGRESSION FROM D2007 Involving an inlined function into record can cause Internal URW1104 during a project build. QC Entry 75462

Compile the attached application below with the following command-line. dcc32 -b BTS270692 See the following compiler output indicating failure. WrSymRef sym has no index: s003FE228 t003FE250 TEvent Allocated in unit 003FD0F0 uBTS270692a Writing unit 003FC0F0 uBTS270692b uBTS270692b.pas(20) Fatal: F2084 Internal Error: URW1104 If the inline modifier is removed from the line marked #1 in uBTS270692, the program builds without error. unit uBTS270692a; interface type TEvent = record strict private function GetID: integer; inline; //#1// public property ID: integer read GetID; end; PEvent = ^TEvent; implementation { TEvent } function TEvent.GetID: integer; begin end; end. unit uBTS270692b;

interface implementation uses uBTS270692a; procedure X; var p: PEvent; i: integer; begin if p.ID <> i then end; end. // <-- F2048 Internal Error: URW1104 program BTS270692; { F2048 Internal Error: URW1104 } {$APPTYPE CONSOLE} uses uBTS270692a, uBTS270692b; begin WriteLn('PASS'); { PASS on compile } end.

QC #: Date Reported: Area:77913 9/22/2009 Compiler\Delphi\Execution

Description: Steps:[QC Short Description] F2084 Internal Error: AV0045D1BE-R00000014-0 with a class destructor with parenthesis. [QC Description] Using parenthesis in the class destructor implementation leads to an internal error. ("...Destroy;" -> does work, but "...Destroy();" -> AV) -> see steps Original descriptions: F2084 Internal Error: AV03CD372A-R00000014-0 when using class constructor and destructor Try to compile attached project. QC Entry 77913

Steps by USc: - save the following file as Test_22092009Simplified.dpr - dcc32 Test_22092009Simplified.dpr expected: it compiles actual: Test_22092009Simplified.dpr(11) Fatal: F2084 Internal Error: AV0045D1BE-R00000014-0 - remove the parenthesis pair after "...Destroy" in line 11 - compile again and see it does compile program Test_22092009Simplified; {$APPTYPE CONSOLE} type TEventArgs = class(TObject) public class destructor Destroy(); end; class destructor TEventArgs.Destroy(); begin end; begin Writeln('PASS'); end.

QC #: Date Reported: Area:89789 11/18/2010 Compiler\Delphi\Execution

Description: Steps:

[QC Short Description] Internal Error T987 [QC Description] Open array parameters can generate internal error T987. The bug seems to occur only if sizeof(TWrapper) > SizeOf(Pointer), as the following modification make the code compile : - changing the record to a class - changing a : int64 into a : integer QC Entry 89789

program BTS281235; { Open array parameters can generate internal error T987. The bug seems to occur only if sizeof(TWrapper) > SizeOf(Pointer), as the following modification make the code compile : - changing the record to a class - changing a : int64 into a : integer ... } {$APPTYPE CONSOLE} uses types; type TWrapper = record a : int64; function items : TCardinalDynArray; end; function TWrapper.items: TCardinalDynArray; begin end; function f : TWrapper; begin end; procedure Simple (const AList : array of cardinal); begin end; procedure InternalError; begin Simple(f.items); end; begin WriteLn('PASS'); // PASS on compile // end.

QC #: Date Reported: Area:93806 5/12/2011 Compiler\Delphi\Execution

Description: Steps:[QC Short Description] Compiler hangs on code with inlined function call in try..finally [QC Description] Compiler hangs on code with a combination of try..finally, an inlined function call and try..except constructs. See the attached project. QC Entry 93806

Try to compile the attached project. See that both the IDE and the command line compiler hang.

QC #: Date Reported: Area:86567 7/24/2010 Compiler\Delphi\Packages

Description: Steps:[QC Short Description] Initialization sections not running for some units upon package loading when moved between packages. [QC Description] When a package is loaded, it's supposed to run the initialization for each unit. This isn't happening. QC Entry 86567

Install JCL and JVCL component libraries. You may encounter an error with the JCL install while checking HPP headers. If so, disable the HPP file options in the JEDI install. For Fulcrum, the JEDI team had the following svn project, though with the release the normal download may apply now. http://svn.obones.com:443/fulcrum/trunk/ For read access only use this account: Login = Fu1crum Password = Cr055X Unzip the contents of the attached ZIP file to c:\turbu

Launch the IDE. Install the following component packages into the IDE. C:\TURBU\components\PascalScript\PascalScript_Core_D12.dpk C:\TURBU\components\TURBU\sdlframe.dpk C:\TURBU\components\TURBU\turbu_components.dpk Close All files. Load the project group file, "c:\turbu\turbu\turbu.groupproj" into the IDE. In the package, map_default_design.bpl, bring up these source files and set breakpoints in their initialization sections. C:\TURBU\turbu\turbu format\design\EB Editors\Messages\MessageEdit.pas C:\TURBU\turbu\turbu format\design\EB Editors\Messages\MessageOptions.pas C:\TURBU\turbu\turbu format\design\EB Editors\Messages\PortraitEdit.pas Have the project, "turbu.exe", be the current project in the Project Manager, compile and run. See that each breakpoint is encountered as expected. The program will produce an exception at runtime, namely "Project Turbu.exe raised exception class EBadHandle with message 'glTexImage2d(): GLINVALID_ENUM" To see the problem. Remove MessageEdit.pas from the project for "map_default_design.bpl" via the Project Manager. Add "C:\TURBU\turbu\turbu format\design\EB Editors\Messages\MessageEdit.pas" to the project for "default_format_design.bpl" Recompile the project, "turbu.exe", and run. See that the breakpoints for "MessageOptions.pas" and "PortraitEdit.pas" are encountered as expected but not that of "MessageEdit.pas" as occurred when it was part of "map_default_design.bpl". Launch the Modules View and see that "map_default_design.bpl" is present.

QC #: Date Reported: Area:44634 4/18/2007 Compiler\Delphi\Finalization

Description: Steps:[QC Short Description] Compiler finalizes record incorrectly [QC Description] When you have (a) a record that contains an interface reference and one or more methods, (b) a function that returns that record, and (c) code that chains a call to that function with a call to a method on the record (e.g. MyFunction.DoSomething), the compiler incorrectly finalizes the interface refcount too many times, causing the interfaced object to be freed even though there's still a live reference to it. This results in heap problems and sporadic

Save the attachments (or see below for detailed steps). Open and run the project. Expected: should run without errors and show "Press ENTER". Actual: pops up a FastMM error dialog showing that an interface was used after it was freed (see attached screenshot). -------- To repro the problem from scratch: 1. Create a new Win32 console app. Save it somewhere. 2. Download the FastMM4 distribution from http://fastmm.sourceforge.net/. Copy the following files from the FastMM zip into the same directory as your project file: - FastMM4.pas - FastMM4Messages.pas - FastMM4Options.inc - FullDebugMode DLL\Precompiled\FastMM_FullDebugMode.dll 3. Make the following changes to FastMM4Options.inc: - Define FullDebugMode. (remove the "." before the "$define") - Define CatchUseOfFreedInterfaces. (remove the "." before the "$define") 4. Add the below code to your project file. 5. Save all, compile, and run. -------- program Project2; {$APPTYPE CONSOLE} uses FastMM4,

(though sometimes reproducible) AVs. However, the problem can be verified easily using the FastMM4 memory manager in full debug mode. See Steps. The problem line is marked "<--- compiler incorrectly releases refcount too many times"; if this line is omitted, or the statement is broken into two statements by using a temporary variable, the problem does not occur. QC Entry 44634

SysUtils; type TRecord = record public Value: IInterface; procedure Foo; end; TTester = class strict private FFoo: TRecord; function Value: TRecord; public procedure Test; end; { TRecord } procedure TRecord.Foo; begin end; { TTester } procedure TTester.Test; begin FFoo.Value := TInterfacedObject.Create; Value.Foo; // <--- compiler incorrectly releases refcount too many times FFoo.Value := nil; // <--- error: use of already-freed interface end; function TTester.Value: TRecord; begin Result := FFoo; end; var Tester: TTester; begin Tester := TTester.Create; try try Tester.Test; except on E: Exception do WriteLn(E.ClassName + ': ' + E.Message); end; finally FreeAndNil(Tester); end; WriteLn('Press ENTER:'); ReadLn; end.

QC #: Date Reported: Area:90864 1/13/2011 Compiler\Delphi\Interaction with UI

Description: Steps:[QC Short Description] Delphi IDE deadlock during background compiler operation [QC Description] From time to time the Delphi XE Update 1 IDE appears to deadlock with a background compiler operation. The only way I have found to break the deadlock is to delete all DCU files in the project folders. The last time such a deadlock occurred I inspected the BDS.EXE process using Process Monitor: It seems the background compiler gets stuck in a loop opening dcu files associated with the project. Since it looks in the wrong folders most of the time, most of these file open calls fail. However, even after successfully opening a dcu file in the correct folder it does not exit the loop, instead restarting the search from the beginning. I am fairly confident that this is a new problem in XE Update 1, since I do not recall ever experiencing this problem in any prior version. QC Entry 90864

I have not been able to find reproducible steps, but from the recent newsgroup thread in e.p.d.non-technical entitled "Delphi XE hangs with Update 1" it appears that several other users also experience this problem from time to time. new steps... the IMPORTANT thing to NOTE is that the CodeInsight MUST be switched ON to see the problem. 1) Extract the attached archive to the root of the C: drive. 2) Start Delphi XE 3) Copy and paste the library paths in "Delphi XE Library Path.txt" into the library path settings of Delphi XE 4) Open the Project1.dproj in the c:\projects\CIMSO\TestApp1 folder5) Compile it with Ctrl+F9 6) Open the Project1.dproj in the c:\projects\CIMSO\TestApp2 folder7) Compile it with Ctrl+F9 8) Open Unit1.pas (pressing F12 should do the job) and view the source 9) Ctrl+click on PSDForm in the "uses" list to open up PSDForm.pas10) Modify the PSDForm.pas (adding a blank line anywhere will suffice) 11) Select File -> Reopen and select c:\projects\CIMSO\TestApp1\Project1.dproj 12) Delphi will prompt to save PSDForm.pas - Click "yes" 13) Open Unit1.pas and view the source 14) Ctrl+click on PSDForm in the "uses" list to open up PSDForm.pas15) Modify the PSDForm.pas (adding a blank line anywhere will suffice) 16) Select File -> Reopen and select c:\projects\CIMSO\TestApp2\Project1.dproj 17) Delphi will prompt to save PSDForm.pas - Click "yes" The Delphi XE IDE will hang somewhere between steps 13 and 17. If it doesn't happen the first time, repeat steps 13 through 17, alternating between the two test projects. Workaround: Run clean.bat (deleting all dcu files) when it hangs and the IDE will become responsive again. Comment: the dcc150.dll seems to be culprit.

QC #: Date Reported: Area:88031 9/13/2010 Compiler\Delphi\Generics

Description: Steps:[QC Short Description] F2084 Internal Error: URW1136 with nested array of record type with type parameter [QC Description] An nested array of record type with type parameter leads to F2084 Internal Error: URW1136. This is regression from D2009 that happened already in D2010 RTM.

- save the following program and unit - dcc32 -B GenericRecordURW.dpr expected: it compiles actual: GenericRecordURWUnit.pas(19) Fatal: F2084 Internal Error: URW1136 //--- GenericRecordURW.dpr --- program GenericRecordURW; {$APPTYPE CONSOLE} uses GenericRecordURWUnit in 'GenericRecordURWUnit.pas'; var Foo: TFoo<Integer>; begin WriteLn('PASS'); // on compile end. //--- GenericRecordURWUnit.pas --- unit GenericRecordURWUnit; interface type TFoo<T> = record type TData = array [0..1] of record

-> see steps QC Entry 88031

Value: T; end; var Data: TData; end; implementation end.

QC #: Date Reported: Area:89952 11/25/2010 Compiler\Delphi\Generics

Description: Steps:[QC Short Description] AV accessing TList<TPair<Byte, Byte>> [QC Description] Accessing a TList<TPair<Byte, Byte>> causes an AV. The problem seems to be in the function {code} function TMyList<TKey, TValue>.get_Items(const AIndex: Integer): TPair<TKey, TValue>; begin Result := FList[AIndex]; end; {code} The AV occurs only if TKey and TValue are a Byte or a Word. The same code works with D2010. The issue is a regression from D2010. QC Entry 89952

Compile and run the attached project. Expected: output is PASS Actual: output is FAIL - Exception Error ClassName=EAccessViolation Message=Access violation at address 00410AC7 in module 'PairM.exe'. Write of address 00000303 [bjk] Reduced test case: {$APPTYPE CONSOLE} uses SysUtils; type TPair<TKey,TValue> = record Key: TKey; Value: TValue; end; TObj<TKey, TValue> = class function GetPair(AIndex: Integer): TPair<TKey, TValue>; end; function TObj<TKey, TValue>.GetPair(AIndex: Integer): TPair<TKey, TValue>; begin Result := Default(TPair<TKey,TValue>); end; procedure Reset(a, b, c: Integer); begin end; procedure Go; var x: TObj<Byte,Byte>; begin x := TObj<Byte,Byte>.Create; Reset(0, 0, 0); x.GetPair(0); end; begin Go; end.

QC #: Date Reported: Area:96865 7/29/2011 Compiler\Delphi\Generics

Description: Steps:[QC Short Description] Copy raises AV [QC Description] There are several conditions for this to happen. There must be a generic class with a TArray field (generic parameter of the class can be different from type used in the TArray field). The instance of this class must be global variable or a field inside another class. QC Entry 96865

- save the following files - dcc32 QC96865.dpr - execute QC96865 expected: output is PASS actual: FAIL - Exception Error ClassName=EAccessViolation Message=Access violation at address 00406D90 in module 'QC96865.exe'. Read of address 00110001 //--- QC96865.dpr --- program QC96865; {$APPTYPE CONSOLE} uses SysUtils, QC96865Unit; var Test: TTest; begin try Test := TTest.Create; try if Test.Execute then WriteLn('PASS') else WriteLn('FAIL'); finally Test.Free; end; except on E: Exception do begin Writeln('FAIL - Exception Error'); WriteLn(' ClassName=', E.ClassName); WriteLn(' Message=', E.Message); end; end; end. //---QC96865Unit.pas --- unit QC96865Unit; interface type TList<T> = class private FItems: TArray<Integer>; public constructor Create;

function ToArray: TArray<Integer>; end; TTest = class private FList: TList<Integer>; public function Execute: Boolean; end; implementation constructor TList<T>.Create; begin SetLength(FItems, 1); end; function TList<T>.ToArray: TArray<Integer>; begin Result := Copy(FItems, 0, Length(FItems)); end; function TTest.Execute: Boolean; begin FList := TList<Integer>.Create; try Result := Length(FList.ToArray) = 1; finally FList.Free; end; end; end.

QC #: Date Reported: Area:90016 11/29/2010 Compiler\Delphi\Generics

Description: Steps:[QC Short Description] Delphi XE Generics AccessViolation on Free, [QC Description] Receive Access Violation when trying to Free Generic class object with redefined constructor. Sample test case in steps. QC Entry 90016

program DLG20101129; {$APPTYPE CONSOLE} uses SysUtils; //---> Generics.Collections simplified type TCollectionNotifyEvent<T> = procedure of object; TList<T> = class(TObject) private FOnNotify: TCollectionNotifyEvent<T>; end; TObjectList<T: class> = class(TList<T>) private FOwnsObjects: Boolean; end; //<--- Generics.Collections simplified type TDataType = ( typeOne, typeTwo); TData = class(TObject) end; TDataTwo = class(TData) end; TDataList<T: TData> = class(TObjectList<T>) private FDataType: TDataType; public constructor Create(ADataType: TDataType); end; TDataListTwo = class(TDataList<TData>) public constructor Create; end; { TDataList<T> } constructor TDataList<T>.Create(ADataType: TDataType); begin inherited Create; FDataType := ADataType; end; { TDataListTwo } constructor TDataListTwo.Create; begin inherited Create(typeTwo); end; var FData: TDataListTwo; begin try FData := TDataListTwo.Create; // Any code here FData.Free; WriteLn('PASS'); except on E: Exception do begin Writeln('FAIL - Exception Error'); WriteLn(' ClassName=', E.ClassName); WriteLn(' Message=', E.Message); end; end; end.

QC #: Date Reported: Area:82944 3/12/2010 Compiler\Delphi\Generics

Description: Steps:[QC Short Description] No compiler Error although there is a syntax-Error in the Code [QC Description] If you are using a generic-Base-Type you can write code that has a wrong syntax but the compiler compiles withtout an error. QC Entry 82944

Compile the attached application below. See that it compiles without expected errors as the parameters and result types in the type declaration of TGenericBaseType do not match those given where they are implemented. program BTS275476; { No compiler Error although there is a syntax-Error in the Code } {$APPTYPE CONSOLE} type TEnumerable<T> = class(TObject); TGenericBaseType<T> = class public function GetSomeStuffWrongTypeParameter: TEnumerable<TGuid>;function GetSomeStuffWrongResultType: TEnumerable<TGuid>; end; function TGenericBaseType<T>.GetSomeStuffWrongTypeParameter:TEnumerable<TObject>; begin Result := nil; end; function TGenericBaseType<T>.GetSomeStuffWrongResultType: TGenericBaseType<TGuid>; begin Result := nil; end; begin WriteLn('FAIL - Compile-time expected'); end.

QC #: Date Reported: Area:85968 7/5/2010 Compiler\Delphi\Generics

Description: Steps:[QC Short Description] Implicit operator won't compile if generic has constraint [QC Description] Test code in 'Steps' Code causes compilation to fail with [DCC Error] Project1.dpr(12): E2522 Operator 'Implicit' can not convert to/from ancestor type Changing to unconstrained declaration // TGenRec<T> = record allows compilation but is not type safe QC Entry 85968 [FT]

program Project1; {$APPTYPE CONSOLE} uses SysUtils; type // TGenRec<T> = record TGenRec<T : record> = record InternalValue : T; class operator Implicit(value: T): TGenRec<T>; class operator Implicit(value: TGenRec<T>): T; end; { TGenRec<T> } class operator TGenRec<T>.Implicit(value: T): TGenRec<T>; begin Result.InternalValue := value; end; class operator TGenRec<T>.Implicit(value: TGenRec<T>): T; begin Result := value.InternalValue; end; var foo : TGenRec<Integer>; bar : integer; begin bar := 42; foo := bar; assert(foo.InternalValue = bar); end.

QC #: Date Reported: Area:88267 9/21/2010 Compiler\Delphi\Generics

Description: Steps:[QC Short Description] Generics Memory Problem [QC Description] In the attached sample app setting a boolean in a class causes a memory corruption for an unrelated variable. It appears the compiler is incorrectly mapping the variables in memory. QC Entry 88267

Compile the attached project in Embarcadero? Delphi? XE Version 15.0.3890.34076 Click the button If a dialog is shown then there is an error. I could not attach the files so here is the main code. TOnChanged = procedure() of object; TOnChangedList = class(TList<TOnChanged>); // Generic object list that had register changes TNotifiedObjectList<T: class> = class(TObjectList<T>) protected m_OnChanged : TOnChangedList; public constructor Create(); virtual; destructor Destroy; override; end; // Generic object list that had register changes TNotifiedObject = class(TObject) protected m_OnChanged : TOnChangedList; public constructor Create(); virtual; destructor Destroy; override; end; TProvider = class(TNotifiedObject); TProviders = class(TNotifiedObjectList<TProvider>) private m_bInitialised : Boolean; public procedure Initialise(); end; procedure TForm5.Button1Click(Sender: TObject); begin m_Providers := TProviders.Create(); m_Providers.Initialise; end; procedure TProviders.Initialise;

begin if assigned(m_OnChanged) then showmessage('Not Nil'); m_bInitialised := True; // ERROR HERE - THIS LINE CAUSE m_OnChanged variable to be changed if assigned(m_OnChanged) then showmessage('m_OnChanged Not Nil after setting unrelated boolean'); end;

QC #: Date Reported: Area:90767 1/9/2011 Compiler\Delphi\Generics

Description: Steps:[QC Short Description] Regression: E2010 with multiple default properties in a generic type [QC Description] Using multiple default properties in a generic type fails with E2010 when not using the first specified property. This is regression from D2009 that happened already in D2010 RTM. -> see steps QC Entry 90767

- save the following program or the attachment - dcc32 GenericsMultipleDefaultPropertiesTest.dpr expected: it compiles actual: GenericsMultipleDefaultPropertiesTest.dpr(47) Error: E2010 Incompatible types: 'Integer' and 'string' GenericsMultipleDefaultPropertiesTest.dpr(48) Error: E2010 Incompatible types: 'Integer' and 'string' When changing the order of the Value properties to this property Value[const AName: string]: T read GetNamedValue write SetNamedValue; default; property Value[AIndex: Integer]: T read GetValue write SetValue; default; then only one error is raised for line 48 ("if A[0] = A['123'] then;") When turning the generic type into a classic type then it compiles. program GenericsMultipleDefaultPropertiesTest; {$APPTYPE CONSOLE} type TAssocArray<T> = record private function GetNamedValue(const AName: string): T; function GetValue(AIndex: Integer): T; procedure SetNamedValue(const AName: string; const AValue: T); procedure SetValue(AIndex: Integer; const AValue: T); public property Value[AIndex: Integer]: T read GetValue write SetValue; default; property Value[const AName: string]: T read GetNamedValue write SetNamedValue; default; end; { TAssocArray<T> } function TAssocArray<T>.GetNamedValue(const AName: string): T; begin Result := Default(T); end; function TAssocArray<T>.GetValue(AIndex: Integer): T; begin Result := Default(T); end; procedure TAssocArray<T>.SetNamedValue(const AName: string; const AValue: T); begin // end; procedure TAssocArray<T>.SetValue(AIndex: Integer; const AValue: T); begin // end; type TStringAssocArray = TAssocArray<string>; procedure Test; var A: TStringAssocArray; begin A['123'] := 'abc'; if A[0] = A['123'] then; end; begin WriteLn('PASS'); // on compile end.

QC #: Date Reported: Area:91714 2/23/2011 Compiler\Delphi\Generics

Description: Steps:[QC Short Description] Regression: Delphi2010 shows error URW1111 and DelphiXE freezes [QC Description] USc: This is REGRESSION from Delphi XE RTM. (Test case compiles with D2009, D2010 and DXE RTM) The IDE freezes when two units reference each other, and you try to compile. See also QC-Report: 78295 That issue where fixed, but this is slightly different. If you try to compile the project with Delphi2010 it brings the internal error URW1111. In DelphiXE the whole IDE freezes. QC Entry 91714

By USc: - save the attachment - dcc32 GenericTest.dpr (or "dcc32 unit1.pas" with the code from the steps) expected: it compiles actual: compilation "never" finishs Repeats also with this simplified version of Generics.Collections. Removing the Foo method makes it compile. unit Generics.Collections; interface type TList<T> = class(TObject) procedure Foo; end; implementation procedure TList<T>.Foo; begin end; end. Original Steps: There are two units: ////unit1//// unit unit1; interface uses Generics.Collections; type TGenericClass<T> = class public function DoSomething:TList<TObject>; end; implementation uses unit2; { TGenericClass<T> } function TGenericClass<T>.DoSomething: TList<TObject>; begin result := nil; end; end. ////unit2//// unit unit2; interface uses unit1, Generics.Collections; type TProblem = class(TGenericClass<TObject>) end; implementation end.

QC #: Date Reported: Area:93281 4/21/2011 Compiler\Delphi\Generics

Description: Steps:

[QC Short Description] Internal error using two TDelegatedComparer [QC Description] Declaring two TDelegatedComparer gives an interlan error AV0BD09392-R0000000C-0 QC Entry 93281

Compile this and you have a AV0BD09392-R0000000C-0 internal error program TDelegatedComparerCrash; {$APPTYPE CONSOLE} uses Generics.Defaults, SysUtils; function _comparefunc(const Left, Right: STRING): Integer; begin Result := 1; end; var LComparer: IComparer<STRING>; begin try IF 1=1 THEN BEGIN LComparer := TDelegatedComparer<STRING>.Create( _comparefunc); END ELSE BEGIN LComparer := TDelegatedComparer<STRING>.Create( _comparefunc); END; { TODO -oUser -cConsole Main : Insérer du code ici } except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; end.

QC #: Date Reported: Area:71097 2/3/2009 Compiler\Delphi\Generics

Description: Steps:[QC Short Description] TDictionary<> is too slow on adding [QC Description] Adding 1000 elements in a Int/Int dictionary take TOO MUCH time. It's very slow. Consider rewriting it completely. The implementation is quite hacky and is bound to be slow. QC Entry 71097

Simple test: procedure TForm3.FormCreate(Sender: TObject); var M: TDictionary<Integer, Integer>; I: Integer; begin M := TDictionary<Integer, Integer>.Create(); for I := 0 to 1000 do M.Add(I, I); end;

QC #: Date Reported: Area:

90191 12/8/2010 Compiler\Delphi\Anonymous Methods

Description: Steps:[QC Short Description] Capturing array of const (TVarRec) gets corrupted [QC Description] Hi, When capturing a array of const argument with a anonymous procedure, that argument is corrupt later when the anonymous function is called. See attached sample project. I notice that if I change the argument to a const Args: array of const, the compiler complains that it can not capture Args. I think this may be true also for the case where Args is not marked as const, but then the compiler doesn't complain at all. QC Entry 90191

Compile and run the attached application below. See the following program output indicating failure. FAIL #1 I=0 Args[I].VType=40 vtInteger=0 vtUnicodeString=17 FAIL program BTS281397; { Capturing array of const (TVarRec) gets corrupted when involved with an anonymous method } {$APPTYPE CONSOLE} uses SysUtils, Math; var Expected: Integer = 0; Counter: Integer = 0; procedure CallMyProc(Proc: TProc); begin Proc; end; procedure MakeCall(Fmt: String; Args: array of const); begin CallMyProc( procedure var I: Integer; begin Expected := High(Args) + 1; for I := 0 to High(Args) do if not InRange(Args[I].VType, vtInteger, vtUnicodeString) then

begin WriteLn('FAIL #1'); WriteLn(' I=', I); WriteLn(' Args[I].VType=', Args[I].VType); WriteLn(' vtInteger=', vtInteger); WriteLn(' vtUnicodeString=', vtUnicodeString); end else Inc(Counter); end); end; procedure DoTest; var Obj: TObject; S: String; begin Obj := TObject.Create; try S := Obj.ToString; MakeCall('%s: test %s', [S, 'Value2']); finally Obj.Free; end; end; begin try Dotest; if Expected = Counter then WriteLn('PASS') else WriteLn('FAIL'); except on E: TObject do WriteLn('FAIL - Exception=', E.ClassName); end; end. I've seen a few different errors, it all depends on where the instruction pointer ends up after this call: SysUtils.pas:10751 JMP @CvtVector.Pointer[EDX*4] Where EDX is initialized a few lines earlier: 10743: MOVZX EDX,[ESI].Byte[4] // TVarRec.VType So, a bad TVarRec will cause a arbitrary jump when passed to the Format function (or more specifically, to WideFormatBuf).

QC #: Date Reported: Area:93646 5/6/2011 Compiler\Delphi\RTTI

Description: Steps:[QC Short Description] TRttiMethod fails to invoke method with large record parameter [QC Description] When using the Rtti unit to call a method, the method call will fail (with access violation in most cases) if the method has a large (>4 byte) record parameter, the parameter is a const parameter, and the calling convention is stdcall. QC Entry 93646

See the attachment for more details. ----------- ... type ... TLargeRecord = record A: Cardinal; B: Cardinal; end; IMyInterface = interface(IInvokable) ['{75551820-50D2-46D0-A6A9-AED63940664B}'] procedure TestSmall(const Value: TSmallRecord); stdcall; procedure TestMedium(const Value: TMediumRecord); stdcall; procedure TestLarge(const Value: TLargeRecord); stdcall; end; TMyImplementation = class(TInterfacedObject, IMyInterface) public procedure TestSmall(const Value: TSmallRecord); stdcall; procedure TestMedium(const Value: TMediumRecord); stdcall; procedure TestLarge(const Value: TLargeRecord); stdcall; end; procedure TMyImplementation.TestLarge(const Value: TLargeRecord); begin WriteLn(Format('Large(%d, %d)', [Value.A, Value.B])); end; procedure TMyImplementation.TestMedium(const Value: TMediumRecord); begin WriteLn(Format('Medium(%d, %d)', [Value.A, Value.B])); end; procedure TMyImplementation.TestSmall(const Value: TSmallRecord); begin

WriteLn(Format('Small(%d, %d)', [Value.A, Value.B])); end; procedure TryRtti; var Obj: IMyInterface; Ctx: TRttiContext; Intf: TRttiInterfaceType; Meth: TRttiMethod; S: TSmallRecord; M: TMediumRecord; L: TLargeRecord; begin Obj := TMyImplementation.Create; Ctx := TRttiContext.Create; try Intf := Ctx.GetType(TypeInfo(IMyInterface)) as TRttiInterfaceType; ... ... // large L.A := 1; L.B := 2; Obj.TestLarge(L); Intf.GetMethod('TestLarge').Invoke(TValue.From<IMyInterface>(Obj), [TValue.From<TLargeRecord>(L)]); finally Ctx.Free; end; ... -----------

QC #: Date Reported: Area:84627 5/15/2010 Compiler\Delphi\RTTI

Description: Steps:[QC Short Description] TRttiRecordType should override GetDeclaredFields and not GetFields [QC Description] TRttiType.GetDeclaredFields() is meant to return all fields which are explicitly declared (i.e.: not inherited) for the type in question, whereas TRttiType.GetFields() merely collects and concatenates all ancestor fields. However, for some reason TRttiRecordType overloads GetFields() and not GetDeclaredFields(), which implies that you won't see the record fields if you call GetDeclaredFields(). The fix is trivial: rename TRttiRecordType.GetFields() to TRttiRecordType.GetDeclaredFields(). QC Entry 84627

- Compile and run this code (dcc32 qc84627.pas): // ----- program qc84627; {$APPTYPE CONSOLE} uses Rtti; type TMyClass = class FMyField: String; end; TMyRecord = record FMyField: String; end; procedure PrintFields (AType: TRttiType); var Field: TRttiField; begin Writeln (AType.Name + ' declared fields:'); for Field in AType.GetDeclaredFields do Writeln (' ' + Field.ToString); end; var Context: TRttiContext; begin PrintFields (Context.GetType (TMyClass)); PrintFields (Context.GetType (TypeInfo (TMyRecord))); end. // ----- Expected printout: TMyClass fields: FMyField: string @ 04 TMyRecord fields: FMyField: string @ 00 Actual printout: Expected printout: TMyClass fields: FMyField: string @ 04 TMyRecord fields:

QC #: Date Reported: Area:90337 12/15/2010 Compiler\Delphi\RTTI

Description: Steps:[QC Short Description] TValue.AsVariant fails if contains interface as value [QC Description] When TValue contains an interface value, AsVariant will raise EInvalidCast exception instead of returning a variant with VarType = varUnknown. QC Entry 90337

var I: IInterface; Val: TValue; V: Variant; begin I := TInterfacedObject.Create; Val := TValue.From<IInterface>(I); V := Val.AsVariant; // exception here end;

QC #: Date Reported: Area:

85704 7/23/2010 2:53:59 PM Compiler\Delphi\RTTI\Custom attributes

Description: Steps:[QC Short Description] Attributes and TGUID [QC Description] When defining a attribute which takes a TGUID as an constructor Parameter its impossible to use it with an interface. QC Entry 85704

Declare the following types. When compiling you will get a internal error TI2531 program QC85704; { When defining a attribute which takes a TGUID as an constructor Parameter its impossible to use it with an interface. RAID 277635 } type IMyInterface = interface ['{EED5046C-AD96-41D7-AD3C-4C9E901681D1}'] end; MyAttr = class(TCustomAttribute) public constructor Create(aGUID: TGUID); end; [MyAttr(IMyInterface)]

MyObj = class end; begin WriteLn('PASS'); //PASS on compile// end. AMP: The initial report is RAID 277635. It cannot be reproduced anymore ( see build 15.0.3855.32878).

QC #: Date Reported: Area:89515 11/8/2010 RTL

Description: Steps:[QC Short Description] UnicodeToUTF8 not Null Terminating [QC Description] Ref: case 87709 and 89402 UnicodeToUTF8 is still not null terminating the output in build 15.0.3890.34076 as stated in case 87709. QC Entry 89515 Added by Sysop <<<<<<<<<<<< According to documentation, [System.UnicodeToUtf8] http://docwiki.embarcadero.com/VCL/en/System.UnicodeToUtf8 says ------- Call UnicodeToUtf8 to convert a Unicode string to a null-terminated sequence of UTF-8 characters. ... Dest receives the resulting null-terminated array of UTF-8 characters. ------- >>>>>>>>>>>>

===== This case was previously lodged as number 89402 and closed without a resolution. While the comments about nulls in memo controls was valid, the use of the memo control shows that there are no nulls! That's the point. Please see the attachements to this case for screen snapshots that show the problem clearly Thanks ===== The following code when run in Delphi 2010 will show that the final value of 's' has the null terminator. When run in Delphi XE version 15.0.3890.34076 there is no null termination. procedure TfrmMain.pbGoClick(Sender: TObject); const SOME_STRINGS : array [0..9] of string = ('String 1', 'String 2', 'String 3 is longer than string 2', 'String 4 is even longer than string 3', 'String 5 is shorter that 4', 'Str 6', 'String 7', 'String 8 is a bit longer', 'String 9 is the longest string of all of these', 'String 10'); MAX_DEST_BYTES = 1024; var StrIdx : integer; i : integer; AChars : array [0..MAX_DEST_BYTES - 1] of AnsiChar; UChars : array [0..MAX_DEST_BYTES - 1] of Char; SrcChCnt : cardinal; CallChCnt : cardinal; s : string; begin mmLog.Clear; FillMemory (@AChars, MAX_DEST_BYTES, Ord ('X')); for StrIdx := low (SOME_STRINGS) to high (SOME_STRINGS) do begin s := SOME_STRINGS [StrIdx]; StrPCopy (@UChars, s); CallChCnt := UnicodeToUtf8 (@AChars, MAX_DEST_BYTES, @UChars, Length (s)); for i := 0 to Length (s) + 4 do s := Format ('%s %s:%.2x', [s, AChars [i], integer (byte (AChars [i]))]); mmLog.Lines.Add (s); end; end;

QC #: Date Reported: Area:54801 11/13/2007 RTL

Description: Steps:[QC Short Description] Variant conversion failure for published property [QC Description] Delphi still cannot do variant conversions to or from a WordArray published property on a class that uses getter/setter methods. QC Entry 54801

Compile and run the attached program below. See the following program output indicating failure. FAIL #1 Exception-EVariantTypeCastError: Invalid variant type conversion FAIL #2 Exception-EVariantTypeCastError: Invalid variant type conversion (JJS): In .NET, the following compile time errors are seen. Error: E2010 Incompatible types: 'TBytes' and 'WordArray' Error: E2010 Incompatible types: 'TBytes' and 'WordArray' Error: E2010 Incompatible types: 'WordArray' and 'TBytes' program bts256694; {$APPTYPE CONSOLE} uses SysUtils; type WordArray = array of Word; TWordClass = class protected FArray: WordArray; function GetArray: WordArray;

procedure SetArray(const Value: WordArray); published property ArrayValue: WordArray read GetArray write SetArray; end; { TWordClass } function TWordClass.GetArray: WordArray; begin result := FArray end; procedure TWordClass.SetArray(const Value: WordArray); begin FArray := Value end; var v: variant; w: TWordClass; i: integer; Counter: Integer = 0; const ct = 5; begin w := TWordClass.Create; try SetLength(w.FArray, ct); for i := 0 to ct - 1 do w.FArray[i] := i; v := w.ArrayValue; Inc(Counter); except on E:Exception do Writeln('FAIL #1 Exception-', E.Classname, ': ', E.Message); end; try v := w.FArray; w.ArrayValue := v; Inc(Counter); except on E: Exception do Writeln('FAIL #2 Exception-', E.Classname, ': ', E.Message); end; if Counter = 2 then WriteLn('PASS'); w.Free; end.

QC #: Date Reported: Area:93744 5/10/2011 RTL\Delphi

Description: Steps:[QC Short Description] TComparer<Pointer>.Default gives bad result [QC Description] TComparer<Pointer>.Default uses signed integer comparison instead of unsigned. Thus, for example, TComparer<Pointer>.Default.Compare(nil, Pointer($FFFFFFFF)) returns 1 instead of -1. QC Entry 93744

program BTS283080; {$APPTYPE CONSOLE} uses SysUtils, Generics.Defaults; var C : Integer; begin try C := TComparer<Pointer>.Default.Compare(nil, Pointer($FFFFFFFF)); if(-1 = C) then writeln('PASS') else writeln('FAIL'); except

on E: Exception do writeln('FAIL -', E.ClassName, ' ', E.Message); end; end.

QC #: Date Reported: Area:63854 6/28/2008 RTL\Delphi

Description: Steps:[QC Short Description] TList<T>: "RemoveAt" method should be named "Delete" [QC Description] On TList<T>, the "RemoveAt" method should be named "Delete" for consistency with existing list classes (TList, TInterfaceList, TCollection, etc.). QC Entry 63854

var A: TList; B: TInterfaceList; C: TCollection; D: TList<Pointer>; begin A.Delete(0); B.Delete(0); C.Delete(0); D.RemoveAt(0); // why? end;

QC #: Date Reported: Area:87092 8/10/2010 RTL\Delphi

Description: Steps:(JJS: Reopened with Update 1) [QC Short Description] Invalid summaries are calculated based on FMTBCD values [QC Description] Summing up elements of an array containing FMTBCD values produces different results when enumerating the array from the beginning to the end and vice versa. note: This bug can be reproduced in all IDEs starting from RAD 2007, but cannot be reproduced in Delphi 7. Our customers consider this bug critical when using FMTBCD fields for summary calculations. Please fix it. QC Entry 87092

Using the attached program below and the attached data file. program FMTBCD_InvalidCalculations; {$APPTYPE CONSOLE} uses Classes, Variants, fmtBCD, SysUtils; procedure DoTest; var I, J: Integer; B: TBCD; // Data: array of Variant; Stream: TFileStream; Sum1, Sum2: Variant; L: Integer; Data: Variant; V: Variant; begin Stream := TFileStream.Create('bcd_data.dat', fmOpenRead or fmShareDenyNone); L := Stream.Size div SizeOf(TBCD); WriteLn('#0 L=', L); // SetLength(Data, L); Data := VarArrayCreate([0, L-1], varVariant); for I := 0 to L - 1 do begin Stream.ReadBuffer(B, SizeOf(TBCD)); // VarFMTBcdCreate(Data[I], B); VarFMTBcdCreate(V, B); Data[I] := V; end; Stream.Free; // calculate summaries of FMTBCD values Sum1 := 0; Sum2 := 0; J := L; //Length(Data); // for I := 0 to Length(Data) - 1 do for I := 0 to L-1 do begin Dec(J);

WriteLn('#1 I=', I, ' J=', J); WriteLn('#2 Sum1=', Sum1, ' Sum2=', Sum2); WriteLn('#3 Data[I]=', Data[I], ' Data[J]=', Data[J]); WriteLn; WriteLn('#4'); Sum1 := Sum1 + Data[I]; WriteLn('#5'); Sum2 := Sum2 + Data[J]; WriteLn('#6'); end; if Sum1 <> Sum2 then raise EVariantError.CreateFmt('Invalid fmtBCD calculations' + ' DirectSum = %s, ReverseSum = %s', [VarToStr(Sum1), VarToStr(Sum2)]); end; begin try DoTest; except on E: TObject do WriteLn('FAIL - Exception=', E.ClassName); end; end.

QC #: Date Reported: Area:90424 12/20/2010 RTL\Delphi

Description: Steps:[QC Short Description] RegOpenKey is a 16 bit compatiblity function and should not be used [QC Description] RegOpenKey is still used in OleAuto.pas even though it is for compatibility with 16-bit versions of Windows only. Please use RegOpenKeyEx instead. QC Entry 90424

Search for RegOpenKey in DataBkr.pas, MConnect.pas, ScktMain.pas, SConnect.pas, ActiveScriptCat.pas, ComObj.pas

QC #: Date Reported: Area:76028 7/23/2009 RTL\Delphi

Description: Steps:[QC Short Description] please export additional zlib functions / structures [QC Description] there are LOTS of projects which require zlib (png, graphicex, indy...)each of them needs to recompile zlib and ends with lot of duplicated code... Simply modify / recompile is not an easy task for everyone, because of c obj linking problem. I suggest to export all potential functions from zlib pas; there is nothing else but simple declarations to put in interface and mark as external in implementation. It was already done for what was necessary in png, why not benefit all other projects? Quick list (in NO WAY complete) - crc32 - internal wrappers: InflateInit/2, DeflateInit/2, ZCompressCheck... - inflateReset, deflateReset, inflateSync, deflateParams - gzheader !! (see steps) - deflateSetHeader - inflateGetHeader See also my gzip extension http://cc.embarcadero.com/Item/23490

Additional info: gz_header = packed record text : integer; //* true if compressed data believed to be text */ time : Cardinal; //* modification time */ xflags : integer; //* extra flags (not used when writing a gzip file) */ os : integer; //* operating system */ extra : PByte; //* pointer to extra field or Z_NULL if none */ extra_len : Cardinal; //* extra field length (valid if extra != Z_NULL) */ extra_max : Cardinal; //* space at extra (only when reading header) */ name : PAnsiChar; //* pointer to zero-terminated file name or Z_NULL */ name_max : Cardinal; //* space at name (only when reading header) */ comment : PAnsiChar; //* pointer to zero-terminated comment or Z_NULL */ comm_max : Cardinal; //* space at comment (only when reading header) */ hcrc : integer; //* true if there was or will be a header crc */ done : integer; //* true when done reading gzip header (not used when writing a gzip file) */ end; function deflateSetHeader(var strm: TZStreamRec; var head: gz_header): integer; external; function inflateGetHeader(var strm: TZStreamRec; var head: gz_header): integer; external;

BTW: is zlib really compiled with PWCHAR?? see inflateInit_ QC Entry 76028 QC #: Date Reported: Area:90419 12/20/2010 RTL\Delphi

Description: Steps:[QC Short Description] RegSetValue in OleAuto.pas is a 16 bit compatibility function [QC Description] RegSetValue is still used in OleAuto.pas even though it is for compatibility with 16-bit versions of Windows only. Please use RegSetValueEx and keep in mind that both functions expect the size of the buffer in bytes according to the Windows SDK. Currently it is called with the number of characters. QC Entry 90419

Take a look at OleAuto.pas: procedure CreateRegKey(const Key, Value: string); begin RegSetValue(HKEY_CLASSES_ROOT, PChar(Key), REG_SZ, PChar(Value), Length(Value)); end;

QC #: Date Reported: Area:91195 1/28/2011 RTL\Delphi

Description: Steps:[QC Short Description] Hiro is not fathom (do not localize) [QC Description] Hiro is not fathom (do not localize). [Definition of fathom] 1 feet = 0.3048 m (International foot) 1 fathom = 6 feet = 1.8288 m [Definition of Hiro] 1 Shaku (Japanese) = 10 / 33 m 1 Hiro (Japanese) = 6 Shaku = 1.818 m QC Entry 91195

EXP: Ja\RTLConsts.pas SFathomsDescription = '????'; // Japanese katakana "fazomu" ACT: Ja\RTLConsts.pas SFathomsDescription = '?'; // <- Kanji 'Hiro'

QC #: Date Reported: Area:82588 3/1/2010 RTL\Delphi

Description: Steps:[QC Short Description] Winsock.pas needs to be updated to Winsock 2.2 [QC Description] The header, Winsock.pas should be updated for the Winsock 2.2 specifications as well as some additional functions that Microsoft has included in their stack. The Winsock.pas file is still based on Winsock 1.1 which is over 16 years old. Winsock 2.2 was introduced in 1996 and was included in Windows NT 4.0, as an optional addon for WIndows 95, and has been included since then. Winsock 2.2 supports some things that were not included in the Winsock 1.1 specification and supports things such as layered service providers (LSP's), namespaces, IPv6 addresses, and various other stuff. The only way that the Winsock 1.1 spefication file header works is that there's a WInsock 1.1 compatability shim, and you are only using the Winsock 1.1 subset of functions. QC Entry 82588

QC #: Date Reported: Area:83172 3/19/2010 RTL\Delphi

Description: Steps:[QC Short Description] Update zlib to version 1.2.4 [QC Description]

http://www.zlib.net/ Current release: zlib 1.2.4, March 14, 2010 QC Entry 83172 Added by Sysop <<<<<<<<<<<<< zlib 1.2.5 has been released. >>>>>>>>>>>>>

QC #: Date Reported: Area:93741 5/10/2011 RTL\Delphi

Description: Steps:[QC Short Description] TComparer<Variant> and TEqualityComparer<Variant> gives bad result [QC Description] TComparer<Variant> and TEqualityComparer<Variant> both use some fundamentally wrong comparison technique: (this was copied from Generics.Defaults) function Compare_Variant(Inst: PSimpleInstance; Left, Right: Pointer): Integer; var l, r: string; begin try l := PVariant(Left)^; r := PVariant(Right)^; Result := Compare_UString(nil, l, r); except Result := BinaryCompare(Left, Right, SizeOf(Variant)); end; end; #1 When Left or Right is Null, first an exception is raised (stopping the debugging of course), then it compares the two values binary, which gives random result (since being Null means VType = varNull, and the rest is to be ignored). #2 When Left and Right are numbers, this comparison gives an alphabetical ordering, which is totally wrong for numbers. #3 When Left or Right contains a variant array, first the result is still random, since the array data is at the location referenced by the VArray field. Please, correct this by calling VarCmp or some other working variant comparison! QC Entry 93741

... uses ... Generics.Defaults, Variants, ...; ... procedure Test; var C: IComparer<Variant>; V1, V2: Variant; C1, C2: Integer; begin C := TComparer<Variant>.Default; V1 := $FFFFFFFF; TVarData(V1).VType := varNull; C1 := C.Compare(V1, Null); C2 := C.Compare(2.1, 100); Assert((C1 = 0) and (C2 < 0)); end;

QC #: Date Reported: Area:88711 10/6/2010 RTL\Delphi\WinAPI

Description: Steps:[QC Short Description] ShLwApi StrFormatByteSize and StrFormatByteSize64 declared wrong [QC Description] StrFormatByteSize maps to the Ansi function and uses a paramater mix of the Ansi and Wide function. ShLwAp.pas: function StrFormatByteSize(dw: DWORD; szBuf: PChar; uiBufSize: UINT): PChar; stdcall;

program TestFormatByteSize; {$APPTYPE CONSOLE} uses SysUtils, ShLwApi; function FormatByteSize(S: Int64): string; var Buf: Array[0..100] of Char; begin FillChar(Buf, SizeOf(Buf), #0); Result := StrFormatByteSize(S, Buf, Length(Buf)); end; var tmp: string; begin try tmp := FormatByteSize(1000); if AnsiSameText(tmp, '1000 bytes') then Writeln('PASS') else Writeln('FAIL; tmp = ', tmp, ' but should be 1000 bytes'); except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; end.

function StrFormatByteSize; external shlwapi32 name 'StrFormatByteSizeA'; should be function StrFormatByteSize(qdw: LONGLONG; szBuf: PWideChar; uiBufSize: UINT): PWideChar; stdcall; function StrFormatByteSize; external shlwapi32 name 'StrFormatByteSizeW'; Please note that the first parameter of the Ansi function needs a DWORD, the first paramter of the Wide function needs a LONGLONG. Also the import of StrFormatByteSize64 looks really weird. The import name with a % does not exist. function StrFormatByteSize64; external shlwapi32 name 'StrFormatByteSize64(%)'; function StrFormatByteSize64A; external shlwapi32 name 'StrFormatByteSize64(%)'; function StrFormatByteSize64W; external shlwapi32 name 'StrFormatByteSize64(%)'; QC Entry 88711 QC #: Date Reported: Area:76638 8/12/2009 RTL\Delphi\WinAPI

Description: Steps:[QC Short Description] Unit WinSvc out of date [QC Description] Newer features such as: Constants SERVICE_CONTROL_PARAMCHANGE SERVICE_CONTROL_NETBINDADD SERVICE_CONTROL_NETBINDREMOVE SERVICE_CONTROL_NETBINDENABLE SERVICE_CONTROL_HARDWAREPROFILECHANGE SERVICE_CONTROL_POWEREVENT SERVICE_CONTROL_SESSIONCHANGE Types SERVICE_STATUS_PROCESS ENUM_SERVICE_STATUS_PROCESS Functions EnumServicesStatusEx RegisterServiceCtrlHandlerEx are simply missing from unit WinSvc. The copyright notice says 1985-1999. 1999 was ten years ago, and it shows. QC Entry 76638

Open WinSvc.pas with your favorite editor.

QC #: Date Reported: Area:89209 10/25/2010 RTL\Delphi\WinAPI

Description: Steps:[QC Short Description] Add SetFilePointerEx declaration [QC Description] It would be nice to have SetFilePointerEx function declared because SetFilePointer is a headache when you're working with >4Gb files. QC Entry 89209

Added by Sysop <<<<<<<<<<< For myself I created following declaration: function SetFilePointerEx(hFile: THandle; liDistanceToMove: Int64; var lpNewFilePointer: Int64; dwMoveMethod: DWORD): Boolean; stdcall; external kernel32 name 'SetFilePointerEx';

>>>>>>>>>>>

QC #: Date Reported: Area:92217 3/11/2011 RTL\Delphi\WinAPI

Description: Steps:[QC Short Description] Wrong record alignment in Delphi headers cause WinAPI functions to fail [QC Description] See wingdi.h file: #ifndef _WINGDI_ #pragma option push -b -a8 -pc -A- -w-pun /*P_O_Push*/ #define _WINGDI_ ... /* Bitmap Header Definition */ typedef struct tagBITMAP { LONG bmType; LONG bmWidth; LONG bmHeight; LONG bmWidthBytes; WORD bmPlanes; WORD bmBitsPixel; LPVOID bmBits; } BITMAP, *PBITMAP, NEAR *NPBITMAP, FAR *LPBITMAP; This means 8 byte alignment for tagBitmap record. See Windows.pas: {$ALIGN ON} // <- same as {$A8} {$MINENUMSIZE 4} ... { Bitmap Header Definition } PBitmap = ^TBitmap; {$EXTERNALSYM tagBITMAP} tagBITMAP = packed record bmType: Longint; bmWidth: Longint; bmHeight: Longint; bmWidthBytes: Longint; bmPlanes: Word; bmBitsPixel: Word; bmBits: Pointer; end; TBitmap = tagBITMAP; {$EXTERNALSYM BITMAP} BITMAP = tagBITMAP; This means 1 byte alignment for TBitmap/tagBitmap because of "packed" specificator. It's wrong. The "packed" should be removed - making alignment of this record to be 8 bytes, as indicated in Windows headers. QC Entry 92217

Run this code: {$O-} procedure Test(const BitmapHandle: HBITMAP; Value: Boolean); var BitmapInfo: Windows.TBitmap; begin if not Value then Exit; FillChar(BitmapInfo, SizeOf(BitmapInfo), 0); if Windows.GetObject(BitmapHandle, SizeOf(BitmapInfo), @BitmapInfo) = 0 then ShowMessage('FAIL'); // ... end; Assuming BitmapHandle is valid handle and Value is True. Expected: this code should run OK. Actual: this code will FAIL. See also attached file. Note: verified to fail on WinXP x32. Code works fine on Win7 x64 because of WOW64 layer.

QC #: Date Reported: Area:94226 5/25/2011 RTL\Delphi\WinAPI

Description: Steps:[QC Short Description] wrong declaration: MessageBoxIndirect [QC Description] i was suggested to report this as a bug

function MsgBox(Title, Text: string; IconType: UInt8; uType: UInt16): UInt8; var MBox: MsgBoxParams; begin with MBox do begin hwndOwner := Application.Handle; lpszCaption := PWideChar(Title); lpszText := PWideChar(Text); dwStyle := MB_USERICON +uType; HInstance := hRes; case IconType of MB_ICONINFORMATION:

https://forums.embarcadero.com/message.jspa?messageID=355938 i tried to create custom messagebox using MessageBoxIndirect function. but i can't get the right return value since delphi declare the return value as bool not integer. so i can only create custom messagebox, but i don't know which button the user press thank you QC Entry 94226

lpszIcon := MakeIntResource('MB_Info'); MB_ICONQUESTION: lpszIcon := MakeIntResource('MB_Question'); MB_ICONWARNING: lpszIcon := MakeIntResource('MB_Warning'); MB_ICONERROR: lpszIcon := MakeIntResource('MB_Error'); else dwStyle := uType; end; end; Result := MessageBoxIndirect(MBox); end; this is my custom msgbox function. i get an error when i compile it. coz return value MessageBoxIndirect (in delphi) declared as bool while it should be integer

QC #: Date Reported: Area:93215 4/19/2011 RTL\Delphi\WinAPI

Description: Steps:[QC Short Description] Wrong definition ICustomDestinationList.AppendCategory [QC Description] shlobj.pas line 7953: function AppendCategory(pszCategory: LPCWSTR; var poa: IObjectArray): HRESULT; stdcall; I think that the definition below: function AppendCategory(pszCategory: LPCWSTR; const poa: IObjectArray): HRESULT; stdcall; QC Entry 93215

Added by Sysop <<<<<<<< Please see attached project to verify this issue. >>>>>>>>

QC #: Date Reported: Area:94846 6/7/2011 RTL\Delphi\WinAPI

Description: Steps:[QC Short Description] DwmSetIconicLivePreviewBitmap not declared correctly [QC Description] The function DwmSetIconicLivePreviewBitmap has a parameter pptClient. MSDN says this is optional, but the pascal translation uses a var parameter. The general rule for optional parameters is to use a pointer instead of var, so a PPoint (pointer to TPoint) would be the more correct translation.QC Entry 94846

Added by Sysop <<<<<< [DwmApi.pas] function DwmSetIconicLivePreviewBitmap(hwnd: HWND; hbmp: HBITMAP; var pptClient: TPoint; dwSITFlags: DWORD): HResult; stdcall; >>>>>>

QC #: Date Reported: Area:21043 11/5/2005 RTL\Delphi\WinAPI

Description: Steps:[QC Short Description] Convert shlwapi.h to pascal [QC Description] The include file shlwapi.h is not translated to pascal. It contains many functions to access file systems, internet, registry and more... QC Entry 21043

QC #: Date Reported: Area:54503 11/7/2007 RTL\Delphi\WinAPI

Description: Steps:[QC Short Description] SHLGUID.h translation MIA [QC Description] I needed these two in my latest project: SID_STopLevelBrowser: TGUID = '{4C96BE40-915C-11CF-99D3-00AA004AE837}'; SID_SWebBrowserApp: TGUID = '{0002DF05-0000-0000-C000-000000000046}';

I had to add them manually because noone has bothered converting SHLGUID.h! Without these declared, you won't get very far writing an IE plugin. (not that it matters much, without Delphi.x64 you're dead in the water as far as plugins for 64-bit IE are concerned anyway) QC Entry 54503 QC #: Date Reported: Area:84050 4/22/2010 RTL\Delphi\WinAPI

Description: Steps:[QC Short Description] Please update WinSock.pas or add WinSock2.pas [QC Description] Please add to RTL WinSock 2 functions such as WSASocket or WSASend (defined in WinSock2.h in the SDK). Classes in ScktComp.pas could encapsulate those functions instead of WinSock 1 functions. Note that TWinSocketStream.Read / Write use ReadFile and WriteFile that is not considered as a good thing, see http://support.microsoft.com/kb/192800/en-us Michel Added by Sysop <<<<<<<<<<< This issue is related to RAID#250977(QC#46527), which was closed as 'Fixed'. >>>>>>>>>>> QC Entry 84050

QC #: Date Reported: Area:90549 12/28/2010 RTL\Delphi\WinAPI

Description: Steps:[QC Short Description] ShLwApi. Wrong declarations [QC Description] stdcall directive missing in the declaration of following functions: StrCmpIW StrCmpI StrCpyW StrCpy StrCpyNW StrCpyN QC Entry 90549

QC #: Date Reported: Area:7618 3/17/2004 RTL\Delphi\Other RTL

Description: Steps:[QC Short Description] Delphi 7 MaxSingle is not a single [QC Description] The delphi help states under " MaxSingle constant" that "The maximum value of the single precision floating point type." ... "is const MaxSingle: Single = 3.4e+38;" This is incorrect, the actual code is "const MaxSingle = 3.4e+38;" which means it is typed as an extended (I think). 3.4e+38, when stored in a single, gets rounded to 3.3999...e+38 Thus, the value of MaxSingle cannot actually be stored in a single at all. It is also not the largest number you can store in a single, that is 3.40282346638528859811704183484516925440e38

The potential for error is illustrated below. program Test; {$APPTYPE CONSOLE} uses Math; var s: Single; begin s := MaxSingle; // rounding occurs here if (s = MaxSingle) then WriteLn('PASS') else

QC Entry 7618 WriteLn('FAIL'); end.

QC #: Date Reported: Area:89696 11/16/2010 RTL\Delphi\Other RTL

Description: Steps:[QC Short Description] NormalizeBcd return incorrect result if BCD's precision is 64 [QC Description] I have 2 test cases that fail the NormalizeBcd in unit FmtBcd.pas (see "Steps to Reproduce"). NormalizeBcd will return incorrect result if the BCD value's precision is 64. Added By Sysop <<<<<<<< Please see [Comments] and [Workaround] for more detail. >>>>>>>> QC Entry 89696

Run the following test cases: procedure TTestCase_Bcd.Test1; const B: TBcd = (Precision: 64; SignSpecialPlaces: 136; fraction: (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 118, 149, 131, 128, 87)); var B1: TBcd; begin NormalizeBcd(B, B1, 18, 8); CheckEquals('-76.95838057', BcdToStr(B1)); end; procedure TTestCase_Bcd.Test2; const B: TBcd = (Precision: 18; SignSpecialPlaces: 136; fraction: (0, 0, 0, 0, 118, 149, 131, 128, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)); var B1: TBcd; S: string; begin NormalizeBcd(B, B1, 64, 8); CheckEquals('-76.95838057', BcdToStr(B1)); end;

QC #: Date Reported: Area:90083 12/2/2010 RTL\Delphi\Other RTL

Description: Steps:[QC Short Description] fmtbcd.StrToBCD returns '123-' as '123=' [QC Description] When our users enter an invalid numeric value in a TFMTBCD field such as '123-', the StrToBCD function returns '123=' because the internal InvalidBCDString function allows '+' or '-' to be in any position, but later code expect those characters to only be in the first position. Under workaround is the Delphi source that I modified to change this behavior,. QC Entry 90083

procedure TForm9.Button1Click(Sender: TObject); var B : TBCD; s: string; begin S := '123-' B := StrToBcd(S); S := BcdToStr(B); Showmessage(S); // Displays '123=' end;

QC #: Date Reported: Area:90371 12/17/2010 RTL\Delphi\Other RTL

Description: Steps:[QC Short Description] TCharacter.ToLower failure [QC Description] The TCharacter.ToLower class-method fails only under Win2000SP4. Works fine with WinXP/Win7. ( Systemerror Code:87: wrong parameter ) This Error did not occur using Delphi2009. Added by Sysop <<<<<<<<<<<<<< TCharacter.ToLower and TCharacter.ToUpper cause error when passing string parameter on Windows 2000 SP4. >>>>>>>>>>>>>> QC Entry 90371

Create an application that converts a string with TCharacter.ToLower. Compile it with DelphiXE(SP1) Executing it under Win2000 causes failure Added by Sysop <<<<<<<<<<<<<< procedure TForm2.Button1Click(Sender: TObject); var str: string; begin str := TCharacter.ToUpper(Edit1.Text); // or TCharacter.ToLower(Edit1.Text); ShowMessage(str); end; >>>>>>>>>>>>>>

QC #: Date Reported: Area:93360 4/25/2011 RTL\Delphi\Other RTL

Description: Steps:[QC Short Description] TInterlocked.Exchange bug [QC Description] SyncObjs.TInterlocked.Exchange() with Double type parameters has a bug with returned value. See "Steps" QC Entry 93360

Program syncobjs_tinterlocked_exchange_bug; {$APPTYPE CONSOLE} Uses SyncObjs; Var d1, d2 : Double; Begin d1 := PI; d2 := PI * PI; WriteLn('d1 = ', d1); WriteLn('d2 = ', d2); WriteLn('TInterlocked.Exchange(d1, d2); must return initial value of d1 (', d1, '), but...'); WriteLn('...returned value is ', TInterlocked.Exchange(d1, d2), ', value of d2'); ReadLn; End.

QC #: Date Reported: Area:94322 5/27/2011 RTL\Delphi\Other RTL

Description: Steps:[QC Short Description] RTTI.TValue doesn't handle ordinal negative values well [QC Description] When creating a TValue.From<OrdinalType> with a negative value, for a type less than Int64, it loose its sign when extracted using a bigger type, such as the one used when accessing the data with TValue.AsOrdinal. See attached test project. QC Entry 94322

Compile and run the attached application below. See the following program output indicating failure. FAIL #2 - RetVal=4294967295 FAIL #3 - RetVal=255 FAIL #4 - RetVal=65535 FAIL=1/4 program BTS283420; {$APPTYPE CONSOLE} uses RTTI; var Expected: Integer = 0; Counter: Integer = 0; procedure DoTest; var RetVal: Int64; begin Inc(Expected, 4); RetVal := TValue.From(Int64(-1)).AsOrdinal; if RetVal = -1 then Inc(Counter) else WriteLn('FAIL #1 - RetVal=', RetVal); RetVal := TValue.From(Longint(-1)).AsOrdinal; if RetVal = -1 then Inc(Counter) else WriteLn('FAIL #2 - RetVal=', RetVal); RetVal := TValue.From(Shortint(-1)).AsOrdinal; if RetVal = -1 then Inc(Counter) else WriteLn('FAIL #3 - RetVal=', RetVal); RetVal := TValue.From(SmallInt(-1)).AsOrdinal; if RetVal = -1 then Inc(Counter) else WriteLn('FAIL #4 - RetVal=', RetVal); end; begin try DoTest; if Counter = Expected then WriteLn('PASS=', Counter) else WriteLn('FAIL=', Counter, '/', Expected); except

on E: TObject do WriteLn('FAIL - Exception=', E.ClassName); end; end.

QC #: Date Reported: Area:80947 1/7/2010 RTL\Delphi\Other RTL

Description: Steps:[AMP] [QC Short Description] TDictionary.ExtractPair Fails and creates memory leak [QC Description] The documentation is a bit lacking on this function, but it seems reasonable to assume that ExtractPair should reteurn the Key/Value pair for the supplied Key. Calling it with a valid key causes the key/value pair to be hidden from the list, but does not return the values to the user. Furthermore, if the dictionary is a TObjectDictionary set to own the Objects, the reference to the object is lost, but the object is not freed so we get a memory leak. /////////////////////////////////////////////////////// Although the bug was reported only on Vista, it also reproduces on Windows. However, the Fixed configuration does not work on Windows. [AMP] ///////////////////////////////////////////////////// QC Entry 80947 [PulsarBeta]

Download the attached test project and run it. It will report the errors. It has two configurations - Standard and Fixed. In the Fixed configuration the Dictionary is modified to work as I think it should. Incidentally, the fix relies on access to private members of TDictionary which should not work- so i think that is another minor compiler bug.

QC #: Date Reported: Area:82487 2/25/2010 RTL\Delphi\Other RTL

Description: Steps:[QC Short Description] Rtti.ConvStr2Str is wrong (when cast a unicode string to widestring) [QC Description] see steps QC Entry 82487 // Rtti.pas function ConvStr2Str tkWString: TValue.Make(@asWide, ATarget, AResult); // Wrong

Compile and run the attached application below. See the following program output indicating failure. FAIL #1 - v.AsString=() FAIL - Expectation Failure (0/1) program BTS275223; {$APPTYPE CONSOLE} uses RTTI; var Expected: Integer = 0; Counter: Integer = 0; procedure RAID275223; var s: string; v: TValue; RetVal: String; begin Inc(Expected); s := 'Name'; v := s; v := v.Cast<WideString>; RetVal := v.AsString; if v.AsString = s then // !!!WRONG!!! Here v.AsString is empty; Inc(Counter) else WriteLn('FAIL #1 - v.AsString=(',RetVal, ')'); end;

begin try RAID275223; if Counter = Expected then WriteLn('PASS') else WriteLn('FAIL - Expectation Failure (', Counter, '/', Expected, ')'); except on E: TObject do WriteLn('FAIL - Exception (', E.ClassName, ')'); end; end.

QC #: Date Reported: Area:91276 2/2/2011 RTL\Delphi\Other RTL

Description: Steps:[QC Short Description] ObjAuto.ObjectInvoke casts varBoolean to integer [QC Description] When the function ObjAuto.ObjectInvoke attempts to cast the parameter data to the proper data types for the dispatch method being called, it is casting VarTypes of varBoolean to an integer. This occurs when the ConvertKindOf returns ckNone. In the case where the dispatch method being called accepts a variant type, the VarType of the value passed to the parameter is now identified as varInteger. According to the comments in the code it looks as though an intended step is missing: // Convert Boolean/LongBool params to integer via hardcast to Boolean // ensuring that _VarToBool is called to fix a bit clearing issue. The code does not ensure the call to _VarToBool is made: if (VarType = varBoolean) then begin Temps[I] := Integer(Boolean(Params[I])); ParamVarData := @Temps[I]; end; The code is only converting the Boolean to an Integer. QC Entry 91276

Added by Sysop <<<<<<<<<< program Sample; {$APPTYPE CONSOLE} uses SysUtils , ObjComAuto , Variants; type {$methodinfo on} TSample = class( TObjectDispatch ) private type TGuessType = class( TObject ) published function guessType( avar : OleVariant ): Integer; end; public constructor Create; reintroduce; end; {$methodinfo off} function AsString( vt: Integer ): String; begin case vt of varOleStr: Result := 'String'; varInteger: Result := 'Integer'; varBoolean: Result := 'Boolean'; else Result := 'Unknown'; end; end; procedure RunSample; var o: OleVariant; vt: Integer; begin o := TSample.Create as IDispatch; vt := o.guessType( 'string' ); if vt = varOleStr then writeln( Format( '%s - Correct', [ AsString( varOleStr ) ] ) ) else writeln( Format( '%s - Incorrect...Expected %s', [ AsString( vt ), AsString( varOleStr ) ] ) ); vt := o.guessType( 5 ); if vt = varInteger then writeln( Format( '%s - Correct', [ AsString( varInteger ) ] ) ) else writeln( Format( '%s - Incorrect...Expected %s', [ AsString( vt ), AsString( varInteger ) ] ) ); vt := o.guessType( true ); if vt = varBoolean then writeln( Format( '%s - Correct', [ AsString( varBoolean ) ] ) ) else writeln( Format( '%s - Incorrect...Expected %s', [ AsString( vt ), AsString( varBoolean ) ] ) ); end; { TSample } constructor TSample.Create; begin inherited Create( TGuessType.Create, true ); end; { TSample.TGuessType } function TSample.TGuessType.guessType(avar: OleVariant): Integer; begin Result := VarType( avar ); end; begin try RunSample; readln; except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; end. >>>>>>>>>>

QC #: Date Reported: Area:92869 4/5/2011 RTL\Delphi\Other RTL

Description: Steps:[QC Short Description] NormalizeBCD return incorrect result if precision/scale is changed [QC Description] A BCD value of 11.55 (precision 19, scale 2) after normalize to precision 18 and scale 8 return a new BCD that has more decimal point. QC Entry 92869

Run the following Test Case in Delphi XE: procedure TTestCase_Bcd.Test_NormalizeBcd; const B: TBcd = (Precision: 19; SignSpecialPlaces: 2; Fraction: (0, 0, 0, 0, 0, 0, 0, 1, 21, 80, 80, 1, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 159, 194, 3, 80, 192, 98, 146, 4, 2)); var C: TBcd; begin NormalizeBcd(B, C, 18, 8); ShowMessage(BcdToStr(C)); //CheckEquals(StrToLocaleDecimal('11.55'), BcdToStr(C)); end; Act: 11.55050505 Exp: 11.55

QC #: Date Reported: Area:96851 7/29/2011 RTL\Delphi\Other RTL

Description: Steps:[QC Short Description] AV in TVirtualMethodInterceptor [QC Description] TVirtualMethodInterceptor causes Access Violation with some functions

{$APPTYPE CONSOLE} {$R *.res} uses

----- ... //and this causes Access Violation obj := LTest.BadFunc(10.10, dbl); //access violation at 0x00404798: read of address 0x33333333 ... ----- QC Entry 96851

System.Classes, System.SysUtils, System.Rtti; type TTest = class function GoodFunc(Arg1: Integer; var Arg2: Double): TObject; virtual;function BadFunc(Arg1: Double; var Arg2: Double): TObject; virtual;end; function TTest.BadFunc(Arg1: Double; var Arg2: Double): TObject; begin Result := nil; end; function TTest.GoodFunc(Arg1: Integer; var Arg2: Double): TObject;begin Result := nil; end; procedure DoTest; var vmi: TVirtualMethodInterceptor; obj: TObject; dbl: Double; LTest: TTest; begin vmi := TVirtualMethodInterceptor.Create(TTest); vmi.OnBefore := procedure(Instance: TObject; Method: TRttiMethod; const Args: TArray<TValue>; out DoInvoke: Boolean; out Result: TValue) begin if (Method.Name = 'BadFunc') or (Method.Name = 'GoodFunc') thenbegin Result := TPersistent.Create; DoInvoke := False; end; end; LTest := TTest.Create; vmi.Proxify(LTest); dbl := 10.10; //This is OK obj := LTest.GoodFunc(10, dbl); Writeln ( obj.ClassName ); dbl := 10.10; // and this causes Access Violation obj := LTest.BadFunc(10.10, dbl); //access violation at 0x00404798: read of address 0x33333333 Writeln ( obj.ClassName ); end; begin try DoTest; { TODO -oUser -cConsole Main : Insert code here } except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; end.

QC #: Date Reported: Area:73629 5/5/2009 RTL\Delphi\Other RTL

Description: Steps:[QC Short Description] CreateMethodPointer doesn't work when one of the parameters is a

unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ObjAuto; type

set [QC Description] in ObjAuto function CreateMethodPointer(const ADynamicInvokeEvent: TDynamicInvokeEvent; TypeData: PTypeData): TMethod; overload; CreateMethodPointer fails when one of the parameters passed in typedata is a set, the problem is in ObjAuto function GetTypeSize(TypeInfo: PTypeInfo): Integer which doesen't take care of tkSet QC Entry 73629

TForm1 = class(TForm) btnTypeInfo: TButton; procedure btnTypeInfoClick(Sender: TObject); private procedure InternalInvoke(Params: PParameters; StackSize: Integer); end; var Form1: TForm1; implementation uses TypInfo; {$R *.dfm} procedure TForm1.btnTypeInfoClick(Sender: TObject); var MethInfo: PTypeInfo; TypeData: PTypeData; begin MethInfo := TypeInfo(TKeyEvent); TypeData := GetTypeData(MethInfo); CreateMethodPointer(InternalInvoke, TypeData) end; end.

QC #: Date Reported: Area:85206 6/7/2010 RTL\Delphi\Other RTL

Description: Steps:[QC Short Description] filesearch not correct [QC Description] VCL: Delhphi 6, Delphi7 ... Delphi 2010 in the implementation of sysutils.filesearch there is a bug: if the file to be searched exists in the "actual directory", then filesearch returns thefilename without the path, no means, wether the "actual path" is in the directorylist, passed to "filesearch" or not. QC Entry 85206

clear Added by Sysop <<<<<<<<<<<< simply try a filesearch for "user32.dll": if you are before that search in c:\temp (or somewhere alse), you get "c:\windows\system32\user32.dll" (full path). If you execute chdir('c:\windows\system32') before the fileserach, you get only "user32.dll". In the help ist said, that you allways will get the filename with full path. Regards MM p.s.: c:\windows\system32 ist the place, where user32.dll usually resides, you can make the same with you own files... >>>>>>>>>>>>

QC #: Date Reported: Area:95290 6/17/2011 RTL\Delphi\Other RTL

Description: Steps:[QC Short Description] Character.pas ToLower/ToUpper system error with LOCALE_INVARIANT [QC Description] From Delphi XE version TCharacter.ToLower/ToUpper functions use LOCALE_INVARIANT, but this locale type is NOT supported in Windows 2000! This causes application crash with "EOSError, system error code 87" after launching it. More about LOCALE_INVARIANT: http://msdn.microsoft.com/en-us/library/dd373795 You can see that it is supported starting from Windows XP. There is "GetThreadLocale" function must be returned back like it wasin Delphi 2010. QC Entry 95290

1. Create new VCL forms application. 2. Add Character module to uses secton. 3. Double click on form's OnCreate event. 4. Add following code to FormCreate procedure. Caption := ToLower(Application.Title); 5. Build application. 6. Launch, MS Windows 2000. 7. Copy your application's exe file to any folder of Windows 2000 and run exe. 8. You will see exception message box "EOSError. System error code 87: wrong parameter". That's how Delphi XE broke our application for Windows 2000 based corporate network.

QC #: Date Reported: Area:50097 8/6/2007 RTL\Delphi\Other RTL

Description: Steps:[QC Short Description] ObjAuto AV on XEON [QC Description] When using interface TMethodHandlerInstance.RegisterStub from ObjAuto.pas line 784 "JMP ECX" raises AV on DEP-enabled cpu (ex. XEON). QC Entry 50097

Locate the following method in ObjAuto.pas procedure TMethodHandlerInstance.RegisterStub; asm PUSH EAX PUSH ECX PUSH EDX MOV EDX,ESP CALL Handler // Pop EDX and ECX off the stack while preserving all registers. MOV [ESP+4],EAX POP EAX POP EAX POP ECX // Self LEA ECX,[ECX].TMethodHandlerInstance.Return // Jump to the actual return instruction since it is most likely not just a

RET JMP ECX end; The final asm command "JMP ECX" causes the DEP failure.

QC #: Date Reported: Area:70510 1/14/2009 RTL\Delphi\Other RTL

Description: Steps:[QC Short Description] ActiveX.CoInitializeSecurity() seventh parameter is no longer reserved and can be set [QC Description] ActiveX.CoInitializeSecurity() seventh parameter is still called pReserved2. Since Windows 2000 that parameter became named pAuthList, a pointer to a SOLE_AUTHENTICATION_LIST structure. SYSOP: http://msdn.microsoft.com/en-us/library/ms693736(VS.85).aspx QC Entry 70510

Check http://msdn.microsoft.com/en-us/library/ms693736(VS.85).aspx and CoInitializeSecurity() declaration.

QC #: Date Reported: Area:77366 9/4/2009 RTL\Delphi\Other RTL

Description: Steps:[QC Short Description] AV using new RTTI on enum fields with explicit values [QC Description] When you have an enum declaration like this (with a specific value assignment): type TMyEnum = (Value1 = 10, Value2, Value3); you get an AV when using TRttiField.GetValue on a field of this type. When the enum does NOT contain explicit assignments like this: type TMyEnum = (Value1, Value2, Value3); then there is no problem. See steps and attachment for details. QC Entry 77366

Compile and run the attached application below. See the following program output indicating failure. IntField: 123 EnumField1: Value2 FAIL - Exception Error ClassName=EAccessViolation Message=Access violation at address 00447C14 in module 'BTS272768.exe'. Read of address 00000004 program BTS272768; {$APPTYPE CONSOLE} uses Rtti, SysUtils; type TMyEnum1 = (Value1, Value2, Value3); TMyEnum2 = (Value4 = 10, Value5, Value6); TMyObject = class public IntField: Integer; EnumField1: TMyEnum1; EnumField2: TMyEnum2; end; procedure DoTest; var MyObject: TMyObject; RttiContext: TRttiContext; ObjType: TRttiType; Field: TRttiField; Value: TValue; begin MyObject := TMyObject.Create; try MyObject.IntField := 123;

MyObject.EnumField1 := Value2; MyObject.EnumField2 := Value6; ObjType := RttiContext.GetType(MyObject.ClassInfo); Assert(Assigned(ObjType)); { Read fields } for Field in ObjType.GetFields do begin Value := Field.GetValue(MyObject); { <-- AV here when accessing EnumField2 } WriteLn(Field.Name, ': ', Value.ToString); end; WriteLn('PASS'); finally MyObject.Free; end; end; begin try DoTest; except on E: Exception do begin WriteLn('FAIL - Exception Error'); WriteLn(' ClassName=', E.ClassName); WriteLn(' Message=', E.Message); end; end; end.

QC #: Date Reported: Area:78808 10/20/2009 RTL\Delphi\Other RTL

Description: Steps:[QC Short Description] System.TObject.GetInterface bug. [QC Description] line 9646 has code: "if (Int64(ObjCastGUID.D1) = Int64(IID.D1)) and (Int64(ObjCastGUID.D4) = Int64(IID.D4)) then." for check of request of object instance from interface type variable. But first part of condition has bug -- fields D2 and D3 of TGUID record not verify (type casting to Int64 is unnecessary). QC Entry 78808

For check we can request any faked interface ({CEDF24DE-0000-0000-8C75-EB871DC121FD} for example).

QC #: Date Reported: Area:67587 10/6/2008 RTL\Delphi\Other RTL

Description: Steps:[QC Short Description] TRect type should have Height/Width properties [QC Description] Please add Height and Width to TRect. I currently use record helpers to achieve this, but it would be nice if they were in the standard RTL as well. (easier for code insight...) Suggested implementation detail: Setting Width should set Right to Left + Width. The advantages of having Height and Width are tremendous. It simplifies a lot of the code I have written recently. QC Entry 67587

QC #: Date Reported: Area:83817 4/13/2010 RTL\Delphi\Other RTL

Description: Steps:[QC Short Description]

Posix sysinfo() and sysctl() missing [QC Description] The Posix sysinfo() and sysctl() functions are missing. They can be used to find the amount of system RAM, for example. QC Entry 83817 QC #: Date Reported: Area:87428 8/21/2010 RTL\Delphi\Other RTL

Description: Steps:[QC Short Description] Original authors of RegularExpressionsCore and RegularExpressionsAPI [QC Description] My name is misspelled in the original author comment in the RegularExpressionsCore unit. It should be Jan Goyvaerts. My name is missing from the original authors of the RegularExpressionsAPI unit. Embarcadero's version of this unit includes changes that I made to the pcre.pas unit from the JCL library to make it work with TPerlRegEx. E.g. pcre_dispose does not exist in the JCL version. The RegularExpressionsAPI unit does not use the C++ wrapper mentioned in the PCRE license statement. QC Entry 87428

QC #: Date Reported: Area:91072 1/24/2011 RTL\Delphi\Date - Time

Description: Steps:[QC Short Description] SysUtils.FormatDateTime() may cause an access violation [QC Description] The FormatDateTime function that accepts a TFormatSettings parameter may cause an access violation when called with valid arguments. Under similar circumstances, the other FormatDateTime function (the one that accepts only 2 parameters) produces no Access violation and works as intended. See the reproduction code. Doing a textual diff of both DateTimeToString functions (including all nested functions) shows the cause of the AV: SizeOf(buffer) should be Length(Buffer). QC Entry 91072

program Project1; // Demonstrates that FormatDateTime can cause an access violation // when called with valid arguments. {$APPTYPE CONSOLE} uses Windows, SysUtils; // Output: "Test0 length=256" procedure Test0; var dt: TDateTime; begin dt := EncodeDate(2011,01,01); LongMonthNames[1] := StringOfChar('X', 130); Write('Test0 length='); WriteLn(length(FormatDateTime('MMMM MMMM', dt))); end; // Output: "Test1 length=256" procedure Test1; var dt: TDateTime; Format: string; begin dt := EncodeDate(2011,01,01); Format := 'YYYY "' + StringOfChar('X', 255) + '"'; Write('Test1 length='); WriteLn(Length(FormatDateTime(Format, dt))); end; // Causes an access violation procedure Test2; var dt: TDateTime; FormatSettings: TFormatSettings; begin dt := EncodeDate(2011,01,01); // Choosing a much longer string corrupts the stack to the extent that // exception handling becomes impossible FormatSettings.LongMonthNames[1] := StringOfChar('X', 130); Write('Test2 length='); WriteLn(Length(FormatDateTime('MMMM MMMM', dt, FormatSettings))); end; // Causes an access violation procedure Test3; var dt: TDateTime; Format: string; FormatSettings: TFormatSettings; begin dt := EncodeDate(2011,01,01); GetLocaleFormatSettings(GetThreadLocale, FormatSettings); // Choosing a much longer string corrupts the stack to the extent that // exception handling becomes impossible Format := 'YYYY "' + StringOfChar('X', 255) + '"'; Write('Test3 length='); WriteLn(Length(FormatDateTime(Format, dt, FormatSettings))); end; begin Test0; Test1; try Test2; except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; try Test3; except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; end.

QC #: Date Reported: Area:89784 11/18/2010 RTL\Delphi\File Management

Description: Steps:[QC Short Description] DirectoryExists return value Error when using invalid NET PATH [QC Description] DirectoryExists function return True when the directory(e.g., invalid NET PATH) does not really exists. QC Entry 89784

it's easy to reproduce: if DirectoryExists('\\xxxxxx\yyyyyy\') then Caption := 'Yes' else Caption := 'No'; (Note: \\xxxxxx\yyyyyy\ is invalide invalid NET PATH)

QC #: Date Reported: Area:92517 3/23/2011 RTL\Delphi\File Management

Description: Steps:[QC Short Description] ChangeFileExt doesn't check for trailing path delimiter [QC Description] ChangeFileExt function doesn't check for trailing path delimiter. QC Entry 92517

ChangeFileExt('c:\foo\bar\', '.newext') we'll get 'c:\foo\bar\.newext' what is senseless.

QC #: Date Reported: Area:79820 11/26/2009 RTL\Delphi\Format + Float

Description: Steps:[QC Short Description] Bug in FormatBcd() function [QC Description] FormatBcd() function outputs wrong result when the number on input is rounded up by the function and the the right padding with 0's is requested by the format used. The result of the function is not right-padded with zeroes as compared to FormatFloat() function using the same number and format. Added by Sysop <<<<<<<<< I should have used DoubleToBcd() function instead of CurrToBcd() in the demo of course, but it doesn't matter, the resut is the same. And, This issue similar to QC#42792. >>>>>>>>> QC Entry 79820

Compile and run the attached application below. See the following program output indicating failure. FAIL #1 - Expected=1.90 Actual=1.9 FAIL #2 - Expected=2.00 Actual=2 program BTS273810; {$APPTYPE CONSOLE} uses SysUtils, FMTBcd; procedure DoTest; const Format = '0.00'; var AFloat: Double; ABcd: TBcd; Expected, Actual: String; Counter: Integer; begin Counter := 0; // Expected result: '1.90'// AFloat := 1.895; CurrToBCD(AFloat, ABcd, MaxBcdPrecision, MaxBcdScale); Expected := FormatFloat(Format, AFloat); // output: '1.90' Actual := FormatBcd(Format, ABcd); // output: '1.9' if Expected = Actual then Inc(Counter) else WriteLn('FAIL #1 - Expected=', Expected, ' Actual=', Actual); // Expected result: '2.00'// AFloat := 1.995; CurrToBCD(AFloat, ABcd, MaxBcdPrecision, MaxBcdScale); Expected := FormatFloat(Format, AFloat); // output: '2.00'// Actual := FormatBcd(Format, ABcd); // output: '2'// if Expected = Actual then Inc(Counter) else WriteLn('FAIL #2 - Expected=', Expected, ' Actual=', Actual); if Counter = 2 then WriteLn('PASS'); end; begin try DoTest; except on E: Exception do begin

WriteLn('FAIL - Exception Error'); WriteLn(' ClassName=', E.ClassName); WriteLn(' Message=', E.Message); end; end; end.

QC #: Date Reported: Area:93782 5/11/2011 RTL\Delphi\Format + Float

Description: Steps:[QC Short Description] Delphi XE does not honour regional settings [QC Description] Background: Win 7 Ultimate 64 Bit. Regional settings: Format: English South Africa. Currency Symbol = 'R'. Other programs installed honour these regional settings. Delphi XE Professional, however reverts to the $ for currency. Locale: English South Africa. I actually did attach an image of the Locale settings. QC Entry 93782

Create a New VCL Forms Application. Place a Speedbutton on the form. Place a Label on the form. In the on click event of the SpeedButton place the following code: Label1.Caption := FormatSettings.CurrencyString; Compile and run the application. On my computer it should show 'R', but it shows '$' Other programs on the PC honour these settings.

QC #: Date Reported: Area:96844 7/29/2011 RTL\Delphi\Format + Float

Description: Steps:[QC Short Description] TFormatSettings.TranslateDateFormat returns an incorrect result with Delphi XE. [QC Description] The TFormatSettings.TranslateDateFormat function does not take into account that the Date Format can contain quoted date separators that are simply added to the date. [Code] ----- procedure TForm1.FormCreate(Sender: TObject); begin Self.Caption := DateToStr(Now); end; ----- [Result] M.d.yyyy 'y.' --> 7.29.2011 y/ QC Entry 96844

Steps-to-reproduce for Windows 7 Enterprise: 1. Go to the Windows "Start" menu. 2. Evoke the "Control Panel" window. 3. Choose the "Clock, Language, and Region" option. 4. Choose "Change the date, time, or number format". This will evoke the "Region and Language" dialog. 5. Click the "Additional Settings..." button. 6. Go to the "Date" tab. 7. Change the Short Date value in the Date formats group to the following: M.d.yyyy 'y.' 8. Apply changes. 9. Run the attached project. The last character in the Form's caption is '/' instead of '.'

QC #: Date Reported: Area:

90244 12/10/2010 RTL\Delphi\Memory, Pointer, Address

Description: Steps:[QC Short Description] "Invalid floating point operation" when using Move and FillChar [QC Description] We have been getting numerous reports from customers getting "Invalid floating point operation" exceptions in our code in places where Move or FillChar is called. We have never been able to reproduce this, and it only seems to happen in certain situations. With the help of this thread: http://groups.google.com/group/borland.public.delphi.language.basm/browse_thread/thread/2697a84c1805e41b/58735a6c4cd2e566?q=EInvalidOp+in+Delphi+2007+FillChar+%26+Move#58735a6c4cd2e566 we have been able to create a small test project that reproduces this exception every time (we have tested it on different machines with different versions of Windows too).

Run the attached project: program FPError; {$APPTYPE CONSOLE} uses Windows, SysUtils, Variants; type TMyVariantClass = class(TCustomVariantType) public procedure Clear(var V: TVarData); override; procedure Copy(var Dest: TVarData; const Source: TVarData;

The test application may seem a bit contrived, but it demonstrates a situation where Move fails with a Floating Point exception. It only fails if the X variable has the two values shown in the sample app. For other values of X, we were able to get a Floating Point exception in the FillChar routine. There could be numerous other (less contrived) situations leading to the same FPU state and exception. Thanks to Pierre Le Riche for pointing us in the right direction. QC Entry 90244

const Indirect: Boolean); override; end; var MyVarType: TMyVariantClass; DummyData: String; X: Integer; { TMyVariantClass } procedure TMyVariantClass.Clear(var V: TVarData); begin { SetLength will call Move. This call will fail on the second run. } SetLength(DummyData, X); { With other values of X, the Floating Point exception occurs when using FillChar: } // FillChar(DummyData[1], Length(DummyData), 0); end; procedure TMyVariantClass.Copy(var Dest: TVarData; const Source: TVarData; const Indirect: Boolean); begin end; procedure Test; var TestVar1, TestVar2: Variant; MyInt: Integer; MyDouble: Double; begin MyInt := 1; MyDouble := 1; {This works} X := 27; TVarData(TestVar1).VType := MyVarType.VarType; TestVar1 := MyInt; {This doesn't work} X := 63; TVarData(TestVar2).VType := MyVarType.VarType; TestVar2 := MyDouble; end; begin MyVarType := TMyVariantClass.Create; try Test; except on E: Exception do Writeln(E.Message); end; WriteLn('Done'); ReadLn; end.

QC #: Date Reported: Area:

71267 2/8/2009 RTL\Delphi\Memory, Pointer, Address

Description: Steps:[QC Short Description] PNativeInt missing

[QC Description] Please add PNativeInt and PNativeUInt to System.pas. QC Entry 71267 QC #: Date Reported: Area:91246 2/1/2011 RTL\Delphi\Thread support

Description: Steps:[QC Short Description] TThreadedQueue fails with multiple consumers [QC Description] Trying to use the TThreadedQueue (Generics.Collections) in a single producer multiple consumer scheme. The idea is to push objects into a queue and let several worker threads draining the queue. It does not work as expected, though. When two or more worker threads are calling PopItem, access violations are thrown from the TThreadedQueue. If the call to PopItem is serialized with a critical section, all is fine. The problem seems to be related to TMonitor in TThreadedQueue. QC Entry 91246

Attached is a simple example to reproduce the error.

QC #: Date Reported: Area:78415 10/7/2009 RTL\Delphi\Thread support

Description: Steps:[QC Short Description] AV in TInternalConditionVariable.RemoveWaiter [QC Description] When synchronizing two threads using a TConditionVariableCS access violations may occur in the method TInternalConditionVariable.RemoveWaiter in SyncObjs.pas (966): Walker := Walker.Next; where Walker is nil. QC Entry 78415 [top10] Added by Sysop <<<<<<<<<<<<<<< This is a comment from QC ---- I've attached a new project which reliably crashes under Windows versions prior to Vista. ---- Please see 'qc78415.patch' attached. >>>>>>>>>>>>>>>

See attached project archive. (JJS: The attached app doesn't reproduce for me. However, here are Christian's comments from the original QC report.) I have modified the code to call ReadLn at the end but to no avail. The AV occurs only when running the process within the IDE debugger. If I start the process outside the IDE everything runs fine. That's the problem with racing conditions, I suppose. Perhaps the fact that I develop on a Quad Core CPU has an inpact on the runtime behaviour. It seems there is a bug (actually two bugs) in TInternalConditionVariable.RemoveWaiter. Suppose the linked list of waiting threads contains the three entries T1, T2 and T3 which have been added in this order. The linked list looks like this: H -> T3 -> T2 -> T1 -> T3 'H' stands for the pointer to the head of the queue (FWaitQueue field). Bug 1: Removing the second item of the wait queue is not possible. Cause: When removing a thread, the walker pointer actually starts at the third entry (T1 in this case). Iteration stops however as soon as the walker reaches the head of the queue (T3), which leaves T2 undetected. Bug 2: The first item of the queue cannot be removed. Cause: In case the first item is to be removed, just the pointer to the head item is moved without updating the links. Hence the resulting queue looks like this: H -> T1 -> T3 -> T2 -> T1 Furthermore the head points to T1 while it should actually point to T2 since that item followed T3 in the original list. I have attached a patch which can be applied to SyncObjs.pas that

corrects both of these issues. 1. Iteration now starts at the second item (T2) and stops at the first (T3). 2. If the first item is removed, the new list now looks like this: H -> T2 -> T1 -> T2

QC #: Date Reported: Area:6394 11/10/2003 RTL\Delphi\Math Unit

Description: Steps:[QC Short Description] Implementation of Variance, TotalVariance, StdDev sucks [QC Description] The result of the following Variance should obviously be zero: Variance([4.2,4.2,4.2,4.2,4.2,4.2,4.2,4.2,4.2,4.2,4.2,4.2]) The current implementation gives -1,26161707343768E-18 that is StdDev results with EInvalidOp. QC Entry 6394

procedure TForm1.Button1Click(Sender: TObject); begin Edit1.text:=floatToStr(Variance([4.2,4.2,4.2,4.2,4.2,4.2,4.2,4.2,4.2,4.2,4.2,4.2]));end; // Exp: 0 // Act: -1,26161707343768E-18

QC #: Date Reported: Area:56524 1/2/2008 RTL\Delphi\Math Unit

Description: Steps:[QC Short Description] Tanh fails with "Floating Point Overflow" instead of returning 1 on big values [QC Description] In Delphi RTL Tanh is calculated as sinh/tanh, which is mathmatically right, but it fails on big numbers, for example: tanh(11990.045913) because sinh(11990.045913) is BIG. But tanh here just equals to 1. Resolution: If value is big (more than some constant), routine should just return 1.QC Entry 56524

Compile and run the attached program below. See the following program output indicating failure. FAIL - Exception Error ClassName: EOverflow Message: Floating point overflow Recompiling and rerunning with the .NET compiler produces the expected result, namely PASS. program BTS257019; {$APPTYPE CONSOLE} uses SysUtils, Math; begin try if Tanh(11990.045913) = 1 then WriteLn('PASS') else WriteLn('FAIL - Unexpected result'); except on E: Exception do begin Writeln('FAIL - Exception Error'); Writeln(' ClassName: ', E.ClassName); WriteLn(' Message: ', E.Message); end; end; end.

QC #: Date Reported: Area:81203 1/15/2010 RTL\Delphi\Math Unit

Description: Steps:[QC Short Description] RoundTo inappropriately clears the fpu exception mask [QC Description]

Compile and run the attached application below. See the following program output indicating failure.

Bug in RoundTo function it crashes if FPU exceptions are disabled by Set8087CW($133F); error is in line fldcw word ptr [CW8087X] - it clears fpu exception mask flags to set fpu controls flags you shoud use code like that in function Trunc in system.pas FNSTCW [ESP].Word // save FNSTCW [ESP+2].Word // scratch FWAIT OR [ESP+2].Word, $0F00 // trunc toward zero, full precision FLDCW [ESP+2].Word QC Entry 81203

#1 #2 FAIL #2 - Exception (EZeroDivide) FAIL - Expectation failure (1/2) program BTS274504; {$APPTYPE CONSOLE} uses SysConst, SysUtils, Math; var Counter: Integer = 0; Expected: Integer = 0; procedure DoTest; var x, y: Double; OldValue: Cardinal; begin OldValue := Get8087CW; try WriteLn('#1'); Inc(Expected); Set8087CW($133F); x := 0.0; y := 5 / x; Inc(Counter); try WriteLn('#2'); Inc(Expected); if y <> -100 then RoundTo(1.23, -1); //#A// Inc(Counter); except on E: TObject do WriteLn('FAIL #2 - Exception (', E.ClassName, ')'); end; finally Set8087CW(OldValue); end; end; begin try DoTest; if Counter = Expected then WriteLn('PASS') else WriteLn('FAIL - Expectation failure (', Counter, '/', Expected, ')'); except on E: TObject do WriteLn('FAIL - Exception Error (', E.ClassName, ')'); end; end.

QC #: Date Reported: Area:85278 6/8/2010 RTL\Delphi\Math Unit

Description: Steps:[QC Short Description] SimpleRoundTo produces Floatingpoint Exception [QC Description] Try to run that: simpleroundto(10000.01,-15)

Try to execute: simpleroundto(10000.01,-15)

Result ist a Floatingpoint Exception QC Entry 85278 QC #: Date Reported: Area:36965 11/24/2006 RTL\Delphi\Math Unit

Description: Steps:[QC Short Description] Inexact floating-point constants in Math [QC Description] One should expect that definitions const { Ranges of the IEEE floating point types, including denormals }MinSingle = 1.5e-45; MaxSingle = 3.4e+38; MinDouble = 5.0e-324; MaxDouble = 1.7e+308; MinExtended = 3.4e-4932; MaxExtended = 1.1e+4932; just from the beginning of unit Math would ensure that any finite, positive Single value would fall in range MinSingle through MaxSingle, and same for types Double and Extended. See Details on how to get numbers smaller than the pretended minimums and larger than the maximums shown above. Of course, there is a gigantic number of other floating point values that fall outside unit Math's Min-Max ranges. My examples just show the most extreme ones, i.e., these are the actual minimums and maximums. Since floating-point constants in Delphi always are Extended, the definitions for Single and Double values need 20 significant digits (not just 6, 14, or 18) in order to get the exact Extended equivalent of the extreme Single and Double values. In a typed constant definition one could do with fewer digits. However, typed constants are no constant expressions to the compiler. QC Entry 36965

program FloatConstBug; uses Math; const // decimal approximations // exact values SmallSingle = 1.4012984643248170709e-45; // 2^(-149) LargeSingle = 3.402823466385288598e38 + 1e19; // 2^128 - 2^104 SmallDouble = 4.9406564584124654418e-324; // 2^(-1074) LargeDouble = 1.79769313486231570815e308; // 2^1024 - 2^971 SmallExtended = 4e-4951; // 2^(-16445) LargeExtended = 1.18973149535723e4932 + 176502e4912; // 2^16384 - 2^16320 begin Randomize; // let's play Russian roulette case Random (6) of // (unfortunately 6 bullets have been loaded) 0: assert (MinSingle <= SmallSingle); // fails 1: assert (MaxSingle >= LargeSingle); // fails 2: assert (MinDouble <= SmallDouble); // fails 3: assert (MaxDouble >= LargeDouble); // fails 4: assert (MinExtended <= SmallExtended); // fails 5: assert (MaxExtended >= LargeExtended); // fails end; end.

QC #: Date Reported: Area:37997 12/21/2006 RTL\Delphi\Math Unit

Description: Steps:[QC Short Description] Remove register directive [QC Description] Since register is the default calling convention in Delphi, please remove the not necessary register directive from Math unit. QC Entry 37997

ms-help://borland.bds4/bds4ref/html/ProceduresAndFunctionsOV.htm#SecondSubtopic1Title

QC #: Date Reported: Area:82657 3/3/2010 RTL\Delphi\Math Unit

Description: Steps:[QC Short Description] Tanh() implementation [QC Description] Currently Tanh() is implemented using the SinH() and CosH() function. The same result can be calculated more efficiently using the following expression: Tanh(X) = (Exp(2 * X) - 1) / (Exp(2 * X) + 1);

even if Exp(2 * X) isn't precalculated this turns out to be by far faster.QC Entry 82657 QC #: Date Reported: Area:89681 11/15/2010 RTL\Delphi\DateUtils

Description: Steps:[QC Short Description] TTimeZone Returns Incorrect UtcOffset [QC Description] Under certain conditions the new TTimeZone object returns the wrong UtcOffset. After switching from EDT to EST on 11/7/2010 the TimeZone object still returns the -4 offset rather than -5. After stepping through the code it looks like the existing code in DateUtils will work correctly after 11/14/2010. D2007 and D2010 did not have this problem. QC Entry 89681

Compare results of the following two functions. Before 11/14/2010, the GetTimeZoneBias functions returns -240 and the GetTimeZoneBiasD2007 function returns -300 in the US Eastern time zone. The transition to EST occurred on 11/7/2010, not 11/14/2010. function GetTimeZoneBias: Integer; var TimeZone: TTimeZone; begin TimeZone := TTimeZone.Local; Result := Trunc(TimeZone.UtcOffset.Negate.TotalMinutes); end; function GetTimeZoneBiasD2007: Integer; var TimeZoneInfo: TTimeZoneInformation; begin case GetTimeZoneInformation(TimeZoneInfo) of TIME_ZONE_ID_UNKNOWN: Result := TimeZoneInfo.Bias; TIME_ZONE_ID_STANDARD: Result := TimeZoneInfo.Bias + TimeZoneInfo.StandardBias; TIME_ZONE_ID_DAYLIGHT: Result := TimeZoneInfo.Bias + TimeZoneInfo.DaylightBias; else Result := 0; end; end;

QC #: Date Reported: Area:92281 3/14/2011 RTL\Delphi\DateUtils

Description: Steps:[QC Short Description] TTimeZone::IsDaylightTime is using wrong start and end dates for daylight saving time for GMT-06. [QC Description] For the GMT-06 (Central time zone in the U.S.) the TTimeZone::IsDaylightTime function is using the wrong date for the start and end of daylight saving time. Daylight saving time actually started yesterd, March 13, 2011, but IsDaylightTime is returning false. The first day it returns true is March 21, 2011. QC Entry 92281

// Is today in daylight saving time? TTimeZone * tz = TTimeZone::Local; TDateTime TestDate = TDateTime(2011, 3, 14); if (tz->IsDaylightTime(Now())) { // SHOULD execute this block MessageDlg("Today we are in Daylight Saving Time", mtInformation, TMsgDlgButtons() << mbOK, 0); } else { // ACTUALLY executing this block MessageDlg("Today we are NOT in Daylight Saving Time", mtInformation, TMsgDlgButtons() << mbOK, 0); } // When does daylight saving time start? TestDate = TDateTime(2011, 1, 1); while (!tz->IsDaylightTime(TestDate)) { TestDate += 1; } // My tests find March 21, 2011 as the first day, but should be March 14, 2011 MessageDlg("First day of Daylight Saving Time is " + TestDate.DateString(), mtInformation, TMsgDlgButtons() << mbOK, 0); // When does daylight saving time start? while (tz->IsDaylightTime(TestDate)) { TestDate += 1; } // My tests find Nov 14, 2011 as the first day of standard time, but should be Nov 6, 2011 MessageDlg("First day of Standard Time is " + TestDate.DateString(), mtInformation, TMsgDlgButtons() << mbOK, 0);

QC #: Date Reported: Area:

90815 1/11/2011 RTL\Delphi\Other Classes\TEncoding

Description: Steps:[QC Short Description] TMBCSEncoding.GetPreamble() should return a BOM for select codepages [QC Description] Currently, TMBCSEncoding.GetPreamble() does not return any BOM at all: function TMBCSEncoding.GetPreamble: TBytes; begin SetLength(Result, 0); end; TMBCSEncoding.GetPreamble() should be updated to detect select codepages, in particular UTF-8 and UTF-16, and return a BOM for them, just as TCharSetEncoding under Posix already does: function TCharSetEncoding.GetPreamble: TBytes; begin case CodePage of // must use property CodePage not FCodePage!1200: Result := TBytes.Create($FF, $FE);

A UTF-8 BOM is not written to the file using this code: var Strings: TStringList; InputEnc, OutputEnc: TEncoding; FileName: String; begin FileName := 'Some FileName here'; Strings := TStringList.Create; try InputEnc := TEncoding.GetEncoding(SomeInputCodePage); try OutputEnc := TEncoding.GetEncoding(65001); try Strings.LoadFromFile(FileName, InputEnc); Strings.SaveToFile(FileName, OutputEnc); finally OutputEnc.Free; end; finally InputEnc.Free; end; finally Strings.Free; end; end; However, a BOM is written to the file using this code: var Strings: TStringList; InputEnc: TEncoding; FileName: String; begin FileName := 'Some FileName here'; Strings := TStringList.Create; try InputEnc := TEncoding.GetEncoding(SomeInputCodePage); try Strings.LoadFromFile(FileName, InputEnc); Strings.SaveToFile(FileName, TEncoding.UTF8); finally InputEnc.Free; end; finally Strings.Free; end; end;

1201: Result := TBytes.Create($FE, $FF); CP_UTF8: Result := TBytes.Create($EF, $BB, $BF); else SetLength(Result, 0); end; end; QC Entry 90815 QC #: Date Reported: Area:

96375 7/18/2011 RTL\Delphi\Other Classes\TStreamReader/TStreamWriter

Description: Steps:[QC Short Description] TStreamReader corrupt Shift-JIS data [QC Description] TStreamReader corrupt Shift-JIS data Added by Sysop <<<<<<<< On Windows XP SP3, if 3rd parameter is set to smaller value, TStreamReader fails to read line which contains multi-byte characters(e.g., Japanese Kaniji Characters). SR := TStreamReader.Create('test.txt', Enc, False, 128); >>>>>>>> QC Entry 96375

procedure TForm1.Button1Click(Sender: TObject); var SR: TStreamReader; SW: TStreamWriter; Enc: TEncoding; begin Enc := TEncoding.GetEncoding(932); SR := TStreamReader.Create('test.txt', Enc, False, 128); SW := TStreamWriter.Create('test2.txt', false, Enc); while Not SR.EndOfStream do SW.WriteLine(SR.ReadLine); FreeAndNil(SW); FreeAndNil(SR); FreeAndNil(Enc); end; Exp test.txt, test2.txt same data Act test.txt, test2.txt not same

QC #: Date Reported: Area:

95942 7/8/2011 RTL\Delphi\Other Classes\TStreamReader/TStreamWriter

Description: Steps:[QC Short Description] TStreamReader may hung the thread [QC Description] Private procedure FillBuffer of TStreamReader contains a bug that leads to hungs even with 1 MB files. Unicode is multibyte encoding. Reader reads some amount of data into byte array. Then it runs loop in which try to convert this bytes to Unicode from UTF8. If it was unsuccessful it suppose that last byte in that array was insufficient to form a character. Than it increases length of array by 1 byte, reads it from file, and tries again (continuing the loop). The problem is that loop may reallocate this buffer array until the file entirely fits into this buffer (1 MB file ~ 1million of SetLength(array, Length(array) + 1) and other API calls). Such situation occurs when file contain inappropriate byte sequence for given encoding (is corrupted or user selected from dropdown list wrong encoding). This bug is present at list in Delphi XE Update 1 QC Entry 95942

1. Create some file in UTF8 encoding of arbitary content with size ~1 MB 2. Substitude one of the first characters in file with U+0080-U+00FF (in my case U+0096) 3. Try to execute next code procedure RunReader() var reader: TStreamReader; isEnd: Boolean; begin reader := TStreamReader.Create('1mb_corrupted_file.txt'); // or reader := TStreamReader.Create('1mb_corrupted_file.txt', TEncoding.UTF8, false, 1024); isEnd := reader.EndOfStream; end; Added by Sysop <<<<<<<< Even If overloaded consructor is used, this issue also occur. Please see comments of QC for more details. constructor Create(const Filename: string; Encoding: TEncoding; DetectBOM: Boolean = False; BufferSize: Integer = 1024); overload; >>>>>>>>

QC #: Date Reported: Area:92498 3/22/2011 RTL\Delphi\Regular Expressions

Description: Steps:[QC Short Description] TGroupCollection says "index out of bounds" instead of "named group does not exist" [QC Description] Attempting to get the text matched by a named group that does not exist raises a very confusing "index out of bounds (-7)" exception instead of a more accurate "named group does not exist" exception. When TGroupCollection.GetItem in RegularExpressions.pas calls FRegEx.NamedGroup it should check whether the result is -7 or PCRE_ERROR_NOSUBSTRING. If it is, it should raise an exception saying the named group does not exist rather than try to use -7 as a group index. The -7 value of the PCRE_ERROR_NOSUBSTRING constant is an

1. Run attached project Expected: Some kind of exception saying 'thisgroupdoesnotexist' is not a valid group name Actual: Exception saying -7 is not a valid group number

implementation detail of the RegularExpressionsAPI unit that should not be exposed to the users of the RegularExpressions unit. QC Entry 92498 QC #: Date Reported: Area:92349 3/17/2011 RTL\Delphi\Regular Expressions

Description: Steps:[QC Short Description] Regex named capture groups incorrect [QC Description] The behaviour when using RegEx.Match.Groups['name'] is erratic. Both description and discussions around this problem can be found at http://stackoverflow.com/questions/5322825/regex-named-capture-groups-in-delphi-xe The problem appears both when using TRegEx and TPerlRegEx in RegularExpressions and RegularExpressionsCore. The most essential stuff from Stack Overflow is what Mikael Eriksson wrote: "When pcre_get_stringnumber does not find the name, PCRE_ERROR_NOSUBSTRING is returned. PCRE_ERROR_NOSUBSTRING is defined in RegularExpressionsAPI as PCRE_ERROR_NOSUBSTRING = -7. Some testing shows that pcre_get_stringnumber returns PCRE_ERROR_NOSUBSTRING for every name that has the first letter in the range of k to z and that range is dependent of the first letter in judge. Changing judge to something else changes the range. As i see it there is at lest two bugs involved here. One in pcre_get_stringnumber and one in TGroupCollection.GetItem that needs to raise a proper exception instead of SRegExIndexOutOfBounds" QC Entry 92349

Compile and run the attached app below. See the following output indicating failure. FAIL #3 - Exception=ERegularExpressionError FAIL=3/4 program BTS282293; {$APPTYPE CONSOLE} uses RegularExpressions; var Expected: Integer = 0; Counter: Integer = 0; procedure Test1; var Regex: TRegEx; M: TMatch; RetVal: Integer; S: String; begin try Inc(Expected); Regex := TRegEx.Create('(?P<time>\d{1,2}:\d{1,2})(?P<judge>.{1,3})'); M := Regex.Match('00:00 X1 90 55KENNY BENNY'); RetVal := M.Groups.Count; if RetVal = 3 then Inc(Counter) else WriteLn('FAIL #1 - Test1 - RetVal=', RetVal); Inc(Expected); S := M.Groups['time'].Value; if S = '00:00' then Inc(Counter) else WriteLn('FAIL #2 - Test1 - S=', S); except on E: TObject do WriteLn('FAIL #3 - Exception=', E.ClassName); end; end; // But the following does. First group is now named "atime" procedure Test2; var Regex: TRegEx; M: TMatch; RetVal: Integer; S: String; begin try Inc(Expected); Regex := TRegEx.Create('(?P<atime>\d{1,2}:\d{1,2})(?P<judge>.{1,3})'); M := Regex.Match('00:00 X1 90 55KENNY BENNY'); RetVal := M.Groups.Count;

if RetVal = 3 then Inc(Counter) else WriteLn('FAIL #4 - Test2 - RetVal=', RetVal); Inc(Expected); S := M.Groups['atime'].Value; if S = '00:00' then Inc(Counter) else WriteLn('FAIL #5 - Test2 - S=', S); except on E: TObject do WriteLn('FAIL #6 - Exception=', E.ClassName); end; end; begin try Test1; Test2; if Expected = Counter then WriteLn('PASS=', Counter) else WriteLn('FAIL=', Counter, '/', Expected); except on E: TObject do WriteLn('FAIL - Exception=', E.ClassName); end; end.

QC #: Date Reported: Area:87752 9/2/2010 RTL\Delphi\Regular Expressions

Description: Steps:[QC Short Description] TRegEx frees FRegEx while TMatch et al still have a reference to it [QC Description] The TRegEx record allocates a TPerlRegEx instance that it stores in the FRegEx field. It uses TScopeExitNotifier to free the TPerlRegEx instance when the TRegEx record goes out of scope. It's a nifty trick, but it fails spectacularly because TMatch and TGroupCollection copy the reference to the TPerlRegEx instance but not the TScopeExitNotifier. An FNotifier field must be added to TMatch and TGroupCollection. TRegEx.FNotifier must be assigned to TMatch.FNotifier and TGroupCollection.FNotifier whenever TRegEx.FRegEx is assigned to TMatch.FRegEx and TGroupCollection.FRegEx. QC Entry 87752

1. Start a new VCL application 2. Turn on debug DCUs in project options 3. Add RegularExpressions to the uses clause of Unit1 4. Add a TButton with this event handler: procedure TForm1.Button1Click(Sender: TObject); begin Button1.Caption := TRegEx.Match('one two', '\w+').NextMatch.Value; end; 5. Open the RegularExpressionsCore unit 6. Place breakpoints in TPerlRegEx.Create, TPerlRegEx.Destroy, and TPerlRegEx.MatchAgain 7. Run the application Expected: breakpoints stop at Create, MatchAgain, and Destroy in that order, and the button's caption shows "two". Actual: breakpoints stop at Create, Destroy, and MatchAgain in that order, showing that MatchAgain is called on a TPerlRegEx instance that has already been destroyed. In my tests the button caption goes blank, but in real world code the program may very well crash with an access violation.

QC #: Date Reported: Area:40327 2/12/2007 SOAP

Description: Steps:[QC Short Description] lots of widestrings passed by value and more... [QC Description] Read description. I have serious questions about the overall quality when looking at them. And sorry, I do not have time to post one entry for each individual request. QC Entry 40327

I didn't look at SOAP source until recently, but I was surprised. I wanted to use XMLTimeToDateTime function (I had my own wrapper since a long time), and I almost got lost in tracing the calls. * My first complain is about the widestring parameters which are passed by value several levels deep. Because widestring is not (yet) reference counted, lots of unnecessary copies are made... Quick list (in xsbuiltins) - TXSDateTime.XSToNative - GetBaseDateTime (and other similar) - TXSBaseTime.XSToNative Other: * SoapStrToFloat and SoapFloatToStr use substitution (therefore search), instead of much simpler/faster approach of using a properly initialized TFormatSettings variable * And look at this; what's the purpose of try/finaly (around a widestring assign)??? procedure TXSDateTime.XSToNative(Value: WideString); var BaseDate: TXSBaseDateTime; begin BaseDate := GetBaseDateTime(Value); try

FDateTime := Value; finally BaseDate.Free; end; end; QC #: Date Reported: Area:49030 7/13/2007 SOAP

Description: Steps:[QC Short Description] soap array elements need namespace [QC Description] Using Delphi 7 with the SOAP/WSDL update 24535 to pass an array to a web service written with Visual Studio 2005. The D7 client does not include the namespace on the array elements. The web service fails to deserialize the array when the namespace is not included. QC Entry 49030

Create a simple web service in VS2005 that simply returns the array received back to the client. Enable logging of the SOAP packets. A client that will permit editing the SOAPRequest in the HTTPRIO.OnBeforeExecute Send an array to the web service unedited. The web service will fail to echo the packet. Send the array again editing the SOAP Request to include the namespace on the array elements. The web service will echo the packet. Checking the web service log show that it does receive the soap packet with the array but it is unable to deserialize it without the ns.

QC #: Date Reported: Area:89906 11/23/2010 SOAP

Description: Steps:[QC Short Description] Access Violation in SOAP WebServExp.GenerateXMLSchema [QC Description] We've recently setup out own webservice using SOAP and it all works like a charm. Because the service is only used from within our own applications, I usually don't allow for a WSDL to be generated. Today i started some tests with SoapUI and needed a WSDL of our own service. So I enabled the Default action of the TWSDLHTMLPublish component and tried to get the WSDL exported. All I got was an access violaton in WebServExp.GenerateXMLSchema, line 1636: if (ParentInfo = nil) and ((GetTypeData(ATypeInfo).ParentInfo)^ <> nil) then Debugging this, reveiled that GetTypeData(ATypeInfo).ParentInforeturned a nil, so of course using ^ on nil raises an access violation. QC Entry 89906

QC #: Date Reported: Area:90026 11/30/2010 SOAP\WSDL Importer

Description: Steps:[QC Short Description] Cannot compile WsdlImp any more [QC Description] Whe used to compile a customized version of WsdlImp from $(BDS)\source\soap\wsdlimporter but the sources provided with Delphi XE cannot compile. - unknown type - object that does not implement the interface it is supposed to implement Note that the project is a Delphi 2010 project (version 12.0) and not a Delphi XE project (version 12.3) Michel Terrisse QC Entry 90026

QC #: Date Reported: Area:44552 4/17/2007 SOAP\Server Applications

Description: Steps:

[QC Short Description] SOAP-Attachments not beeing freed [QC Description] Soap-Attachments temporarily extracted to Windows\Temp do not get freed properly by the soap-runtime(BorlandSoapAttachmentxxx-files live forever). The problem lies in InvokeRegistry.pas - procedure TSOAPAttachment.SOAPToObject, line DataContext := Nil; This line SHOULD read AttachFound.DataContext := Nil; The bug is present at least since D7 QC Entry 44552

Create a soap-server-app with any procedure having TSOAPAttachment-parameters. e.g. ILicensing = interface(IInvokable) ['{D8DD5A8E-1E2E-4F65-BB43-BB3C745B8EA8}'] function RequestLicense(Key: String; Request: TSOAPAttachment): Boolean; stdcall; end; and implement this Interface. According to the documentation the soap-runtime should free the received TSOAPAttachments (and its corresponding BorlandSoapAttachmentXYZ-files in Windows\Temp), however the wrong code in InvokeRegistry.pas - procedure TSOAPAttachment.SOAPToObject prevents this from happening. Even from the comments in the TSOAPAttachment.SOAPToObject() source it's clear that this is an error in the code, however it doesn't lead to a compile-time-error because unfortunately AttachFound as well as Self are of the samte type (TSOAPAttachment). { Transfer ownership } AttachFound.Ownership := soReference; { Make sure SOAP Runtime does not delete this object } DataContext := Nil; obviously the comment in the second-last line means, that the AttachFound should not be destroyed by the runtime, however DataContext := Nil; prevents the current soap-attachment-object from getting freed...

QC #: Date Reported: Area:32105 9/12/2006 SOAP\Server Applications

Description: Steps:The WSDL generated by Delphi contains a mistake: The <input> and <output> elements for an operation within the <binding> section contains the message attribute. It's invalid to have the message attribute there. [NOTE: Because of this one cannot import the WSDL of a Delphi Service using Axis (Java) WSDL2JAVA utlity).

1. Build any WebService in Delphi 2. Look at the WSDL 3. Go to the '<binding name="xxxx" type="xxxx"> section and look at the <input> node following each operation. You'll see something like this: <binding name="InteropTestPortTypebinding" type="tns:InteropTestPortType"> <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/> <operation name="echoString"> <soap:operation soapAction="http://soapinterop.org/" style="rpc"/> <input message="tns:echoString0Request"> <<<===== "This is wrong" An example of this can be seen at the following URL: http://hirondelle.inprise.com/WebServices/Interop/cgi-bin/InteropService.exe/wsdl/InteropTestPortType Now, do the same on a Java/AXIS or .NET Service. For example, you can view a .NET service at: http://corbeau.inprise.com/webservices/sample-service.asmx?WSDL=wsdl1 You'll see: <wsdl:binding name="InteropTestPortTypebinding" type="tns:InteropTestPortTypebinding"> <soap:binding transport="http://schemas.xmlsoap.org/soap/http"/> <wsdl:operation name="echoString"> <soap:operation soapAction="http://soapinterop.org/" style="rpc"/> <wsdl:input> <<<<<===== "No 'message' attribute !!

QC #: Date Reported: Area:91730 2/23/2011 Modeling\Class Diagram

Description: Steps:[QC Short Description] Modeling Surface fails to update Generic References QC Entry 91730

1. Open the diagram editor on the following code ----------------- unit Unit1; interface uses Generics.Collections; type TMyObject = class end; TMyObjectList = class(TList<TMyObject>) end; implementation end. ----------------- 2. Rename TMyObject to TNewObject via 'Object Inspector' // Expected: all Reference to TMyObject to be renamed //

Actual: Only the base class is renamed the generic reference remains unchanged. Resulting Code ----------------- unit Unit1; interface uses Generics.Collections; type TNewObject = class end; TMyObjectList = class(TList<TMyObject>) end; implementation end. -----------------

QC #: Date Reported: Area:87681 8/31/2010 Modeling\Printing

Description: Steps:[QC Short Description] Can't directly Print a Kiviat Chart [QC Description] Once I've opened a Kiviat Chart in the editor I should be able to go to File | Print... and print this chart to a printer of my choosing. QC Entry 87681

1. Run metrics for a project 2. Select a metric result 3. Right click on the result and select Kiviat Chart exp: Chart opens in IDE exp: File | Print... command is enabled act: File | Print... is disabled

QC #: Date Reported: Area:93457 4/29/2011 Modeling\Audits

Description: Steps:[QC Short Description] Wrong IL "Infinite loop" detection [QC Description] The following source generates a IL report: function WordToBin(aWord:word):String; function BitSet(w:word; indx:Byte):boolean; var maske:word; begin maske:=$0001 shl indx; w:=(w and Maske); if w=0 then result:=false else result:=true; end; var bin:String; i:Byte; begin bin:='xxxxxxxxxxxxxxxx'; for i:=0 to 15 do if BitSet(aWord,i) then bin[16-i]:='1' else bin[16-i]:='0'; result:=bin; end; It says the for loop could be a endless loop. But a simple for loop like this can never be a endless loop. QC Entry 93457

Added by Sysop <<<<<< With sample code block, for i:=0 to 15 do // <-- IL: Infinite loop has been reported. >>>>>>

QC #: Date Reported: Area:93461 4/29/2011 Modeling\Audits

Description: Steps:[QC Short Description] Wrong MNU warning [QC Description] The following code snippet: TDeviceInfo = class(TObject) private fserialno :AnsiString; fdescription:AnsiString; fbusID :Integer; public property serialno :AnsiString read fserialno

Added by Sysop <<<<<< With sample code block, ... private fserialno :AnsiString; // MNU: Field 'fserialno' is not used fdescription:AnsiString; // MNU: Field 'fdescription' is not used fbusID :Integer; // MNU: Field 'fbusID' is not used public ... >>>>>>

write fserialno; property description:AnsiString read fdescription write fdescription; property busID :Integer read fbusID write fbusID; end; leads to a wrong MNU warning for fdescription not to be used. I could understand this if description would also be listed as not being used, but since it isn't the warning is wrong in my eyes. QC Entry 93461 QC #: Date Reported: Area:93462 4/29/2011 Modeling\Audits

Description: Steps:[QC Short Description] Wrong RIEWS warning for string comparison cascade [QC Description] The following code: function Tdm.GetParityFromString(pts: String): Integer; begin pts:=UpperCase(pts); if (pts = 'NONE') then begin result:=PARITY_NONE; end else if (pts = 'ODD') then begin result:=PARITY_ODD; end else if (pts = 'EVEN') then begin result:=PARITY_EVEN; end else if (pts = 'MARK') then begin result:=PARITY_MARK; end else if (pts = 'SPACE') then begin result:=PARITY_SPACE; end else result:=PARITY_NONE; end; generates a RIEWS warning because audit thinks one can use a case here. But case statements are only supported for ordinal values which string is not. QC Entry 93462

QC #: Date Reported: Area:66231 8/29/2008 Documentation

Description: Steps:[QC Short Description] BDN.HTML refers to Borland.com [QC Description] File BDN.HTML deployed at \Program Files\CodeGear\RAD Studio\6.0 says : "Connecting to the Borland Developer Network at www.borland.com", when opening but it correctly redirects to http://dn.codegear.com/

QC Entry 66231 QC #: Date Reported: Area:69783 12/10/2008 Documentation

Description: Steps:[QC Short Description] C++-specific help is invalid C++ [QC Description] Several of the C++-specific portions of the help don't give valid C++. For example: * TNotifyEvent is incorrectly listed as "(Sender: TObject) ( TNotifyEvent)();". Should be "typedef void __fastcall (__closure *TNotifyEvent)(System::TObject* Sender);" * TNotifyList::AddNotify is listed without a return type. (Should be void.) * TAutoCompleteOptions has this rather meaningless definition: "TAutoCompleteOption TAutoCompleteOptions;" I currently have to browse the header files if I need detailed and correct information; the help should provide this for me. QC Entry 69783

QC #: Date Reported: Area:12812 5/14/2005 Documentation

Description: Steps:[QC Short Description] Map file documentation [QC Description] Please document all of the elements of the map file. I understand what the major symbols mean, but there are several things that I can't find any information on. For example: Detailed map of segments 0001:00002030 0000014F C=CODE S=_TEXT G=(none) M=F:\BORLAND\BCB6\LIB\C0W32.OBJ ACBP=A9 What does ACPB=A9 mean? What could it be equal to other than A9? I assume G= is group and M= is module? Why do I have to guess? 0001:00611A0C Buttons::_16401 What is _16401? Why is it here and, most importantly, how can I find it in the source code? 0001:0016712C Cellformats::TColumnFormat:: What does this indicate? The address is lower than any of the TColumnFormat method addresses. 0002:00029220 __ectbl__ __fastcall TFormMain::DisplayDataSetChart(int) (this method lives at 0001:000721FC) Why do I find things like this in the data segment? What is __ectbl__? What do the other __?__ symbols mean? 0002:00043A4C __indStub:117126 What are __indStubs? I find not such symbol in the BCB soruce directory.

N/A

0013:00000000 __fastcall System::VarClear(System::Variant&) What is segment 13? QC Entry 12812 QC #: Date Reported: Area:70112 12/24/2008 Documentation

Description: Steps:[QC Short Description] No help on sysmac.h [QC Description] Help has no information about sysmac.h (opposed to BCB5 help). The file contains important definitions like BEGIN_MESSAGE_MAP, __interface, __safecall, etc. QC Entry 70112

2 - Help -> Search 3 - Search for: sysmac.h exp: help regarding sysmac.h appears act: no help regarding the file.

QC #: Date Reported: Area:82020 2/10/2010 Documentation

Description: Steps:[QC Short Description] Help / Wiki [QC Description] No one answers at '[email protected]' QC Entry 82020

QC #: Date Reported: Area:27296 4/13/2006 Documentation\Online Help\VCL

Description: Steps:[QC Short Description] Wrong documentation for the calling conventions. [QC Description] The C++ Builder functions are documented without the __fascall modifier. As result it is impossible to write components overriding virtual methods by using the help. QC Entry 27296

Open any VCL member function in the BCB 2006 help. They are documented without the __fastcall modifier. BCB 2006 appears to have the worse and the most incorrect help from all the BCB products, including BCB 1.0! For example: <ms-help://borland.bds5/delphivclwin32/Classes_TThread_Execute1.html> Syntax C++ virtual Execute() = 0; should read: [C++] virtual void __fastcall Execute() = 0; Cogswell is actually worse than DeXter, because it omits the "void" part of the declaration as well.

QC #: Date Reported: Area:2536 9/27/2002 Documentation\Online Help\VCL

Description: Steps:[QC Short Description] Undocumented Capability of Using TIndexOptions::ixUnique with TClientDataSet::AddIndex [QC Description] The documentation for TClientDataSet::AddIndex states: "Options is a (potentially empty) set that can include up to two TIndexOptions values. The valid members for that set include ixDescending...and ixCaseInsensitive. Warning: AddIndex throws an exception if you attempt to create an index that includes any other TIndexOptions values."

1) Create a TClientDataSet. 2) Activate it. 3) Call its AddIndex method, setting the Options parameter to "TIndexOptions() << ixUnique". 4) Observe that no exception is thrown, and the unique index is enforced. This method of indexing the TClientDataSet, by the way, is handy for catching key violations locally, rather than letting the DB catch them after calling TClientDataSet::ApplyUpdates. The attached project should adequately demonstrate that this does work.

In "Understanding ClientDataSet Indexes" by Cary Jensen on the Borland Community Site (http://community.borland.com/article/0,1410,29056,00.html), it states: "The second [parameter] is the semicolon-separated list of the index fields...Note, however, that only the ixCaseInsensitive, ixDescending, and ixUnique TIndexOptions are valid when you invoke AddIndex. Using any of the other TIndexOptions flags raises an exception. " Indeed, ixUnique *can* be specified for Options without generating an exception, and the TClientDataSet behaves as expected (a key value exception is thrown by the TClientDataSet if a duplicate key value is inserted). QC Entry 2536 QC #: Date Reported: Area: 58677 2/25/2008 Documentation\Help Output

Description: Steps:[QC Short Description] TListColumn help page is incomplete [QC Description] The Properties page for TListColumn is missing some descriptions. QC Entry 58677

Go to this help link ms-help://borland.bds5/delphivclwin32/!!MEMBERTYPE_Properties_ComCtrls_TListColumn.htmlNote that WidthType, ImageIndex, MaxWidth, MinWidth, and Tag descriptions are missing.

QC #: Date Reported: Area:91597 2/16/2011 IDE

Description: Steps:[QC Short Description] QA Metrics [QC Description] Are the QA Metrics and Audits options supposed to be available in C++ Builder XE. The marketing spiel indicates that this is functionality available for both Delphi & C++ but there are no menu options available to run this under the Project Menu. I did have an empty metrics window show up in one of my projects but it has since disappeared. QC Entry 91597

QC #: Date Reported: Area:31750 3/30/2005 IDE\Dialogs\Environment Options

Description: Steps:Background compilation option is not implemented

1) Tools | Options | Environment options in Compiling and Run groupbox // no background compilation option exist

QC #: Date Reported: Area:

88342 9/23/2010 IDE\Dialogs\PreComp. Header Wizard

Description: Steps:[QC Short Description] precompiled header wizard breaks when Indy components included [QC Description] When dropping a TIDTCPClient onto a form and then running the precompiled header wizard, the wizard fails with a: Examining project... Reading "Project1.cpp" Reading "Unit1.cpp"

Create a VCL Application Drop a TIdTCPClient on the form. run the precompiled header wizard.

Embarcadero C++ Win32 Preprocessor 6.30 Copyright (c) 1993-2010 Embarcadero Technologies, Inc. Unit1.cpp: Warning W8017 c:\program files\embarcadero\rad studio\8.0\include\windows\rtl\IdGlobal.hpp 397: Redefinition of 'sLineBreak' is not identical Please correct errors before re-running the wizard, or select "Load from cache" on the previous page. sLineBreak is defined in Indy as L"\r\n" sLineBreak is defined in System.hpp as "\r\n" QC Entry 88342 QC #: Date Reported: Area:18072 9/29/2005 IDE\Project Management

Description: Steps:[QC Short Description] BCB6 projects are not always converted correctly [QC Description] The RESFILES section of a BCB6 .bpk file are not always being parsed correclty. QC Entry 18072

I have a BCB6 project with a RESFILES section of the .bpk looks like this; <RESFILES value="CCUTL60.res "c:\program files\borland\cbuilder6\lib\obj\trayicon.dcr"cttrayicon.res ButtonBarImages.res"/> When opened in DeXter, and converted to version 10, the resfiles section looks like this; <property category="win32.*.win32b.ilink32" name="param.resfiles.1" value="CCUTL60.res"/> <property category="win32.*.win32b.ilink32" name="param.resfiles.2" value="c:\program"/> <property category="win32.*.win32b.ilink32" name="param.resfiles.3" value="files\borland\cbuilder6\lib\obj\trayicon.dcr"/> <property category="win32.*.win32b.ilink32" name="param.resfiles.4" value=" "/> <property category="win32.*.win32b.ilink32" name="param.resfiles.5" value="cttrayicon.res"/> <property category="win32.*.win32b.ilink32" name="param.resfiles.6" value="ButtonBarImages.res"/> <property category="win32.*.win32b.ilink32" name="param.resfiles.merge" value="1"/> As you can see, I think .2, .3, and .4 should be one line.

QC #: Date Reported: Area:

77914 9/22/2009 IDE\Project Management\Project Options

Description: Steps:[QC Short Description] Unable to clear a boolean option from an option-set in CB2010 [QC Description] Sometimes it is necessary to clear a boolean option from a set which means I don't want to change the value of the boolean option in any way. In CB2009 you could just press "Backspace" and the override would be removed from the option set. In CB2010 "Backspace" does nothing. In CB2010 you can only set the value to "false" or "true", but you can't change it to 'no change'. It seems there is no way to remove a "boolean" option from an option set in CB2010. QC Entry 77914

- Create option set - Set any boolean value to true or false - Try to clear that setting

QC #: Date Reported: Area:

15455 8/25/2005 IDE\Project Management\Build Options Explorer

Description: Steps:Bringing up the Install Packages dialog while a C++ project is open results in an access violation bcbide100.bpl

-Launch the IDE -File | New | Other... | C++ Projects | VCL Forms Application -Component | Install Packages... --------------------------- Error --------------------------- Access violation at address 22AA697A in module 'bcbide100.bpl'. Read

of address 00000010. --------------------------- OK Details >> --------------------------- + $19[22AA697A]{bcbide100.bpl} BOEProjOpts.BOEProjOpts.TProjectOptions.GetAllConfigurations (Line 1780, "BOEProjOpts.pas" + 2) + $19 + $0[51EB698F]{rtl100.bpl } System.System.@HandleAnyException (Line 9912, "system.pas" + 13) + $0 + $41[7C903786]{ntdll.dll } RtlConvertUlongToLargeInteger + $41 + $9[7C90EAF5]{ntdll.dll } KiUserExceptionDispatcher + $9 + $4[22A72E55]{bcbide100.bpl} BOEProjOptsDlg.BOEProjOptsDlg.TBOEProjectOptionsDlg.FormShow (Line 258, "BOEProjOptsDlg.pas" + 4) + $4 <snip> + $C[51FE6A22]{vcl100.bpl } Controls.Controls.TControl.SetVisible (Line 4124, "Controls.pas" + 5) + $C + $11[22AA4F1D]{bcbide100.bpl} BOEProjOpts.BOEProjOpts.TProjectOptions.InternalEdit (Line 1307, "BOEProjOpts.pas" + 39) + $11 + $3[22A75EC3]{bcbide100.bpl} NewCppProjOpts.NewCppProjOpts.TBorlandCppProjectOptions.GetInst

QC #: Date Reported: Area:

43649 4/2/2007 IDE\Project Management\Virtual Folders

Description: Steps:[QC Short Description] Add capability to set compiler options at a virtual folder level [QC Description] It would be extremely useful if an option set could be applied at a virtual folder level. This way a bunch of files can be grouped by needed compiler switches and a set of such switches can be applied once. QC Entry 43649

1. Open a C++ project 2. Create a virtual folder 3. Add source files to the virtual folder 4. Righ click on the virtual folder. 5. Observe that there is no option to apply an option set.

QC #: Date Reported: Area:20785 10/28/2005 IDE\Code Editor

Description: Steps:[QC Short Description] Edit SQL in Code editor pops up 3 error dialogs [QC Description] Trying to edit SQL in the Code editor with any of the following TADOQuery - dbGo TQuery - bde TSQLQuery - dbexpres Gets 3 "Illegal Characters in Path" dialogs when clicking the "Code Editor" button on a SQL statement. QC Entry 20785

you1. New C++ Builder VCL Application 2. Drop a TSQLQuery, TQuery or TADOQuery on the form 3. Click the ... on the SQL 4. Click Code Editor --------------- + $24[226D0E49]{dotnetcoreide100.bpl} ToolsAPIWrapper.ToolsAPIWrapper.TDotNetGauntletHandler.AttachHandler(Line 2946, "ToolsAPIWrapper.pas" + 1) + $24 + $0[51F3A2A1]{rtl100.bpl } System.System.@CheckAutoResult (Line 18061, "system.pas" + 6) + $0 + $0[20C10169]{coreide100.bpl} DocModul.DocModul.TModuleHandlerGauntlet.Add (Line 2976, "DocModul.pas" + 2) + $0 + $51[20C0BBEE]{coreide100.bpl} DocModul.DocModul.TDocModule.Destroy (Line 867, "DocModul.pas" + 19) + $51 + $5[51F369CD]{rtl100.bpl } System.System.@AfterConstruction (Line 9537,"system.pas" + 2) + $5 + $21[20B8E1F4]{coreide100.bpl} SourceModule.SourceModule.TSourceModule.Create (Line 402, "SourceModule.pas" + 27) + $21 + $8[20C5B1D1]{coreide100.bpl} IDEServices.IDEServices.TIDEServices.DoCreateModule (Line 1529, "IDEServices.pas" + 7) + $8 + $4[20C5C2B8]{coreide100.bpl} IDEServices.IDEServices.TIDEServices.TerminateServices (Line 1826, "IDEServices.pas" + 0) + $4 + $2B[20F69CE7]{designide100.bpl} StrEdit.StrEdit.TStringListProperty.Edit (Line 309, "stredit.pas" + 29) + $2B

+ $2[20CA4B4E]{coreide100.bpl} PropInsp.PropInsp.TPropertyInspector.PropListHelp (Line 799, "PropInsp.pas" + 3) + $2 + $0[2100D8A9]{vclide100.bpl} IDEInspListBox.IDEInspListBox.TInspListBox.DoEditDblClick (Line 980, "ideinsplistbox.pas" + 1) + $0 + $6[5206C924]{vcl100.bpl } Controls.Controls.TWinControl.WndProc (Line 7241, "Controls.pas" + 100) + $6 + $6[5206C0EC]{vcl100.bpl } Controls.Controls.TWinControl.MainWndProc (Line 7021, "Controls.pas" + 3) + $6 + $8[51F710EC]{rtl100.bpl } Classes.Classes.TDataModule.WriteVerticalOffset (Line 11520, "classes.pas" + 0) + $8 + $6A[77D48731]{USER32.dll } GetDC + $6A + $14A[77D48811]{USER32.dll } GetDC + $14A + $122[77D489C8]{USER32.dll } GetWindowLongW + $122 + $A[77D48A0B]{USER32.dll } DispatchMessageW + $A

QC #: Date Reported: Area:91637 2/18/2011 IDE\Code Editor\

Description: Steps:[QC Short Description] Code formatter does wrong with 'u' as Unicode prefix in strings [QC Description] For example. You write: String hello=u"Hello World"; That AFAIK is a valid Unicode string in C++Builder and compiles ok. Press Ctrl-D and the line converts in: String hello = u "Hello World"; (note the space between 'u' and "Hello World") After formatting this, compiler refuses compile giving "Undefined symbol 'u'" error. Prefixing an 'L' code formatter does not separate the L from the string. QC Entry 91637

Type in a valid place (for example into a for constructor: String hello=u"Hello World"; It compiles ok. Type Ctrl-D to format the code. The line converts in String hello = u "Hello World"; (note the space between 'u' and "Hello World") Compile. Compiler gives "Undefined symbol 'u'" error because 'u' has been separated from the string.

QC #: Date Reported: Area:91316 2/3/2011 IDE\Code Editor\

Description: Steps:[QC Short Description] code formatter breaks if indentation with preprocessor [QC Description] Using the attached formatter file the formatting if statements breaks. It looks like the formatter does not use know about the preprocessorQC Entry 91316

1 Use a new VCL program. 2 enter into the TForm1 constructor: #ifdef __BORLANDC__ if ( 1 == 0 ) #else if ( 0 == 1 ) #endif { } 3 Press control-D expected: no change actual: #ifdef __BORLANDC__ if ( 1 == 0 ) #else if ( 0 == 1 ) #endif { } I have attached the exported formatter file.

QC #: Date Reported: Area:26006 3/13/2006 IDE\Form Designer

Description: Steps:[QC Short Description] Cannot Apply/Store Value List Editor Changes QC Entry 26006

In Windows Display Properties go to Advanced and set font size to Large- You will need to restart Windows after this Insert a Value List Editor component onto a form In the Object Inspector double click the Strings property This will bring up a Value List Editor dialog. There is no way to store anything in this dialog as the only way to close it down is to click on the Window Close [X] icon which discards changes

QC #: Date Reported: Area:92455 3/15/2011 3:42:22 PM IDE\Message View

Description: Steps:The XE IDE crashes when to many tool messages are generated for the message view to handle. This becomes an issue with large C++ projects where large amount of warnings or if extended error info is switched on, and if you have a large amount of projects in a project group and large amount files per project, this can blow the limit of the tools message away and it causes a IDE to AV.

1) Compile and attached package in the IDE and install.... 2) it will hang while the messages are pushed into the message pane 3) then it will crash with an AV The number of messages that are causing the problem should look very familiar. >>>>[32767] Test(1): test message<<<< This seems a problem only with tool messages if you use "AddTitleMessage(const MessageStr: string);" instead of" AddToolMessage(...)" you can add lots more messages. Also worth noting is that the package code that brings down XE runs without a problem in CB2007! So there has been some regression... --------------------------- Error --------------------------- Registration procedure, Unit1.Register in package C:\Documents and Settings\All Users.WINDOZE\Documents\RAD Studio\8.0\Bpl\Package1.bpl raised exception class EAccessViolation: Access violation at address 20984368 in module 'coreide150.bpl'. Write of address 7FDF0012. --------------------------- OK --------------------------- Then when you try and close down you get: [209BE6C7]{coreide150.bpl} MsgLinesIntf.TLine.GetChild (Line 141, "MsgLinesIntf.pas" + 1) + $5 [209BD12D]{coreide150.bpl} MsgLines.TLineBuffer.NotifyLinesRemoved (Line 1023, "MsgLines.pas" + 0) + $9 [209BD2A0]{coreide150.bpl} MsgLines.TLineBuffer.Clear (Line 1075, "MsgLines.pas" + 7) + $5 [208412C3]{coreide150.bpl} ProjectModule.TBaseProject.BeforeDestruction (Line 1017, "ProjectModule.pas" + 24) + $16 [21B13075]{delphicoreide150.bpl} BaseDelphiProject.TBaseDelphiProject.BeforeDestruction (Line 1521, "BaseDelphiProject.pas" + 4) + $2 [5003A7FD]{rtl150.bpl } System.@BeforeDestruction (Line 12216, "System.pas" + 10) + $0 [21B1034A]{delphicoreide150.bpl} BaseDelphiProject.TBaseDelphiProject.Destroy (Line 784, "BaseDelphiProject.pas" + 0) + $A [5003A118]{rtl150.bpl } System.TObject.Free (Line 11069, "System.pas" + 1) + $4

QC #: Date Reported: Area:38921 1/18/2007 IDE\Performance

Description: Steps:[QC Short Description] IDE Compiler searching & opening the same file multiple times during compiling [QC Description] This is Technically a duplicate of QC: 13775 but with everything together in a cohesive whole with the reasons why it occurs. Asked for by David Dean. When BDS 10/11 compiles a project the internal compiler re-searches for header (and source) files mulitple times down the entire include path; even though it should know where it found it last time -- this is waisting a lot of time duplicating efforts that it should already know about. All of Code Insight features also uses the internal compiler

Attached is Andreas Plugin with my mod to track the stats per compile 1. Load BDS 110 project, Install plugin 2. Run->Load Process 3. Choose BDS.exe and run 4. Open the WPM sample application located in ($BDS)\Demos\CPP\Apps\Wpm 5. Project -> Options 6. Disable ALL pre-compiled headers (otherwise your numbers are not correct) -> OK 7. Project -> Build WPM 8. Switch to BDS where you are debugging IDE and you should have on your eventlog: File In Known: 308, In Missed: 655, Total: 1174 Date In Cache: 140, Total: 279 8. Switch back to BDS, and click in the source 9. Hit CTRL-Space, to activate one of the Code Insight features. File In Known: 86, In Missed: 294, Total: 591 Date In Cache: 139, Total: 139 Now these numbers grow exponentionally (yes, exponentionally) each additional unit you add to a project, so on this small aplication with one form (two CPP files); you have that many file hits. Please

which then causes CI to be a lot slower than it can be. QC Entry 38921

note the stats/cache are reset for EVERY compile. The statisics are: Number of files that the plugin cached as already knowing didn't exist in that location from a prior request Number of files that the plugin cached as already knowing existed from a prior request Total number of file requests. If you subtract the two cache counts from the Total, that will leave you with the total number of _unique_ valid file requests (Using the above numbers a total of 211). Second stats that is the number of requests for the date/time of a file, and how many were requests for dates that _weren't_ cached. If you subtract the two numbers, then result is the number of date/times that were cached that BDS should already have had since it asked for it before. (Sorry the Output say "In Cache" but it sould actually be "Added to Cache". Using the above build numbers meaning a 140 unique file/date requests and a total of 139 duplicate file date requests.

QC #: Date Reported: Area:44927 1/3/2002 IDE\Code Completion

Description: Steps:Suggest that Code Completion come up to assist with types when making global declarations

-File | New Application -Somewhere in global space place edit caret and hit Ctrl+Spacebar e.g. start to declare another global after Form1: TForm1 *Form1; <Ctrl+Spacebar here> //res: Error Unable to invoke Code Completion due to errors in source code //exp: Code Completion list with available types

QC #: Date Reported: Area:87974 9/10/2010 IDE\

Description: Steps:[QC Short Description] Header file of unit opens separately from cpp file [QC Description] It is possible for the header file of a unit to become opened separately from its associated cpp and/or dfm files. This can lead to having the header loaded into the code editor in two different tabs. When this happens it is possible to make changes to one tab that are not reflected in the other tab. It's also possible for the IDE to crash when the correctly loaded unit is closed prior to the incorrectly loaded header file. View steps to see how that is accomplished. This is a regression for a bug that used to exist in BCB6. It works fine in CB2009 and was broken in CB2010 and still exists in CBXE. The attached project's .dsk file is already in the state to show the two units open at the same time. QC Entry 87974

- Create a C++Builder VCL Forms Application - Switch to the header file of the form (Unit1.h) - Add something that generates a warning (eg. #warning This is a warning) - Save the project, close the unit - Compile - Double-click on on the warning in Build messages window -Note that the header has been loaded ("Code" and "History" tabs exist at the bottom of the code editor window) - Open the unit any way you'd like (eg. CTRL+F6, double click in project manager, etc) - Now there will be two "Unit1" tabs ... "Unit1.h" and "Unit1.cpp" - Close and reopen the project - There will be one "Unit1" tab - Click on the tab (now shows "Code", "Design", and "History" tabs at the bottom) - Open the unit (CTRL+F6, etc) - Two "Unit1" tabs exist again - Close the project Access violation at address 5003A116 in module 'rtl150.bpl'. Read of address 00000058. followed by a never ending: Access violation at address 209DA44F in module 'coreide150.bpl'. Read of address 00000014.

QC #: Date Reported: Area: 87965 9/10/2010 IDE\Packages\Installin

g Components Description: Steps: [QC Short Description] IDE crash when rebuilding installed package [QC Description] **NOTE ** This really is a Windows 7 problem but it is not available in the list of platforms in my QC client. My system is Windows 7 Pro 64-bit. I have attempted to recreate this issue on Win2008 Server 64-bit and it never fails. This leads me to my belief that this is a Win7 issue. If a C++Builder personality package is empty or contains any other code in the Register() function aside from RegisterComponents() then the IDE will crash when attempting to rebuild, clean, or uninstall the package. The IDE displays an AV with a stack dump (shown below). If instead of an empty package I register one or

- Launch RSXE (fresh install or otherwise) - Create a new C++Builder package (no coding required) - Install the package - Close and restart RSXE - Rebuild the package exp: The package should be momentarily unloaded from the IDE, rebuilt, and then reloaded into the IDE act: The IDE displays an AV, CPU use

more components then the IDE will not crash. However, if I then add another single line of code to Register() such as Beep(), or __typeinfo(), etc then the IDE crashes again. For me, this problem happens in RS2010 as well. It does not happen in RS2009. Stack Dump: (0EAC121A){bds.exe } [0EAC221A] [21751FE1]{vclactnband150.bpl} UxTheme.uxtheme.dll + $5 [217824FC]{vclactnband150.bpl} ThemedActnCtrls.TThemedMenuButton.DoDrawText (Line 493, "ThemedActnCtrls.pas" + 23) + $68 [21782610]{vclactnband150.bpl} ThemedActnCtrls.TThemedMenuButton.DrawText (Line 522, "ThemedActnCtrls.pas" + 9) + $15 [2176B5EA]{vclactnband150.bpl} ActnMan.TCustomActionControl.Paint (Line 6125, "ActnMan.pas" + 37) + $18 [21758024]{vclactnband150.bpl} ActnCtrls.TCustomButtonControl.Paint (Line 526, "ActnCtrls.pas" + 1) + $2[5025E82E]{vcl150.bpl } Graphics.TCanvas.SetPenPos (Line 4118, "Graphics.pas" + 1) + $9 [2177975C]{vclactnband150.bpl} ActnMenus.TCustomMenuButton.Paint (Line 4123, "ActnMenus.pas" + 4) + $2 [502878ED]{vcl150.bpl } Controls.TGraphicControl.WMPaint (Line 13195, "Controls.pas" + 7) + $5 [5027DF74]{vcl150.bpl } Controls.TControl.WndProc (Line 7074, "Controls.pas" + 91) + $6 [502DC8B2]{vcl150.bpl } ExtCtrls.TCustomControlBar.WMEraseBkgnd (Line 7971, "ExtCtrls.pas" + 28) + $6 [50292F77]{vcl150.bpl } Themes.TThemeServices.DrawElement (Line 707, "Themes.pas" + 1) + $22 [5027DF74]{vcl150.bpl } Controls.TControl.WndProc (Line 7074, "Controls.pas" + 91) + $6 [502DBD77]{vcl150.bpl } ExtCtrls.TCustomControlBar.PaintControlFrame (Line 7559, "ExtCtrls.pas" + 49) + $16 [5027DB98]{vcl150.bpl } Controls.TControl.Perform (Line 6852, "Controls.pas" + 10) + $8 [50282CD2]{vcl150.bpl } Controls.TWinControl.PaintControls (Line 9989, "Controls.pas" + 27) + $D [50282ACD]{vcl150.bpl } Controls.TWinControl.PaintHandler (Line 9935, "Controls.pas" + 24) + $8 [50286CBF]{vcl150.bpl } Controls.TWinControl.WMPrintClient (Line 12757, "Controls.pas" + 14) + $6 [5027DF74]{vcl150.bpl } Controls.TControl.WndProc (Line 7074, "Controls.pas" + 91) + $6 [50282838]{vcl150.bpl } Controls.TWinControl.WndProc (Line 9831, "Controls.pas" + 144) + $6 [21774E72]{vclactnband150.bpl} ActnMenus.TCustomActionMenuBar.WndProc (Line 1876, "ActnMenus.pas" + 25) + $4 [5027DB98]{vcl150.bpl } Controls.TControl.Perform (Line 6852, "Controls.pas" + 10) + $8 [50283253]{vcl150.bpl } Controls.TWinControl.WMPaint (Line 10128, "Controls.pas" + 18) + $D [21769D53]{vclactnband150.bpl} ActnMan.TCustomActionBar.WMPaint (Line 5497, "ActnMan.pas" + 4) + $4 [5027DF74]{vcl150.bpl } Controls.TControl.WndProc (Line 7074, "Controls.pas" + 91) + $6 [50282838]{vcl150.bpl } Controls.TWinControl.WndProc (Line 9831, "Controls.pas" + 144) + $6 [21774E72]{vclactnband150.bpl} ActnMenus.TCustomActionMenuBar.WndProc (Line 1876, "ActnMenus.pas" + 25) + $4 [50281ED8]{vcl150.bpl } Controls.TWinControl.MainWndProc (Line 9552, "Controls.pas" + 3) + $6 [500B067C]{rtl150.bpl } Classes.StdWndProc (Line 13491, "Classes.pas" + 8) + $0 [50278AAE]{vcl150.bpl } Controls.FindControl (Line 3378, "Controls.pas" + 6) + $9 [50358AFF]{vcl150.bpl } Forms.TApplication.ProcessMessage (Line 9760, "Forms.pas" + 23) + $1 [50358B2A]{vcl150.bpl } Forms.TApplication.ProcessMessages (Line 9782, "Forms.pas" + 1) + $4 [20847976]{coreide150.bpl} ComPrgrs.TProgressForm.DoUpdate (Line 238, "ComPrgrs.pas" + 12) + $7 [208481DE]{coreide150.bpl} ComPrgrs.TProgressMonitor.MainThreadUpdate (Line 451, "ComPrgrs.pas" + 5) + $A [500ADF64]{rtl150.bpl } Classes.TThread.Synchronize (Line 11800, "Classes.pas" + 4) + $6 [500AE1D8]{rtl150.bpl } Classes.TThread.Synchronize (Line 11868, "Classes.pas" + 9) + $A [208480F8]{coreide150.bpl} ComPrgrs.TProgressMonitor.DoOnUpdate (Line 385, "ComPrgrs.pas" + 4) + $D [208480C3]{coreide150.bpl} ComPrgrs.TProgressMonitor.DoUpdate (Line 376, "ComPrgrs.pas" + 2) + $2 [207EAC22]{coreide150.bpl} ProjectGroupBuilder.TProjectGroupBuilder.MakeThingsHappen (Line 243, "ProjectGroupBuilder.pas" + 51) + $B [5013B6B9]{rtl150.bpl } Rtti.RawInvoke (Line 5538, "Rtti.pas" + 46) + $0 [5013BA1E]{rtl150.bpl } Rtti.Invoke (Line 5729, "Rtti.pas" + 38) + $6 [50134809]{rtl150.bpl } Rtti.TRttiInstanceMethodClassic.GetCallingConvention (Line 4103, "Rtti.pas" + 1) + $2[501351AF]{rtl150.bpl } Rtti.TRttiInstanceMethodEx.DispatchInvoke (Line 4408, "Rtti.pas" + 130) + $17 [5013BE84]{rtl150.bpl } Rtti.TRttiMethod.Invoke (Line 5859, "Rtti.pas" + 1) + $11 [207EA959]{coreide150.bpl} ProjectGroupBuilder.TProjectGroupBuilder.DoBuild (Line 179, "ProjectGroupBuilder.pas" + 2) + $28 [207DD66D]{coreide150.bpl} BuildHost.TBuildHost.Perform (Line 362, "BuildHost.pas" + 19) + $8 [208476A2]{coreide150.bpl} ComPrgrs.TProgressForm.StartCompile (Line 188, "ComPrgrs.pas" + 8) + $C [20847D4A]{coreide150.bpl} ComPrgrs.TProgressForm.HandleCompileMessage (Line 310, "ComPrgrs.pas" + 0) + $2 [5027DF74]{vcl150.bpl } Controls.TControl.WndProc (Line 7074, "Controls.pas" + 91) + $6 [50282838]{vcl150.bpl } Controls.TWinControl.WndProc (Line 9831, "Controls.pas" + 144) + $6 [5034FB30]{vcl150.bpl } Forms.TCustomForm.WndProc (Line 3961, "Forms.pas" + 191) + $5 [50281ED8]{vcl150.bpl } Controls.TWinControl.MainWndProc (Line 9552, "Controls.pas" + 3) + $6 [500B067C]{rtl150.bpl } Classes.StdWndProc (Line 13491, "Classes.pas" + 8) + $0 [50278AAE]{vcl150.bpl } Controls.FindControl (Line 3378, "Controls.pas" + 6) + $9 [50358AFF]{vcl150.bpl } Forms.TApplication.ProcessMessage (Line 9760, "Forms.pas" + 23) + $1 [50358B42]{vcl150.bpl } Forms.TApplication.HandleMessage (Line 9790, "Forms.pas" + 1) + $4 [503544A1]{vcl150.bpl } Forms.TCustomForm.ShowModal (Line 6648, "Forms.pas" + 33) + $5

goes to 100% on a core, the main menu items disappear from the toolbar, the IDE must be killed with Task Manager.

[207DD0C6]{coreide150.bpl} BuildHost.TBuildHost.Build (Line 226, "BuildHost.pas" + 50) + $9 [207DCCB0]{coreide150.bpl} BuildHost.Build (Line 136, "BuildHost.pas" + 4) + $A [207EA769]{coreide150.bpl} ProjectGroupBuilder.BuildProjects (Line 139, "ProjectGroupBuilder.pas" + 1) + $17 [2081A6AB]{coreide150.bpl} ProjectGroup.TProjectGroup.CompileProjects (Line 847, "ProjectGroup.pas" + 1) + $23 [2081A34D]{coreide150.bpl} ProjectGroup.TProjectGroup.CompileActive (Line 695, "ProjectGroup.pas" + 4) +$10 [20820F4D]{coreide150.bpl} ProjectGroup.TProjectGroupWrapper.CompileActive (Line 2792, "ProjectGroup.pas" + 0) + $5 [0041F2F2]{bds.exe } Sanctuary.Util..{Generics.Collections}TList<Sanctuary.Util.TPair<System.string,System.string>> (Line 13, "Sanctuary.Util.pas" + 0) + $25B2 [0041E9DB]{bds.exe } Sanctuary.Util..{Generics.Collections}TList<Sanctuary.Util.TPair<System.string,System.string>>.TEnumerator(Line 13, "Sanctuary.Util.pas" + 0) + $1C9B [500AF987]{rtl150.bpl } Classes.TBasicAction.Execute (Line 12988, "Classes.pas" + 3) + $7 [5026AA1D]{vcl150.bpl } ActnList.TContainedAction.Execute (Line 448, "ActnList.pas" + 8) + $2C [5026B7F8]{vcl150.bpl } ActnList.TCustomAction.Execute (Line 1094, "ActnList.pas" + 7) + $8 [500AF84B]{rtl150.bpl } Classes.TBasicActionLink.Execute (Line 12917, "Classes.pas" + 2) + $7 [21773505]{vclactnband150.bpl} ActnMenus.TCustomActionMenuBar.ExecAction (Line 1071, "ActnMenus.pas" + 6) + $D [21774D5C]{vclactnband150.bpl} ActnMenus.TCustomActionMenuBar.TrackMenu (Line 1837, "ActnMenus.pas" + 19) + $15 [21778386]{vclactnband150.bpl} ActnMenus.TCustomActionMainMenuBar.TrackMenu (Line 3574, "ActnMenus.pas" + 5) + $3 [21773109]{vclactnband150.bpl} ActnMenus.TCustomActionMenuBar.CMItemKeyed (Line 984, "ActnMenus.pas" + 3) + $4 [5027DF74]{vcl150.bpl } Controls.TControl.WndProc (Line 7074, "Controls.pas" + 91) + $6 [50281ED8]{vcl150.bpl } Controls.TWinControl.MainWndProc (Line 9552, "Controls.pas" + 3) + $6 [50282838]{vcl150.bpl } Controls.TWinControl.WndProc (Line 9831, "Controls.pas" + 144) + $6 [21774E72]{vclactnband150.bpl} ActnMenus.TCustomActionMenuBar.WndProc (Line 1876, "ActnMenus.pas" + 25) + $4 [50281ED8]{vcl150.bpl } Controls.TWinControl.MainWndProc (Line 9552, "Controls.pas" + 3) + $6 [500B067C]{rtl150.bpl } Classes.StdWndProc (Line 13491, "Classes.pas" + 8) + $0 [50278AAE]{vcl150.bpl } Controls.FindControl (Line 3378, "Controls.pas" + 6) + $9 [50358AFF]{vcl150.bpl } Forms.TApplication.ProcessMessage (Line 9760, "Forms.pas" + 23) + $1 [50358B42]{vcl150.bpl } Forms.TApplication.HandleMessage (Line 9790, "Forms.pas" + 1) + $4 [50358E6D]{vcl150.bpl } Forms.TApplication.Run (Line 9927, "Forms.pas" + 26) + $3 [004ACCE2]{bds.exe } bds.bds (Line 201, "" + 8) + $FFFB QC Entry 87965 QC #: Date Reported: Area:1124 9/9/2002 IDE\Translation Tools

Description: Steps:I can't port existing BCB5 translated applications. AFAICT there are several faults in the resulting BPRs including: UNITNAME is always "Form" CONTAINERID is always empty (though this may be correct). In addition "#pragma resource" has been changed so that you needdouble '\\'s to represent a single '\'. Having fixed these issues I can get the project to Build and Make but I get EResourceNotFound on running and when I try to open the form for viewing/designing I just get taken to the DFM in the edit window. --------- I tried recreating the project from scratch but after running the Resource DLL Wizard the translation project only had the first form listed. Aside from that it appeared to have the same BPR defects as the upgraded BPR. -------- None of the ITE menu items appear in the IDE although it is listed as an available package.

1.Choose a VCL project with several forms. 2.\File\New\ and select Resource DLL Wizard 3.Click to the language selection page and enable a foreign language. 4.Click on to finish and allow the IDE to recompile and create the new project. You will find the new project has only one form (probably the first listed in your original project) and that double clicking the form in the Project Manager only opens the file in the text editor. The pop-up menu has 'View as form' greyed out. If you attempt to compile this project it will fail at a #pragma directive. If you fix this by replacing '\' with '\\' it will compile and link but the resulting DLL fails when you try and run it and is obviously deficient. // ADDITIONAL EXAMPLE OF 'BROKEN ITE' //////////////////////////////////The 'RichEdit' example project shows some aspects of how broken the ITE is. Each international project does at least have two forms but: 1.They're both called "Form" in the Project Manager 2.You can't view/edit them as forms..only as DFMs. FWIW if you build the project it does work but obviously in its current state it would be a PITA to maintain.

QC #: Date Reported: Area:2456 9/23/2002 IDE\Translation Tools

Description: Steps:[QC Short Description] Translation manager [QC Description] The Translation Manager shows and translates no strings directly coded in the sourcecode. (xy->Caption = "text";) It would be helpful to get this translated without working with resource string tables and constants to address them (and change thousands of lines of old, untranslated, but running program code). QC Entry 2456

QC #: Date Reported: Area:2412 9/19/2002 IDE\Translation Tools

Description: Steps:[QC Short Description] Translation manager errors and missing usability [QC Description] Viewing forms in the TM is nearly unusable. In the source view you can never see hidden components. Additionally in the translated view you can't see different pages of a TPageControl! Only translated view: Clicking on the components sometimes move them accidentally. Sometimes the TM moves components automatically, when their alignment is set to alBottom, because it seems to change the original create order. See also Report#2451 to 2456. QC Entry 2412

QC #: Date Reported: Area:35461 10/19/2006 IDE\Build Tools

Description: Steps:[QC Short Description] IDE build processes include path incorrectly [QC Description] For the attached project, the compiler produces number of errors like: [C++ Error] Sysconst.hpp(24): E2316 'ResourceString' is not a member of 'System' [C++ Error] Sysconst.hpp(24): E2040 Declaration terminated incorrectly [C++ Error] Sysconst.hpp(26): E2316 'ResourceString' is not a member of 'System' [C++ Error] Sysconst.hpp(26): E2040 Declaration terminated incorrectly when attempting to compile Main.cpp in a build from the IDE. If the include path is changed to place the current directory below the BDS include directory, then the project compiles correctly in the IDE. The cause of the problem is the file "Search.h" with is in the project directory (and included in Main.cpp). There is a "search.h" file in the BDS\include directory which is called by other BDS header files, but apparently the IDE uses the "Search.h" file from the project directory instead of the one in the BDS\include directory. QC Entry 35461

Tools | Options | Environment Options | Show command line - checked open attached project click on run button on toolbar lots of errors compiling Main.cpp copy echoed command line from the message window remove line breaks and unnecessary spaces and add the file name Main.cpp open console window and cd to the directory with this project type bcc32 and paste in the completed command line file compiles without error (linker error is irrelevant)

QC #: Date Reported: Area:92027 3/6/2011 IDE\Structure Pane

Description: Steps:[QC Short Description] a) expand the attache project into a folder b) open the project group

Structure Window is not functional (XE Starter) [QC Description] Classes not cooperating with VCL could not be inspected in the XE Starter edition. This will take from that piece of software nearly any benefit if already having a C++ Builder 2010 like me for development tasks. I am very disappointed. QC Entry 92027

within the subfolder "BDS" c) expand the project "Sammler.lib" d) open the file "Src\Chess\Board.cpp" e) you will see no structure at all, a complete disfunctionality

QC #: Date Reported: Area: 43201 4/16/2007 IDE\Unit Testing

Description: Steps: Several DUnit sources were missing for Spacely. It seems that any new files of DUnit was not delivered.

Here's a list of files that were missing: $(TP)\source\dunit\readme-9.3.txt $(TP)\source\dunit\readme-fastmm.txt $(TP)\source\dunit\Contrib\DUnitWizard\README.rtf $(TP)\source\dunit\Contrib\DUnitWizard\Source\DelphiExperts\DUnitProject\dunit_project.bmp $(TP)\source\dunit\Contrib\DUnitWizard\Source\DelphiExperts\DUnitProject\dunit_project16.ico $(TP)\source\dunit\Contrib\DUnitWizard\Source\DelphiExperts\DUnitProject\dunit_project256.ico $(TP)\source\dunit\Contrib\DUnitWizard\Source\DelphiExperts\DUnitProject\dunit_testclass.bmp $(TP)\source\dunit\Contrib\DUnitWizard\Source\DelphiExperts\DUnitProject\dunit_testmodule.bmp$(TP)\source\dunit\Contrib\DUnitWizard\Source\DelphiExperts\DUnitProject\dunit_testmodule16.ico$(TP)\source\dunit\Contrib\DUnitWizard\Source\DelphiExperts\DUnitProject\dunit_testmodule256.ico$(TP)\source\dunit\doc\DUNIT.CNT $(TP)\source\dunit\doc\DUNIT.HLP $(TP)\source\dunit\doc\tutorial.doc $(TP)\source\dunit\doc\images\xtao.cdr $(TP)\source\dunit\examples\ChecklessTests\FailChecklessTestsDemo.dpr $(TP)\source\dunit\examples\ChecklessTests\TestFailChecklessTests.pas $(TP)\source\dunit\examples\HaltRepeating\DemoHaltOnError.dpr $(TP)\source\dunit\examples\HaltRepeating\DemoHaltRepeatingOnError.pas $(TP)\source\dunit\examples\MemLeakDetect\LeakTestDemo.dpr $(TP)\source\dunit\examples\MemLeakDetect\UnitTestLeak.pas $(TP)\source\dunit\examples\MemLeakDetect\UnitTestSetup.pas $(TP)\source\dunit\src\DUnit4Net.bdsgroup $(TP)\source\dunit\src\DUnitW32.bdsgroup $(TP)\source\dunit\src\DUnitW32.bdsproj $(TP)\source\dunit\src\DUnitW32.dpr $(TP)\source\dunit\src\DUnitW32.res $(TP)\source\dunit\src\FastMMMemLeakMonitor.pas $(TP)\source\dunit\tests\DUnitTestLibW32.bdsproj $(TP)\source\dunit\tests\DUnitTestLibW32.dpr $(TP)\source\dunit\tests\DUnitTestLibW32.res $(TP)\source\dunit\tests\FastMMMonitorTest.pas I'm also attaching a complete list of the DUnit distributable.

QC #: Date Reported: Area:87379 8/19/2010 Install

Description: Steps:[QC Short Description] AQtime 7 not installed [QC Description] After downloading the new Setup and checking AQTime 7 to install, the tools isn´t installed. I use the German release QC Entry 87379

QC #: Date Reported: Area:90217 12/9/2010 Install\Files

Description: Steps:[QC Short Description] 'CPPStructurePane.inc' is not installed - Warning: Unable to locate Structure PreInclude File

1. I downloaded the trial version and installed only C++Builder XE 2. I did not install all features. The features that were NOT installed are:

[QC Description] After building a C++ project I get the warning Unable to locate Structure PreInclude File 'c:\program files\embarcadero\rad studio\8.0\ObjRepos\CPPStructurePane.inc'. Tried a repair install, but to no avail. QC Entry 90217

- All database features - HTML WYSIWYG - Web Development Controls - VCL for the Web - integrated Translation Environment - Microsoft(R) Office controls - Rave Report Database ... - Ribbon Controls - DUnit Unit testing frameworks - Shared Files - XML Mapper. After the above install the 'CPPStructurePane.inc' file was not present. This is still an issue in Pulsar...

QC #: Date Reported: Area:9592 11/23/2004 VCL\System Controls\TPaintBox

Description: Steps:[QC Short Description] GDI + Not working [QC Description] When i tried to include guiplus.h i get the following errors: [C++ Warning] GdiplusHeaders.h(681): W8022 'Bitmap::Clone(const Rect &,int)' hides virtual function 'Image::Clone()' [C++ Error] GdiplusGraphics.h(37): E2015 Ambiguity between 'Gdiplus::Graphics::Graphics(void *)' and 'Gdiplus::Graphics::Graphics(void *,int)' QC Entry 9592

Create a VCL application put that in #define STRICT #include <windows.h> #include <algorithm> using std::min; using std::max; #include <gdiplus.h> and it won't compile

QC #: Date Reported: Area:72879 4/10/2009 VCL\Printing

Description: Steps:[QC Short Description] TPrinterOrientation unusable, at compile time [QC Description] this line of code TPrinterOrientation OldOrientation=Printer()->Orientation; cannot be compiled, E2015 Ambiguity betwwen TPrinterOrientation and Printers;;TPrinterOrientation If I type Printer()-> in the code, he tells me Orientation is also of type TPrinterOrientation. So where is the ambiguity? QC Entry 72879

new forms project, in constructor, type TPrinterOrientation OldOrientation=Printer()->Orientation;

QC #: Date Reported: Area:90773 1/9/2011 VCL\

Description: Steps:[QC Short Description] __delphirtti changes RTTI [QC Description] __delphirtti() on a class may remove access to some properties on the same class through RTTI. __delphirtti(TStream) anywhere in the application will remove TStream::Position and TStream::Size from RTTI. __delphirtti(TComponent) anywhere in the application will remove TComponent::Owner from RTTI. QC Entry 90773

Create a VCL console application with the following code: #include <vcl.h> #pragma hdrstop #include <Rtti.hpp> #include <iostream> int wmain() { // TTypeInfo *TypeInfo = __delphirtti(TStream); TRttiContext Context; TRttiType *Type = Context.GetType(__classid(TMemoryStream)); DynamicArray<TRttiProperty*> Properties = Type->GetProperties(); std::cout << Properties.Length << std::endl; return 0; } It is important to disable "Build with runtime packages". When you run the application it writes "3" in the console as TMemoryStream has 3 properties. Now try to remove the comment in front of the line with __delphirtti(TStream). Now when you run the application it writes "1" in the console. The properties Position and Size have disappeared.

QC #: Date Reported: Area:

77428 9/7/2009 VCL\

Description: Steps:[QC Short Description] Generic member functions of TValue do not link [QC Description] When "Build with runtime packages" is enabled, the generic member functions of TValue cannot link. QC Entry 77428

Create a new VCL application and include Rtti.hpp Make sure "Build with runtime packages" is enabled. Add the following code somewhere: TValue Value2 = TValue::From(5); The linker says: [ILINK32 Error] Error: Unresolved external 'Rtti::TValue __fastcall Rtti::TValue::From<int>(const const int)' referenced from UNIT7.OBJ

QC #: Date Reported: Area:77427 9/6/2009 VCL\

Description: Steps:[QC Short Description] No default constructor for TValue [QC Description] The TValue class cannot be default constructed. This can make it awkward to use. QC Entry 77427

Create a new VCL application, include Rtti.hpp, and add the following code somewhere: TValue Value; This is especially annoying when used with TRttiMethod::Invoke(), which takes an array of TValue as argument. It makes code like this difficult: TValue Values[3]; if(something) Values[0] = get_a_value(); else retrieve_value(&Values[0])

QC #: Date Reported: Area:86675 7/28/2010 VCL\Emulation Classes

Description: Steps:[QC Short Description] OPENARRAY() and ARRAYOFCONST() evaluate arguments twice [QC Description] In order to get the argument count, both OPENARRAY() and ARRAYOFCONST() pass all arguments to a special template class (OpenArrayCount<>). This implies that all arguments passed to OPENARRAY() and ARRAYOFCONST() are evaluated twice. Here's an example: // ----- #include <SysUtils.hpp> #include <cstdio> int main (void) { int i = 0; Format (L"%d", ARRAYOFCONST ((i++))); std::printf (i == 1 ? "PASS" : "FAIL"); } // ----- It's possible to circumvent this by adequate usage of sizeof() (which probably wasn't possible back in the days of C++Builder 1); I've attached a possible fix. QC Entry 86675

- Build (bcc32 -WCV qc86675.cpp) and run the following code: // ----- #include <SysUtils.hpp> #include <cstdio> int main (void) { int i = 0; Format (L"%d", ARRAYOFCONST ((i++))); std::printf (i == 1 ? "PASS" : "FAIL"); } // ----- Exp.: prints "PASS" Act.: prints "FAIL"

QC #: Date Reported: Area:77436 9/7/2009 VCL\Emulation Classes

Description: Steps:[QC Short Description] AV when a Delphi record containing managed data types is used as a function Result [QC Description] When a Delphi record type containing managed data types, such as interfaces or strings, is used as a return type for a Delphi function, an AV occurs if the function is called in C++. [MORE INFORMATION]

======================================================================This code is a simplified example of the same crash that occurs in QC #77431: ====================================================================== --- RecIntfCrash.pas --- unit RecIntfCrash; interface type TCrashRec = record

As in C++, a Delphi function returning a record receives a hidden parameter with the address of the destination. However, the Delphi function assumes that the destination memory has beeninitialized/cleared. Delphi does this via a call to __InitializeRecord when a record variable is declared. C++ does no initialization/clearing in a statement like this: PasRec r= GetRec(); Instead C++ relies on the fact that the callee will copy [via the copy ctr] the results directly into the hidden address passed [or, with RVO, just construct the return object @ the hidden address]. The Delphi function returning a record instead invokes the _CopyRecord helper to copy the source into the hidden address. This crashes because _CopyRecord attempts to clear the managed fields as they have non-zero values. [WORKAROUND] A possible workaround would be for the C++ side to use this instead: PasRec r; r = GetRec(); QC Entry 77436

Data: IInterface; Str: String; class function Create: TCrashRec; static; end; implementation class function TCrashRec.Create: TCrashRec; begin Result.Data := nil; // AV in _IntfClear() because Data is not initially zero Result.Str := ''; // AV in UStrLAsg() because Str is not initially zero end; end. --- Test.cpp --- #include "RecIntfCrash.hpp" { TCrashRec r = TCrashRec::Create(); // AV because r is not initialized before jumping into Create() } =========================================================== Another example is from the duplicate 272796 RAID: =========================================================== /--------------------------------------------------------------------------- #include <vcl.h> #include <windows.h> #pragma hdrstop #include <tchar.h> #include <Rtti.hpp> //--------------------------------------------------------------------------- #pragma argsused WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { TRttiContext ctx = TRttiContext::Create(); // <- AV ctx.Free(); return 0; } //--------------------------------------------------------------------------- =========================================================== Another example is from the duplicate 272770 RAID: =========================================================== TValue::_op_Implicit(5);

QC #: Date Reported: Area:93966 5/17/2011 VCL\Emulation Classes

Description: Steps:[QC Short Description] Variant loses it's value on auto-assignments [QC Description] "No matter if you try to assign variant to itself (i.e. v=v) it always clears destination first" Further discussion on https://forums.embarcadero.com/message.jspa?messageID=353312#353312QC Entry 93966

int foo = 1; Variant bar = foo; bar = bar; if (bar!=foo) ShowMessage("fail");

QC #: Date Reported: Area:93971 5/17/2011 VCL\Emulation Classes

Description: Steps:[QC Short Description] Variant assignment operators have several flaws [QC Description] There is a number of problems with the assignment operators in the EMUVCL Variant classes: - they are not exception-safe, i.e. the data in the object being assigned to is lost if the assigment fails - they do not check for self-assignment, which means that self-assignment results in data loss - they duplicate all the code in the constructor overloads. And sure enough, there are several cases where the assignment operator and the copy constructor are misaligned. - the Variant classes usually don't check the result of the ::VariantCopy() and ::VariantChangeType() My proposition is to solve all these problems at once by introducing swap() methods and use the "copy & swap" idiom to implement the assignment operator overloads. The attachment contains a test case for the second problem (self-assignment) and a set of patches for sysvari.h, utilcls.h and variant.cpp which address all of the problems listed above. The self-assignment problem has also been mentioned in QC #93966. QC Entry 93971

- downlad the attachment, compile and run self_assignment.cpp -------------- #include <cstdio> #include <vcl.h> #pragma hdrstop #include <tchar.h> int _tmain(void) { Variant v1, v2 = "foo"; v1 = v2; v2 = v2; std::printf ((v1 == v2) ? "PASS" : "FAIL"); } -------------- Expected output: "PASS" Actual output: "FAIL"

QC #: Date Reported: Area:93699 5/8/2011 VCL\Ribbon Controls

Description: Steps:[QC Short Description] occurred access-violation with QAT when selecting 'Show Quick Access Toolbar Below the Ribbon' [QC Description] If shown QAT below a ribbon. occurred access-violation Source: Samples\CPP\VCL\RibbonDemos\RibbonDemo Access violation at address 005873FE in module 'RibbonDemo.exe'. Read of address 00000000 :7685b727 KERNELBASE.RaiseException + 0x58 :0046b474 System::_17044 + 0x1C :76fa6a8b ; ntdll.dll :76f70143 ntdll.KiUserExceptionDispatcher + 0xf :00583b04 ; Ribbon::TCustomRibbon::Resize :004fd8e1 ; Controls::TWinControl::WndProc :004fcf7f Controls::TWinControl::MainWndProc + 0x2F :0042c7ce Classes::_17544 + 0x16 :75cd62fa ; C:\Windows\syswow64\user32.dll :75cd6d3a user32.GetThreadDesktop + 0xd7 :75cd6de8 ; C:\Windows\syswow64\user32.dll :75cd6e44 ; C:\Windows\syswow64\user32.dll :76f7011a ntdll.KiUserCallbackDispatcher + 0x2e :75cd6a8c ; C:\Windows\syswow64\user32.dll :71330b64 ; C:\Windows\SysWOW64\uxtheme.dll :71330b96 ; C:\Windows\SysWOW64\uxtheme.dll :75cd729a user32.GetPropW + 0x73 :75cd62fa ; C:\Windows\syswow64\user32.dll :75cd6d3a user32.GetThreadDesktop + 0xd7 :75ce0d27 user32.GetClientRect + 0xc5 :75ce0d4d user32.CallWindowProcW + 0x1b :004fd9e1 ; Controls::TWinControl::DefaultHandler

1) Run a sample program. 2) QAT, and click the right mouse 3) Click 'Show Quick Access Toolbar Below the Ribbon' 4) An access violation occurs. OS: Windows 7 32bit

** if make setting "Ribbon1->QuickAccessToolbar->Position = qpBottom" by IDE,occurred a Access Violation on "TForm1::TForm1" on runtime. So can't show a form of a program. QC Entry 93699 QC #: Date Reported: Area:83324 1/22/2010 4:22:52 PM VCL\Gestures

Description: Steps:Tested on Windows XP and 7 Problem linking Gestures.pas Note: Same steps work fine in Fulcrum. Added by Tomohiro Takahashi <<<<<<<<<<<<<<< This issue reproted as QC#81471 >>>>>>>>>>>>>>>

1. File|New|VCL C++ application 2. Drop TGestureManager onto form 3. Project|Options. Packages. Turn off option 'Build with Runtime Packages' 4. Project|Options. C++ Linker. Set Dynamic RTL to 'False' 5. Project|Build Project1.. //exp: Successful //act: [ILINK32 Error] Fatal: Type index 2147479550 is bad in module Gestures.pas

QC #: Date Reported: Area:60062 3/28/2008 Debugger\Watches

Description: Steps:[QC Short Description] Please have Watch evaluator show full contents of AnsiString [QC Description] The attached project builds an AnsiString variable with an embedded \0 character. The watch evaluator properly shows the length of the AnsiString as 11 and shows the contents of a SubString starting after the \0 character, but the contents of the AnsiString are shown only up to the \0. QC Entry 60062

download attached project Project | Options | Debugger Options | CodeGear Debuggers | General - check "Allow side effects in new watches" Open project verify breakpoint set on line 17 of Unit1.cpp F9 to build and run - stops at breakpoint Open Watch window verify watches set for ms, ms.Length() and ms.SubString(7,5) Exp: ms will show Length() characters (11 characters) Act: Only 6 characters show in the watch Note that the SubString() node shows the remaining portion of ms Resume execution Note that the program is able to access the remainder of the data as well

QC #: Date Reported: Area:95964 7/8/2011 Debugger\Watches

Description: Steps:[QC Short Description] Debugger visualizer TDateTime not working [QC Description] Added by Sysop <<<< This issue occurs on Russian locale. >>>> QC Entry 95964

0. start IDE on Russian locale. 1. File -> New -> VCL Application 2. Trivial code void __fastcall TForm1::FormCreate(TObject *Sender) { TDateTime x = Now(); ShowMessage(x.DateTimeString()); } 3. Breakpoint on "ShowMessage" line 4. Variable 'x' in a Watch list 5. Displayed value = '????' No IDE plugins installed. Just a clean C++ Builder XE Update 1. All standard debugger visualizers enabled (default) See the attached screenshot

QC #: Date Reported: Area:84978 5/28/2010 Debugger\Evaluator

Description: Steps:[QC Short Description] TDateTime visualizer is not working [QC Description] If a variable is of type reference to TDateTime, the visualizer is not showing the string date. QC Entry 84978

1. Open a project 2. add following to a .cpp file #include <windows.h> #include <sysutils.hpp> void f( TDateTime & var ) { OutputDebugStringW( var.DateTimeString().c_str() ); } void f2() { TDateTime now( Now() ); f( now );

} call f2() from somewhre. 3. Compile 4. Set breakpoint on OutputDebugString 5. Run. 6. When breakpoint is hit, hover over 'var' or look at it in the local vars view 7. Observe that the string is not displayed.

QC #: Date Reported: Area:20434 10/21/2005 Debugger\Interaction with IDE

Description: Steps:[QC Short Description] Blue dot woes. [QC Description] It would appear that blue 'execution point' dots only appear in the gutter for header files that are already open when debugging starts. QC Entry 20434

1.Load the attached C++ project 2.Run it under the debugger. 2.5 Add breakpoint line 23 in unit3.cpp (at dummy2() call) 3.Click the button - execution stops at breakpoint. 4.Use View Unit (Ctrl+F12) to open Unit1. 5.Switch to Unit1.H 6.Note absence of blue dots in gutter. 6.1 Switch to Unit1.cpp and note no blue dots in gutter. 7.Step execution into the header and note blue dots miraculously appear :)

QC #: Date Reported: Area:77576 9/10/2009 Debugger\Inspector

Description: Steps:[QC Short Description] Codeinspector display wrong value [QC Description] We are using template classes with properties. While debugging, when you move over the property count of an instance of template class, the wrong value or none value is diesplayed //--------------------------------------------------------------------------- template <typename T> class TTemplateList { private: vector<T> vData; bool FOwnsObjects; T GetItem (const int Index) { return vData.at (Index); }; void SetItem (const int Index, T Object) { if (FOwnsObjects) { CheckType (Object); } vData.at (Index) = Object; }; const unsigned int GetCapacity() { return vData.capacity(); }; const unsigned int GetCount() { return vData.size(); };

class cls_Data : public TObject { int i_Data; public: cls_Data (int Data){i_Data = Data;}; }; TTemplateList<cls_Data*> * Results = new TTemplateList< cls_Data *>(false); Results->Add(new cls_Data(10)); Results->Add(new cls_Data(20)); int i_Count = Results->Count; Start the debugger an move to the last line. Move mouse over the line "Results->Count" expression. Debugger displays wrong value. We attached a small example.

.

.

.

. public: __property const unsigned int Capacity = { read = GetCapacity }; __property unsigned int Count = { read = GetCount }; __property bool OwnsObjects = { read = FOwnsObjects, write = SetOwnsObjects }; __property T Items[int Index] = {read=GetItem, write=SetItem}; QC Entry 77576 QC #: Date Reported: Area:76164 7/22/2009 3:33:45 PM Debugger\Evaluator View

Description: Steps:Using the Evaluate dialog: Expressions with side effects have their side effects doubled. Evaluating function calls actually calls the function twice. evaluate/modify shows wrong value when evaluating an expression with side effects (ie a variable using increment operator)

1. paste these lines into a new console app. int main() { int i = 0; return 0; } 2. set breakpoint on line "return 0" and run 3. ctrl+F7 (evaluate/modify) 4. enter ++i: it shows "1" 5. enter ++i again exp:shows '2' act: shows '3'

QC #: Date Reported: Area:87945 9/10/2010 Internet\XML\Data Binding

Description: Steps:[QC Short Description] XSD files are treated as regular XML files during import [QC Description] The XML Data Binding Wizard treats XSD files as regular XML files. The generated binding is hence unusable. DTD files work as expected as does RS2010. QC Entry 87945

see attached files: simple.xsd: a simple XSD simple_2010: the binding RS2010 created (correct) simple_XE: the binding RSXE created (wrong)

QC #: Date Reported: Area:95898 7/7/2011 Compatibility\Previous -> Current

Description: Steps:[QC Short Description] Auto-generated standard copy constructor not longer calls: a) calls the base constructor b) copies fields from source [QC Description] [REGRESSION] QC Entry 95898

// Compile, link and run the following console application: #include <System.hpp> #include <stdio.h> class TMyClass : public TObject { public: TMyClass(int AValue) : FValue(AValue) {} int FValue; }; int main() { TMyClass *object1 = new TMyClass( 1 ); TMyClass *object2 = new TMyClass( *object1 ); printf("object2->FValue=%d\n", object2->FValue); return 0; } Exp: The expected value of object2->FValue is '1' Act: The value is '0'

(Plus, looking at the assembly code generated you'll see that the base constructor (i.e. TObject's) is also not being called). IOW, the compiler generated copy constructor is broken. This worked fine until XE.

QC #: Date Reported: Area:77221 8/31/2009 Compatibility\BCB<->Delphi

Description: Steps:[QC Short Description] The Rtti unit does not work with runtime packages disabled [QC Description] When "Build with runtime packages" is disabled the Rtti unit is completely useless. When enabled the Rtti unit is just very buggy. QC Entry 77221

Create a new VCL application with the following code somewhere, eg. in a button OnClick: TRttiContext LContext; TArray__1<TRttiType*> Types = LContext.GetTypes(); You also need to include Rtti.hpp at the top of the file. This works when "Build with runtime packages" is enabled and Types gets filled with a list of all types. But when runtime packages is disabled the list is empty.

QC #: Date Reported: Area:4753 11/13/2001 Linker

Description: Steps:The linker doesn't seem to like having a '+' (plus sign) anywhere in a path. Gives error: [Linker Fatal Error] Fatal: Expected a file name:

1. File | New | Application 2. Save All | New Folder < name it something with a '+' in it (ie. C++Folder) > 3. F9 //exp: clean build //res: [Linker Fatal Error] Fatal: Expected a file name:

QC #: Date Reported: Area:81838 2/4/2010 Linker

Description: Steps:[QC Short Description] Add support /3GB aware: IMAGE_FILE_LARGE_ADDRESS_AWARE [QC Description] With C++Builder 2010, default memory manager(heap) has been replaced with FastMM. So, please add support /3GB linker option like Delphi compiler. {$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE} Note: [Enabling An Address Space > 2GB - Appropriate Linker Directive] http://edn.embarcadero.com/article/33416#12EnablingAnAddressSpaceGBQC Entry 81838

QC #: Date Reported: Area:90719 1/6/2011 Linker\ILINK32\Errors/Warnings

Description: Steps:The following code throws a bunch of warnings and then finally a linker error (see below). Only occurs when application is built statically. #include "shlobj.h" wchar_t *APath = NULL;

1. new Console App 2. include the following code: #include "shlobj.h" wchar_t *APath = NULL; HRESULT hr = ::SHGetKnownFolderPath( FOLDERID_Desktop, 0, NULL, &APath );

HRESULT hr = ::SHGetKnownFolderPath( FOLDERID_Desktop, 0, NULL, &APath ); Errors: [ILINK32 Warning] Warning: BSS : 0x00000000 / 0x00800000 [ILINK32 Warning] Warning: CODE : 0x000472bb / 0x00800000 [ILINK32 Warning] Warning: DATA : 0x00031790 / 0x00800000 [ILINK32 Warning] Warning: DEBNAM : 0x0012d15f / 0x00800000 [ILINK32 Warning] Warning: DEBSYM : 0x00041b0c / 0x00800000 [ILINK32 Warning] Warning: DEBTYP : 0x0021a0d9 / 0x00800000 [ILINK32 Warning] Warning: Extdef flags : 0x00000418 / 0x00004000[ILINK32 Warning] Warning: Extdefs : 0x00001060 / 0x00004000 [ILINK32 Warning] Warning: External types : 0x00000910 / 0x00040000 [ILINK32 Warning] Warning: Import symbols : 0x0000030c / 0x00100000 [ILINK32 Warning] Warning: Line number cache : 0x0001429e / 0x00060000 [ILINK32 Warning] Warning: OBJ symbols : 0x000a0cc8 / 0x00400000 [ILINK32 Warning] Warning: Public GSX : 0x0000c5e4 / 0x000c0000[ILINK32 Warning] Warning: Public types : 0x00015280 / 0x00080000[ILINK32 Warning] Warning: Publics : 0x0006f504 / 0x000c0000 [ILINK32 Warning] Warning: SegRelocs : 0x00059704 / 0x00800000[ILINK32 Warning] Warning: StringBlock : 0x000009fb / 0x00800000[ILINK32 Warning] Warning: TLS : 0x0000009c / 0x00800000 [ILINK32 Warning] Warning: Type names : 0x0003633d / 0x00100000[ILINK32 Warning] Warning: UNKNOWN : 0x00000018 / 0x00800000[ILINK32 Warning] Warning: Virdefs : 0x0000c5e4 / 0x00020000 [ILINK32 Warning] Warning: C:/Documents and Settings/Administrator/Desktop/Known Folders/BCB XE/KnownFolders.ilc: 0x00308000 / 0x08000000 [ILINK32 Warning] Warning: C:/Documents and Settings/Administrator/Desktop/Known Folders/BCB XE/KnownFolders.ild: 0x00062000 / 0x08000000 [ILINK32 Warning] Warning: C:/Documents and Settings/Administrator/Desktop/Known Folders/BCB XE/KnownFolders.ilf: 0x00526000 / 0x08000000 [ILINK32 Warning] Warning: C:/Documents and Settings/Administrator/Desktop/Known Folders/BCB XE/KnownFolders.ils: 0x008ae000 / 0x06000000 [ILINK32 Warning] Warning: C:/Documents and Settings/Administrator/Desktop/Known Folders/BCB XE/KnownFolders.tds: 0x01320000 / 0x08000000 [ILINK32 Warning] Warning: unknown heap name : 0x08000000 / 0x08000000 [ILINK32 Warning] Warning: Error detected (PE972) [ILINK32 Error] Error: Unable to perform link QC Entry 90719

3. Compile -> application compiled successfully 4. Select linking with static RTL 5. Uncheck the Build with runtime packages check button exp: application compiled without warnings and errors rez: warnings and unable to perform link error

QC #: Date Reported: Area:

21417 11/14/2005 ActiveX\IDE\Project Manager Interaction

Description: Steps:[QC Short Description] Project Manager does not display the Project_TLB.h file [QC Description] The Project Manager never displays the Project_TLB.h file of an ActiveX Library. It does display the Project_TLB.cpp file by itself, which rarely does anything when clicked on. QC Entry 21417

File | New | Other | ActiveX | ActiveX Library Expected: "Project_TLB.cpp" treenode that displays two child nodes - "Project_TLB.cpp" and "Project_TLB.h" Actual: "Project_TLB.cpp" treenode that has no child nodes at all. File | Save All create new directory and save all files

Flie | Close All File | Reopen and selcet the project check nodes on PM // _ATL.cpp has sub nodes _ATL.cpp _ATL.h // _TLB.cpp doesn't have sub node

QC #: Date Reported: Area:23482 1/13/2006 ActiveX\Code Generators\C++

Description: Steps:[QC Short Description] Imported ActiveX into new package but package won't install (linker errors) [QC Description] When trying to install a package with the imported flash activex control the linker generates 8 errors: [Linker Error] Error: Unresolved external '__stdcall Shockwaveflashobjects_tlb::IDispatchEx::GetDispID(wchar_t *, unsigned long, long *)' referenced from D:\RICHARD'S DOCUMENTS\BORLAND STUDIO PROJECTS\DEBUG_BUILD\SHOCKWAVEFLASHOBJECTS_OCX.OBJ:: QC Entry 23482

1. tregsvr attached .tlb 2. File | New C++ Package 3. Component | Import Component 4. Select Type Library 5. Find and select this type library in the list: "Shockwave flash", click Next 6. Check the Generate Component Wrapper check box, click Next7. Add unit to package, click Finsih 8. Ctrl + F9 //res: [Linker Error] Error: Unresolved external '__stdcall Stuffflash_tlb::IDispatchEx::GetDispID(wchar_t *, unsigned long, long *)' referenced from ..\DEBUG_BUILD\STUFFFLASH_OCX.OBJ -- Previous steps -- 1. Open up attached project in Package1.zip 2. Build 3. Get Error that the linker can't find GetDispID Note: if you comment out __declspec (package) then it works. -- Old steps -- 1) Launch Borland C++Builder 2006 2) Select 'File->New->Package - C++Builder' 3) Select 'Component->Import Component' 4) Select 'Import ActiveX Control' radio button 5) Choose 'Shockwave Flash' from the list 6) Click 'Next' 7) Accept default options: Class Name(s): = TShockwaveFlash Palette Page: = ActiveX Unit Dir Name: = c:\program files\borland\bds\4.0\Imports\ Search Path: = $(BDS)\Include\Indy9;$(BDS)\Lib\Indy9;c:\windows\system32 'Generate Component Wrappers' is checked and click 'Next' 8) Select 'Add unit to Package1.bdsproj project' 9) Click 'Finish' 10) In 'Project Manager' right-click on 'Package1.bpl' and select Install

QC #: Date Reported: Area:92394 3/18/2011 ActiveX\Code Generators\C++

Description: Steps:[QC Short Description] ciSingleInstance and ciInternal COM object cannot be created [QC Description] Creating a COM object in a DLL or EXE choosing single instance or internal in wizard does not produce different code than multiple instance QC Entry 92394

- In an empty project - Add new Active X Library - Add new Automation Object - name it anything you want - select single instance or internal - save and look at the imple file generated code the createfactory will state Comobj::ciMultiInstance rather than what you chose. The COM object when used acts a multi instance.

QC #: Date Reported: Area:5521 8/6/2003 ActiveX\Type Library Editor

Description: Steps:[QC Short Description] Should be self explanatory! If not then 1/ Create an automation object

Redundant semicolon always added to end of all implementation stubs! [QC Description] Minor problem When refresh implementation button is pressed all newly generated implementation stubs have a semicolon added at the end of the closing brace e.g. STDMETHODIMP TEDGMsgContextImpl::set_TargetAddress(long Value) { try { } catch(Exception &e) { return Error(e.Message.c_str(), IID_IEDGMsgContext); } return S_OK; }; There should NOT BE a semicolon HERE! Causes minor issues with source code validation tools (such as lint) QC Entry 5521

2/ Add a method or property 3/ Refresh implementation 4/ Examine generated code

QC #: Date Reported: Area:79606 11/18/2009 CodeGuard

Description: Steps:[QC Short Description] Pointer arithmetic underrun [QC Description] Pointer arithmetic underrun in process: ScadaKSA.exe(3140) - c:\program files\embarcadero\rad studio\7.0\include\../include/dinkumware/streambuf#201 QC Entry 79606

1. if you use sstream in this example CodeGuard reports Pointer arithmetic underrun in process: ScadaKSA.exe(3140) - c:\program files\embarcadero\rad studio\7.0\include\../include/dinkumware/streambuf#201 in each case if you use dynamic RTL or not; #include <sstream> using namespace std; void main () { ostringstream os; os<< 2; string s = os.str(); } 2. only way i solved this issue is to turn off is to set (in options) C++ Compiler -> Debugging -> Enable CodeGuard ->Monitor inline pointer access = FALSE but this turns off basic codeguard functionality.

QC #: Date Reported: Area:90513 12/26/2010 Compiler\C++

Description: Steps:[QC Short Description] Complier error (2 variables get the same memory address) [QC Description] In the case of the following code the compiler creates bad assembly code. Different varables get the same memory addres. The code: class Base { public: int Fa; int Fb; }; class TTest : private Base { public: TTest() {

1) Create a new VCL forms application 2) Copy the code above to header file 3) create an instance of TTest 4) Run 5) Observe the 'Error'

Fa=0; Fb=5; if (Fa == Fb) ShowMessage("Error"); } __property int a = { read = Fa}; virtual bool AnyFunction(){return true;} }; CPU window: TestMain.h.23: Fa=0; 00401D3B 8B4508 mov eax,[ebp+$08] 00401D3E 33D2 xor edx,edx 00401D40 895004 mov [eax+$04],edx TestMain.h.24: Fb=5; 00401D43 8B4D08 mov ecx,[ebp+$08] 00401D46 C7410405000000 mov [ecx+$04],$00000005 Note that the problem only occurs if there is a virtual function and a propery in the TTest class. C++ Builder 5 works fine. QC Entry 90513 QC #: Date Reported: Area:95526 6/23/2011 Compiler\C++

Description: Steps:[QC Short Description] conditional operator ?: corrupts input variable [QC Description] Conditional operator in XE corrupts input variables. std::wstring str2 = condition ? str1 : std::wstring(L"cou cou"); if condition is true, str1 will be assigned to str2, then str1 will become empty. QC Entry 95526

std::wstring s1 = L"Hello world"; std::wstring s2 = (true) ? s1 : std::wstring(); // BUG?!: s1 cleared std::wstring s3 = s1; // s3 still empty Thanks to Eike Petersen for providing simplified code.

QC #: Date Reported: Area:88686 10/5/2010 Compiler\C++

Description: Steps:[QC Short Description] [ILINK32 Error] Fatal: The symbol @%Foo$i%@$barow$xqv has zero size, or excessive offset in module 'S:\..\FILE1.OBJ' [QC Description] #include <vcl.h> #pragma hdrstop #include <tchar.h> template <typename T> class FooBar { public: inline T* operator->() const { throw Exception("not supposed to see this!"); } }; namespace foons { template <typename T> class TBar; template <typename T> struct Bar { typedef FooBar<TBar<T> > Type; typedef TBar<T> BaseType; };

Exp: compile and link without errors Act: [ILINK32 Error] Fatal: The symbol @%Foo$i%@$barow$xqv has zero size, or excessive offset in module 'S:\..\FILE1.OBJ' Quote from Bruneau: It's definitely a bug against whatever generated the .obj: the linker is simply reporting "Oh no, you won't get me to fixup to this: something's wrong here!". Before the linker added this check, it would proceed and then fail later, causing some error that lead one to believe that the culprit was the linker. So, I'm glad about this particular addition: during the beta cycle it caught lots of bad .objs generated by DCC32 (specially for generics); it seems that now it's catching bad .objs generated by BCC32 for the new import/export logic we've put in XE.

} template <typename T> class PACKAGE Foo { protected: T* ptr; public: inline Foo() { } public: inline foons::Bar<T>::Type operator->() const; }; template <typename T> inline foons::Bar<T>::Type Foo<T>::operator->() const { throw Exception("what happened to me???"); } namespace foons { template <typename T> class TBar { public: int __fastcall Foo() const { throw Exception("can't get here either"); } }; } #pragma argsused int _tmain(int argc, _TCHAR* argv[]) { Foo<int> foo; foo->Foo(); return 0; } QC Entry 88686 QC #: Date Reported: Area:89869 11/22/2010 Compiler\C++

Description: Steps:[QC Short Description] destructor not called after exception [QC Description] #include <iostream> #include <tchar.h> int foobar_count = 0; class FooBar { public: inline FooBar(const FooBar& obj) { foobar_count++; } inline FooBar() { } template <typename P> inline FooBar(const P& obj) { foobar_count++; std::cout<<"FooBar c'tor"<<std::endl; } inline ~FooBar() { std::cout<<"FooBar d'tor"<<std::endl; foobar_count--; }

Compile with the following command line. bcc32 test.cpp run test.exe exp: FooBar c'tor FooBar d'tor passed. act: FooBar c'tor failed.

inline operator bool() const { return false; } }; #pragma option push -xd- struct Base { inline Base() { } inline ~Base() { } }; template <typename T> class Bar : public Base { public: inline Bar() { } }; template <typename T> class Foo : public Bar<T> { public: inline Foo() { } }; #pragma option pop #pragma argsused int _tmain(int argc, _TCHAR* argv[]) { try { Foo<void> foo; if (FooBar f = foo) { } else { throw 1; } } catch (...) { } if (foobar_count) { std::cout<<"failed!!!!!"<<std::endl; } else { std::cout<<"passed."<<std::endl; } return 0; } QC Entry 89869 QC #: Date Reported: Area:88001 9/12/2010 Compiler\C++

Description: Steps:[QC Short Description] Compiler outputs warning 8122 indiscriminantly when all warning are enabled [QC Description] When all warnings are enabled the new "8122 Dllexport member must be of exported type" warning is output for valid class declarations. If only explicit warnings are enabled and "8122" is checked on then the warning is not output.

- Create a new Package or VCL Forms Application project - Edit project options and enable all compiler warnings - Add the code from the description - Compile exp: Successful compilation with no warnings act: [BCC32 Warning] W8122 dllexport class member 'TNotMuch::Code' should be of exported type

Consider this code: class PACKAGE TNotMuch { public: String Code; }; The compiler will output the following warning: [BCC32 Warning] W8122 dllexport class member 'TNotMuch::Code' should be of exported type This happens for any class exported via the PACKAGE macro or __declspec(dllexport). And, it only seems to happen for certain property types. It errors for String, AnsiString, and WideString. I have tried other types that do not generate the error such as int, double, and TComponent*. QC Entry 88001 QC #: Date Reported: Area:88813 10/10/2010 Compiler\C++

Description: Steps:[QC Short Description] Optimizer's BUG [QC Description] See Attachments. Added by Sysop <<<<<<<<<< This issue is related to QC#85745(InternalTracking#277648). The issue is not fixed yet in C++Builder XE. >>>>>>>>>> QC Entry 88813

bcc32 -O2 280786.cpp 280786.exe exp: no output (as without -O2) act: Compiler wrong!

QC #: Date Reported: Area:89420 11/3/2010 Compiler\C++

Description: Steps:[QC Short Description] bcc32 fails to compile code when "expand inline functions" is not disabled [QC Description] The attached cpp file (generated by cpp32) compiles fine with the following command line: bcc32.exe -c -w-par -vi- mainform.cpp BUT fails with the following: bcc32.exe -c -w-par mainform.cpp with this error message: Error E2027 mainform.cpp 850028: Must take address of a memory location in function _fastcall CleanupUpdateProj(TfrmMain *,Server,const UnicodeString) *** 1 errors in Compile *** QC Entry 89420

Compile the attached mainform.cpp file as per description.

QC #: Date Reported: Area:76879 8/20/2009 Compiler\C++\Back End

Description: Steps:[QC Short Description] BCC doesn't correctly emit the updated type info

- Download the attached sample project, compile it (bcc32 -WCV qc76879.cpp) and run it. Expected output: // ----- Testing TObject...

[QC Description] The type info structures in TypInfo.pas have been updated to support the new RTTI features, primarily attributes. Look at the following diff of TTypeData from Tiburon to Weaver: // ----- TTypeData = packed record case TTypeKind of ... tkClass: ( ClassType: TClass; // most data for instance types is in VMT offsetsParentInfo: PPTypeInfo; PropCount: SmallInt; // total properties inc. ancestors UnitName: ShortStringBase; - {PropData: TPropData}); + {PropData: TPropData; + PropDataEx: TPropDataEx; + ClassAttrData: TAttrData;}); ... end; // ----- However, BCC doesn't emit the new type info fields, primarily the PropDataEx and ClassAttrData fields. It is understandable that BCC doesn't fully support the new RTTI features such as attributes right now, but it should at least zero out the new fields - right now the type info generated by BCC is simply wrong, and all code that tries to read in all type info fields simply crashes. To demonstrate the failure, I've attached a test case that simply reads out and skips above fields. It works fine for DCC-built type info but, as expected, it runs into AVs when consuming BCC-generated type info. In addition, once QC's #76875 and #76877 are fixed, I think Rtti.pas will form another good test case for this problem. QC Entry 76879

PASS Testing TStringList... PASS Testing TComponent... PASS Testing TInterfacedObject... PASS Testing TCppObject... PASS Testing TCppStringList... PASS Testing TCppComponent... PASS Testing TCppInterfacedObject... PASS // ----- Actual output (message language may differ depending on locale and setup): // ----- Testing TObject... PASS Testing TStringList... PASS Testing TComponent... PASS Testing TInterfacedObject... PASS Testing TCppObject... FAIL EAccessViolation: Zugriffsverletzung bei Adresse 0040166C in Modul 'qc.exe'. L esen von Adresse 0050AC36 Testing TCppStringList... FAIL EAccessViolation: Zugriffsverletzung bei Adresse 0040166C in Modul 'qc.exe'. L esen von Adresse 004FC5CF Testing TCppComponent... FAIL EAccessViolation: Zugriffsverletzung bei Adresse 0040166C in Modul 'qc.exe'. L esen von Adresse 004FB8AE Testing TCppInterfacedObject... FAIL EAccessViolation: Zugriffsverletzung bei Adresse 0040166C in Modul 'qc.exe'. L esen von Adresse 004FB000 // -----

QC #: Date Reported: Area:

91407 2/8/2011 Compiler\C++\Back End

Description: Steps:[QC Short Description] Calling a virtual class method raises the AV [QC Description] Calling a virtual class method raises the AV. Please review the attached sample. This sample contains a TTest object with a GetID2 virtual class method. Within the Button.Onclick event, we call this method, and it raises the AV: ShowMessage(IntToStr(test->GetID2())); We believe that the AV should not occur, because in the "Class Methods" topic (http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/devwin32/classmethods_xml.html), it is stated that it is possible to use virtual class methods. QC Entry 91407

1. Compile and run our sample. 2. Click the "Button1" button.

QC #: Date Reported: Area:83835 4/13/2010 Compiler\C++\Back End

Description: Steps:[QC Short Description] Compiler doesn't initialize temporary records to 0 [QC Description] Assuming you have a simple managed record, and a function which returns an instance of it: // ----- type TManagedRecord = record ManagedField: String; end;

- Download the attachment, execute build.bat - Execute qc83835.exe Expected output: Initial result value: 00000000 Initial result value: 00000000 Actual output: Initial result value: 00000000 Initial result value: 00000001 Expected behavior: executes and terminates cleanly Actual behavior: executes and terminates with an access violation

function GetManagedRecord: TManagedRecord; begin Result.ManagedField := 'Foo'; end; // ----- When calling GetManagedRecord(), the caller passes a reference to a temporary TManagedRecord which is being represented by 'Result'. When calling from Delphi code, DCC will make the caller initialize this temporary record to zero. IOW, upon entering GetManagedRecord(), Result.ManagedField is always initialized to nil. Unfortunately this isn't the case when calling the function from C++ code. C++ doesn't know an implicit 'Result' variable; the caller expects the callee to initialize the temporary record if needed. This basically means that you can't invoke Delphi-written functions returning managed records from C++ code. QC Entry 83835 QC #: Date Reported: Area:62524 5/24/2008 Compiler\C++\Front End

Description: Steps:[QC Short Description] Boost related Internal Compiler Error (conversion\lexical_cast_test) [QC Description] Compiling the enclosed preprocessed source results in the following error message: Fatal F1004 QC62524.i 55801: Internal compiler error at 0x46574d with base 0x400000 in function operator lexical_stream_limited_src<char,lexical_streambuf_fake, std::char_traits<char> >::<<(int) Fatal F1004 QC62524.i 55801: Internal compiler error in function operator lexical_stream_limited_src<char,lexical_streambuf_fake,std::char_traits<char> >::<<(int) QC Entry 62524

bcc32 -c -P QC62524.i exp: completed compilation, possibly with errors act: internal compiler error

QC #: Date Reported: Area:89640 11/13/2010 Compiler\C++\Front End

Description: Steps:[QC Short Description] __delphirtti() sometimes causes an internal code generation error [QC Description] When __delphirtti() is used with System::Pointer you get an internal code generation error. It doesn't have to be System::Pointer. Several other types causes the same error, e.g. System::Openstring or System::PackageInfo. QC Entry 89640

Create a VCL application and add the following line somewhere: TTypeInfo *a = __delphirtti(System::Pointer); When compiling you get the following error: [BCC32 Fatal Error] Unit1.cpp(201): F1001 Internal code generator error

QC #: Date Reported: Area:

18831 3/11/1999 Compiler\C++\Front End\Diagnostics

Description: Steps:This code gets warning W8061: Initialization is only partially bracketed. struct A { int a[10]; }; A a = {1, 2}; [QC Entry 18831]

bcc32 -c 46793.cpp Result: Warning W8061 46793.cpp 5: Initialization is only partially bracketed

QC #: Date Reported: Area:

18896 4/12/1999 Compiler\C++\Front End\Diagnostics

Description: Steps:This code gets an internal compiler error: struct A{ operator double(int); }; A::operator double(); [QC Entry 18896]

bcc32 -c 47774.cpp //res: Fatal F1004 47774.cpp 2: Internal compiler error at 0x469fd8 with base 0x400000

QC #: Date Reported: Area:

8680 7/21/2004 Compiler\C++\Front End\Exception Handling

Description: Steps:[QC Short Description] Throwing an Exception can clear GetLastError() [QC Description] For example, when creating a TFileStream instance using a path that produces a Win32 API failure, which is reported by FileOpen() or FileCreate() returning -1, the GetLastError() function returns 0 when the exception is handled in the user's code. Somewhere in the constructor of the Exception class, the error code is getting reset while the Message property is being formatted. The error code needs to be preserved. QC Entry 8680

TFileStream *Strm = NULL; try { Strm = new TFileStream("C:\\No Existant\\file.ext", fmOpenRead); } catch(const Exception &e) { DWORD dwError = GetLastError(); // <-- here //... } Expected: dwError to be 2 (ERROR_FILE_NOT_FOUND) or 3 (ERROR_PATH_NOT_FOUND) Actual: dwError is 0 NOTE: This error only occurs when linking with dynamic RTL + Packages.

QC #: Date Reported: Area:

89260 10/26/2010 Compiler\C++\Front End\Exception Handling

Description: Steps:[QC Short Description] Use of boost::shared_ptr breaks exception unwinding in constructors [QC Description] boost::shared_ptr provides one useful way of hiding a class's implementation. The header file for the class can be something like #include <boost/shared_ptr.hpp> class X { public: X(); private: struct Impl; boost::shared_ptr<Impl> impl; }; By using boost::shared_ptr, the Impl structure does not need to be defined in the header file. However, in C++Builder XE, an exception thrown in the constructor of X will result in an exception unwinding assertion, and program termination. This did not occur in C++ Builder 2010. QC Entry 89260

The attached project files demonstrate the problem. The main function (test.cpp) is int _tmain(int argc, _TCHAR* argv[]) { try { X x; x.f(); } catch (const std::exception& e) { std::cout << e.what() << std::endl; } return 0; } The class X is defined in the header (x.h) as follows: class X { public: X(); ~X(); void f(); private: struct Impl; boost::shared_ptr<Impl> impl; }; The implementation is in x.cpp: struct X::Impl { Impl(); ~Impl(); }; X::Impl::Impl() { std::cout << "X::Impl ctor\n"; } X::Impl::~Impl() { std::cout << "X::Impl dtor\n"; } X::X() : impl(new Impl()) { std::cout << "X ctor\n"; throw std::runtime_error("could not construct X"); } X::~X() { std::cout << "X dtor\n"; } void X::f() { std::cout << "X::f\n"; throw std::runtime_error("problem in X::f"); } Building and running this program with C++Builder 2010 generates the (correct) output: > X::Impl ctor > X ctor > X::Impl dtor > could not construct X But with C++Builder XE the output is: > X::Impl ctor > X ctor > Assertion failed: varType->tpClass.tpcDtorAddr, file xx.cpp, line 3285 > Abnormal program termination Some other points: 1. If all the code is placed in a single file (e.g. test.cpp), the assertion disappears. (But, of course, this is not very useful for hiding the implementation!) 2. If the exception is not thrown in the constructor, but in some other member function, there is no problem. This can be demonstrated by commenting out the constructor exception throw in the example. 3. The same exception unwinding assertion is raised if the Impl class is left totally undefined, and the X constructor is changed to X::X() { std::cout << "X ctor\n"; throw std::runtime_error("could not construct X"); } Once again, this causes no such problem in C++Builder 2010.

QC #: Date Reported: Area:

90038 11/30/2010 Compiler\C++\Front End\Exception Handling

Description: Steps:[QC Short Description] Cannot catch EOverflow exception

Create a new C++Builder VCL Forms Application - Place the following code in TForm1::TForm1(): String str =

[QC Description] Code that produced an EOverflow exception in C++ Builder 2010 and 2007 no longer produces any exception that can be caught. The Messagebox displayed at the application catch is empty. This is similar to QC 88027 except that the messagebox display is empty. The debugger shows an exception is caught at the TApplication level, but the message is empty. Added by Sysop <<<<<<<<<<< Please see comments of QC for more information. >>>>>>>>>>> QC Entry 90038

std::numeric_limits<double>::max(); Cds->CreateDataSet(); Cds->Open(); Cds->Append(); try { CdsFld->AsString = str; } catch (Exception& E) { ShowMessage(E.Message); } Cds->Post(); Cds->Close(); - Build and run expect: messagebox with Floating Point Overflow message actual: empty messagebox

QC #: Date Reported: Area:

92701 3/30/2011 Compiler\C++\Front End\Exception Handling

Description: Steps:[QC Short Description] Stack unwinding results in a non-constructed base class's destructor being called [QC Description] An exception thrown by a parameter to a base class's constructor may result in the base class's destructor being called, even though the base class has not been constructed. This is a violation of the C++ standard and can result in access violations and other bad things. Added by Sysop <<<< This issue still exists in C++Builder XE(w/ Update1). >>>> QC Entry 92701

1. Build the attached source file. 2. Run it with a nonexistent directory as its command-line parameter. 3. Note that it throws a boost::filesystem exception (as expected) then crashes with an access violation while trying to unwind the stack from the boost::filesystem exception. The debugger indicates that the exception is within boost::filter_iterator's DosWildcardMatcher's mRegex, even though boost::filter_iterator has not been constructed.

QC #: Date Reported: Area:18983 6/7/1999 Compiler\C++\Front End\Language

Description: Steps:Terniary operator returning an object does not complie corectly unless extra parentheses are used. [QC Entry 18983]

bcc32 -c 61809.cpp //res: Error E2357 61809.cpp 11: Reference initialized with 'Foo', needs lvalue of type 'Foo' in function main() Error E2340 61809.cpp 11: Type mismatch in parameter 1 (wanted 'Foo', got 'const Foo &') in function main()

QC #: Date Reported: Area:97624 8/14/2011 Compiler\C++\Front End\Language

Description: Steps:[QC Short Description] E2015 Ambiguity between 'operator COARefTime::double()' and 'operator CRefTime::__int64() const' - DirectShow source code generate ambiguity errors [QC Description] I compile directshow source code and find a ambiguity error. The code is simplied as following. There shouldn't be any ambiguity errors. ----------- [BCC32 Error] File12.cpp(49): E2015 Ambiguity between 'operator COARefTime::double()' and 'operator CRefTime::__int64() const' Full parser context File12.cpp(47): parsing: void get_Duration(double *) ----------- class CRefTime

create a project and copy the following code to compile. ----------- [BCC32 Error] File12.cpp(49): E2015 Ambiguity between 'operator COARefTime::double()' and 'operator CRefTime::__int64() const' Full parser context File12.cpp(47): parsing: void get_Duration(double *) ----------- class CRefTime { public: inline CRefTime() { m_time = 0; }; operator LONGLONG() const { return m_time; }; protected: LONGLONG m_time; }; class COARefTime : public CRefTime { public: COARefTime() {}; operator double() { return double(m_time) / 10000000; }; }; void get_Duration(double * plength) { COARefTime m_Duration; *plength = m_Duration; //E2015 Ambiguity here }

{ public: inline CRefTime() { m_time = 0; }; operator LONGLONG() const { return m_time; }; protected: LONGLONG m_time; }; class COARefTime : public CRefTime { public: COARefTime() {}; operator double() { return double(m_time) / 10000000; }; }; void get_Duration(double * plength) { COARefTime m_Duration; *plength = m_Duration; //E2015 Ambiguity here } QC Entry 97624 QC #: Date Reported: Area:

4878 6/30/2003 Compiler\C++\Front End\Namespaces

Description: Steps:[QC Short Description] Failure to generate code for templates in parent namespace [QC Description] The code listed under Steps reveals a nasty compiler bug. Although a workaround exists, severity critical seems appropriate to me since this can (and has for me) cause program malfunctions and crashes for no apparent reason, while there is absolutely no compiler diagnostic. QC Entry 4878 Happens in BCB6

1. Compile and run this code: #include <iostream> #pragma hdrstop namespace A { template< class T > int answer( const T& ) { return 42; } namespace B { struct Oracle { int tell() { return answer( *this ); } }; } } int main() { A::B::Oracle oracle; std::cout << oracle.tell() << std::endl; } The output is 0 instead of the expected 42! Also according to the missing "line has compiled code" icon on A::answer()'s lines, no code seems to be generated for answer() at all. 2. In the above code, replace return answer( *this ); with return answer( *this, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ); or anything similar and compile again: the code still compiles WITH NO ERROR

QC #: Date Reported: Area:

79973 12/2/2009 Compiler\C++\Front End\Pre-Compiled Headers

Description: Steps:[QC Short Description] PCH treats include names as if they were DOS names [QC Description] Long include file names are truncated to 8 characters and looked up again if an exact match is not found when used in pre-compiled headers. This does not happen after #pragma hdrstop or with precompiled headers turned off. Attached code: #include <iostream_is_what_i_want> // line 1 #pragma hdrstop // line 2 #include <iostream_is_what_i_want> // line 3 int main()

bcc32 -c -H qc79973 Exp (this is result without the -H option): Error E2209 qc79973.cpp 1: Unable to open include file 'iostream_is_what_i_want' Error E2209 qc79973.cpp 3: Unable to open include file 'iostream_is_what_i_want' Error E2090 qc79973.cpp 7: Qualifier 'std' is not a class or namespace name in function main() Error E2379 qc79973.cpp 7: Statement missing ; in function main() *** 4 errors in Compile *** Act: Error E2209 qc79973.cpp 3: Unable to open include file 'iostream_is_what_i_want' *** 1 errors in Compile *** [Steps as originally filed. Sysop was unable to reproduce step 7 - perhaps different after applying patch 4] 1) Add a new C++ unit to a project 2) Replace the contents of unit.s cpp file with this lines //#pragma hdrstop // line 1 #include <iostream_is_what_i_want> // line 2 //#include <what_would_be_included> // line 3 int main(int, char* argv) { std::ostream o; return 0; } 3) Check in Project Options that precompiled headers are turned on 4) Compile unit's code 5) It compiles with no error, thou the code includes module

{ std::ostream o; return 0; } [Original description] The following code compiles with no errors in both CB2010 and CB2006 with precompiled headers turned on (note the name of the included file on line 2). //#pragma hdrstop // line 1 #include <iostream_is_what_i_want> // line 2 //#include <what_would_be_included> // line 3 int main(int, char* argv) { std::ostream o; return 0; } It looks like if the compiler cuts the include names to 8 chars and adds .h automatically, if precompiled headers are turned on (line 1 then includes iostreams.h, which succeeds). See Steps for more. QC Entry 79973

<iostream_is_what_i_want> that does not exist. 6) Uncommenting line 1 (#pragma hdrstop) will result in copiler error E2209 Unable to open include file 'iostream_is_what_i_want' as one would expect. 7) With line 1 commented out and line 3 uncommented you get the error E2209 Unable to open include file 'what_wou.h' 8) With line 1 uncommented and line 3 uncommented you get here the error E2209 Unable to open include file 'what_would_be_included_here'

QC #: Date Reported: Area:

61468 4/26/2008 Compiler\C++\Front End\Preprocessor

Description: Steps:[QC Short Description] Preprocessor creates file that will not compile [QC Description] The preprocessor file for the following code errs on compile with the -O2 switch even though the original code compiles without error with the same switch. Attached code: #include <windows.h> int main() { return 0; } QC Entry 61468

cpp32.exe -O2 qc61468.cpp bcc32.exe -P -O2 qc61468.i res: Embarcadero C++ 6.30 for Win32 Copyright (c) 1993-2009 Embarcadero Technologies, Inc. Preliminary version built Dec 7 2009 17:22:31 qc61468.i: Error E2316 qc61468.i 8743: '__strcmp__' is not a member of 'std' Error E2272 qc61468.i 8743: Identifier expected Error E2316 qc61468.i 8744: '__strcpy__' is not a member of 'std' Error E2272 qc61468.i 8744: Identifier expected *** 4 errors in Compile ***

QC #: Date Reported: Area:

33714 9/8/2006 Compiler\C++\Front End\Preprocessor

Description: Steps:[QC Short Description] #import fails [QC Description] testprog.cpp containing: //#import <c:\\windows\\system32\\richtx32.ocx> //#import "c:\\windows\\system32\\richtx32.ocx" #import "c:\windows\system32\richtx32.ocx" int main(int argc, char *argv[]) { return 0 ; } and compiling with

<sysop> download the attached file and compile it. I used sysmon.ocx since I have Win2K and richtx32.ocx was not on my system. Original steps follow: </sysop> Extract test program from above description, place in file, adjusting control imported to be one you have on your system, or adjusting path as necessary. Compile with command shown in description.

bcc32 -c testprog.cpp Produces an error "Unable to open ' richtx32.tlh'", where there is apparently an extraneous extra character in front of the file name. (Note that the file richtx32.tlh [with no leading extraneous character] has been produced in the directory after the compilation attempt.) All 3 versions of the #import produce the same error - they were various attempts hunting for a possible workaround. (richtx32.ocx is not the item I wish to use - it just seems to be one present in an XP installation QC Entry 33714 QC #: Date Reported: Area:86264 7/14/2010 Compiler\C++\Front End\RTTI

Description: Steps:[QC Short Description] C++ compiler doesn't generate correct RTTI for everything but plain non-virtual member functions [QC Description] When retrieving RTTI at runtime for C++ classes, the results are often slightly incorrect in non-trivial details. Look at this class: // ----- class DECLSPEC_DRTTI TTestClass : public TObject { public: virtual void virtualMethod (void) {} __declspec(dynamic) void dynamicMethod (void) {} static void staticMethod (int i, int j) {} __classmethod void classMethod (int i, int j) {} TTestClass (int i) { } __fastcall ~TTestClass (void) {} __published: void publishedMethod (void) {} }; // ----- RTTI returns the following wrong values: - TTestClass::virtualMethod() is TDispatchKind::dkStatic (should be dkVtable) - TTestClass::dynamicMethod() is TDispatchKind::dkStatic (should be dkDynamic) - TTestClass::staticMethod() is TMethodKind::mkProcedure (should be mkClassProcedure) - TRttiMethod::IsStatic returns false for TTestClass::staticMethod() - TTestClass::staticMethod() is reported to have only one argument (should be 2) - TTestClass::classMethod() is TMethodKind::mkProcedure (should be mkClassProcedure) - TRttiMethod::HasExtendedInfo returns false for TTestClass::classMethod() (which implies that no RTTI is available for arguments, return value, calling convention etc.) - TTestClass::publishedMethod() is TMemberVisibility::mvPublic (should be mvPublished) - no RTTI is generated for the TTestClass constructor Complete test case attached. QC Entry 86264

- Download the attachment, run build.bat. - Run the resulting executable (qc86264.exe). Expected output: // ----- procedure virtualMethod: expected & actual: dkVtable procedure dynamicMethod: expected & actual: dkDynamic procedure staticMethod(i: int; j: int): expected & actual: mkClassProcedure procedure staticMethod(i: int; j: int): expected & actual: static procedure staticMethod(i: int; j: int): expected & actual: 2 argumentsprocedure classMethod(i: int; j: int): expected & actual: mkClassProcedure procedure classMethod(i: int; j: int): expected & actual: extended RTTI procedure publishedMethod: expected & actual: mvPublished <constructor>: constructor Create(i: int) PASS // ----- Actual output: // ----- procedure virtualMethod: expected: dkVtable, actual: dkStatic procedure dynamicMethod: expected: dkDynamic, actual: dkStatic procedure staticMethod(j: int): expected: mkClassProcedure, actual: mkProcedure procedure staticMethod(j: int): expected: static, actual: non-static procedure staticMethod(j: int): expected: 2 arguments, actual: 1 argument (basic) procedure classMethod: expected: mkClassProcedure, actual: mkProcedure (basic) procedure classMethod: expected: extended RTTI, actual: basic RTTI procedure publishedMethod: expected: mvPublished, actual: mvPublic <constructor>: no RTTI available FAIL // ----- ######################### Make sure to compile with --xrtti #########################

QC #: Date Reported: Area:18732 6/21/1999 Compiler\C++\Front End\Templates

Description: Steps:The compiler does incorrect deduction of template arguments from a function call re: ISO/IEC 14882:1998(E): 14.8.2.1 - 14.8.2.4

[ANSI] bcc32 62493.cpp //res: no diagnostic

int i; int* pi; volatile int vi; volatile int* pvi; template <class T> void f(T, T*); template <class T> void g(T*, T); int main() { f( i, pi); f(vi, pvi); g(pvi, vi); } [QC Entry 18732]

//exp: 62493.cpp:12: no matching function for call to `f (volatile int &, volatile int *&)' 62493.cpp:13: no matching function for call to `g (volatile int *&, volatile int &)'

QC #: Date Reported: Area:18647 12/15/1999 Compiler\C++\Front End\Templates

Description: Steps:Builder will not compile code that explicitly provides template prameters to function templates that are members of a template class. There is no problem if the class is not templatized. template<class T> class Foo { public: template<class U> void bar( void ); }; template<class T> template<class U> void Foo<T>::bar( void ) { } main() { Foo<int> foo; foo.template bar<short>(); //Error // 'template' qualifier must specify a member template name in function main() } [QC Entry 18647]

bcc32 -c 76889.cpp //res: Error E2105 76889.cpp 17: 'template' qualifier must specify a member template name in function main() Error E2379 76889.cpp 17: Statement missing ; in function main() //exp: no diagnostics

QC #: Date Reported: Area:19131 1/15/1999 Compiler\C++\Front End\Extensions

Description: Steps:Properties that return a struct by reference return 8 bytes instead of 4 bytes. [QC Entry 19131]

bcc32 44657.cpp run 44657.exe should print out 'passed' gp faults right now.

QC #: Date Reported: Area:19597 1/12/1998 Compiler\C++\Front End\Extensions

Description: Steps:The following code generates an internal compiler error: class foo { static foo& getfoo(); __property foo nop = { read = getfoo}; }; Properties that require calls to static methods are not supported by the compiler. However, the internal error should not occur. [QC Entry 19597]

QC #: Date Reported: Area:19527 10/27/1998 Compiler\C++\Front End\Extensions

Description: Steps:When an assignment to a VCL property is part of an equality expression, the assignment doesn't get made. We don't support calling a getter and setter on a property within the same expression. [QC Entry 19527]

make -B USERDEFINES=SHOWBUG -f Project2.bpr Project2.exe Click button and notice text in edit doesn't change. make -B -f Project2.bpr Project2.exe Click button and see correct behavior; edit text changes. --- original text --- make -B - Given a form with a button and an edit on it, with the following OnClick handler for the button: { String string1 = "-DbTest-"; (Edit1->Text = string1.SubString(2, 6)) == ""; } The assignment does not get made (i.e., whatever was in the edit before doesn't get changed to the new substring). The originator claims that clicking repeatedly on the button (i.e., continuously executing the handler) crashed his test program. Couldn't replicate that behaviour. In addition, since the setter for TEdit doesn't return anything, the second statement probably shouldn't compile anyway, since the following won't: void foo() {;} ... (foo() == "") There's a long discussion in the .vcl newsgroup entitled "BCB3's satirical compiler bug", started by Pierre Moillen.

QC #: Date Reported: Area:18832 3/12/1999 Compiler\C++\Front End\Extensions

Description: Steps:Source containing __declspec, when compiled with -A switch, gets an internal compiler error. [QC Entry 18832]

bcc32 -c 46813.cpp Result: Warning W8036 46813.cpp 1: Fatal F1004 46813.cpp 1: Internal compiler error at 0x498408 with base 0x400000

QC #: Date Reported: Area:

18705 11/9/1993 Compiler\C++\Front End\Initialization

Description: Steps:[ANSI] Contrary to ANSI 8.4.3, paragraph 4, the compiler does not allow the initialization of a const reference return type with a different type object that can be converted to the return type (e.g. int -> const unsigned & and int -> const int &). [QC Entry 18705]

bcc -c b4020160 --> Two invalid (one confusing) error messages. Should see warnings regarding intialization of temps.

QC #: Date Reported: Area:

18838 3/12/1999 Compiler\C++\Front End\Initialization

Description: Steps:Code gets error Expression expected. According to the C++ standard, section 8.5, paragraph 1, the following code is legal: int a[1] = {}; [QC Entry 18838]

[ANSI] bcc32 -c 46833.cpp Result: Error 46833.cpp 1: Expression expected

QC #: Date Reported: Area:

18766 7/8/1999 Compiler\C++\Front End\Initialization

Description: Steps:Incorrect compiler error when initializing static variables with constructor syntax. struct Foo { static int x; }; int Foo::x(1); [QC Entry 18766]

bcc32 -c 64370.cpp //res: Warning W8054 64370.cpp 6: Style of function definition is now obsolete Error E2293 64370.cpp 6: ) expected //exp: no diagnostics

QC #: Date Reported: Area:

18781 7/8/1999 Compiler\C++\Front End\Overloading

Description: Steps:The attached code doesn't compile. There is no ambiguity since no conversion from Derived const * to Base * exists. It seems that the compiler is ignoring the constness of the pointer type. class Base {}; class Derived : public Base {}; template<class T> class C_Ptr { public: operator T const *() const; }; template<class T> class Ptr : public C_Ptr<T> { public: operator T*() const; }; void bar(Base *); int main() { Ptr<Derived> x; bar(x); bar((Base *)x); } [QC Entry 18781]

bcc32 64407.cpp //res: Error E2015 64407.cpp 21: Ambiguity between 'Ptr<Derived>::operator Derived *() const' and 'C_Ptr<Derived>::operator const Derived *() const' in function main()Error E2340 64407.cpp 21: Type mismatch in parameter 1 (wanted 'Ptr<Derived>', got 'Base *') in function main() Error E2015 64407.cpp 22: Ambiguity between 'Ptr<Derived>::operator Derived *() const' and 'C_Ptr<Derived>::operator const Derived *() const' in function main() //exp: no errors

QC #: Date Reported: Area:93439 4/28/2011 Compiler\Delphi

Description: Steps:[QC Short Description] DCC32 throws exception, fails when building Delphi package to output C++ headers [QC Description] Running RAD Studio XE with both Delphi & C++ personalities on Win7/64-bit. Tried to build SMcomponents (scalabium.com) with "Generate all C++ Builder files" enabled. IDE reports failure in DCC. Manual execution of the DCC32 command line results in the following error after several (apparently) successful compliations: SMBar.pas(1) Fatal: F2084 Internal Error: GPFC00000FD-00463350-0 Modifying the C/C++ output to any option that DOES NOT create header files results in success; any time header files are elected, the error is thrown QC Entry 93439

See comments. Simplified test case attached. 1) Unzip SMcomponents attached to RAID 2) Open RAD studio with both personalities enabled 3) Open SMCmpntXE.dpk in the SOURCES directory for SMcomponents 4) Modify the "BASE" build configuration's "Output-C/C++" config to "Generate all C++Builder files" 5) Build SMCmpntXE.bpl --> dcc error is thrown <-- The dcc GPF error only occurs if C++ headers are emitted. Another interesting item: Change back to generate DCUs only, and the IDE compiler for error insite seems to be having problems with SMBar.pas as well. Starting on line 110, most of the inherited properties being declared in the published section have red squiggles and the Structure pane shows them as "Undefined property". A Syntax check fails, yet a full compile succeeds and produces a valid BPL. This might have something to do with the C++ header generation failing.

QC #: Date Reported: Area:2298 9/6/2002 Compiler\Delphi\Header Generation

Description: Steps:

[QC Short Description] TComponentList::TComponentList(bool) can't be found [QC Description] The documentation for TComponentList::TComponentList states that a bool can be passed in the constructor for the value of OwnsObjects. However, when a constructor with a bool is used, the following error is received: E2285 Could not find a match for 'TComponentList::TComponentList(bool) I suppose this report could be classified as a documentation issue, rather than a VCL issue, depending on your point of view. One or the other had to be chosen, though. <sysop> The help for BDS doesn't have any documentation for the constructor(s) The following is the help from BCB6 Creates and initializes a TComponentList. __fastcall TComponentList(void); __fastcall TComponentList(bool AOwnsObjects); Description TComponentList creates a TComponentList instance. If no parameter is specified, or if the constructor is called with the true parameter, the new TComponentList is initialized with OwnsObjects set to true. Do not call TComponentList directly. Instead, use the new keyword. </sysop> QC Entry 2298

1) Compile a project containing the following code: TComponentList* foo = new TComponentList(true); 2) Observe error described.

QC #: Date Reported: Area:

92477 3/22/2011 Compiler\Delphi\Header Generation

Description: Steps:[QC Short Description] DCC doesn't emit underlying enum types [QC Description] Forward declaration for enums generated by the delphi compiler is not currently possible because it's underlying type is missing. This could have been implemented since D2009, because of it's partial support for C++0x (which brought that feature into the C++ realm). Currently it's still not possible to forward declare some enums from the VCL like TFieldType, TFieldKind, TLocateOption because auto generated hpp's do not propagate their underlying type as in: enum TFieldType : BYTE { ftUnknown, (...), ftSingle }; enum TFieldKind : BYTE { fkData, fkCalculated, fkLookup, fkInternalCalc, fkAggregate }; enum TLocateOption : BYTE { loCaseInsensitive, loPartialKey }; This really would open the way to have extremely clean and lean headers (and way faster compilations). More information in https://forums.embarcadero.com/thread.jspa?messageID=324731#324731QC Entry 92477

To bypass inclusion of Db.hpp on a header, try to use namespace Db { // #include <DB.hpp> enum TLocateOption : BYTE; } using Db::TLocateOption; it won't compile (type mismatch?). There is no way on the C++ specs to forward declare an enum it we do not specify it's underlying type.

QC #: Date Reported: Area:84198 4/28/2010 Compiler\Delphi\Header Generation

Description: Steps:[QC Short Description] bcc32 -tCV 276923.cpp

Improve support for Delphi records in C++ [QC Description] - Delphi doesn't have the notion of a "default constructor"; for records, the default is to initialize all managed fields to 0 (which is done via RTTI). Unfortunately this means that the compiler won't generate a default constructor for records in C++ header files, whichis problematic especially when the record defines constructors with arguments. TValue takes it to the extreme: it only has a private constructor. Right now there's no clean way to instantiate TValue in C++ code. Suggestion: Have DCC generate a public default constructor for every record. It's as simple as this: // ----- __fastcall [!RecordName] (void) {} // ----- - Delphi supports operator overloads for records, but the aren't beingmapped to C++ operator overloads. For example, look at TTimeSpan in Timespan.hpp and TValue in Rtti.hpp: // ----- struct TValue { ... static TValue __fastcall _op_Implicit(int Value); ... }; ... struct TTimeSpan { ... static TTimeSpan __fastcall _op_Addition(const TTimeSpan &Left, const TTimeSpan &Right); ... static bool __fastcall _op_Equality(const TTimeSpan &Left, const TTimeSpan &Right); ... static TTimeSpan __fastcall _op_UnaryNegation( const TTimeSpan &Value); ... }; Suggestion: if the definitions are public, emit the following additional definitions in the header: // ----- struct TValue { ... TValue (int Value) { *this = _op_Implicit (Value); } ... }; ... struct TTimeSpan { ... TTimeSpan operator - (const TTimeSpan& Value) { return _op_UnaryNegation (Value); } }; TTimeSpan operator + (const TTimeSpan& Left, const TTimeSpan& Right) { return TTimeSpan::_op_Addition (Left, Right); } TTimeSpan operator == (const TTimeSpan& Left, const TTimeSpan& Right) { return TTimeSpan::_op_Equality (Left, Right); } // ----- QC Entry 84198

exp: clean compile/run act: Error E2093 276923.cpp 19: 'operator+' not implemented in type 'TTimeSpan' for a rguments of the same type in function main() Error E2093 276923.cpp 21: 'operator-' not implemented in type 'TTimeSpan' for a rguments of the same type in function main() Error E2015 276923.cpp 30: Ambiguity between '_fastcall operator TDateTime::doub le() const' and '_fastcall operator TDateTime::int() const' in function main() Error E2094 276923.cpp 32: 'operator+' not implemented in type 'TTimeSpan' for a rguments of type 'TDateTime' in function main() Error E2015 276923.cpp 36: Ambiguity between '_fastcall operator TDateTime::doub le() const' and '_fastcall operator TDateTime::int() const' in function main() Error E2093 276923.cpp 39: 'operator==' not implemented in type 'TTimeSpan' for arguments of the same type in function main() Error E2093 276923.cpp 42: 'operator!=' not implemented in type 'TTimeSpan' for arguments of the same type in function main() Error E2093 276923.cpp 45: 'operator>' not implemented in type 'TTimeSpan' for a rguments of the same type in function main() Error E2093 276923.cpp 48: 'operator>=' not implemented in type 'TTimeSpan' for arguments of the same type in function main() Error E2093 276923.cpp 49: 'operator>=' not implemented in type 'TTimeSpan' for arguments of the same type in function main() Error E2093 276923.cpp 52: 'operator<' not implemented in type 'TTimeSpan' for a rguments of the same type in function main() Error E2093 276923.cpp 55: 'operator<=' not implemented in type 'TTimeSpan' for arguments of the same type in function main() Error E2093 276923.cpp 56: 'operator<=' not implemented in type 'TTimeSpan' for arguments of the same type in function main() Warning W8004 276923.cpp 58: 'prevDay' is assigned a value that is never used in function main() *** 13 errors in Compile ***

QC #: Date Reported: Area:92191 3/10/2011 RTL

Description: Steps:[QC Short Description] C++Builder XE - types.hpp file issues [QC Description] Below is the part of the types.hpp file. Both functions have problems. void Offset(int DX, int DY) { left += DX; right += DY; top += DY; bottom += DY; } void Inflate(int DX, int DY) { left -= DX; right += DY; top -= DY; bottom += DY; } QC Entry 92191

Looks like a copy and paste type error. In both functions the right value should be modified by DX instead of DY.

QC #: Date Reported: Area:89676 11/15/2010 RTL\C++

Description: Steps:[QC Short Description] after install of boost update, compiles fail [QC Description] the following errors occur in tuple.h [BCC32 Error] tuple.hpp(58): E2209 Unable to open include file 'boost/fusion/include/tuple.hpp' Full parser context SQLServer.cpp(31): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/algorithm/string.hpp string.hpp(19): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/algorithm/string/trim.hpp trim.hpp(16): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/range/begin.hpp begin.hpp(24): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/range/iterator.hpp iterator.hpp(19): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/range/mutable_iterator.hpp mutable_iterator.hpp(26): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost\tr1\tr1\utility utility(38): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/tr1/utility.hpp utility.hpp(117): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/tr1/tuple.hpp [BCC32 Error] tuple.hpp(59): E2209 Unable to open include file 'boost/fusion/include/std_pair.hpp' Full parser context SQLServer.cpp(31): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/algorithm/string.hpp string.hpp(19): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/algorithm/string/trim.hpp trim.hpp(16): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/range/begin.hpp begin.hpp(24): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/range/iterator.hpp iterator.hpp(19): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/range/mutable_iterator.hpp mutable_iterator.hpp(26): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost\tr1\tr1\utility utility(38): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/tr1/utility.hpp utility.hpp(117): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/tr1/tuple.hpp [BCC32 Error] tuple.hpp(63): E2316 'fusion' is not a member of 'boost'

1. Install update. 2. create a VCL forms application 3. #include <boost/algorithm/string.hpp> to the cpp file 4. compile...errors will be created Added by Sysop <<<<<<<<<<< Please modify '..\include\boost_1_39\boost\tr1\detail\config.hpp' from #if (defined(__BORLANDC__) && (__BORLANDC__ <= 0x630)) ...to #if (defined(__BORLANDC__) && (__BORLANDC__ <= 0x631)) ...>>>>>>>>>>>

Full parser context SQLServer.cpp(31): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/algorithm/string.hpp string.hpp(19): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/algorithm/string/trim.hpp trim.hpp(16): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/range/begin.hpp begin.hpp(24): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/range/iterator.hpp iterator.hpp(19): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/range/mutable_iterator.hpp mutable_iterator.hpp(26): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost\tr1\tr1\utility utility(38): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/tr1/utility.hpp utility.hpp(117): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/tr1/tuple.hpp tuple.hpp(61): namespace std tuple.hpp(61): namespace tr1 [BCC32 Error] tuple.hpp(63): E2272 Identifier expected Full parser context SQLServer.cpp(31): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/algorithm/string.hpp string.hpp(19): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/algorithm/string/trim.hpp trim.hpp(16): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/range/begin.hpp begin.hpp(24): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/range/iterator.hpp iterator.hpp(19): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/range/mutable_iterator.hpp mutable_iterator.hpp(26): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost\tr1\tr1\utility utility(38): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/tr1/utility.hpp utility.hpp(117): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/tr1/tuple.hpp tuple.hpp(61): namespace std tuple.hpp(61): namespace tr1 [BCC32 Error] tuple.hpp(66): E2316 'fusion' is not a member of 'boost' Full parser context SQLServer.cpp(31): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/algorithm/string.hpp string.hpp(19): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/algorithm/string/trim.hpp trim.hpp(16): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/range/begin.hpp begin.hpp(24): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/range/iterator.hpp iterator.hpp(19): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/range/mutable_iterator.hpp mutable_iterator.hpp(26): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost\tr1\tr1\utility utility(38): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/tr1/utility.hpp utility.hpp(117): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/tr1/tuple.hpp tuple.hpp(61): namespace std tuple.hpp(61): namespace tr1 [BCC32 Error] tuple.hpp(66): E2272 Identifier expected Full parser context SQLServer.cpp(31): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/algorithm/string.hpp string.hpp(19): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/algorithm/string/trim.hpp trim.hpp(16): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/range/begin.hpp begin.hpp(24): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/range/iterator.hpp iterator.hpp(19): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/range/mutable_iterator.hpp mutable_iterator.hpp(26): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost\tr1\tr1\utility utility(38): #include C:\Program Files\Embarcadero\RAD

Studio\8.0\include\boost_1_39\boost/tr1/utility.hpp utility.hpp(117): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/tr1/tuple.hpp tuple.hpp(61): namespace std tuple.hpp(61): namespace tr1 [BCC32 Error] tuple.hpp(67): E2316 'fusion' is not a member of 'boost' Full parser context SQLServer.cpp(31): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/algorithm/string.hpp string.hpp(19): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/algorithm/string/trim.hpp trim.hpp(16): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/range/begin.hpp begin.hpp(24): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/range/iterator.hpp iterator.hpp(19): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/range/mutable_iterator.hpp mutable_iterator.hpp(26): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost\tr1\tr1\utility utility(38): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/tr1/utility.hpp utility.hpp(117): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/tr1/tuple.hpp tuple.hpp(61): namespace std tuple.hpp(61): namespace tr1 [BCC32 Error] tuple.hpp(67): E2272 Identifier expected Full parser context SQLServer.cpp(31): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/algorithm/string.hpp string.hpp(19): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/algorithm/string/trim.hpp trim.hpp(16): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/range/begin.hpp begin.hpp(24): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/range/iterator.hpp iterator.hpp(19): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/range/mutable_iterator.hpp mutable_iterator.hpp(26): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost\tr1\tr1\utility utility(38): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/tr1/utility.hpp utility.hpp(117): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/tr1/tuple.hpp tuple.hpp(61): namespace std tuple.hpp(61): namespace tr1 [BCC32 Error] tuple.hpp(68): E2316 'fusion' is not a member of 'boost' Full parser context SQLServer.cpp(31): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/algorithm/string.hpp string.hpp(19): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/algorithm/string/trim.hpp trim.hpp(16): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/range/begin.hpp begin.hpp(24): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/range/iterator.hpp iterator.hpp(19): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/range/mutable_iterator.hpp mutable_iterator.hpp(26): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost\tr1\tr1\utility utility(38): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/tr1/utility.hpp utility.hpp(117): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/tr1/tuple.hpp tuple.hpp(61): namespace std tuple.hpp(61): namespace tr1 [BCC32 Error] tuple.hpp(68): E2272 Identifier expected Full parser context SQLServer.cpp(31): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/algorithm/string.hpp string.hpp(19): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/algorithm/string/trim.hpp trim.hpp(16): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/range/begin.hpp begin.hpp(24): #include C:\Program Files\Embarcadero\RAD

Studio\8.0\include\boost_1_39\boost/range/iterator.hpp iterator.hpp(19): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/range/mutable_iterator.hpp mutable_iterator.hpp(26): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost\tr1\tr1\utility utility(38): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/tr1/utility.hpp utility.hpp(117): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/tr1/tuple.hpp tuple.hpp(61): namespace std tuple.hpp(61): namespace tr1 [BCC32 Error] tuple.hpp(69): E2316 'fusion' is not a member of 'boost' Full parser context SQLServer.cpp(31): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/algorithm/string.hpp string.hpp(19): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/algorithm/string/trim.hpp trim.hpp(16): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/range/begin.hpp begin.hpp(24): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/range/iterator.hpp iterator.hpp(19): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/range/mutable_iterator.hpp mutable_iterator.hpp(26): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost\tr1\tr1\utility utility(38): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/tr1/utility.hpp utility.hpp(117): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/tr1/tuple.hpp tuple.hpp(61): namespace std tuple.hpp(61): namespace tr1 [BCC32 Error] tuple.hpp(69): E2272 Identifier expected Full parser context SQLServer.cpp(31): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/algorithm/string.hpp string.hpp(19): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/algorithm/string/trim.hpp trim.hpp(16): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/range/begin.hpp begin.hpp(24): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/range/iterator.hpp iterator.hpp(19): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/range/mutable_iterator.hpp mutable_iterator.hpp(26): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost\tr1\tr1\utility utility(38): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/tr1/utility.hpp utility.hpp(117): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/tr1/tuple.hpp tuple.hpp(61): namespace std tuple.hpp(61): namespace tr1 [BCC32 Error] tuple.hpp(72): E2316 'fusion' is not a member of 'boost' Full parser context SQLServer.cpp(31): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/algorithm/string.hpp string.hpp(19): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/algorithm/string/trim.hpp trim.hpp(16): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/range/begin.hpp begin.hpp(24): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/range/iterator.hpp iterator.hpp(19): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/range/mutable_iterator.hpp mutable_iterator.hpp(26): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost\tr1\tr1\utility utility(38): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/tr1/utility.hpp utility.hpp(117): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/tr1/tuple.hpp tuple.hpp(61): namespace std tuple.hpp(61): namespace tr1 [BCC32 Error] tuple.hpp(72): E2272 Identifier expected Full parser context SQLServer.cpp(31): #include C:\Program Files\Embarcadero\RAD

Studio\8.0\include\boost_1_39\boost/algorithm/string.hpp string.hpp(19): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/algorithm/string/trim.hpp trim.hpp(16): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/range/begin.hpp begin.hpp(24): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/range/iterator.hpp iterator.hpp(19): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/range/mutable_iterator.hpp mutable_iterator.hpp(26): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost\tr1\tr1\utility utility(38): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/tr1/utility.hpp utility.hpp(117): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/tr1/tuple.hpp tuple.hpp(61): namespace std tuple.hpp(61): namespace tr1 [BCC32 Error] tuple.hpp(73): E2316 'fusion' is not a member of 'boost' Full parser context SQLServer.cpp(31): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/algorithm/string.hpp string.hpp(19): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/algorithm/string/trim.hpp trim.hpp(16): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/range/begin.hpp begin.hpp(24): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/range/iterator.hpp iterator.hpp(19): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/range/mutable_iterator.hpp mutable_iterator.hpp(26): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost\tr1\tr1\utility utility(38): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/tr1/utility.hpp utility.hpp(117): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/tr1/tuple.hpp tuple.hpp(61): namespace std tuple.hpp(61): namespace tr1 [BCC32 Error] tuple.hpp(73): E2272 Identifier expected Full parser context SQLServer.cpp(31): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/algorithm/string.hpp string.hpp(19): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/algorithm/string/trim.hpp trim.hpp(16): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/range/begin.hpp begin.hpp(24): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/range/iterator.hpp iterator.hpp(19): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/range/mutable_iterator.hpp mutable_iterator.hpp(26): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost\tr1\tr1\utility utility(38): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/tr1/utility.hpp utility.hpp(117): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/tr1/tuple.hpp tuple.hpp(61): namespace std tuple.hpp(61): namespace tr1 [BCC32 Error] integral_constant.hpp(34): E2238 Multiple declaration for 'integral_constant<bool,1>::type' Full parser context SQLServer.cpp(31): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/algorithm/string.hpp string.hpp(19): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/algorithm/string/trim.hpp trim.hpp(16): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/range/begin.hpp begin.hpp(24): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/range/iterator.hpp iterator.hpp(20): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/range/const_iterator.hpp const_iterator.hpp(24): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/type_traits/remove_const.hpp remove_const.hpp(14): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/type_traits/is_volatile.hpp

is_volatile.hpp(40): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/type_traits/detail/bool_trait_def.hppbool_trait_def.hpp(15): #include C:\Program Files\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost/type_traits/integral_constant.hppintegral_constant.hpp(13): namespace boost integral_constant.hpp(25): class integral_constant<bool,1> QC Entry 89676 QC #: Date Reported: Area:76880 8/20/2009 RTL\C++\Exception Handling

Description: Steps:[QC Short Description] type_info_hash doesn't free names and thereby causes memory leaks [QC Description] In xxtype.cpp, all type_info_hash functions are registered in a global hash table which is freed by FreeHashTab() to prevent CodeGuard from reporting memory leaks. However, type_info_hash doesn't free its member "name", which can be set by type_info::name(). Fix: // ----- ... // This is the new version that allocates type_info structures on the heap // and deals with delphi classes as well class type_info_hash : public type_info { public: void *vmt; type_info_hash *next; mutable char *name; type_info_hash(void *_tpp, void *_vmt, type_info_hash *_next) : type_info((tpid *)_tpp) { vmt = _vmt; next = _next; name = 0; } + + ~type_info_hash (void) + { + delete [] name; + } }; ... // ----- QC Entry 76880

The description should cover it sufficiently.

QC #: Date Reported: Area:90940 1/18/2011 RTL\C++\Header Files

Description: Steps:[QC Short Description] boost auto_link.hpp with debug [QC Description] In boost header auto_link.hpp lines 261-263 read: #if __BORLANDC__ > 0x561 #pragma defineonoption BOOST_BORLAND_DEBUG -v #endif After every update I have to (re)patch the debug option to -y because -v is an unrecognized switch. Shouldn't this by now be known to the publishers of this header. I'm patching this for about 5 years and had been living in expectation the developers of boost had been able to fix it, but ... QC Entry 90940

create a cpp-file with #include "boost/cregex.hpp" #include "boost/regex.hpp" compile with debug option

QC #: Date Reported: Area:53592 10/17/2007 RTL\C++\I/O Streams

Description: Steps:[QC Short Description] Access violation when using streams in Form destructor [QC Description] Using STL output streams in main Forms destructor causes "Access violation error". When CodeGuard is turned on it detects an error: Method called on freed object in ...\include\dinkumware\xlocale line 104: | } | |> void _Incref() | { // safely increment the reference count This issue has been discussed and confirmed at newsgoup borland.public.cppbuilder.language.cpp (post 51781 and followups) QC Entry 53592

1) Start BCB2006 2) Create a VCL Forms Application. 3) Leave the form 4) Make sure that the main form Form1 is autocreated 5) Paste the following code over the main form's cpp code (Unit1.cpp): #include <vcl.h> #pragma hdrstop #include <string> #include <fstream> #include <io.h> #include <locale> #include "Unit1.h" #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; using namespace std; __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { // use implementation defined locale setlocale( LC_ALL, "" ); // C functions locale::global(locale("")); // C++ STL } __fastcall TForm1::~TForm1() { std::ofstream ofs("temp.txt"); std::string s("tempstring"); ofs << s; } void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action) { // } 6) Go to the project options and set: Linker/Linking/Use dynamic RTL Off Linker/Linking/Full debug info [-v] On 7) Build the application and run it. 8) Close the form (Windows standard button or Alt+F4) - ends up with 'access violation .... write of address....' Or use the attached BCB2006 project to reproduce the error.

QC #: Date Reported: Area:90396 12/19/2010 RTL\C++\Miscellaneous

Description: Steps:[QC Short Description] wmemset function Illegal floating point op [QC Description] Calling wmemset function in CC32110MT.dll with some arguments gives illegal floating point operation exception. This happens under both Windows XP and Windows 7 and on different systems, so I conclude it is a bug in the RTL. [the same program ran under Visual C++ 2008 without problem] QC Entry 90396

Run the following program to reproduce: #pragma hdrstop #include <wchar.h> #pragma argsused int wmain(int argc, wchar_t* argv[]) { wchar_t data[1024] ; wmemset(data, 0xfff5, 556) ; return 0; }

QC #: Date Reported: Area:1403 12/26/1999 RTL\C++\Threads

Description: Steps:Memory leak due to the different threading models used in the VCL and the RTL. This can cause *massive* leakage if a C RTL function is called that caches thread-specific data. Example: strtok (_tcstok) in STRTOK.C has the line #ifdef _MT save = (_TCHAR **)&_thread_data()->thread_token; #else This will allocate some "static" thread data via "_thread_data_new" (see THRDDATA.C). The problem now is that as part of the VCL threading code (TThread in Classes.pas and BeginThread, EndThread in System.pas) there is no call to either of _endthread, _endthreadex, or _unadopt_thread. And that will cause leakage of sizeof(THREAD_DATA) bytes (see _THREAD.H) each time a VCL thread calling in .Execute any C function that uses this "static" thread data is created + destroyed, because the "static" thread data allocated implicitly via the call to _thread_data will never be freed. This obviously is not limited to TThread, but also System::BeginThread and System::EndThread.

bcc32 -tCV -tM 77393.cpp 77393.exe bcc32 -tCV -tM -DBUG 77393.cpp 77393.exe use task manager to view memory usage (You should see memory increasing while running until the process ends). Note increase in memory usage not observed when _beginthread is used.

I suspect that the best fix is to provide a transition layer for System::BeginThread and System::EndThread for C++ code that unadopts the thread so that the "static" thread data managed by the CRTL is freed. QC: 1403 QC #: Date Reported: Area:88561 10/1/2010 SOAP\Server Applications

Description: Steps:[QC Short Description] Unresolved external error when building a WebServices project and with the option to 'Build with runtime packages' turned off. QC Entry 88561

1. Create a new C++ SOAP server app 2. Build project //Result: No errors 3. Project -> Options -> Packages. Turn off 'Build with runtime packages'. 4. Build project //Result: [ILINK32 Error] Error: Unresolved external 'CertOpenSystemStoreW' referenced from C:\PROGRAM FILES\EMBARCADERO\RAD STUDIO\8.0\LIB\WIN32\RELEASE\SOAPRTL.LIB|SOAPHTTPTrans [ILINK32 Error] Error: Unresolved external 'CertEnumCertificatesInStore' referenced from C:\PROGRAM FILES\EMBARCADERO\RAD STUDIO\8.0\LIB\WIN32\RELEASE\SOAPRTL.LIB|CertHelper [ILINK32 Error] Error: Unresolved external 'CertFreeCertificateContext' referenced from C:\PROGRAM FILES\EMBARCADERO\RAD STUDIO\8.0\LIB\WIN32\RELEASE\SOAPRTL.LIB|SOAPHTTPTrans [ILINK32 Error] Error: Unresolved external 'CertCloseStore' referenced from C:\PROGRAM FILES\EMBARCADERO\RAD STUDIO\8.0\LIB\WIN32\RELEASE\SOAPRTL.LIB|SOAPHTTPTrans [ILINK32 Error] Error: Unable to perform link

QC #: Date Reported: Area:46966 6/3/2007 Modeling

Description: Steps:Race condition when starting model support for a project. If you close the project before together finsihed, you get the error: "La référence d'objet n'est pas définie à une instance d'un objet." QC Entry 46966

1. Create a new C++ VCL project 2. Select Model view 3. Accept adding modelization, confirm file save => You see progress bar (untranslated) 4. While progress bar is shown, quickly file -> Close all => You get the error

QC #: Date Reported: Area:87621 8/29/2010 Modeling\IDE Integration

Description: Steps:[QC Short Description] Sequence Diagram Support should not be available [QC Description] The IDE provides support for sequence diagrams in the C++ personality. These items should not be available for selection. Sequence diagrams can be added, and class functions can be added to a new sequence diagram. QC Entry 87621