unit StudyDatamodule;
interface
uses
System.SysUtils, System.Classes, System.Types, System.UITypes, System.Rtti,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
FMX.StdCtrls, FMX.Controls.Presentation, FMX.ScrollBox, FMX.Memo, FMX.Edit,
Unit_TDataModule, Math;
type
TForm1 =
class(TForm)
mmo1: TMemo;
btn_InitList: TButton;
edt_propertyValue: TEdit;
lbl_PropertyName: TLabel;
btn_Up: TButton;
btn_Down: TButton;
edt_Datatype: TEdit;
btn_ListasJSON: TButton;
procedure FormCreate(Sender: TObject);
procedure btn_UpClick(Sender: TObject);
procedure btn_DownClick(Sender: TObject);
procedure edt_propertyValueExit(Sender: TObject);
procedure edt_propertyValueKeyDown(Sender: TObject;
var Key: Word;
var KeyChar: Char; Shift: TShiftState);
procedure btn_ListasJSONClick(Sender: TObject);
private
FDataItemList: TDataItemList;
FItemIndex: Integer;
procedure DisplayActiveItem(
Index: Integer);
procedure SaveInputToItem;
function ValidateInput(
const Value:
string; DataType: TInputType): Boolean;
public
end;
var
Form1: TForm1;
implementation
{$R '.fmx}
procedure TForm1.FormCreate(Sender: TObject);
var
StringList: TStringList;
begin
StringList := TStringList.Create;
FDataItemList := TDataItemList.Create(True);
try
StringList.Add('
EnableLogging|Boolean|true');
StringList.Add('
MaxLogFileSize|Number|1048576');
StringList.Add('
LogFilePath|String|C:\Logs\app.log');
StringList.Add('
Theme|String|dark');
StringList.Add('
RetryDelay|Number|5');
FDataItemList.LoadFromStringList(StringList);
if FDataItemList.Count > 0
then
begin
FItemIndex := 0;
DisplayActiveItem(FItemIndex);
end;
finally
StringList.Free;
end;
end;
procedure TForm1.DisplayActiveItem(
Index: Integer);
var
DataItem: TDataItem;
begin
if (
Index < 0)
or (
Index >= FDataItemList.Count)
then Exit;
DataItem := FDataItemList[
Index];
lbl_PropertyName.Text := DataItem.
Name;
edt_propertyValue.Text := DataItem.Value;
edt_Datatype.Text := InputTypeToString(DataItem.DataType);
end;
procedure TForm1.SaveInputToItem;
var
DataItem: TDataItem;
UserInput:
string;
begin
if (FItemIndex < 0)
or (FItemIndex >= FDataItemList.Count)
then Exit;
DataItem := FDataItemList[FItemIndex];
UserInput := Trim(edt_propertyValue.Text);
if not ValidateInput(UserInput, DataItem.DataType)
then
begin
ShowMessage(Format('
Invalid input for %s. Expected a %s.', [DataItem.
Name, InputTypeToString(DataItem.DataType)]));
edt_propertyValue.SetFocus;
Exit;
end;
DataItem.Value := UserInput;
end;
function TForm1.ValidateInput(
const Value:
string; DataType: TInputType): Boolean;
var
TempFloat: Double;
TempBool: Boolean;
begin
case DataType
of
itString: Result := True;
itNumber: Result := TryStrToFloat(Value, TempFloat);
itBoolean: Result := TryStrToBool(Value, TempBool);
else
Result := False;
end;
end;
procedure TForm1.btn_UpClick(Sender: TObject);
begin
if FItemIndex < FDataItemList.Count - 1
then
begin
SaveInputToItem;
Inc(FItemIndex);
DisplayActiveItem(FItemIndex);
end;
end;
procedure TForm1.btn_DownClick(Sender: TObject);
begin
if FItemIndex > 0
then
begin
SaveInputToItem;
Dec(FItemIndex);
DisplayActiveItem(FItemIndex);
end;
end;
procedure TForm1.edt_propertyValueExit(Sender: TObject);
begin
SaveInputToItem;
end;
procedure TForm1.edt_propertyValueKeyDown(Sender: TObject;
var Key: Word;
var KeyChar: Char; Shift: TShiftState);
var
DataItem: TDataItem;
begin
if (FItemIndex < 0)
or (FItemIndex >= FDataItemList.Count)
then Exit;
DataItem := FDataItemList[FItemIndex];
case DataItem.DataType
of
itNumber:
if not (KeyChar
in ['
0'..'
9', '
.', '
-', #8])
then
KeyChar := #0;
itBoolean:
if not (KeyChar
in ['
t','
r','
u','
e','
f','
a','
l','
s','
e', #8])
then
KeyChar := #0;
end;
end;
procedure TForm1.btn_ListasJSONClick(Sender: TObject);
begin
mmo1.Lines.Text := FDataItemList.AsJSON;
end;
end.