PeterPanettone
Members-
Content Count
1318 -
Joined
-
Last visited
-
Days Won
5
Everything posted by PeterPanettone
-
Uses Clause Manager - Project list does not work with map file in 64-bit programs
PeterPanettone replied to PeterPanettone's topic in GExperts
Done: In \Source\Utils\GX_dzMapFileReader.pas, the original TMapFileReader.ParseSegments method is as follows: procedure TMapFileReader.ParseSegments(_StartIdx: Integer); var i: Integer; s: string; p: Integer; begin for i := _StartIdx to FContent.Count - 1 do begin s := FContent[i]; if s = '' then Exit; if TryCutAt(' M=', s) then begin p := Pos(' ACBP=', s); if p > 0 then begin s := Copy(s, 1, p); s := Trim(s); FUnits.add(s); end; end; end; end; Replace it with this code: procedure TMapFileReader.ParseSegments(_StartIdx: Integer); const StrACBP = ' ACBP='; StrALIGN = ' ALIGN='; var i: Integer; s: string; p: Integer; AlignStr: string; begin //CodeSite.Send('TMapFileReader.ParseSegments: AlignTest START'); p := Pos(StrACBP, FContent.Text); if p > 0 then // 32-bit platform AlignStr := StrACBP else begin p := Pos(StrALIGN, FContent.Text); if p > 0 then // 64-bit platform AlignStr := StrALIGN else EXIT; end; //CodeSite.Send('TMapFileReader.ParseSegments: AlignTest END'); // time not measurable for i := _StartIdx to FContent.Count - 1 do begin s := FContent[i]; if s = '' then Exit; if TryCutAt(' M=', s) then begin p := Pos({' ACBP='}AlignStr, s); if p > 0 then begin s := Copy(s, 1, p); s := Trim(s); FUnits.add(s); end; end; end; //CodeSite.Send('TMapFileReader.ParseSegments: FUnits-List at end of ParseSegments', FUnits.Text); end; -
"A Shell link is a data object that contains information used to access another object in the Shell's namespace": Read the whole definition here: https://docs.microsoft.com/en-us/windows/win32/shell/links I was searching for a Delphi VCL library allowing me to easily create a Shell-Link with all properties described in the Microsoft documentation: https://docs.microsoft.com/en-us/windows/win32/api/shobjidl_core/nn-shobjidl_core-ishelllinkw I found a lot of libraries for this purpose, but most of them were outdated or had some flaws or bugs. Most of the libraries lacked the feature to create a Shell-Link with a Hotkey. The ShellBrowser Delphi VCL Library from JamSoftware contains a method to easily create a Shell-Link: https://www.jam-software.com/shellbrowser_delphi/index.shtml Unfortunately, it has no easy method to configure the properties (especially the hotkey property) of the newly created Shell-Link. Fortunately, the above mentioned Microsoft documentation provides all the information to succeed in the task: I use a standard THotKey control in the UI to allow the user to configure a hotkey for the newly created Shell-Link: The THotKey control has these main properties - HotKey and Modifiers: So the whole process of creating the Shell-Link with the Hotkey properties can be achieved with these steps: 1. Get the ItemIdList of the created Link: 2. Provide the IShellLink Interface of the ItemIdList: 3. Declare the IPersistFile interface for the Shell-Link file: 4. Now we need (as mentioned in the Microsoft documentation) to store the virtual key code in the low-order byte and the modifier flags in the high-order byte of the Shell-Link Hotkey property. For this purpose we declare a record containing two byte-fields: Then we get the Hotkey from the THotKey control, assign it to the record and typecast the record to a Word: But the Modifiers value is still missing from the record. So next, we get the Modifier-keys from the THotKey control and assign them to the Modifier Byte of the record: Now we can assign the record (again typecasted to a Word) to the Shell-Link interface: 5. The other Shell-Link properties are easy to set and are explained in the Microsoft documentation. 6. In the last step we can now save the configured Shell-Link: You can download the source code and learn from its implementation: ShellLinkShortcutTest.zip Here is a compiled exe demo of the program: ShellLinkShortcutTest_CompiledExeDemo.zip To compile the source code yourself you need the ShellBrowser library. You can download a free trial version here: https://customers.jam-software.de/shellbrowser_delphi/download.shtml?language=EN The many other features of the ShellBrowser library are explained here: https://www.jam-software.com/shellbrowser_delphi/features.shtml I am not affiliated with JamSoftware, but I recommend the ShellBrowser library as an excellent product. I wish you a lot of fun with this demo!
-
Creating a Shell-Link with hotkey property
PeterPanettone replied to PeterPanettone's topic in I made this
I just tried to use the linked unit. This has nothing to do with what I want. Sorry about that. -
Creating a Shell-Link with hotkey property
PeterPanettone replied to PeterPanettone's topic in I made this
Confirmed. -
Creating a Shell-Link with hotkey property
PeterPanettone replied to PeterPanettone's topic in I made this
Loading a Shell-Link and reading its properties does not work with the above code: -
Creating a Shell-Link with hotkey property
PeterPanettone replied to PeterPanettone's topic in I made this
Unfortunately it does not work: -
Creating a Shell-Link with hotkey property
PeterPanettone replied to PeterPanettone's topic in I made this
Compiler (Delphi 10.3.1 Rio) unfortunately found these errors in the code: [dcc32 Error] ShellLink.pas(93): E2188 Published property 'ItemIDList' cannot be of type POINTER [dcc32 Error] ShellLink.pas(274): E2033 Types of actual and formal var parameters must be identical [dcc32 Error] ShellLink.pas(337): E2033 Types of actual and formal var parameters must be identical [dcc32 Error] ShellLink.pas(338): E2033 Types of actual and formal var parameters must be identical -
Creating a Shell-Link with hotkey property
PeterPanettone replied to PeterPanettone's topic in I made this
When trying to open this link I got this error message: -
I have implemented a few improvements in the Uses Clause Manager Identifier Search: 1. The number of Identifier Search filter results is now displayed. 2. Previously the search term was searched only at the start of the identifier names. Now you can choose between "Match anywhere" and "Match at start". If you change the match type then the filter results are updated automatically. Here are the sources, so you can build GExperts with these new features yourself: GX_UsesExpert5.zip Fixed a small bug just now; if you have already downloaded GX_UsesExpert3.zip or GX_UsesExpert4.zip then re-download this archive. Here are a few Uses Clause Manager features planned for the future: • Export the list of Project Units additional option: Preformatted as uses clause. • Identifier search: Fuzzy-Search option • Identifier search: Optimize filter performance with TParallel.For • Identifier search (or all tabs?): Multiple search terms (like in RFindUnit) • Identifier search: Search the selected Identifier result in custom help files • All Tabs: Button/Combobox on the bottom panel to Copy the selected List item(s) to the clipboard, or to copy the selected unit path(s) to the clipboard, or to copy the selected unit FILES to the clipboard • SearchPath: Add a custom list of user paths • Add a Statusbar to the UCM window which displays the file-path of a single selected unit; then a Ctrl-click on the statusbar opens Windows Explorer at the location of the selected unit and selects the unit file in Windows Explorer.
-
Improvements in Uses Clause Manager Identifier Search
PeterPanettone replied to PeterPanettone's topic in GExperts
Maybe you are wrong in believing that there are many people using slower computers. I believe that there are more people using faster computers than people using slower computers. Technically advanced computers nowadays are very cheap and many people can afford them. In the German Democratic Republic of Eastern Germany (GDR) there was a very funny car model: The "Trabi" ("Trabant") which was very popular because it was the only model available (from 1957 to 1990) in the communist country. It would be somewhat irrational assuming that a considerable number of people are still using the "Trabi" in their everyday life today. So a company dealing with "Trabi" replacement parts today would soon go out of business. There is much more money to be made with modern cars simply because most people are using modern cars. So, supporting Delphi 6 is a kind of nostalgic behavior, but has no real business value today. -
Improvements in Uses Clause Manager Identifier Search
PeterPanettone replied to PeterPanettone's topic in GExperts
Writing the whole text in uppercase letters nowadays would be really stupid. This has been done in prehistoric times out of necessity to increase the visibility of text on a computer screen because there was no technical possibility to do this otherwise on the very primitive computers of that prehistoric time. Then when text styles like Bold, Italic, etc. were invented and it became possible to use different font sizes, some people continued to constantly use their caps-lock key out of habit which was justly considered as impolite to do this. HOWEVER, writing single important words in uppercase is a way to rhetorically EMPHASIZE meaningful words in a text phrase. So, using rhetoric tools to add color and diversity to a spoken or written text is a very important cultural behavior. That's the reason why many people often fall asleep listening to or reading a text from a bad speaker or a bad writer. EMPHASIZING is important! It has nothing to do with "shouting". -
Improvements in Uses Clause Manager Identifier Search
PeterPanettone replied to PeterPanettone's topic in GExperts
OK, I will do that. -
Improvements in Uses Clause Manager Identifier Search
PeterPanettone replied to PeterPanettone's topic in GExperts
That would be very CONFUSING for the user: Showing "matches at the start first even in "match anywhere" mode": The user would think: Why are there only matches at the start if the option to start matches anywhere is selected? I am not sure, maybe you mean something different. You could make the "match at start" option the DEFAULT option, if you prefer that. BTW, do you have a slow computer? Then why should users with a fast computer SUFFER only because the programmer has a slow computer? This seems to be ILLOGICAL. But maybe this is only a misunderstanding. -
Improvements in Uses Clause Manager Identifier Search
PeterPanettone replied to PeterPanettone's topic in GExperts
I suggest using TParallel.For with conditional compilation to restrict filter performance optimization to newer versions, so Delphi 6 and Delphi 2007 won't be affected. -
Exporting the list of units a project uses explicitly and implicitly
PeterPanettone posted a topic in GExperts
I have implemented and then expanded the feature of exporting the list of units a project uses explicitly and implicitly in GExperts: First, you need to activate the creation of a Map file in the Project Options: Then you need to activate the corresponding option in the Uses Clause Manager Configuration settings: Build your project and then, in the GExperts Uses Clause Manager, open the Project tab. 1. Click the "Copy/Save List" button to copy the list of Project Units to the clipboard. 2. Hold down the CTRL modifier key while clicking the button to save the list to Disk instead. 3. Click on the DropDown part of the button to dropdown the menu containing the same actions. Since Thomas is busy until weekend, here are the units containing my implementation (so you can build GExperts with this feature) : GX_UsesExpert2.zip -
I have compiled GExperts 1.3.14 build 80 (r2809) in Delphi 10.3.1 : Searched for identifier "newshortcut" in Uses Clause Manager: As you can see in the above screenshot, nothing was found. Then I searched in RFindUnit 1.2.0 and found several identifiers: So why GExperts couldn't find these identifiers? Please have a look at RFindUnit at GitHub - it has a lot of useful features: https://github.com/rfrezino/RFindUnit Unfortunately, the author has abandoned the project. Please ask him whether you can use the source code in the GExperts Uses Clause Manager.
-
MAD PEOPLE certainly should not participate in an IT forum. MAD PEOPLE should rather search for psychiatric help, maybe in a psychotherapeutic forum where they can criticize each other for writing too much.
-
You really mix up WhatsApp and delphi praxis forum. Don't you know what a forum is used for? Please don't annoy forum users.
-
It would be useful if the user could add a list of custom paths to this "Search Path". (Like with the MMX Indexer)
-
BTW, the first page in UCM is "Search Path": Is this the correct term? Shouldn't it be "LIBRARY PATH"?
-
I couldn't wait, so I implemented the Copy Project Units List myself: The code is very simple: If you like, the button will save the list to a text file instead (in a save dialog), if the CTRL key is pressed while clicking. I have sent you the modified source in a personal message.
-
I will do that, but useful ideas from other users could also arise here which could be added to the sf.net ticketing system later.
-
If the user has activated the map file usage for UCM (and activated map file creation in the project options) then the list of the project units in UCM contains all units the project uses EXPLICITLY and IMPLICITLY: This list can be quite USEFUL. So please add a button in the Project tab to copy/save this list. This would be very useful!
-
BTW, in the UCM configuration options there should be a warning when the user activates the "Read project units from map file rather than .dpr" checkbox (otherwise he would not see any units from the map file): The warning message should say: "Please make sure to activate the Map file creation in the Project options".
-
The GExperts UCM has the advantage to open the unit with the selected identifier in the IDE, so the user can inspect it: Unfortunately, RFindUnit does not have this feature. So, in my Christmas wishlist I have inserted a GExperts UCM which has all the other features of RFindUnit.