mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-06-11 09:58:17 +02:00
Debugger: more moving value-converters to LazDebuggerIntf.
This commit is contained in:
parent
d98c10ac7d
commit
9147be77ec
@ -46,6 +46,7 @@ type
|
|||||||
procedure Init; override;
|
procedure Init; override;
|
||||||
public
|
public
|
||||||
class function GetName: String; override;
|
class function GetName: String; override;
|
||||||
|
function GetRegistryEntry: TLazDbgValueConvertRegistryEntryClass; override;
|
||||||
procedure Assign(ASource: TFpDbgValueConverter); override;
|
procedure Assign(ASource: TFpDbgValueConverter); override;
|
||||||
function ConvertValue(ASourceValue: TFpValue;
|
function ConvertValue(ASourceValue: TFpValue;
|
||||||
AnFpDebugger: TFpDebugDebuggerBase;
|
AnFpDebugger: TFpDebugDebuggerBase;
|
||||||
@ -58,6 +59,12 @@ type
|
|||||||
property JsonTypenameKey: String read FJsonTypenameKey write FJsonTypenameKey;
|
property JsonTypenameKey: String read FJsonTypenameKey write FJsonTypenameKey;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
{ TFpDbgValueConverterJsonForDebugRegistryEntry }
|
||||||
|
|
||||||
|
TFpDbgValueConverterJsonForDebugRegistryEntry = class(TFpDbgValueConverterRegistryEntry)
|
||||||
|
public
|
||||||
|
class function GetConvertorClass: TClass; override;
|
||||||
|
end;
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
@ -184,6 +191,11 @@ begin
|
|||||||
Result := drsCallJsonForDebug;
|
Result := drsCallJsonForDebug;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function TFpDbgValueConverterJsonForDebug.GetRegistryEntry: TLazDbgValueConvertRegistryEntryClass;
|
||||||
|
begin
|
||||||
|
Result := TFpDbgValueConverterJsonForDebugRegistryEntry;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TFpDbgValueConverterJsonForDebug.Assign(ASource: TFpDbgValueConverter);
|
procedure TFpDbgValueConverterJsonForDebug.Assign(ASource: TFpDbgValueConverter);
|
||||||
begin
|
begin
|
||||||
inherited Assign(ASource);
|
inherited Assign(ASource);
|
||||||
@ -315,15 +327,6 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
type
|
|
||||||
|
|
||||||
{ TFpDbgValueConverterJsonForDebugRegistryEntry }
|
|
||||||
|
|
||||||
TFpDbgValueConverterJsonForDebugRegistryEntry = class(TFpDbgValueConverterRegistryEntry)
|
|
||||||
public
|
|
||||||
class function GetConvertorClass: TClass; override;
|
|
||||||
end;
|
|
||||||
|
|
||||||
{ TFpDbgValueConverterJsonForDebugRegistryEntry }
|
{ TFpDbgValueConverterJsonForDebugRegistryEntry }
|
||||||
|
|
||||||
class function TFpDbgValueConverterJsonForDebugRegistryEntry.GetConvertorClass: TClass;
|
class function TFpDbgValueConverterJsonForDebugRegistryEntry.GetConvertorClass: TClass;
|
||||||
|
@ -28,9 +28,10 @@ type
|
|||||||
procedure Init; virtual;
|
procedure Init; virtual;
|
||||||
public
|
public
|
||||||
class function GetName: String; virtual; abstract;
|
class function GetName: String; virtual; abstract;
|
||||||
|
function GetRegistryEntry: TLazDbgValueConvertRegistryEntryClass; virtual;
|
||||||
constructor Create; virtual;
|
constructor Create; virtual;
|
||||||
procedure Assign(ASource: TFpDbgValueConverter); virtual;
|
procedure Assign(ASource: TFpDbgValueConverter); virtual;
|
||||||
function CreateCopy: TFpDbgValueConverter; virtual;
|
function CreateCopy: TLazDbgValueConverterIntf; virtual;
|
||||||
function ConvertValue(ASourceValue: TFpValue;
|
function ConvertValue(ASourceValue: TFpValue;
|
||||||
AnFpDebugger: TFpDebugDebuggerBase;
|
AnFpDebugger: TFpDebugDebuggerBase;
|
||||||
AnExpressionScope: TFpDbgSymbolScope
|
AnExpressionScope: TFpDbgSymbolScope
|
||||||
@ -65,21 +66,31 @@ type
|
|||||||
function GetProcAddrFromMgr(AnFpDebugger: TFpDebugDebuggerBase; AnExpressionScope: TFpDbgSymbolScope): TDbgPtr;
|
function GetProcAddrFromMgr(AnFpDebugger: TFpDebugDebuggerBase; AnExpressionScope: TFpDbgSymbolScope): TDbgPtr;
|
||||||
public
|
public
|
||||||
class function GetName: String; override;
|
class function GetName: String; override;
|
||||||
|
function GetRegistryEntry: TLazDbgValueConvertRegistryEntryClass; override;
|
||||||
function ConvertValue(ASourceValue: TFpValue;
|
function ConvertValue(ASourceValue: TFpValue;
|
||||||
AnFpDebugger: TFpDebugDebuggerBase;
|
AnFpDebugger: TFpDebugDebuggerBase;
|
||||||
AnExpressionScope: TFpDbgSymbolScope
|
AnExpressionScope: TFpDbgSymbolScope
|
||||||
): TFpValue; override;
|
): TFpValue; override;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
{ TFpDbgValueConverterVariantToLStrRegistryEntry }
|
||||||
|
|
||||||
|
TFpDbgValueConverterVariantToLStrRegistryEntry = class(TFpDbgValueConverterRegistryEntry)
|
||||||
|
public
|
||||||
|
class function GetConvertorClass: TClass; override;
|
||||||
|
end;
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
{ TFpDbgValueConverter }
|
{ TFpDbgValueConverter }
|
||||||
|
|
||||||
function TFpDbgValueConverter.CreateCopy: TFpDbgValueConverter;
|
function TFpDbgValueConverter.CreateCopy: TLazDbgValueConverterIntf;
|
||||||
|
var
|
||||||
|
c: TFpDbgValueConverter;
|
||||||
begin
|
begin
|
||||||
Result := TFpDbgValueConverterClass(ClassType).Create;
|
c := TFpDbgValueConverterClass(ClassType).Create;
|
||||||
Result.Assign(Self);
|
c.Assign(Self);
|
||||||
|
Result := c;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TFpDbgValueConverter.SetError(AnError: TFpError);
|
procedure TFpDbgValueConverter.SetError(AnError: TFpError);
|
||||||
@ -102,6 +113,11 @@ begin
|
|||||||
//
|
//
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function TFpDbgValueConverter.GetRegistryEntry: TLazDbgValueConvertRegistryEntryClass;
|
||||||
|
begin
|
||||||
|
Result := nil;
|
||||||
|
end;
|
||||||
|
|
||||||
constructor TFpDbgValueConverter.Create;
|
constructor TFpDbgValueConverter.Create;
|
||||||
begin
|
begin
|
||||||
inherited Create;
|
inherited Create;
|
||||||
@ -315,6 +331,11 @@ begin
|
|||||||
Result := drsCallSysVarToLStr;
|
Result := drsCallSysVarToLStr;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function TFpDbgValueConverterVariantToLStr.GetRegistryEntry: TLazDbgValueConvertRegistryEntryClass;
|
||||||
|
begin
|
||||||
|
Result := TFpDbgValueConverterVariantToLStrRegistryEntry;
|
||||||
|
end;
|
||||||
|
|
||||||
function TFpDbgValueConverterVariantToLStr.ConvertValue(ASourceValue: TFpValue;
|
function TFpDbgValueConverterVariantToLStr.ConvertValue(ASourceValue: TFpValue;
|
||||||
AnFpDebugger: TFpDebugDebuggerBase; AnExpressionScope: TFpDbgSymbolScope
|
AnFpDebugger: TFpDebugDebuggerBase; AnExpressionScope: TFpDbgSymbolScope
|
||||||
): TFpValue;
|
): TFpValue;
|
||||||
@ -435,15 +456,6 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
type
|
|
||||||
|
|
||||||
{ TFpDbgValueConverterVariantToLStrRegistryEntry }
|
|
||||||
|
|
||||||
TFpDbgValueConverterVariantToLStrRegistryEntry = class(TFpDbgValueConverterRegistryEntry)
|
|
||||||
public
|
|
||||||
class function GetConvertorClass: TClass; override;
|
|
||||||
end;
|
|
||||||
|
|
||||||
{ TFpDbgValueConverterVariantToLStrRegistryEntry }
|
{ TFpDbgValueConverterVariantToLStrRegistryEntry }
|
||||||
|
|
||||||
class function TFpDbgValueConverterVariantToLStrRegistryEntry.GetConvertorClass: TClass;
|
class function TFpDbgValueConverterVariantToLStrRegistryEntry.GetConvertorClass: TClass;
|
||||||
|
@ -10,6 +10,8 @@ uses
|
|||||||
|
|
||||||
type
|
type
|
||||||
TLazDbgValueConverterIntf = interface;
|
TLazDbgValueConverterIntf = interface;
|
||||||
|
TLazDbgValueConvertRegistryEntry = class;
|
||||||
|
TLazDbgValueConvertRegistryEntryClass = class of TLazDbgValueConvertRegistryEntry;
|
||||||
|
|
||||||
TLazDbgValueConverterSettingsFrameIntf = interface
|
TLazDbgValueConverterSettingsFrameIntf = interface
|
||||||
procedure ReadFrom(AConvertor: TLazDbgValueConverterIntf);
|
procedure ReadFrom(AConvertor: TLazDbgValueConverterIntf);
|
||||||
@ -22,7 +24,10 @@ type
|
|||||||
TLazDbgValueConverterIntf = interface
|
TLazDbgValueConverterIntf = interface
|
||||||
procedure AddReference;
|
procedure AddReference;
|
||||||
procedure ReleaseReference;
|
procedure ReleaseReference;
|
||||||
|
function CreateCopy: TLazDbgValueConverterIntf;
|
||||||
|
|
||||||
function GetObject: TObject;
|
function GetObject: TObject;
|
||||||
|
function GetRegistryEntry: TLazDbgValueConvertRegistryEntryClass;
|
||||||
function GetSettingsFrame: TLazDbgValueConverterSettingsFrameIntf;
|
function GetSettingsFrame: TLazDbgValueConverterSettingsFrameIntf;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -59,7 +64,6 @@ type
|
|||||||
class function GetConvertorClass: TClass; virtual; abstract;
|
class function GetConvertorClass: TClass; virtual; abstract;
|
||||||
class function GetDebuggerClass: TClass; virtual; abstract; // class of TDebuggerIntf
|
class function GetDebuggerClass: TClass; virtual; abstract; // class of TDebuggerIntf
|
||||||
end;
|
end;
|
||||||
TLazDbgValueConvertRegistryEntryClass = class of TLazDbgValueConvertRegistryEntry;
|
|
||||||
|
|
||||||
{ TLazDbgValueConvertRegistry }
|
{ TLazDbgValueConvertRegistry }
|
||||||
|
|
||||||
|
@ -8,8 +8,7 @@ uses
|
|||||||
Classes, SysUtils, LazClasses, LazLoggerBase, IdeDebuggerWatchResult,
|
Classes, SysUtils, LazClasses, LazLoggerBase, IdeDebuggerWatchResult,
|
||||||
IdeDebuggerFpDbgValueConv, IdeDebuggerWatchResultJSon, DbgIntfDebuggerBase,
|
IdeDebuggerFpDbgValueConv, IdeDebuggerWatchResultJSon, DbgIntfDebuggerBase,
|
||||||
DbgIntfMiscClasses, LazDebuggerIntf, LazDebuggerTemplate,
|
DbgIntfMiscClasses, LazDebuggerIntf, LazDebuggerTemplate,
|
||||||
LazDebuggerIntfBaseTypes, LazDebuggerValueConverter, FpDebugValueConvertors,
|
LazDebuggerIntfBaseTypes, LazDebuggerValueConverter, FpDebugConvDebugForJson;
|
||||||
FpDebugConvDebugForJson;
|
|
||||||
|
|
||||||
type
|
type
|
||||||
|
|
||||||
|
@ -6,7 +6,7 @@ interface
|
|||||||
|
|
||||||
uses
|
uses
|
||||||
Classes, SysUtils, fgl, Laz2_XMLCfg, LazClasses, lazCollections,
|
Classes, SysUtils, fgl, Laz2_XMLCfg, LazClasses, lazCollections,
|
||||||
FpDebugValueConvertors, LazDebuggerValueConverter;
|
LazDebuggerValueConverter;
|
||||||
|
|
||||||
type
|
type
|
||||||
|
|
||||||
@ -14,19 +14,19 @@ type
|
|||||||
|
|
||||||
TIdeDbgValueConvertSelector = class(TFreeNotifyingObject, TLazDbgValueConvertSelectorIntf)
|
TIdeDbgValueConvertSelector = class(TFreeNotifyingObject, TLazDbgValueConvertSelectorIntf)
|
||||||
private
|
private
|
||||||
FConverter: TFpDbgValueConverter;
|
FConverter: TLazDbgValueConverterIntf;
|
||||||
FMatchTypeNames: TStrings;
|
FMatchTypeNames: TStrings;
|
||||||
FEnabled: Boolean;
|
FEnabled: Boolean;
|
||||||
FName: String;
|
FName: String;
|
||||||
|
|
||||||
procedure SetConverter(AValue: TFpDbgValueConverter);
|
procedure SetConverter(AValue: TLazDbgValueConverterIntf);
|
||||||
protected
|
protected
|
||||||
function GetBackendSpecificObject: TObject; deprecated;
|
function GetBackendSpecificObject: TObject; deprecated;
|
||||||
function GetConverter: TLazDbgValueConverterIntf;
|
function GetConverter: TLazDbgValueConverterIntf;
|
||||||
|
|
||||||
function AllowedTypeNames: TStrings;
|
function AllowedTypeNames: TStrings;
|
||||||
public
|
public
|
||||||
constructor Create(AConverter: TFpDbgValueConverter);
|
constructor Create(AConverter: TLazDbgValueConverterIntf);
|
||||||
destructor Destroy; override;
|
destructor Destroy; override;
|
||||||
|
|
||||||
function CreateCopy: TIdeDbgValueConvertSelector;
|
function CreateCopy: TIdeDbgValueConvertSelector;
|
||||||
@ -34,7 +34,7 @@ type
|
|||||||
procedure LoadDataFromXMLConfig(const AConfig: TRttiXMLConfig; const APath: string);
|
procedure LoadDataFromXMLConfig(const AConfig: TRttiXMLConfig; const APath: string);
|
||||||
procedure SaveDataToXMLConfig(const AConfig: TRttiXMLConfig; const APath: string);
|
procedure SaveDataToXMLConfig(const AConfig: TRttiXMLConfig; const APath: string);
|
||||||
published
|
published
|
||||||
property Converter: TFpDbgValueConverter read FConverter write SetConverter;
|
property Converter: TLazDbgValueConverterIntf read FConverter write SetConverter;
|
||||||
property Enabled: Boolean read FEnabled write FEnabled;
|
property Enabled: Boolean read FEnabled write FEnabled;
|
||||||
property Name: String read FName write FName;
|
property Name: String read FName write FName;
|
||||||
property MatchTypeNames: TStrings read FMatchTypeNames;
|
property MatchTypeNames: TStrings read FMatchTypeNames;
|
||||||
@ -80,10 +80,11 @@ implementation
|
|||||||
|
|
||||||
{ TIdeDbgValueConvertSelector }
|
{ TIdeDbgValueConvertSelector }
|
||||||
|
|
||||||
procedure TIdeDbgValueConvertSelector.SetConverter(AValue: TFpDbgValueConverter);
|
procedure TIdeDbgValueConvertSelector.SetConverter(AValue: TLazDbgValueConverterIntf);
|
||||||
begin
|
begin
|
||||||
if FConverter = AValue then Exit;
|
if FConverter = AValue then Exit;
|
||||||
FConverter.ReleaseReference;
|
if FConverter <> nil then
|
||||||
|
FConverter.ReleaseReference;
|
||||||
FConverter := AValue;
|
FConverter := AValue;
|
||||||
if FConverter <> nil then
|
if FConverter <> nil then
|
||||||
FConverter.AddReference;
|
FConverter.AddReference;
|
||||||
@ -104,7 +105,7 @@ begin
|
|||||||
Result := FMatchTypeNames;
|
Result := FMatchTypeNames;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
constructor TIdeDbgValueConvertSelector.Create(AConverter: TFpDbgValueConverter);
|
constructor TIdeDbgValueConvertSelector.Create(AConverter: TLazDbgValueConverterIntf);
|
||||||
begin
|
begin
|
||||||
inherited Create;
|
inherited Create;
|
||||||
Converter := AConverter;
|
Converter := AConverter;
|
||||||
@ -128,7 +129,6 @@ end;
|
|||||||
|
|
||||||
procedure TIdeDbgValueConvertSelector.Assign(ASource: TIdeDbgValueConvertSelector);
|
procedure TIdeDbgValueConvertSelector.Assign(ASource: TIdeDbgValueConvertSelector);
|
||||||
begin
|
begin
|
||||||
|
|
||||||
Converter := ASource.FConverter.CreateCopy;
|
Converter := ASource.FConverter.CreateCopy;
|
||||||
FMatchTypeNames.Assign(ASource.FMatchTypeNames);
|
FMatchTypeNames.Assign(ASource.FMatchTypeNames);
|
||||||
FName := ASource.FName;
|
FName := ASource.FName;
|
||||||
@ -139,7 +139,6 @@ procedure TIdeDbgValueConvertSelector.LoadDataFromXMLConfig(
|
|||||||
const AConfig: TRttiXMLConfig; const APath: string);
|
const AConfig: TRttiXMLConfig; const APath: string);
|
||||||
var
|
var
|
||||||
s: String;
|
s: String;
|
||||||
obj: TFpDbgValueConverter;
|
|
||||||
RegEntry: TLazDbgValueConvertRegistryEntryClass;
|
RegEntry: TLazDbgValueConvertRegistryEntryClass;
|
||||||
begin
|
begin
|
||||||
AConfig.ReadObject(APath + 'Filter/', Self);
|
AConfig.ReadObject(APath + 'Filter/', Self);
|
||||||
@ -150,9 +149,8 @@ begin
|
|||||||
if RegEntry = nil then
|
if RegEntry = nil then
|
||||||
exit;
|
exit;
|
||||||
|
|
||||||
obj := RegEntry.CreateValueConvertorIntf.GetObject as TFpDbgValueConverter;
|
Converter := RegEntry.CreateValueConvertorIntf;
|
||||||
AConfig.ReadObject(APath + 'Conv/', obj);
|
AConfig.ReadObject(APath + 'Conv/', Converter.GetObject);
|
||||||
Converter := obj;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TIdeDbgValueConvertSelector.SaveDataToXMLConfig(
|
procedure TIdeDbgValueConvertSelector.SaveDataToXMLConfig(
|
||||||
@ -161,8 +159,8 @@ begin
|
|||||||
AConfig.WriteObject(APath + 'Filter/', Self);
|
AConfig.WriteObject(APath + 'Filter/', Self);
|
||||||
AConfig.SetDeleteValue(APath + 'Filter/MatchTypeNames', MatchTypeNames.CommaText, '');
|
AConfig.SetDeleteValue(APath + 'Filter/MatchTypeNames', MatchTypeNames.CommaText, '');
|
||||||
|
|
||||||
AConfig.SetValue(APath + 'ConvClass', Converter.ClassName);
|
AConfig.SetValue(APath + 'ConvClass', Converter.GetObject.ClassName);
|
||||||
AConfig.WriteObject(APath + 'Conv/', Converter);
|
AConfig.WriteObject(APath + 'Conv/', Converter.GetObject);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{ TIdeDbgValueConvertSelectorList }
|
{ TIdeDbgValueConvertSelectorList }
|
||||||
|
@ -6,7 +6,7 @@ interface
|
|||||||
|
|
||||||
uses
|
uses
|
||||||
Classes, SysUtils, Forms, Controls, ExtCtrls, StdCtrls, CheckLst, LCLIntf,
|
Classes, SysUtils, Forms, Controls, ExtCtrls, StdCtrls, CheckLst, LCLIntf,
|
||||||
Dialogs, StrUtils, FpDebugValueConvertors, LazDebuggerValueConverter,
|
Dialogs, StrUtils, LazDebuggerValueConverter,
|
||||||
IdeDebuggerStringConstants, IdeDebuggerFpDbgValueConv;
|
IdeDebuggerStringConstants, IdeDebuggerFpDbgValueConv;
|
||||||
|
|
||||||
type
|
type
|
||||||
@ -80,7 +80,7 @@ begin
|
|||||||
|
|
||||||
FCurConvConf := nil;
|
FCurConvConf := nil;
|
||||||
AvailClass := ValueConverterRegistry;
|
AvailClass := ValueConverterRegistry;
|
||||||
obj := TIdeDbgValueConvertSelector.Create(AvailClass[0].CreateValueConvertorIntf.GetObject as TFpDbgValueConverter);
|
obj := TIdeDbgValueConvertSelector.Create(AvailClass[0].CreateValueConvertorIntf);
|
||||||
obj.Enabled := True;
|
obj.Enabled := True;
|
||||||
obj.Name := AName;
|
obj.Name := AName;
|
||||||
// obj.MatchKinds := obj.Converter.GetSupportedKinds;
|
// obj.MatchKinds := obj.Converter.GetSupportedKinds;
|
||||||
@ -131,12 +131,12 @@ begin
|
|||||||
else
|
else
|
||||||
SetCurConv(FValConvList[FCurIdx]);
|
SetCurConv(FValConvList[FCurIdx]);
|
||||||
|
|
||||||
lblDesc.Caption := FCurConvConf.Converter.GetName;
|
lblDesc.Caption := FCurConvConf.Converter.GetRegistryEntry.GetName;
|
||||||
EdName.Text := FCurConvConf.Name;
|
EdName.Text := FCurConvConf.Name;
|
||||||
memoTypeNames.Text := FCurConvConf.MatchTypeNames.Text;
|
memoTypeNames.Text := FCurConvConf.MatchTypeNames.Text;
|
||||||
|
|
||||||
AvailClass := ValueConverterRegistry;
|
AvailClass := ValueConverterRegistry;
|
||||||
dropAction.ItemIndex := AvailClass.IndexOfConvertorClass(FCurConvConf.Converter.ClassType);
|
dropAction.ItemIndex := AvailClass.IndexOfConvertorClass(FCurConvConf.Converter.GetObject.ClassType);
|
||||||
|
|
||||||
lstConvertersItemClick(nil, FCurIdx);
|
lstConvertersItemClick(nil, FCurIdx);
|
||||||
end;
|
end;
|
||||||
@ -251,7 +251,7 @@ begin
|
|||||||
(EdName.Text <> FCurConvConf.Name)
|
(EdName.Text <> FCurConvConf.Name)
|
||||||
then begin
|
then begin
|
||||||
FValConvList.Changed := True;
|
FValConvList.Changed := True;
|
||||||
FCurConvConf.Converter := TFpDbgValueConverter(FCurConv.GetObject);
|
FCurConvConf.Converter := FCurConv;
|
||||||
// FCurConvConf.MatchKinds := FCurConvConf.Converter.GetSupportedKinds;
|
// FCurConvConf.MatchKinds := FCurConvConf.Converter.GetSupportedKinds;
|
||||||
FCurConvConf.MatchTypeNames.Text := memoTypeNames.Text;
|
FCurConvConf.MatchTypeNames.Text := memoTypeNames.Text;
|
||||||
FCurConvConf.Name := EdName.Text
|
FCurConvConf.Name := EdName.Text
|
||||||
|
Loading…
Reference in New Issue
Block a user