DDevExtensions 2.4

By | July 23, 2011

I eventually found the time to release version 2.4 of my DDevExtensions RAD Studio IDE Plugin that I used for months myself.

“Package Add Unit” dialog replaced by “File Open” dialog
When you add a unit to a package project the “Package Add Unit” dialog changes your project’s search path. That is something I don’t like, especially because it adds an absolute path that then bites you in other project groups that use the same package or in branches.

Inheritable modules from packages in the project group can be used in the active project
If you write applications that use visual inheritance and you have the base forms/frames/datamodules in a package in your project group, the IDE doesn’t allow you to easily derive from the module if the active project isn’t the one that contains the base modules. With the new option “Show all inheritable modules” all modules from packages appear in the “Inheritable Forms” list.

Keybinding for Shift-F3
In Delphi 2010 the new Editor-Search introduced Shift-F3. But as I’m stuck with Delphi 2009, I have added a Shift-F3 key binding for Delphi 2007 and 2009. It has one limitation: the searched word is found twice if you press Shift-F3 the first time after a F3 because the caret is on the right side of the word and after pressing Shift-F3 it is on the left side of the word. But you get used to it.

Replacement for “Open File At Cursor”
If you work with project groups and your main project uses packages but doesn’t have the package’s paths of the contained source files in the search path, Ctrl+Enter (Open File At Cursor) doesn’t find the source files. DDevExtensions replaces the IDE’s algorithm by one that also looks into the packages who’s unit output directory is in the active project’s search path. That is useful if you use packages as a replacement for the missing feature of static libraries in Delphi (compile files in a package and use the dcu files in the main project).

“Use/Search Unit” dialog improvement
The “Use/Search Unit” dialog uses the same file search algorithm that the new “Open File At Cursor” code uses to find the source files in packages in the project group. For Delphi 2009+ on Windows 7 users it should also be faster as it uses FindFirstFileEx with FindExInfoBasic and FIND_FIRST_EX_LARGE_FETCH. Another optimization is that ShowModal doesn’t have to recreate the form’s handle anymore.

 

Download:

Name IDE Version File Size Downloads Added
DDevExtensions 1.61 5-2007 DDevExtensions161Setup.zip 734.07 KB 20325 times 2009-01-10
DDevExtensions 2.8 Features PDF DDevExtensionsFeatures.pdf 602.92 KB 18200 times 2014-12-27
DDevExtensions 2.4 7, 2007 DDevExtensions24Setup7_2007.zip 535.41 KB 13273 times 2011-07-25
DDevExtensions 2.86 2009-10.3 DDevExtensions286.7z 1.24 MB 6169 times 2020-05-30
DDevExtensions 2.88 2009-10.4.2 DDevExtensions288.7z 1.3 MB 5531 times 2021-07-20

Changelog:

  • Version 2.4 (2011-07-23)
    • Added: “Package Add Unit” dialog replaced by “File Open” dialog. (2007/2009)
    • Added: Inheritable modules from packages in the project group can be used in the active project (Option: Show all inhertiable modules)
    • Added: Keybinding for Shift-F3 to reverse the editor’s search direction. (2007/2009)
    • Added: Replacement for “Open File At Cursor” algorithm that allows to open files from other projects in the project group.
    • Improved: “Use/Search Unit” dialog now shows files from other projects in the group as source file if they compile into a directory that is in the active project’s search path.
    • Fixed: Compile ProgressBar only worked in Delphi 2010 and XE.
    • Fixed: StructureView search hotkey threw “Cannot focus invisible control” if the structure view wasn’t visible.

