unit xpMemParamManagerUnit; interface uses Messages, SysUtils, Variants, Classes; // xpConst; const sFRBreak = #13#10; type ParamRow = array[0..1] of Variant; TParamArray = array of ParamRow; { TxpMemParamManager } TxpMemParamManager = class(TObject) private ParamArray: TParamArray; function GetValue(ParamName: Variant): Variant; procedure SetValue(ParamName: Variant; const Value: Variant); public constructor Create; destructor Destroy; override; function IndexOf(const ParamName : string) : Integer; function Count: Integer; function ListAllParamsAndValues: string; procedure Delete(ParamName: Variant); property Params: TParamArray read ParamArray; property Values[ParamName: Variant]: Variant read GetValue write SetValue; default; procedure Assign(OwnerParam: TxpMemParamManager); end; implementation uses lazUTF8; procedure TxpMemParamManager.Assign(OwnerParam: TxpMemParamManager); var i: Integer; begin if OwnerParam = nil then Exit; if Length(OwnerParam.ParamArray) > 0 then for i:= Low(OwnerParam.ParamArray) to High(OwnerParam.ParamArray) do Values[OwnerParam.ParamArray[i][0]] := OwnerParam.ParamArray[i][1] end; constructor TxpMemParamManager.Create; begin inherited Create; ParamArray := nil; end; destructor TxpMemParamManager.Destroy; begin ParamArray := nil; inherited; end; function TxpMemParamManager.GetValue(ParamName: Variant): Variant; var i: Integer; begin for i:= Low(ParamArray) to High(ParamArray) do if AnsiSameText(ParamArray[i][0], ParamName) then begin Result := ParamArray[i][1]; Exit; end; raise Exception.Create('Не найден параметр ' + VarToStr(ParamName)); end; function TxpMemParamManager.IndexOf(const ParamName: string): Integer; var i : Integer; begin Result := -1; for i := Low(ParamArray) to High(ParamArray) do begin if AnsiSameText(ParamArray[i][0], ParamName) then begin Result := i; Exit; end; end; end; function TxpMemParamManager.Count: Integer; begin result := High(ParamArray) + 1; end; function TxpMemParamManager.ListAllParamsAndValues: string; var i: integer; begin Result := ''; for i := 0 to (self.Count - 1) do Result := Result + IntToStr(i) + ': '#39 + VarToStr(self.Params[i][0]) + #39' = '#39 + VarToStr(self.Params[i][1]) + #39'.' + sLineBreak; end; procedure TxpMemParamManager.SetValue(ParamName: Variant; const Value: Variant); var i,j: Integer; strVal: string; v: variant; begin if VarIsStr(Value) then begin v := utf8trim(Value); end else v := Value; for i:= Low(ParamArray) to High(ParamArray) do if AnsiSameText(ParamArray[i][0], ParamName) then begin ParamArray[i][1] := v; Exit; end; SetLength(ParamArray, Length(ParamArray) + 1); ParamArray[High(ParamArray)][0] := ParamName; ParamArray[High(ParamArray)][1] := v; end; procedure TxpMemParamManager.Delete(ParamName: Variant); var i: Integer; begin for i:= Low(ParamArray) to High(ParamArray) do if AnsiSameText(ParamArray[i][0], ParamName) then begin ParamArray[i][0] := ''; Exit; end; end; end.