unit StudyDatamodule;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes,
System.Variants,
Rtti, TypInfo, Math,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Memo.Types,
FMX.StdCtrls, FMX.Controls.Presentation, FMX.ScrollBox, FMX.Memo,
Unit_Tdatamodule, FMX.Edit;
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_propertyValueEnter(Sender: TObject);
procedure edt_propertyValueExit(Sender: TObject);
procedure edt_propertyValueKeyDown(Sender: TObject;
var Key: Word;
var KeyChar: Char; Shift: TShiftState);
procedure edt_propertyValueKeyUp(Sender: TObject;
var Key: Word;
var KeyChar: Char; Shift: TShiftState);
procedure btn_ListasJSONClick(Sender: TObject);
private
{ Private declarations }
FDataItemList: TDataItemList;
FItemIndex: Integer;
procedure DisplayActiveItem(
index: Integer);
procedure SaveInputToItem;
function ValidateInput(
const Value:
string; DataType: TInputType): Boolean;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.fmx}
// Example Initialization from StringList
// ere’s an updated FormCreate method that uses the new functionality:
procedure TForm1.btn_DownClick(Sender: TObject);
begin
FItemIndex := FItemIndex - 1;
FItemIndex := Max(FItemIndex, 0);
DisplayActiveItem(FItemIndex);
end;
procedure TForm1.btn_ListasJSONClick(Sender: TObject);
begin
mmo1.Lines.Add(FDataItemList.AsJSON);
end;
procedure TForm1.btn_UpClick(Sender: TObject);
begin
FItemIndex := FItemIndex + 1;
FItemIndex := Min(FItemIndex, FDataItemList.Count - 1);
DisplayActiveItem(FItemIndex);
end;
procedure TForm1.DisplayActiveItem(
index: Integer);
var
DataItem: TDataItem;
begin
DataItem := FDataItemList.Items[
Index];
lbl_PropertyName.Text := DataItem.
Name;
edt_propertyValue.Text := DataItem.Value;
edt_Datatype.Text := GetEnumName(TypeInfo(TInputType),
Integer(DataItem.DataType));
end;
procedure TForm1.edt_propertyValueEnter(Sender: TObject);
begin
/// check for valid user inputs and save data
end;
procedure TForm1.edt_propertyValueExit(Sender: TObject);
begin
SaveInputToItem;
end;
// Restrict input while typing
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.Items[FItemIndex];
// Restrict input for numbers and booleans
case DataItem.DataType
of
itNumber:
if not(KeyChar
in ['
0' .. '
9', '
.', '
-', #8])
then
// Allow digits, decimal point, negative sign, and backspace
KeyChar := #0;
itBoolean:
if not(KeyChar
in ['
t', '
r', '
u', '
e', '
f', '
a', '
l', '
s', #8])
then
// Allow 'true' and 'false'
KeyChar := #0;
end;
end;
procedure TForm1.edt_propertyValueKeyUp(Sender: TObject;
var Key: Word;
var KeyChar: Char; Shift: TShiftState);
begin
end;
// Save the user's input into the active data item
procedure TForm1.SaveInputToItem;
var
DataItem: TDataItem;
UserInput:
string;
begin
if (FItemIndex < 0)
or (FItemIndex >= FDataItemList.Count)
then
Exit;
DataItem := FDataItemList.Items[FItemIndex];
UserInput := Trim(edt_propertyValue.Text);
// Validate the input
if not ValidateInput(UserInput, DataItem.DataType)
then
begin
ShowMessage(Format('
Invalid input for %s. Expected a %s value.',
[DataItem.
Name, GetEnumName(TypeInfo(TInputType),
Integer(DataItem.DataType))]));
edt_propertyValue.SetFocus;
// Return focus to the input field
Exit;
end;
// Save the validated input to the data item's Value field
DataItem.Value := UserInput;
end;
// Validate user input based on the data type of the current item
function TForm1.ValidateInput(
const Value:
string;
DataType: TInputType): Boolean;
var
TempFloat: Double;
TempBoolean: Boolean;
begin
Result := False;
case DataType
of
itString:
Result := True;
// Any string is valid
itNumber:
Result := TryStrToFloat(Value, TempFloat);
// Validate numeric input
itBoolean:
Result := TryStrToBool(Value, TempBoolean);
// Validate boolean input ('true' or 'false')
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
StringList: TStringList;
DataItem: TDataItem;
begin
StringList := TStringList.Create;
FDataItemList := TDataItemList.Create(True);
// Owns objects
try
// Populate TStringList with data using '|' as the delimiter
StringList.Add('
EnableLogging|Boolean|true');
StringList.Add('
MaxLogFileSize|Number|1048576');
// File size in bytes (1 MB)
StringList.Add('
LogFilePath|String|C:\Logs\app.log');
StringList.Add('
EnableAutoSave|Boolean|true');
StringList.Add('
AutoSaveInterval|Number|10');
// Interval in minutes
StringList.Add('
Theme|String|dark');
StringList.Add('
ShowNotifications|Boolean|true');
StringList.Add('
MaxRetries|Number|3');
StringList.Add('
RetryDelay|Number|5');
// Delay in seconds
StringList.Add('
EnableEncryption|Boolean|true');
StringList.Add('
EncryptionKey|String|default_key');
StringList.Add('
AllowGuestAccess|Boolean|false');
StringList.Add('
DefaultLanguage|String|en');
StringList.Add('
TimeoutDuration|Number|30');
// Timeout in seconds
StringList.Add('
EnableDebugMode|Boolean|false');
FDataItemList.LoadFromStringList(StringList);
// Load data into TDataItemList
FDataItemList.LoadFromStringList(StringList);
// Display loaded items for verification
for DataItem
in FDataItemList
do
mmo1.Lines.Add(Format('
Name: %s, DataType: %s, DefaultValue: %s',
[DataItem.
Name, GetEnumName(TypeInfo(TInputType),
Integer(DataItem.DataType)), DataItem.DefaultValue]));
DisplayActiveItem(FItemIndex);
finally
StringList.Free;
end;
end;
end.