Windows Path Viewer App
Posted: January 21, 2024 | | Categories: Delphi, Microsoft Windows
A while back I had a problem with my Windows Path that I wrote about in Windows Path Items Not Available in Visual Studio Code. I was thinking about that problem recently and decided to build my own tooling for managing my system path. I didn't do this because I needed to, but I wanted to write some Windows code (Using Delphi) and this topic is interesting.
As I was playing around with the code, I ran into an issue that I simply couldn't figure out. It turned out to be a Stupid User Problem (me), you can read about it here: Delphi Read Windows 11 System Path. Anyway, in order to ask that question, I needed to build a sample app that demonstrated the problem. My current project has a lot of other code in it and I use some VCL components many other people won't have, so I decided to build a limited scope sample application and share the link to that project in the Stack Overflow question.
Windows stores the User Path in HKEY_CURRENT_USER\Environment
and the System Path in HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
, so the code has to pull the values from different parts of the Registry.
Windows stores the path as a string, so to display it in the Listboxes, the app splits the string into an array using:
if Length(pathStr) > 0 then begin
pathArray := pathStr.Split([';'], TStringSplitOptions.ExcludeEmpty);
pathList.Items.AddStrings(pathArray);
end;
The Code
Here's the core of the application's code.
procedure PopulateList(pathList: TListBox; theHKey: HKEY;
regKey, regProperty: String);
var
Reg: TRegistry;
pathArray: Tarray<String>;
pathStr: String;
begin
Reg := TRegistry.Create(KEY_READ);
Reg.rootKey := theHKey;
if Reg.KeyExists(regKey) then begin
if Reg.OpenKey(regKey, false) then begin
if Reg.ValueExists(regProperty) then begin
pathStr := Reg.Readstring(regProperty);
if Length(pathStr) > 0 then begin
pathArray := pathStr.Split([';'], TStringSplitOptions.ExcludeEmpty);
pathList.Items.AddStrings(pathArray);
end;
end else begin
ShowMessage(Format('Property "%s" does not exist.', [regProperty]));
end;
Reg.CloseKey;
end else begin
ShowMessage(Format('Path and cannot open open: %s', [regKey]));
end;
end;
end;
procedure TfrmMain.FormActivate(Sender: TObject);
begin
PopulateList(UserPathList, HKEY_CURRENT_USER, 'Environment', pathProperty);
PopulateList(SystemPathList, HKEY_LOCAL_MACHINE,
'\SYSTEM\CurrentControlSet\Control\Session Manager\Environment',
pathProperty);
end;
procedure TfrmMain.FormCreate(Sender: TObject);
begin
PanelMain.Align := alClient;
UserGroupBox.Height :=
(PanelMain.Height - (UserGroupBox.Padding.Top +
UserGroupBox.Padding.Bottom)) div 2;
UserGroupBox.Align := alTop;
SystemGroupBox.Align := alClient;
end;
Here's a screen shot of the application:
Changing the Path
The application opens the Registry for read-only access, so it can't make any changes to the Path (or any other part of the registry for that matter). In order to make changes to the Path values, you must do three things.
First, in your code, you must open the Registry for write access:
Reg := TRegistry.Create(KEY_ALL_ACCESS);
Next, you must run the application with Administrator access. This is because an everyday Windows user doesn't have access to modify the System Path. Users can modify their User path all day long, but as soon as you try to change the System Path, the app will crash. To enable admin mode in the Delphi IDE, open Projects -> Options and select the Manifest section. Set Execution Level to Require Administrator and save your changes.
Finally, you must run Delphi with administrator privileges, otherwise you won't be able to test write access to the System Path. If you forget to do this and you launch a project that requires administrator access, Delphi will display an error indicating "The requested operation requires elevation."
Source Code
I published all the code into a stand-alone Delphi app called Windows Path Viewer Delphi
Next Post: Delphi Passing Data Between Forms
Previous Post: Added Monthly Posts Heatmap To The Site
If this content helps you in some way, please consider buying me a coffee.