Here a small sample project to deal with a lot (365) of records.
unit RecordEdit_ViewU;
interface
uses
SysUtils,
Controls, Forms, Dialogs, StdCtrls, System.Classes;
type
TPerson = record
Firstname : string[50]; // shortstring !!
Lastname : string[50]; // shortstring !!
end;
TRecordEdit_View = class( TForm )
Current_Edit : TEdit;
Data_Firstname_Edit : TEdit;
Data_Lastname_Edit : TEdit;
Data_Prev_Button : TButton;
Data_Next_Button : TButton;
Data_Save_Button : TButton;
procedure FormCreate( Sender : TObject );
procedure Current_EditChange( Sender : TObject );
procedure Data_Prev_ButtonClick( Sender : TObject );
procedure Data_Next_ButtonClick( Sender : TObject );
procedure Data_Save_ButtonClick( Sender : TObject );
private
FData : array [1 .. 365] of TPerson;
FCurrent : Integer;
procedure SetCurrent( const Value : Integer );
procedure InitData;
procedure StoreCurrent;
procedure LoadCurrent;
procedure SaveData;
public
property Current : Integer read FCurrent write SetCurrent;
end;
var
RecordEdit_View : TRecordEdit_View;
implementation
{$R *.dfm}
procedure TRecordEdit_View.Current_EditChange( Sender : TObject );
begin
Current := StrToIntDef( Current_Edit.Text, 0 ); // convert text to integer
end;
procedure TRecordEdit_View.Data_Next_ButtonClick( Sender : TObject );
begin
Current := Current + 1; // next record
end;
procedure TRecordEdit_View.Data_Prev_ButtonClick( Sender : TObject );
begin
Current := Current - 1; // prev record
end;
procedure TRecordEdit_View.Data_Save_ButtonClick( Sender : TObject );
begin
SaveData;
end;
procedure TRecordEdit_View.FormCreate( Sender : TObject );
begin
InitData;
end;
procedure TRecordEdit_View.InitData;
begin
FCurrent := Low( FData ); // first record
LoadCurrent; // load data from record
end;
procedure TRecordEdit_View.LoadCurrent;
begin
// Data from record to controls
Data_Firstname_Edit.Text := FData[Current].Firstname;
Data_Lastname_Edit.Text := FData[Current].Lastname;
// Update the Current-Edit
Current_Edit.Text := IntToStr( Current );
end;
procedure TRecordEdit_View.SaveData;
begin
ShowMessage( 'Needs to be implemented!' );
end;
procedure TRecordEdit_View.SetCurrent( const Value : Integer );
begin
// check, if we have a change and if we can change to the new index
if ( Value <> Current ) and ( Value >= Low( FData ) ) and ( Value <= High( FData ) )
then
begin
StoreCurrent; // store data from controls
FCurrent := Value; // change current index
LoadCurrent; // load data from record
end;
end;
procedure TRecordEdit_View.StoreCurrent;
begin
// Data from controls to record
FData[Current].Firstname := Data_Firstname_Edit.Text;
FData[Current].Lastname := Data_Lastname_Edit.Text;
end;
end.
And the form
object RecordEdit_View: TRecordEdit_View
Left = 0
Top = 0
Caption = 'RecordEdit_View'
ClientHeight = 337
ClientWidth = 635
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
OnCreate = FormCreate
PixelsPerInch = 96
TextHeight = 13
object Current_Edit: TEdit
Left = 107
Top = 16
Width = 75
Height = 21
TabOrder = 0
Text = 'Current_Edit'
OnChange = Current_EditChange
end
object Data_Firstname_Edit: TEdit
Left = 80
Top = 56
Width = 129
Height = 21
MaxLength = 50
TabOrder = 1
Text = 'Data_Firstname_Edit'
end
object Data_Lastname_Edit: TEdit
Left = 80
Top = 83
Width = 129
Height = 21
MaxLength = 50
TabOrder = 2
Text = 'Data_Lastname_Edit'
end
object Data_Prev_Button: TButton
Left = 80
Top = 16
Width = 21
Height = 21
Caption = '<'
TabOrder = 3
OnClick = Data_Prev_ButtonClick
end
object Data_Next_Button: TButton
Left = 188
Top = 16
Width = 21
Height = 21
Caption = '>'
TabOrder = 4
OnClick = Data_Next_ButtonClick
end
object Data_Save_Button: TButton
Left = 80
Top = 118
Width = 129
Height = 25
Caption = 'Save Data'
TabOrder = 5
OnClick = Data_Save_ButtonClick
end
end
You can get the complete Source and Executable here