@@ -83,35 +83,39 @@ TPJEnvironmentVar = record
8383 // / records.</summary>
8484 TPJEnvironmentVarArray = array of TPJEnvironmentVar;
8585
86- // / <summary>Type of callback method passed to the
87- // / <see cref="PJEnvVars|TPJEnvironmentVars.EnumNames"/> method, to be called
88- // / for each enumerated environment variable.</summary>
89- // / <param name="VarName">string [in] Name of the current environment
90- // / variable in the enumeration.</param>
91- // / <param name="Data">Pointer [in] User-specified value that was passed to
92- // / <see cref="PJEnvVars|TPJEnvironmentVars.EnumNames"/></param>
93- // / <remarks>Either closures or normal methods can be assigned to
94- // / <c>TPJEnvVarsEnum</c>.</remarks>
95- TPJEnvVarsEnum = reference to procedure(const VarName: string; Data: Pointer);
96-
97- // / <summary>Type of callback method passed to the
98- // / <see cref="PJEnvVars|TPJEnvironmentVars.EnumVars"/> method, to be called
99- // / for each enumerated environment variable.</summary>
100- // / <param name="EnvVar"><see cref="PJEnvVars|TPJEnvironmentVar"/> [in]
101- // / Information about the current environment variable in the enumeration.
102- // / </param>
103- // / <param name="Data">Pointer [in] User-specified value that was passed to
104- // / <see cref="PJEnvVars|TPJEnvironmentVars.EnumVars"/></param>
105- // / <remarks>Either closures or normal methods can be assigned to
106- // / <c>TPJEnvVarsEnumEx</c>.</remarks>
107- TPJEnvVarsEnumEx = reference to procedure(const EnvVar: TPJEnvironmentVar;
108- Data: Pointer);
109-
11086 // / <summary>Static class providing class methods for interrogating,
11187 // / manipulating and modifying the environment variables available to the
11288 // / current process.</summary>
11389 // / <remarks>This class cannot be constructed.</remarks>
11490 TPJEnvironmentVars = class (TObject)
91+ public
92+ type
93+ // / <summary>Type of callback method passed to the
94+ // / <see cref="PJEnvVars|TPJEnvironmentVars.EnumNames<T>"/> method,
95+ // / to be called for each enumerated environment variable.</summary>
96+ // / <param name="VarName">string [in] Name of the current environment
97+ // / variable in the enumeration.</param>
98+ // / <param name="Data">Pointer [in] User-specified value that was passed
99+ // / to <see cref="PJEnvVars|TPJEnvironmentVars.EnumNames<T>"/>
100+ // / </param>
101+ // / <remarks>Either closures or normal methods can be assigned to
102+ // / <c>TEnumNamesCallback<T></c>.</remarks>
103+ TEnumNamesCallback<T> = reference to
104+ procedure(const VarName: string; Data: T);
105+
106+ // / <summary>Type of callback method passed to the
107+ // / <see cref="PJEnvVars|TPJEnvironmentVars.EnumVars<T>"/> method,
108+ // / to be called for each enumerated environment variable.</summary>
109+ // / <param name="EnvVar"><see cref="PJEnvVars|TPJEnvironmentVar"/> [in]
110+ // / Information about the current environment variable in the
111+ // / enumeration.</param>
112+ // / <param name="Data">Pointer [in] User-specified value that was passed
113+ // / to <see cref="PJEnvVars|TPJEnvironmentVars.EnumVars<T>"/>
114+ // / </param>
115+ // / <remarks>Either closures or normal methods can be assigned to
116+ // / <c>TEnumVarsCallback<T></c>.</remarks>
117+ TEnumVarsCallback<T> = reference to
118+ procedure(const EnvVar: TPJEnvironmentVar; Data: T);
115119 public
116120 // / <summary>Prevents construction of instances of this static class.
117121 // / </summary>
@@ -212,23 +216,50 @@ TPJEnvironmentVars = class(TObject)
212216 // / <returns>TStringDynArray. Dynamic array containing the environment
213217 // / variable names.</returns>
214218 class function GetAllNames : TStringDynArray; overload;
219+
215220 // / <summary>Enumerates the names of all environment variables in the
216221 // / current process.</summary>
217- // / <param name="Callback"><see cref="PJEnvVars|TPJEnvVarsEnum"/> [in]
218- // / Callback method called once for each environment variable, passing its
219- // / name and the value of the <c>Data</c> pointer as parameters.</param>
220- // / <param name="Data">Pointer [in] Data to be passed to <c>Callback</c>
222+ // / <param name="Callback"><see
223+ // / cref="PJEnvVars|TEnumNamesCallback<T>"/> [in] Closure called once
224+ // / for each environment variable, passing its name and <c>Data</c> as
225+ // / parameters.</param>
226+ // / <param name="Data"><T> [in] Data to be passed to <c>Callback</c>
221227 // / method each time it is called.</param>
222- class procedure EnumNames (Callback: TPJEnvVarsEnum; Data: Pointer);
228+ // / <remarks>This is a parameterised method that enables the <c>Data</c>
229+ // / parameter to take on the desired type.</remarks>
230+ class procedure EnumNames <T>(Callback: TEnumNamesCallback<T>; Data: T);
231+ overload;
232+
233+ // / <summary>Enumerates the names of all environment variables in the
234+ // / current process.</summary>
235+ // / <remarks>This deprecated method is equivalent to calling
236+ // / <see cref="PJEnvVars|TPJEnvironmentVars.EnumNames<Pointer>"/>.
237+ // / </remarks>
238+ class procedure EnumNames (Callback: TEnumNamesCallback<Pointer>;
239+ Data: Pointer) overload;
240+ deprecated ' Use TPJEnvironmentVars.EnumNames<Pointer> instead' ;
241+
223242 // / <summary>Enumerates all the environment variables available to the
224243 // / current process.</summary>
225- // / <param name="Callback"><see cref="PJEnvVars|TPJEnvVarsEnumEx"/> [in]
226- // / Callback method called once for each environment variable, passing a
227- // / record containing its name and value along with the the value of the
228- // / <c>Data</c> pointer as parameters.</param>
229- // / <param name="Data">Pointer [in] Data to be passed to <c>Callback</c>
244+ // / <param name="Callback"><see
245+ // / cref="PJEnvVars|TEnumVarsCallback<T>"/> [in] Closure called once
246+ // / for each environment variable, passing a record containing its name and
247+ // / value, along with <c>Data</c>, as parameters.</param>
248+ // / <param name="Data"><T> [in] Data to be passed to <c>Callback</c>
230249 // / method each time it is called.</param>
231- class procedure EnumVars (Callback: TPJEnvVarsEnumEx; Data: Pointer);
250+ // / <remarks>This is a parameterised method that enables the <c>Data</c>
251+ // / parameter to take on the desired type.</remarks>
252+ class procedure EnumVars <T>(Callback: TEnumVarsCallback<T>; Data: T);
253+ overload;
254+
255+ // / <summary>Enumerates all the environment variables available to the
256+ // / current process.</summary>
257+ // / <remarks>This deprecated method is equivalent to calling
258+ // / <see cref="PJEnvVars|TPJEnvironmentVars.EnumVars<Pointer>"/>.
259+ // / </remarks>
260+ class procedure EnumVars (Callback: TEnumVarsCallback<Pointer>;
261+ Data: Pointer); overload;
262+ deprecated ' Use TPJEnvironmentVars.EnumVars<Pointer> instead' ;
232263 end ;
233264
234265 // / <summary>Enumerator for all environment variables names in the current
@@ -259,6 +290,20 @@ TPJEnvVarsEnumerator = class(TObject)
259290 property Current: string read GetCurrent;
260291 end ;
261292
293+ // / <summary>Type of callback method that can be passed to the
294+ // / <see cref="PJEnvVars|TPJEnvironmentVars.EnumNames"/> method.</summary>
295+ // / <remarks>Deprecated type retained for backwards compatibility only
296+ // / </remarks>
297+ TPJEnvVarsEnum = TPJEnvironmentVars.TEnumNamesCallback<Pointer>
298+ deprecated ' Use TPJEnvironmentVars.TEnumNamesCallback<Pointer> instead' ;
299+
300+ // / <summary>Type of callback method that can be passed to the
301+ // / <see cref="PJEnvVars|TPJEnvironmentVars.EnumVars"/> method.</summary>
302+ // / <remarks>Deprecated type retained for backwards compatibility only
303+ // / </remarks>
304+ TPJEnvVarsEnumEx = TPJEnvironmentVars.TEnumVarsCallback<Pointer>
305+ deprecated ' Use TPJEnvironmentVars.TEnumVarsCallback<Pointer> instead' ;
306+
262307 // / <summary>Exception raised by <see cref="PJEnvVars|TPJEnvVars"/> when an
263308 // / error is encountered.</summary>
264309 EPJEnvVars = class (EOSError);
@@ -401,8 +446,15 @@ class function TPJEnvironmentVars.Delete(const VarName: string): Integer;
401446 Result := GetLastError;
402447end ;
403448
404- class procedure TPJEnvironmentVars.EnumNames (Callback: TPJEnvVarsEnum;
405- Data: Pointer);
449+ class procedure TPJEnvironmentVars.EnumNames (
450+ Callback: TEnumNamesCallback<Pointer>; Data: Pointer);
451+ begin
452+ Assert(Assigned(Callback));
453+ EnumNames<Pointer>(Callback, Data);
454+ end ;
455+
456+ class procedure TPJEnvironmentVars.EnumNames <T>(Callback: TEnumNamesCallback<T>;
457+ Data: T);
406458var
407459 Idx: Integer;
408460 EnvList: TStringList;
@@ -418,8 +470,15 @@ class procedure TPJEnvironmentVars.EnumNames(Callback: TPJEnvVarsEnum;
418470 end ;
419471end ;
420472
421- class procedure TPJEnvironmentVars.EnumVars (Callback: TPJEnvVarsEnumEx;
422- Data: Pointer);
473+ class procedure TPJEnvironmentVars.EnumVars (
474+ Callback: TEnumVarsCallback<Pointer>; Data: Pointer);
475+ begin
476+ Assert(Assigned(Callback));
477+ EnumVars<Pointer>(Callback, Data);
478+ end ;
479+
480+ class procedure TPJEnvironmentVars.EnumVars <T>(Callback: TEnumVarsCallback<T>;
481+ Data: T);
423482var
424483 Idx: Integer;
425484 AllEnvVars: TPJEnvironmentVarArray;
0 commit comments