22 thoughts on “DDevExtensions 2.4

  1. EMB

    There’s any correction to AV in JCL versioning and DDevExtension when opening Options?
    I get it every time… 🙁

    1. Andreas Hausladen Post author

      No, because I can’t reproduce this AV. The thing is, I do not even come near the “Options” dialog’s code in DDevExtensions.

        1. Andreas Hausladen Post author

          You could try to debug the IDE from the JCL Versioning plugin and try to find what fails, so I can have a look at the DDevExtensions code and try to guess what is going wrong. Maybe it is a JCL Versioning bug writing to memory that doesn’t belong to it, and with DDevExtensions loaded, the memory layout looks different.

          1. Petr

            Hi, I was also getting this error, but I decided to install the binary release of JCL for Delphi XE (unstable 2.3: http://cc.embarcadero.com/Item/28222 ). After that the error was gone. Also call stack got fixed in exception dialog.

          2. EMB

            Hmm… never had to debug an extension before. Can you help me saying where I can start? Do you know any tut(how-to) about that?

            What I’ve found so far is that JCL creates one item in Tools menu named “JCL Options”. Any Design package that expose that create the AV.
            Either clicking in “JCL Options” or “Options”, the details of AV shows same stack. I’m reproducing it from what I think is the equivalent to action.execute bellow:
            Exception class name: EAccessViolation
            Exception message: Access violation at address 5003C49A in module 'rtl150.bpl'. Write of address 53909868
            (00152258){Jcl150.bpl } [48153258] Jcldebug.TJclStackInfoList + $A8
            (00151EBA){Jcl150.bpl } [48152EBA] Jcldebug.JclCreateStackList + $1A
            (00005B97){JclBaseExpert150.bpl} [150F6B97] Jclotaexceptionform.TJclExpertExceptionForm.ShowException + $13B
            (0000AB47){JclBaseExpert150.bpl} [150FBB47] Jclotautils.JclExpertShowExceptionDialog + $33
            (0000C5B8){JclBaseExpert150.bpl} [150FD5B8] Jclotautils.TJclOTAExpertBase.ConfigurationActionExecute + $38
            (0001E206){rtl150.bpl } [5004F206] SysUtils.Trim (Line 5811, "SysUtils.pas" + 3) + $18
            (0008011E){Jcl150.bpl } [4808111E] Jclunitversioning.TUnitVersion.RCSfile + $E
            (00003A64){JclBaseExpert150.bpl} [150F4A64] Jclotaunitversioningsheet.TJclOtaUnitVersioningFrame + $228
            (0000C694){JclBaseExpert150.bpl} [150FD694] Jclotautils.TJclOTAExpertBase.AddConfigurationPages + $78
            (000047A3){JclDebugExpert150.bpl} [580257A3] Jcldebugideimpl.TJclDebugExtension.AddConfigurationPages + $1F
            (0000BD35){JclBaseExpert150.bpl} [150FCD35] Jclotautils.TJclOTAExpertBase.ConfigurationDialog + $CD
            (0000C598){JclBaseExpert150.bpl} [150FD598] Jclotautils.TJclOTAExpertBase.ConfigurationActionExecute + $18
            (0007DD6F){rtl150.bpl } [500AED6F] Classes.TBasicAction.Execute (Line 12988, "Classes.pas" + 3) + $7

            Thanks for your work. We really appreciate it. (:

          3. EMB

            @Petr,
            maybe that is the problem. I am using JVCL340CompleteJCL221-Build3845.

          4. Andreas Hausladen Post author

            Sat, 21 Aug 2004 16:27:54 +0200 was a sad day. That is the day I “invented” that TJclUnitVersioning thing. And I think I’m the only one who disables it. I don’t care about what revision one single file has. I do not cherry pick JCL and JVCL units.

          5. EMB

            Why it is not be disabled by default?
            Most users you know, just trust the default configuration. (:

  2. Fabricio

    Added: Inheritable modules from packages in the project group can be used in the active project (Option: Show all inhertiable modules) “

    That one is cooooool! I’ll add a request on QC to it make part of IDE.

  3. Alexey Kuznetsov

    I have an AV after installing DDevExt 2.4 to Delphi XE

    AV in module vcl150.bpl. Read of address 00000288

    stack trace:
    [50306754]{vcl150.bpl } ComCtrls.TCustomTabControl.GetTabs (Line 5692, “ComCtrls.pas” + 0) + $0
    [500A3B7B]{rtl150.bpl } Classes.PropertyNotFound (Line 7241, “Classes.pas” + 1) + $1D
    [500A41BE]{rtl150.bpl } Classes.TReader.PropertyError (Line 7490, “Classes.pas” + 2) + $2
    [500A51F9]{rtl150.bpl } Classes.TReader.ReadProperty (Line 7991, “Classes.pas” + 45) + $C
    [500A4AC5]{rtl150.bpl } Classes.TReader.ReadDataInner (Line 7773, “Classes.pas” + 1) + $5
    [502877B9]{vcl150.bpl } Controls.TWinControl.SetParent (Line 13156, “Controls.pas” + 5) + $5
    [500A4AA7]{rtl150.bpl } Classes.TReader.ReadData (Line 7766, “Classes.pas” + 11) + $5
    [500AE1AD]{rtl150.bpl } Classes.TComponent.ReadState (Line 12468, “Classes.pas” + 0) + $1
    [5027B7E4]{vcl150.bpl } Controls.TControl.ReadState (Line 5421, “Controls.pas” + 3) + $4
    [5027FDCD]{vcl150.bpl } Controls.TWinControl.ReadState (Line 8263, “Controls.pas” + 3) + $5
    [500A491F]{rtl150.bpl } Classes.TReader.ReadComponent (Line 7727, “Classes.pas” + 23) + $8
    [500A5277]{rtl150.bpl } Classes.TReader.ReadProperty (Line 8000, “Classes.pas” + 54) + $10
    [500A4B39]{rtl150.bpl } Classes.TReader.ReadDataInner (Line 7781, “Classes.pas” + 9) + $5
    [500A4AA7]{rtl150.bpl } Classes.TReader.ReadData (Line 7766, “Classes.pas” + 11) + $5
    [500AE1AD]{rtl150.bpl } Classes.TComponent.ReadState (Line 12468, “Classes.pas” + 0) + $1
    [5027B7E4]{vcl150.bpl } Controls.TControl.ReadState (Line 5421, “Controls.pas” + 3) + $4
    [5027FDCD]{vcl150.bpl } Controls.TWinControl.ReadState (Line 8263, “Controls.pas” + 3) + $5
    [500A491F]{rtl150.bpl } Classes.TReader.ReadComponent (Line 7727, “Classes.pas” + 23) + $8
    [500A5277]{rtl150.bpl } Classes.TReader.ReadProperty (Line 8000, “Classes.pas” + 54) + $10
    [500A4B39]{rtl150.bpl } Classes.TReader.ReadDataInner (Line 7781, “Classes.pas” + 9) + $5
    [500A4AA7]{rtl150.bpl } Classes.TReader.ReadData (Line 7766, “Classes.pas” + 11) + $5
    [500AE1AD]{rtl150.bpl } Classes.TComponent.ReadState (Line 12468, “Classes.pas” + 0) + $1
    [5027B7E4]{vcl150.bpl } Controls.TControl.ReadState (Line 5421, “Controls.pas” + 3) + $4
    [5027FDCD]{vcl150.bpl } Controls.TWinControl.ReadState (Line 8263, “Controls.pas” + 3) + $5
    [500A491F]{rtl150.bpl } Classes.TReader.ReadComponent (Line 7727, “Classes.pas” + 23) + $8
    [500A5277]{rtl150.bpl } Classes.TReader.ReadProperty (Line 8000, “Classes.pas” + 54) + $10
    [500A4B39]{rtl150.bpl } Classes.TReader.ReadDataInner (Line 7781, “Classes.pas” + 9) + $5
    [500A4A78]{rtl150.bpl } Classes.TReader.ReadData (Line 7760, “Classes.pas” + 5) + $5
    [500AE1AD]{rtl150.bpl } Classes.TComponent.ReadState (Line 12468, “Classes.pas” + 0) + $1
    [5027B7E4]{vcl150.bpl } Controls.TControl.ReadState (Line 5421, “Controls.pas” + 3) + $4
    [5027FDCD]{vcl150.bpl } Controls.TWinControl.ReadState (Line 8263, “Controls.pas” + 3) + $5
    [500A59E7]{rtl150.bpl } Classes.TReader.ReadRootComponent (Line 8176, “Classes.pas” + 37) + $B
    [500A1E5E]{rtl150.bpl } Classes.TStream.ReadComponent (Line 6321, “Classes.pas” + 3) + $5
    [5009C673]{rtl150.bpl } Classes.InternalReadComponentRes (Line 3201, “Classes.pas” + 7) + $5
    [5009C7E3]{rtl150.bpl } Classes.InitComponent (Line 3258, “Classes.pas” + 4) + $23
    [5009C871]{rtl150.bpl } Classes.InitInheritedComponent (Line 3270, “Classes.pas” + 6) + $8
    [5034E070]{vcl150.bpl } Forms.TCustomFrame.Create (Line 3054, “Forms.pas” + 6) + $8
    [5003A753]{rtl150.bpl } System.@ClassCreate (Line 12121, “System.pas” + 5) + $0
    [5395BEB6]{DDevExtensionsXE.dll} OldPalette.TFrameOldPalette.Create (Line 184, “OldPalette.pas” + 1) + $4
    [5395E5DA]{DDevExtensionsXE.dll} FrmeOptionPageOldPalette.TOldPaletteConfig.SetActive (Line 226, “FrmeOptionPageOldPalette.pas” + 20) + $9
    [5395E518]{DDevExtensionsXE.dll} FrmeOptionPageOldPalette.TOldPaletteConfig.LoadFromXml (Line 199, “FrmeOptionPageOldPalette.pas” + 7) + $4
    [53929D44]{DDevExtensionsXE.dll} PluginConfig.TPluginConfig.Create (Line 123, “PluginConfig.pas” + 8) + $1B
    [5395E362]{DDevExtensionsXE.dll} FrmeOptionPageOldPalette.TOldPaletteConfig.Create (Line 153, “FrmeOptionPageOldPalette.pas” + 1) + $21
    [5395E0C3]{DDevExtensionsXE.dll} FrmeOptionPageOldPalette.InitPlugin (Line 91, “FrmeOptionPageOldPalette.pas” + 1) + $7
    [5395EBBE]{DDevExtensionsXE.dll} Main.IDELoaded (Line 179, “Main.pas” + 25) + $11
    [53906453]{DDevExtensionsXE.dll} Splash.IsIDELoaded (Line 71, “Splash.pas” + 11) + $0
    [50358AF7]{vcl150.bpl } Forms.TApplication.ProcessMessage (Line 9760, “Forms.pas” + 23) + $1
    [50358B22]{vcl150.bpl } Forms.TApplication.ProcessMessages (Line 9782, “Forms.pas” + 1) + $4
    [0041C893]{bds.exe } AppMain.TArray.QuickSort (Line 537, “Generics.Collections.pas” + 6) + $9
    [50396951]{vcl150.bpl } AppEvnts.TCustomApplicationEvents.DoActivate (Line 200, “AppEvnts.pas” + 1) + $C
    [50396FB1]{vcl150.bpl } AppEvnts.TMultiCaster.DoActivate (Line 421, “AppEvnts.pas” + 5) + $C
    [50358095]{vcl150.bpl } Forms.TApplication.WndProc (Line 9380, “Forms.pas” + 126) + $C
    [500AFA64]{rtl150.bpl } Classes.StdWndProc (Line 13491, “Classes.pas” + 8) + $0
    [50358AF7]{vcl150.bpl } Forms.TApplication.ProcessMessage (Line 9760, “Forms.pas” + 23) + $1
    [50358B3A]{vcl150.bpl } Forms.TApplication.HandleMessage (Line 9790, “Forms.pas” + 1) + $4
    [50358E65]{vcl150.bpl } Forms.TApplication.Run (Line 9927, “Forms.pas” + 26) + $3

  4. Julian

    [5395E362]{DDevExtensionsXE.dll} FrmeOptionPageOldPalette.TOldPaletteConfig.Create (Line 153, “FrmeOptionPageOldPalette.pas” + 1) + $21

    is OldPalette gone?

      1. Julian

        I mean that the Old Palette feautre doesn’t exist in this version.
        In 2.3 I can see the option in DDevExtensions options but I can not see it in 2.4
        I guess that you have removed that option so if you have enabled Old Palette feautre in 2.3 then when you upgrade to 2.4, DDevExtensions can’t manage this option.
        (sorry for double post)

        1. Andreas Hausladen Post author

          It exists. The tree node in the DDevExtensions options dialog is also there. The only thing that doesn’t work is a missing event handler.

  5. Julian

    I mean that the Old Palette feautre doesn’t exist in this version.
    In 2.3 I can see the option in DDevExtensions options but I can not see it in 2.4
    I guess that you have removed that option so if you have enabled Old Palette feautre in 2.3 then when you upgrade to 2.4, DDevExtensions can’t manage this option.

  6. Ted Stephens

    Andy,

    I enabled the put “Last Compile” into Version Info. When I change the format from yyyy-mm-dd hh:nn to m/d/yyyy h:nn AM/PM. It stay until I exit the IDE, then it reverts to yyyy-mm-dd hh:nn. I am using Delphi XE. Any ideas?

    Ted

    1. Andreas Hausladen Post author

      Thanks for that bug report. It was a missing “tkUString” in the XML streaming code. I must have missed that one when I did the Unicode migration.

Comments are closed.