Delphi - объектно-ориентированный язык программирования, разработанный компанией Borland в 1995 году. Он основан на языке программирования Pascal, но имеет более расширенные возможности и добавлены новые функции.
Delphi является интегрированной средой разработки (IDE), которая позволяет разрабатывать программное обеспечение для различных платформ, включая Windows, macOS, Android и iOS. Delphi достигает многоплатформенности с помощью...
unitReg; {$R-,T-,H+,X+} interface
uses
Registry, Classes, Windows, Consts, SysUtils; type
TReg = class
(TRegistry) public
procedure
ReadStringList(const
name: string
; list: TStringList); procedure
WriteStringList(const
name: string
; list: TStringList); end
; implementation
//*** TReg ********************************************************************* //------------------------------------------------------------------------------ // Запись TStringList ввиде значения типа REG_MULTI_SZ в реестр //------------------------------------------------------------------------------ procedure
TReg.WriteStringList(const
name: string
; list: TStringList); var
Buffer: Pointer; BufSize: DWORD; i, j, k: Integer; s: string
; p: PChar; begin
{подготовим буфер к записи} BufSize := 0; for
i := 0 to
list.Count - 1 do
inc(BufSize, Length(list[i]) + 1); inc(BufSize); GetMem(Buffer, BufSize); k := 0; p := Buffer; for
i := 0 to
list.Count - 1 do
begin
s := list[i]; for
j := 0 to
Length(s) - 1 do
begin
p[k] := s[j + 1]; inc(k); end
; p[k] := chr(0); inc(k); end
; p[k] := chr(0);
{запись в реестр} ifRegSetValueEx(CurrentKey, PChar(name), 0, REG_MULTI_SZ, Buffer, BufSize) <> ERROR_SUCCESS then
raise
ERegistryException.CreateResFmt(@SRegSetDataFailed, [name]); end
;
//------------------------------------------------------------------------------ // Чтение TStringList ввиде значения типа REG_MULTI_SZ из реестра //------------------------------------------------------------------------------ procedureTReg.ReadStringList(const
name: string
; list: TStringList); var
BufSize, DataType: DWORD; Len, i: Integer; Buffer: PChar; s: string
; begin
if
list = nil
then
Exit;
{чтение из реестра} Len := GetDataSize(Name); ifLen < 1 then
Exit; Buffer := AllocMem(Len); if
Buffer = nil
then
Exit; try
DataType := REG_NONE; BufSize := Len; if
RegQueryValueEx(CurrentKey, PChar(name), nil
, @DataType, PByte(Buffer), @BufSize) <> ERROR_SUCCESS then
raise
ERegistryException.CreateResFmt(@SRegGetDataFailed, [name]); if
DataType <> REG_MULTI_SZ then
raise
ERegistryException.CreateResFmt(@SInvalidRegType, [name]);
{запись в TStringList} list.Clear; s := ''; fori := 0 to
BufSize - 2 do
begin
// BufSize-2 т.к. последние два нулевых символа if
Buffer[i] = chr(0) then
begin
list.Add(s); s := ''; end
else
s := s + Buffer[i]; end
; finally
FreeMem(Buffer); end
; end
; end
.