summaryrefslogtreecommitdiff
path: root/examples/gui/gridediting/frm_main.pas
diff options
context:
space:
mode:
Diffstat (limited to 'examples/gui/gridediting/frm_main.pas')
-rw-r--r--examples/gui/gridediting/frm_main.pas172
1 files changed, 172 insertions, 0 deletions
diff --git a/examples/gui/gridediting/frm_main.pas b/examples/gui/gridediting/frm_main.pas
new file mode 100644
index 00000000..51480595
--- /dev/null
+++ b/examples/gui/gridediting/frm_main.pas
@@ -0,0 +1,172 @@
+unit frm_main;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+ SysUtils, Classes, fpg_base, fpg_main, fpg_form, fpg_basegrid,
+ fpg_grid, fpg_button, fpg_edit, fpg_label;
+
+type
+
+ TMainForm = class(TfpgForm)
+ private
+ {@VFD_HEAD_BEGIN: MainForm}
+ Grid1: TfpgStringGrid;
+ btnQuit: TfpgButton;
+ Label1: TfpgLabel;
+ {@VFD_HEAD_END: MainForm}
+ FCellEdit: TfpgEdit;
+ FFocusRect: TfpgRect;
+ FLastGrid: TfpgStringGrid; // reference only
+ procedure SetupCellEdit(AGrid: TfpgStringGrid);
+ procedure CellEditExit(Sender: TObject);
+ procedure CellEditKeypressed(Sender: TObject; var KeyCode: word; var ShiftState: TShiftState; var Consumed: boolean);
+ procedure GridKeyPressed(Sender: TObject; var KeyCode: word; var ShiftState: TShiftState; var Consumed: boolean);
+ procedure GridDrawCell(Sender: TObject; const ARow, ACol: Integer; const ARect: TfpgRect; const AFlags: TfpgGridDrawState; var ADefaultDrawing: boolean);
+ procedure ButtonQuitClicked(Sender: TObject);
+ public
+ procedure AfterCreate; override;
+ end;
+
+{@VFD_NEWFORM_DECL}
+
+implementation
+
+{@VFD_NEWFORM_IMPL}
+
+procedure TMainForm.GridKeyPressed(Sender: TObject; var KeyCode: word;
+ var ShiftState: TShiftState; var Consumed: boolean);
+begin
+ if (KeyCode = keyInsert) and (ssCtrl in ShiftState) then
+ begin
+ TfpgStringGrid(Sender).RowCount := TfpgStringGrid(Sender).RowCount + 1;
+ Consumed := True;
+ Exit;
+ end;
+
+ if (KeyCode = keyF2) or (KeyCode = keyReturn) then
+ begin
+ // we need to edit the cell contents
+ SetupCellEdit(TfpgStringGrid(Sender));
+ Consumed := True;
+ end;
+end;
+
+procedure TMainForm.GridDrawCell(Sender: TObject; const ARow, ACol: Integer;
+ const ARect: TfpgRect; const AFlags: TfpgGridDrawState; var ADefaultDrawing: boolean);
+begin
+ if (gdSelected in AFlags) then
+ begin
+ FFocusRect := ARect;
+ end;
+end;
+
+procedure TMainForm.ButtonQuitClicked(Sender: TObject);
+begin
+ Close;
+end;
+
+procedure TMainForm.SetupCellEdit(AGrid: TfpgStringGrid);
+var
+ pt: TPoint;
+begin
+ if Assigned(FCellEdit) then
+ FCellEdit.Free;
+
+ FLastGrid := AGrid;
+ FCellEdit := TfpgEdit.Create(FLastGrid.Parent);
+ pt.X := FLastGrid.Left + FFocusRect.Left;
+ pt.Y := FLastGrid.Top + FFocusRect.Top;
+ with FCellEdit do
+ begin
+ Name := 'FCellEdit';
+ SetPosition(pt.X, pt.Y, FFocusRect.Width, FFocusRect.Height);
+ BorderStyle := ebsSingle;
+ FontDesc := '#Grid';
+ Text := AGrid.Cells[AGrid.FocusCol, AGrid.FocusRow];
+ OnKeyPress := @CellEditKeypressed;
+ OnExit := @CellEditExit;
+ SetFocus;
+ end;
+end;
+
+procedure TMainForm.CellEditExit(Sender: TObject);
+begin
+ FCellEdit.Visible := False;
+end;
+
+procedure TMainForm.CellEditKeypressed(Sender: TObject; var KeyCode: word;
+ var ShiftState: TShiftState; var Consumed: boolean);
+begin
+ if KeyCode = keyReturn then
+ begin
+ FLastGrid.Cells[FLastGrid.FocusCol, FLastGrid.FocusRow] := FCellEdit.Text;
+ FCellEdit.Visible := False;
+ FLastGrid.SetFocus;
+ end;
+end;
+
+procedure TMainForm.AfterCreate;
+begin
+ {%region 'Auto-generated GUI code' -fold}
+ {@VFD_BODY_BEGIN: MainForm}
+ Name := 'MainForm';
+ SetPosition(356, 172, 431, 361);
+ WindowTitle := 'Editable StringGrid Demo';
+ Hint := '';
+
+ Grid1 := TfpgStringGrid.Create(self);
+ with Grid1 do
+ begin
+ Name := 'Grid1';
+ SetPosition(16, 76, 400, 239);
+ Anchors := [anLeft,anRight,anTop,anBottom];
+ AddColumn('#1', 100, taLeftJustify);
+ AddColumn('#2', 100, taLeftJustify);
+ AddColumn('#3', 100, taLeftJustify);
+ AddColumn('#4', 75, taLeftJustify);
+ FontDesc := '#Grid';
+ HeaderFontDesc := '#GridHeader';
+ Hint := '';
+ RowCount := 5;
+ RowSelect := False;
+ TabOrder := 1;
+ OnKeyPress := @GridKeyPressed;
+ OnDrawCell := @GridDrawCell;
+ end;
+
+ btnQuit := TfpgButton.Create(self);
+ with btnQuit do
+ begin
+ Name := 'btnQuit';
+ SetPosition(336, 329, 80, 24);
+ Anchors := [anRight,anBottom];
+ Text := 'Quit';
+ Down := False;
+ FontDesc := '#Label1';
+ Hint := '';
+ ImageName := '';
+ TabOrder := 2;
+ OnClick := @ButtonQuitClicked;
+ end;
+
+ Label1 := TfpgLabel.Create(self);
+ with Label1 do
+ begin
+ Name := 'Label1';
+ SetPosition(16, 8, 400, 56);
+ Anchors := [anLeft,anRight,anTop];
+ FontDesc := '#Label1';
+ Hint := '';
+ Text := 'You can use Ctrl+Ins to add new grid lines. F2 or Enter will put you in edit mode. While in edit mode, changing focus or pressing Enter will take you back to non-edit mode.';
+ WrapText := True;
+ end;
+
+ {@VFD_BODY_END: MainForm}
+ {%endregion}
+end;
+
+
+end.