summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--extras/contributed/editgrid/EditGridDemo.lpr25
-rw-r--r--extras/contributed/editgrid/fpg_edit.patch589
-rw-r--r--extras/contributed/editgrid/readme.txt10
-rw-r--r--extras/contributed/editgrid/u_demo.pas388
-rw-r--r--extras/contributed/editgrid/u_editgrid.pas1743
5 files changed, 2755 insertions, 0 deletions
diff --git a/extras/contributed/editgrid/EditGridDemo.lpr b/extras/contributed/editgrid/EditGridDemo.lpr
new file mode 100644
index 00000000..819b44ab
--- /dev/null
+++ b/extras/contributed/editgrid/EditGridDemo.lpr
@@ -0,0 +1,25 @@
+program EditGridDemo;
+
+{$mode objfpc}{$H+}
+
+uses
+ Classes,fpgui_toolkit
+ { you can add units after this },
+ fpg_main, u_demo, u_editgrid;
+
+procedure MainProc;
+begin
+fpgApplication.Initialize;
+F_Demo:= TF_Demo.Create(nil);
+try
+ F_Demo.Show;
+ fpgApplication.Run;
+finally
+ F_Demo.Free;
+ end;
+end;
+
+begin
+MainProc;
+end.
+
diff --git a/extras/contributed/editgrid/fpg_edit.patch b/extras/contributed/editgrid/fpg_edit.patch
new file mode 100644
index 00000000..889a1c4b
--- /dev/null
+++ b/extras/contributed/editgrid/fpg_edit.patch
@@ -0,0 +1,589 @@
+diff --git a/src/gui/fpg_edit.pas b/src/gui/fpg_edit.pas
+index f66a585..8451a74 100644
+--- a/src/gui/fpg_edit.pas
++++ b/src/gui/fpg_edit.pas
+@@ -204,6 +204,8 @@ TfpgBaseNumericEdit = class(TfpgBaseEdit)
+ FNegativeColor: TfpgColor;
+ FThousandSeparator: TfpgChar;
+ FShowThousand: boolean;
++ FMaxLimit: boolean;
++ FMinLimit: boolean;
+ procedure AdjustTextOffset(UsePxCursorPos: boolean); override;
+ procedure AdjustDrawingInfo; override;
+ procedure SetOldColor(const AValue: TfpgColor);
+@@ -217,6 +219,7 @@ TfpgBaseNumericEdit = class(TfpgBaseEdit)
+ procedure DoOnChange; override;
+ function GetMarginAdjustment: integer; override;
+ procedure HandlePaint; override;
++ procedure HandleKeyPress(var keycode: word; var shiftstate: TShiftState; var consumed: Boolean); override;
+ procedure SetTextColor(const AValue: TfpgColor); override;
+ procedure FormatEdit; virtual;
+ procedure Justify; virtual; // to implement in derived classes
+@@ -233,9 +236,12 @@ TfpgBaseNumericEdit = class(TfpgBaseEdit)
+ property HideSelection;
+ // property MaxLength; { probably MaxValue and MinValue }
+ property TabOrder;
+- property ShowThousand: boolean read FShowThousand write FShowThousand default False;
++ property ShowThousand: boolean read FShowThousand write FShowThousand;
+ public
+ constructor Create(AOwner: TComponent); override;
++ property TextColor: TfpgColor read FTextColor write SetTextColor;
++ property MaxLimit: boolean read FMaxLimit write FMaxLimit;
++ property MinLimit: boolean read FMinLimit write FMinLimit;
+ published
+ property FontDesc;
+ end;
+@@ -243,7 +249,6 @@ TfpgBaseNumericEdit = class(TfpgBaseEdit)
+
+ TfpgEditInteger = class(TfpgBaseNumericEdit)
+ private
+- FLimit: Boolean;
+ FMaxValue: integer;
+ FMinValue: integer;
+ protected
+@@ -270,7 +275,7 @@ TfpgEditInteger = class(TfpgBaseNumericEdit)
+ property ParentShowHint;
+ property ReadOnly;
+ property ShowHint;
+- property ShowThousand default True;
++ property ShowThousand;
+ property TabOrder;
+ property TextColor;
+ property Value: integer read GetValue write SetValue;
+@@ -288,7 +293,6 @@ TfpgEditInteger = class(TfpgBaseNumericEdit)
+ TfpgEditFloat = class(TfpgBaseNumericEdit)
+ private
+ FFixedDecimals: integer;
+- FLimit: Boolean;
+ FMaxValue: extended;
+ FMinValue: extended;
+ protected
+@@ -298,6 +302,7 @@ TfpgEditFloat = class(TfpgBaseNumericEdit)
+ procedure SetMinValue(const AValue: extended); virtual;
+ procedure SetDecimals(const AValue: integer);
+ procedure SetFixedDecimals(const AValue: integer);
++ procedure HandleKeyPress(var keycode: word; var shiftstate: TShiftState; var consumed: Boolean); override;
+ procedure HandleKeyChar(var AText: TfpgChar; var shiftstate: TShiftState; var consumed: Boolean); override;
+ procedure HandleSetFocus; override;
+ procedure HandleKillFocus; override;
+@@ -320,7 +325,7 @@ TfpgEditFloat = class(TfpgBaseNumericEdit)
+ property ParentShowHint;
+ property ReadOnly;
+ property ShowHint;
+- property ShowThousand default True;
++ property ShowThousand;
+ property TabOrder;
+ property TextColor;
+ property Value: extended read GetValue write SetValue;
+@@ -337,7 +342,6 @@ TfpgEditFloat = class(TfpgBaseNumericEdit)
+
+ TfpgEditCurrency = class(TfpgBaseNumericEdit)
+ private
+- FLimit: Boolean;
+ FMaxValue: Currency;
+ FMinValue: Currency;
+ protected
+@@ -368,7 +372,7 @@ TfpgEditCurrency = class(TfpgBaseNumericEdit)
+ property ParentShowHint;
+ property ReadOnly;
+ property ShowHint;
+- property ShowThousand default True;
++ property ShowThousand;
+ property TabOrder;
+ property TextColor;
+ property Value: Currency read GetValue write SetValue;
+@@ -1726,7 +1730,7 @@ procedure TfpgBaseNumericEdit.SetShowThousand;
+ else
+ txt := fText;
+ end;
+- if ShowThousand then
++ if FShowThousand then
+ begin
+ if fText > '' then
+ if fText[1] = '-' then
+@@ -1843,6 +1847,13 @@ procedure TfpgBaseNumericEdit.HandlePaint;
+ end;
+ end;
+
++procedure TfpgBaseNumericEdit.HandleKeyPress(var keycode: word; var shiftstate: TShiftState; var consumed: Boolean);
++begin
++ if (keycode = keyReturn) or (keycode = keyPEnter) then
++ FormatEdit;
++ inherited HandleKeyPress(keycode, shiftstate, consumed);
++end;
++
+ procedure TfpgBaseNumericEdit.SetTextColor(const AValue: TfpgColor);
+ begin
+ if FTextColor = AValue then
+@@ -1886,33 +1897,36 @@ function TfpgEditInteger.GetValue: integer;
+ txt := UTF8Copy(txt, 1, Pred(UTF8Pos(FThousandSeparator, txt)))
+ +UTF8Copy(txt, Succ(UTF8Pos(FThousandSeparator, txt)), Length(txt) - UTF8Pos(FThousandSeparator, txt));
+ if UTF8Copy(fText, 1, 1) = '-' then
+- fText := '-' + txt
+- else
+- fText := txt;
+- end;
++ txt := '-' + txt;
++ end
++ else
++ txt := fText;
+
+- if fText = '-' then
++ if txt = '-' then
+ begin
+ Result := 0;
+- Text := fText;
++ Text := txt;
+ end
+ else
+ begin
+- if Text <> '' then
++ if txt <> '' then
+ begin
+ try
+- Result := StrToInt(fText);
+- if FLimit then
++ Result := StrToInt(txt);
++ if FMaxLimit then
+ begin
+- if Result> FMaxValue then
++ if Result > FMaxValue then
+ begin
+ SetValue(FMaxValue);
+- Result:= FMaxValue;
++ Result := FMaxValue;
+ end;
+- if Result< FMinValue then
++ end;
++ if FMinLimit then
++ begin
++ if Result < FMinValue then
+ begin
+ SetValue(FMinValue);
+- Result:= FMinValue;
++ Result := FMinValue;
+ end;
+ end;
+ except
+@@ -1931,25 +1945,33 @@ function TfpgEditInteger.GetValue: integer;
+
+ procedure TfpgEditInteger.SetValue(const AValue: integer);
+ begin
+- if FLimit then
+- if (AValue <= FMaxValue) and (AValue >= FMinValue) then
+- try
+- Text := IntToStr(AValue);
+- FormatEdit;
+- except
+- on E: EConvertError do
+- Text := '';
+- end
+- else
+- Exit
+- else
++ if not FMaxLimit and not FMinLimit then
+ try
+ Text := IntToStr(AValue);
+ FormatEdit;
+ except
+ on E: EConvertError do
+ Text := '';
+- end;
++ end
++ else
++ begin
++ if FMaxLimit and (AValue <= FMaxValue) then
++ try
++ Text := IntToStr(AValue);
++ FormatEdit;
++ except
++ on E: EConvertError do
++ Text := '';
++ end;
++ if FMinLimit and (AValue >= FMinValue) then
++ try
++ Text := IntToStr(AValue);
++ FormatEdit;
++ except
++ on E: EConvertError do
++ Text := '';
++ end;
++ end;
+ end;
+
+ procedure TfpgEditInteger.SetMaxValue(const AValue: integer);
+@@ -1958,7 +1980,7 @@ procedure TfpgEditInteger.SetMaxValue(const AValue: integer);
+ FMaxValue:= AValue
+ else
+ FMaxValue := FMinValue;
+- FLimit:= True;
++ FMaxLimit:= True;
+ end;
+
+ procedure TfpgEditInteger.SetMinValue(const AValue: integer);
+@@ -1967,7 +1989,7 @@ procedure TfpgEditInteger.SetMinValue(const AValue: integer);
+ FMinValue:= AValue
+ else
+ FMinValue := FMaxValue;
+- FLimit:= True;
++ FMinLimit:= True;
+ end;
+
+ procedure TfpgEditInteger.HandleKeyChar(var AText: TfpgChar;
+@@ -1981,6 +2003,12 @@ procedure TfpgEditInteger.HandleKeyChar(var AText: TfpgChar;
+ else
+ consumed := True;
+ inherited HandleKeyChar(AText, shiftstate, consumed);
++ if FMaxLimit then
++ if GetValue > FMaxValue then
++ SetValue(FMaxValue);
++ if FMinLimit then
++ if GetValue < FMinValue then
++ SetValue(FMinValue);
+ end;
+
+ procedure TfpgEditInteger.HandleSetFocus;
+@@ -2025,7 +2053,8 @@ constructor TfpgEditInteger.Create(AOwner: TComponent);
+ inherited Create(AOwner);
+ FShowThousand := True;
+ FDecimals := 0;
+- FLimit := False;
++ FMaxLimit := False;
++ FMinLimit := False;
+ end;
+
+ { TfpgEditFloat }
+@@ -2048,7 +2077,6 @@ function TfpgEditFloat.GetValue: extended;
+ if UTF8Pos(FDecimalSeparator, fText) > 0 then
+ if UTF8Length(fText)-UTF8Pos(FDecimalSeparator, fText) > FFixedDecimals then
+ fText := UTF8Copy(fText, 1, UTF8Length(fText) - 1);
+-
+ if ShowThousand then
+ begin
+ if Copy(fText, 1, 1) = '-' then // No need for utf8 version here
+@@ -2059,33 +2087,36 @@ function TfpgEditFloat.GetValue: extended;
+ txt := UTF8Copy(txt, 1, Pred(UTF8Pos(FThousandSeparator, txt)))
+ +UTF8Copy(txt, Succ(UTF8Pos(FThousandSeparator, txt)), UTF8Length(txt) - UTF8Pos(FThousandSeparator, txt));
+ if Copy(fText, 1, 1) = '-' then // No need for utf8 version here
+- fText := '-' + txt
+- else
+- fText := txt;
+- end;
++ txt := '-' + txt;
++ end
++ else
++ txt := fText;
+
+- if fText = '-' then
++ if txt = '-' then
+ begin
+ Result := 0;
+- Text := fText;
++ Text := txt;
+ end
+ else
+ begin
+- if fText <> '' then
++ if txt <> '' then
+ begin
+ try
+- Result := StrToFloat(fText);
+- if FLimit then
++ Result := StrToFloat(txt);
++ if FMaxLimit then
+ begin
+- if Result> FMaxValue then
++ if Result > FMaxValue then
+ begin
+ SetValue(FMaxValue);
+- Result:= FMaxvalue;
++ Result := FMaxValue;
+ end;
+- if Result< FMinValue then
++ end;
++ if FMinLimit then
++ begin
++ if Result < FMinValue then
+ begin
+ SetValue(FMinValue);
+- Result:= FMinValue;
++ Result := FMinValue;
+ end;
+ end;
+ except
+@@ -2104,22 +2135,7 @@ function TfpgEditFloat.GetValue: extended;
+
+ procedure TfpgEditFloat.SetValue(const AValue: extended);
+ begin
+- if FLimit then
+- if (AValue <= FMaxValue) and (AValue >= FMinValue) then
+- try
+- Text := FloatToStr(AValue);
+- if FFixedDecimals > -1 then
+- if UTF8Pos(FDecimalSeparator, Text) > 0 then
+- while UTF8Length(Text)-UTF8Pos(FDecimalSeparator, Text) < FFixedDecimals do
+- Text := Text + '0';
+- FormatEdit;
+- except
+- on E: EConvertError do
+- Text := '';
+- end
+- else
+- Exit
+- else
++ if not FMaxLimit and not FMinLimit then
+ try
+ Text := FloatToStr(AValue);
+ if FFixedDecimals > -1 then
+@@ -2130,7 +2146,34 @@ procedure TfpgEditFloat.SetValue(const AValue: extended);
+ except
+ on E: EConvertError do
+ Text := '';
+- end;
++ end
++ else
++ begin
++ if FMaxLimit and (AValue <= FMaxValue) then
++ try
++ Text := FloatToStr(AValue);
++ if FFixedDecimals > -1 then
++ if UTF8Pos(FDecimalSeparator, Text) > 0 then
++ while UTF8Length(Text)-UTF8Pos(FDecimalSeparator, Text) < FFixedDecimals do
++ Text := Text + '0';
++ FormatEdit;
++ except
++ on E: EConvertError do
++ Text := '';
++ end;
++ if FMinLimit and (AValue >= FMinValue) then
++ try
++ Text := FloatToStr(AValue);
++ if FFixedDecimals > -1 then
++ if UTF8Pos(FDecimalSeparator, Text) > 0 then
++ while UTF8Length(Text)-UTF8Pos(FDecimalSeparator, Text) < FFixedDecimals do
++ Text := Text + '0';
++ FormatEdit;
++ except
++ on E: EConvertError do
++ Text := '';
++ end;
++ end;
+ end;
+
+ procedure TfpgEditFloat.SetMaxValue(const AValue: extended);
+@@ -2139,7 +2182,7 @@ procedure TfpgEditFloat.SetMaxValue(const AValue: extended);
+ FMaxValue:= AValue
+ else
+ FMaxValue := FMinValue;
+- FLimit:= True;
++ FMaxLimit := True;
+ end;
+
+ procedure TfpgEditFloat.SetMinValue(const AValue: extended);
+@@ -2148,7 +2191,7 @@ procedure TfpgEditFloat.SetMinValue(const AValue: extended);
+ FMinValue:= AValue
+ else
+ FMinValue := FMaxValue;
+- FLimit:= True;
++ FMinLimit := True;
+ end;
+
+ procedure TfpgEditFloat.SetDecimals(const AValue: integer);
+@@ -2173,6 +2216,32 @@ procedure TfpgEditFloat.SetFixedDecimals(const AValue: integer);
+ end;
+ end;
+
++procedure TfpgEditFloat.HandleKeyPress(var keycode: word; var shiftstate: TShiftState; var consumed: Boolean);
++begin
++ if (keycode = keyReturn) or (keycode = keyPEnter) then
++ begin
++ fText := FloatToStr(GetValue);
++ if FFixedDecimals > -1 then
++ begin
++ if UTF8Pos(FDecimalSeparator, fText) > 0 then
++ begin
++ if (UTF8Length(fText) - UTF8Pos(FDecimalSeparator, fText)) > FFixedDecimals then
++ fText := Copy(fText, 1, UTF8Pos(FDecimalSeparator, fText) + FFixedDecimals);
++ end
++ else
++ if UTF8Pos(FDecimalSeparator, fText) = 0 then
++ fText := fText + FDecimalSeparator;
++ while (UTF8Length(fText) - (UTF8Pos(FDecimalSeparator, fText)) < FFixedDecimals) do
++ fText := fText +'0';
++ end;
++ if FDecimals > -1 then
++ if UTF8Pos(FDecimalSeparator, fText) > 0 then
++ if (UTF8Length(fText) - UTF8Pos(FDecimalSeparator, fText)) > FDecimals then
++ fText := Copy(fText, 1, UTF8Pos(FDecimalSeparator, fText) + FDecimals);
++ end;
++ inherited HandleKeyPress(keycode, shiftstate, consumed);
++end;
++
+ procedure TfpgEditFloat.HandleKeyChar(var AText: TfpgChar;
+ var shiftstate: TShiftState; var consumed: Boolean);
+ var
+@@ -2185,6 +2254,16 @@ procedure TfpgEditFloat.HandleKeyChar(var AText: TfpgChar;
+ else
+ consumed := True;
+ inherited HandleKeyChar(AText, shiftstate, consumed);
++ if FMaxLimit then
++ if GetValue > FMaxValue then
++ SetValue(FMaxValue);
++ if FMinLimit then
++ if GetValue < FMinValue then
++ SetValue(FMinValue);
++ if FDecimals > -1 then
++ if UTF8Pos(FDecimalSeparator, fText) > 0 then
++ if (UTF8Length(fText) - UTF8Pos(FDecimalSeparator, fText)) > FDecimals then
++ fText := Copy(fText, 1, UTF8Pos(FDecimalSeparator, fText) + FDecimals);
+ end;
+
+ procedure TfpgEditFloat.HandleSetFocus;
+@@ -2244,8 +2323,10 @@ constructor TfpgEditFloat.Create(AOwner: TComponent);
+ begin
+ inherited Create(AOwner);
+ FDecimals := -1;
++ FFixedDecimals := -1;
+ FShowThousand := True;
+- FLimit := False;
++ FMaxLimit := False;
++ FMinLimit := False;
+ end;
+
+ { TfpgEditCurrency }
+@@ -2268,30 +2349,34 @@ function TfpgEditCurrency.GetValue: Currency;
+ txt := UTF8Copy(txt, 1, Pred(UTF8Pos(FThousandSeparator, txt)))
+ +UTF8Copy(txt, Succ(UTF8Pos(FThousandSeparator, txt)), UTF8Length(txt) - UTF8Pos(FThousandSeparator, txt));
+ if Copy(fText, 1, 1) = '-' then
+- fText := '-' + txt
+- else
+- fText := txt;
+- end;
+- if fText = '-' then
++ txt := '-' + txt;
++ end
++ else
++ txt := fText;
++
++ if txt = '-' then
+ begin
+ Result := 0;
+- Text:= fText;
++ Text:= txt;
+ end
+ else
+- if fText > '' then
++ if txt > '' then
+ try
+- Result := StrToCurr(fText);
+- if FLimit then
++ Result := StrToCurr(txt);
++ if FMaxLimit then
+ begin
+- if Result> FMaxValue then
++ if Result > FMaxValue then
+ begin
+ SetValue(FMaxValue);
+- Result:= FMaxvalue;
++ Result := FMaxValue;
+ end;
+- if Result< FMinValue then
++ end;
++ if FMinLimit then
++ begin
++ if Result < FMinValue then
+ begin
+ SetValue(FMinValue);
+- Result:= FMinValue;
++ Result := FMinValue;
+ end;
+ end;
+ except
+@@ -2308,25 +2393,33 @@ function TfpgEditCurrency.GetValue: Currency;
+
+ procedure TfpgEditCurrency.SetValue(const AValue: Currency);
+ begin
+- if FLimit then
+- if (AValue <= FMaxValue) and (AValue >= FMinValue) then
+- try
+- Text := FloatToStrF(AValue, ffFixed, -1, FDecimals);
+- FormatEdit;
+- except
+- on E: EConvertError do
+- Text := '';
+- end
+- else
+- Exit
+- else
++ if not FMaxLimit and not FMinLimit then
+ try
+ Text := FloatToStrF(AValue, ffFixed, -1, FDecimals);
+ FormatEdit;
+ except
+ on E: EConvertError do
+ Text := '';
+- end;
++ end
++ else
++ begin
++ if FMaxLimit and (AValue <= FMaxValue) then
++ try
++ Text := FloatToStrF(AValue, ffFixed, -1, FDecimals);
++ FormatEdit;
++ except
++ on E: EConvertError do
++ Text := '';
++ end;
++ if FMinLimit and (AValue >= FMinValue) then
++ try
++ Text := FloatToStrF(AValue, ffFixed, -1, FDecimals);
++ FormatEdit;
++ except
++ on E: EConvertError do
++ Text := '';
++ end;
++ end;
+ end;
+
+ procedure TfpgEditCurrency.SetMaxValue(const AValue: Currency);
+@@ -2335,7 +2428,7 @@ procedure TfpgEditCurrency.SetMaxValue(const AValue: Currency);
+ FMaxValue:= AValue
+ else
+ FMaxValue := FMinValue;
+- FLimit:= True;
++ FMaxLimit:= True;
+ end;
+
+ procedure TfpgEditCurrency.SetMinValue(const AValue: Currency);
+@@ -2344,7 +2437,7 @@ procedure TfpgEditCurrency.SetMinValue(const AValue: Currency);
+ FMinValue:= AValue
+ else
+ FMinValue := FMaxValue;
+- FLimit:= True;
++ FMinLimit:= True;
+ end;
+
+ procedure TfpgEditCurrency.SetDecimals(AValue: integer);
+@@ -2389,6 +2482,12 @@ procedure TfpgEditCurrency.HandleKeyChar(var AText: TfpgChar;
+ else
+ consumed := True;
+ inherited HandleKeyChar(AText, shiftstate, consumed);
++ if FMaxLimit then
++ if GetValue > FMaxValue then
++ SetValue(FMaxValue);
++ if FMinLimit then
++ if GetValue < FMinValue then
++ SetValue(FMinValue);
+ end;
+
+ procedure TfpgEditCurrency.HandleSetFocus;
+@@ -2433,7 +2532,8 @@ constructor TfpgEditCurrency.Create(AOwner: TComponent);
+ inherited Create(AOwner);
+ FDecimals := 2;
+ FShowThousand := True;
+- FLimit := False;
++ FMaxLimit := False;
++ FMinLimit := False;
+ end;
+
+
diff --git a/extras/contributed/editgrid/readme.txt b/extras/contributed/editgrid/readme.txt
new file mode 100644
index 00000000..6da50086
--- /dev/null
+++ b/extras/contributed/editgrid/readme.txt
@@ -0,0 +1,10 @@
+
+Name: EditGrid widget
+Author: Jean-Marc Levecque <jmarc.levecque@jmlesite.fr>
+Date: 2013
+Description:
+Inspired by the grid editing demo, the idea then came to make an
+editgrid which would incorporate existing edit components. Included
+here is the editgrid widget, and a demo project. This is still work
+in progress.
+
diff --git a/extras/contributed/editgrid/u_demo.pas b/extras/contributed/editgrid/u_demo.pas
new file mode 100644
index 00000000..6e42b597
--- /dev/null
+++ b/extras/contributed/editgrid/u_demo.pas
@@ -0,0 +1,388 @@
+unit u_demo;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+ Classes, SysUtils, dateutils,
+ fpg_main, fpg_base,
+ fpg_form, fpg_panel, fpg_button, fpg_basegrid, fpg_editcombo, fpg_checkbox, fpg_radiobutton,
+ u_editgrid;
+
+type
+ TF_Demo = class(TfpgForm)
+ private
+ EG_Grid: TfpgEditGrid;
+ Bt_AddOne: TfpgButton;
+ Ckb_Limits: TfpgCheckBox;
+ Ckb_FloatDec: TfpgCheckBox;
+ Ckb_FloatFixDec: TfpgCheckBox;
+ Ckb_EditWay: TfpgCheckBox;
+ Rb_Point: TfpgRadioButton;
+ Rb_Comma: TfpgRadioButton;
+ Ckb_Space: TfpgCheckBox;
+ Ckb_Thousand: TfpgCheckBox;
+ P_EditCombo: TfpgPanel;
+ Ckb_AutoComplete: TfpgCheckBox;
+ Rb_No: TfpgRadioButton;
+ Rb_Yes: TfpgRadioButton;
+ Rb_Ask: TfpgRadioButton;
+ Bt_Fermer: TfpgButton;
+ procedure EG_GridKeyPress(Sender: TObject; var KeyCode: word; var ShiftState: TShiftState;
+ var Consumed: Boolean);
+ procedure Bt_AddOneClick(Sender: TObject);
+ procedure Ckb_LimitsChange(Sender: TObject);
+ procedure Ckb_ThousandChange(Sender: TObject);
+ procedure Rb_Change(Sender: TObject);
+ procedure Ckb_SpaceChange(Sender: TObject);
+ procedure Ckb_FloatDecChange(Sender: TObject);
+ procedure Ckb_FloatFixDecChange(Sender: TObject);
+ procedure Ckb_EditWayChange(Sender: TObject);
+ procedure Ckb_AutoCompleteChange(Sender: TObject);
+ procedure Rb_EditComboChange(Sender: TObject);
+ procedure Bt_FermerClick(Sender: TObject);
+ public
+ constructor Create(AOwner: TComponent); override;
+ procedure AfterCreate; override;
+ end;
+
+var
+ F_Demo: TF_Demo;
+
+implementation
+
+var
+ ComboBoxListe: TStringList;
+
+procedure PopulateListe;
+begin
+ComboBoxListe:= TStringList.Create;
+ComboBoxListe.Add('one');
+ComboBoxListe.Add('two');
+ComboBoxListe.Add('three');
+ComboBoxListe.Add('four');
+ComboBoxListe.Add('five');
+end;
+
+procedure TF_Demo.EG_GridKeyPress(Sender: TObject; var KeyCode: word; var ShiftState: TShiftState;
+ var Consumed: Boolean);
+begin
+case KeyCode of
+ KeyInsert:
+ with EG_Grid do
+ begin
+ RowCount:= RowCount+1;
+ FocusCol:= 0;
+ FocusRow:= Pred(RowCount);
+ Consumed:= True;
+ end;
+ end;
+end;
+
+procedure TF_Demo.Bt_AddOneClick(Sender: TObject);
+var
+ ADate: TDateTime;
+begin
+with EG_Grid do
+ begin
+ RowCount:= RowCount+1;
+ Cells[0,Pred(RowCount)]:= 'No edit';
+ Cells[1,Pred(RowCount)]:= 'Row '+IntToStr(RowCount);
+ Cells[2,Pred(RowCount)]:= IntToStr(RowCount*RowCount*100);
+ Cells[3,Pred(RowCount)]:= FloatToStr(1000/RowCount);
+ Cells[4,Pred(RowCount)]:= FormatCurr('0.00',FloatToCurr(1000/RowCount));
+ Cells[5,Pred(RowCount)]:= ComboBoxListe[Pred(RowCount) mod ComboBoxListe.Count];
+ Cells[6,Pred(RowCount)]:= '';
+ if Odd(RowCount) then
+ Cells[7,Pred(RowCount)]:= 'True'
+ else
+ Cells[7,Pred(RowCount)]:= 'False';
+ ADate:= IncDay(Now,RowCount);
+ Dates[8]:= ADate;
+ Cells[8,Pred(RowCount)]:= FormatDateTime(EG_Grid.GridDateFormat[8], Adate);
+ end;
+end;
+
+procedure TF_Demo.Ckb_LimitsChange(Sender: TObject);
+var
+ Cpt: Integer;
+begin
+ with EG_Grid do
+ for Cpt:= 0 to Pred(ColumnCount) do
+ if Ckb_Limits.Checked then
+ case ColumnEditType[Cpt] of
+ etInteger:
+ begin
+ MaxIntValue[Cpt]:= 5000;
+ MinIntValue[Cpt]:= -1000;
+ end;
+ etFloat:
+ begin
+ MaxFloatValue[Cpt]:= 5000;
+ MinFloatValue[Cpt]:= -1000;
+ end;
+ etCurrency:
+ begin
+ MaxCurrValue[Cpt]:= 5000;
+ MinCurrValue[Cpt]:= -1000;
+ end;
+ end
+ else
+ case ColumnEditType[Cpt] of
+ etInteger, etFloat, etCurrency:
+ begin
+ NumericMaxLimit[Cpt]:= False;
+ NumericMinLimit[Cpt]:= False;
+ end;
+ end;
+end;
+
+procedure TF_Demo.Ckb_ThousandChange(Sender: TObject);
+var
+ Cpt: Integer;
+begin
+ with EG_Grid do
+ for Cpt:= 0 to Pred(ColumnCount) do
+ if Ckb_Thousand.Checked then
+ case ColumnEditType[Cpt] of
+ etInteger, etFloat, etCurrency:
+ NumericShowThousand[Cpt]:= True;
+ end
+ else
+ case ColumnEditType[Cpt] of
+ etInteger, etFloat, etCurrency:
+ NumericShowThousand[Cpt]:= False;
+ end;
+end;
+
+procedure TF_Demo.Rb_Change(Sender: TObject);
+var
+ Cpt: Integer;
+begin
+ with EG_Grid do
+ for Cpt:= 0 to Pred(ColumnCount) do
+ if Sender is TfpgRadioButton then
+ case (Sender as TfpgRadioButton).tag of
+ 0:
+ case ColumnEditType[Cpt] of
+ etInteger:
+ if Ckb_Space.Checked then
+ NumericThousandSeparator[Cpt] := ' '
+ else
+ NumericThousandSeparator[Cpt] := ',';
+ etFloat, etCurrency:
+ begin
+ NumericDecimalSeparator[Cpt] := '.';
+ if Ckb_Space.Checked then
+ NumericThousandSeparator[Cpt] := ' '
+ else
+ NumericThousandSeparator[Cpt] := ',';
+ end;
+ end;
+ 1:
+ case ColumnEditType[Cpt] of
+ etInteger, etFloat, etCurrency:
+ begin
+ NumericDecimalSeparator[Cpt] := ',';
+ if Ckb_Space.Checked then
+ NumericThousandSeparator[Cpt] := ' '
+ else
+ NumericThousandSeparator[Cpt] := '.';
+ end;
+ end;
+ end;
+end;
+
+procedure TF_Demo.Ckb_SpaceChange(Sender: TObject);
+var
+ Cpt: Integer;
+begin
+ with EG_Grid do
+ for Cpt:= 0 to Pred(ColumnCount) do
+ case ColumnEditType[Cpt] of
+ etInteger, etFloat, etCurrency:
+ begin
+ if Ckb_Space.Checked then
+ NumericThousandSeparator[Cpt] := ' '
+ else
+ if Rb_Point.Checked then
+ NumericThousandSeparator[Cpt] := ','
+ else
+ NumericThousandSeparator[Cpt] := '.';
+ end;
+ end;
+end;
+
+procedure TF_Demo.Ckb_FloatDecChange(Sender: TObject);
+var
+ Cpt: Integer;
+begin
+ with EG_Grid do
+ for Cpt:= 0 to Pred(ColumnCount) do
+ case ColumnEditType[Cpt] of
+ etFloat:
+ if Ckb_FloatDec.Checked then
+ begin
+ Ckb_FloatFixDec.Checked := False;
+ NumericDecimals[Cpt] := 3;
+ end
+ else
+ FloatFixedDecimals[Cpt] := -1;
+ end;
+end;
+
+procedure TF_Demo.Ckb_FloatFixDecChange(Sender: TObject);
+var
+ Cpt: Integer;
+begin
+ with EG_Grid do
+ for Cpt:= 0 to Pred(ColumnCount) do
+ case ColumnEditType[Cpt] of
+ etFloat:
+ if Ckb_FloatFixDec.Checked then
+ begin
+ Ckb_FloatDec.Checked := False;
+ FloatFixedDecimals[Cpt] := 3;
+ end
+ else
+ NumericDecimals[Cpt] := -1;
+ end;
+end;
+
+procedure TF_Demo.Ckb_EditWayChange(Sender: TObject);
+begin
+ if Ckb_EditWay.Checked then
+ EG_Grid.EditWay:= edRow
+ else
+ EG_Grid.EditWay:= edColumn;
+end;
+
+procedure TF_Demo.Ckb_AutoCompleteChange(Sender: TObject);
+var
+ Cpt: Integer;
+begin
+ with EG_Grid do
+ for Cpt:= 0 to Pred(ColumnCount) do
+ case ColumnEditType[Cpt] of
+ etEditCombo:
+ AutoComplete[Cpt] := Ckb_AutoComplete.Checked;
+ end;
+end;
+
+procedure TF_Demo.Rb_EditComboChange(Sender: TObject);
+var
+ Cpt: Integer;
+begin
+ with EG_Grid do
+ for Cpt:= 0 to Pred(ColumnCount) do
+ case ColumnEditType[Cpt] of
+ etEditCombo:
+ begin
+ if RB_No.Checked then
+ AllowNew[Cpt] := anNo;
+ if RB_Yes.Checked then
+ AllowNew[Cpt] := anYes;
+ if RB_Ask.Checked then
+ AllowNew[Cpt] := anAsk;
+ end;
+ end;
+end;
+
+procedure TF_Demo.Bt_FermerClick(Sender: TObject);
+begin
+ComboBoxListe.Free;
+Close;
+end;
+
+constructor TF_Demo.Create(AOwner: TComponent);
+var
+ Cpt: Integer;
+begin
+inherited Create(AOwner);
+Name:= 'F_Demo';
+WindowTitle:= 'EditGrid demo';
+SetPosition(0,0,1000,400);
+WindowPosition:= wpScreencenter;
+Sizeable:= False;
+PopulateListe;
+EG_Grid:= CreateEditGrid(Self,10,10,Width-20,Height-120);
+with EG_Grid do
+ begin
+ AddColumn('None',50,taCenter);
+ AddColumn('Text',100,etText);
+ AddColumn('Integer',90,etInteger,taRightJustify);
+ AddColumn('Float',90,etFloat,taRightJustify);
+ //FloatFixedDecimals[Pred(ColumnCount)]:= 3;
+ //NumericDecimals[Pred(ColumnCount)]:= 3;
+ AddColumn('Currency',90,etCurrency,taRightJustify);
+ AddColumn('ComboBox',120,etComboBox);
+ for Cpt:= 0 to Pred(ComboBoxListe.Count) do
+ AddComboItem(Pred(ColumnCount),ComboBoxListe[Cpt]);
+ AddColumn('EditCombo',120,etEditCombo);
+ AddEditcomboItem(Pred(ColumnCount),'un');
+ AddEditcomboItem(Pred(ColumnCount),'deux');
+ AddEditcomboItem(Pred(ColumnCount),'trois');
+ AddEditcomboItem(Pred(ColumnCount),'quatre');
+ AddEditcomboItem(Pred(ColumnCount),'cinq');
+ AutoComplete[Pred(ColumnCount)] := True;
+ AllowNew[Pred(ColumnCount)] := anAsk;
+ AddColumn('CheckBox',100,etCheckBox,taCenter);
+ BoxCheckedText[Pred(ColumnCount)] := 'True';
+ BoxUncheckedText[Pred(ColumnCount)] := 'False';
+ BoxDisplayText[Pred(ColumnCount)] := 'CheckBox';
+ AddColumn('Calendar',120,etCalendar,taCenter);
+ GridDateFormat[Pred(ColumnCount)] := LongDateFormat;
+ CalendarDateFormat[Pred(ColumnCount)] := ShortDateFormat;
+ DateValue[Pred(ColumnCount)] := Now;
+ WeekStartDay[Pred(ColumnCount)] := 1;
+ WeeklyHoliday[Pred(ColumnCount)] := 7;
+ DayColor[Pred(ColumnCount)] := clBlue;
+ HoliDayColor[Pred(ColumnCount)] := clRed;
+ SingleClickSelect[Pred(ColumnCount)] := True;
+ DefaultRowHeight:= 20;
+ HeaderHeight:= 22;
+ HeaderFontDesc:= 'bitstream vera sans-10:bold';
+// Options:= [go_HideFocusRect];
+ OnKeyPress:= @EG_GridKeyPress;
+ end;
+Bt_AddOne:= CreateButton(Self,20,Height-100,100,'Add 1 line',@Bt_AddOneClick,'');
+Ckb_Limits:= CreateCheckBox(Self,150,Height-100,'Limit min and max numeric values');
+Ckb_Limits.OnChange:= @Ckb_LimitsChange;
+Ckb_FloatDec:= CreateCheckBox(Self,150,Height-80,'Limit EditFloat to 3 decimals');
+Ckb_FloatDec.OnChange:= @Ckb_FloatDecChange;
+Ckb_FloatFixDec:= CreateCheckBox(Self,150,Height-60,'Set EditFloat to 3 decimals');
+Ckb_FloatFixDec.OnChange:= @Ckb_FloatFixDecChange;
+Ckb_EditWay:= CreateCheckBox(Self,150,Height-40,'Edit changing to next row');
+Ckb_EditWay.OnChange:= @Ckb_EditWayChange;;
+Rb_Point:= CreateRadioButton(Self,400,Height-100,'Point as decimal separator');
+Rb_Point.Tag:= 0;
+Rb_Point.OnChange:= @Rb_Change;
+Rb_Comma:= CreateRadioButton(Self,400,Height-80,'Comma as decimal separator');
+Rb_Comma.Tag:= 1;
+Rb_Comma.OnChange:= @Rb_Change;
+Ckb_Space:= CreateCheckBox(Self,400,Height-60,'Space as thousand separator');
+Ckb_Space.OnChange:= @Ckb_SpaceChange;
+Ckb_Thousand:= CreateCheckBox(Self,400,Height-40,'Show thousand separator');
+Ckb_Thousand.OnChange:= @Ckb_ThousandChange;
+Ckb_Thousand.Checked:= True;
+P_EditCombo:= CreatePanel(Self,650,Height-110,170,100,'EditCombo',bsFlat,taCenter,tlTop);
+Ckb_AutoComplete:= CreateCheckBox(P_EditCombo,10,20,'Auto Completion');
+Ckb_AutoComplete.OnChange:= @Ckb_AutoCompleteChange;
+Rb_No:= CreateRadioButton(P_EditCombo,10,40,'No new item');
+Rb_No.OnChange:= @Rb_EditComboChange;
+Rb_Yes:= CreateRadioButton(P_EditCombo,10,60,'Auto new item');
+Rb_Yes.OnChange:= @Rb_EditComboChange;
+Rb_Ask:= CreateRadioButton(P_EditCombo,10,80,'Confirm new item');
+Rb_Ask.OnChange:= @Rb_EditComboChange;
+Rb_Ask.Checked:= True;
+Bt_Fermer:= CreateButton(Self,Width-130,Height-40,100,'Close',@Bt_FermerClick,'stdimg.exit');
+end;
+
+procedure TF_Demo.AfterCreate;
+begin
+Rb_Point.Checked:= True;
+end;
+
+end.
+
diff --git a/extras/contributed/editgrid/u_editgrid.pas b/extras/contributed/editgrid/u_editgrid.pas
new file mode 100644
index 00000000..9de5dfc3
--- /dev/null
+++ b/extras/contributed/editgrid/u_editgrid.pas
@@ -0,0 +1,1743 @@
+unit u_editgrid;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+ Classes,
+ SysUtils,
+ fpg_base,
+ fpg_main,
+ fpg_basegrid,
+ fpg_customgrid,
+ fpg_grid,
+ fpg_edit,
+ fpg_combobox,
+ fpg_editcombo,
+ fpg_checkbox,
+ fpg_popupcalendar;
+
+type
+
+ TEditType = (etNone, etText, etInteger, etFloat, etCurrency, etComboBox, etEditCombo, etCheckBox, etCalendar);
+ TEditing =(edRow, edColumn);
+
+ TfpgColumnData = class(TObject)
+ private
+ FMaxSet: boolean;
+ FminSet: boolean;
+ public
+ constructor Create;
+ destructor Destroy; override;
+ property MaxSet: boolean read FMaxSet write FMaxSet;
+ property MinSet: boolean read FminSet write FminSet;
+ end;
+
+ TfpgNumericColumn = class(TfpgColumnData)
+ private
+ FMaxLimit: boolean;
+ FMinLimit: boolean;
+ FDecimals: integer;
+ FDecimalseparator: TfpgChar;
+ FThousandSeparator: TfpgChar;
+ FShowThousand: boolean;
+ public
+ constructor Create;
+ destructor Destroy; override;
+ property MaxLimit: boolean read FMaxLimit write FMaxLimit;
+ property MinLimit: boolean read FMinLimit write FMinLimit;
+ property Decimals: integer read FDecimals write FDecimals;
+ property DecimalSeparator: TfpgChar read FDecimalSeparator write FDecimalSeparator;
+ property ThousandSeparator: TfpgChar read FThousandSeparator write FThousandSeparator;
+ property ShowThousand: boolean read FShowThousand write FShowThousand;
+ end;
+
+ TfpgIntegerColumn = class(TfpgNumericColumn)
+ private
+ FMaxVal: integer;
+ FMinVal: integer;
+ public
+ constructor Create;
+ destructor Destroy; override;
+ property MaxVal: integer read FMaxVal write FMaxVal;
+ property MinVal: integer read FMinVal write FMinVal;
+ end;
+
+ TfpgFloatColumn = class(TfpgNumericColumn)
+ private
+ FMaxVal: extended;
+ FMinVal: extended;
+ FFixedDecimals: integer;
+ public
+ constructor Create;
+ destructor Destroy; override;
+ property MaxVal: extended read FMaxVal write FMaxVal;
+ property MinVal: extended read FMinVal write FMinVal;
+ property FixedDecimals: integer read FFixedDecimals write FFixedDecimals;
+ end;
+
+ TfpgCurrencyColumn = class(TfpgNumericColumn)
+ private
+ FMaxVal: currency;
+ FMinVal: currency;
+ public
+ constructor Create;
+ destructor Destroy; override;
+ property MaxVal: currency read FMaxVal write FMaxVal;
+ property MinVal: currency read FMinVal write FMinVal;
+ end;
+
+ TfpgComboBoxColumn = class(TfpgColumnData)
+ private
+ FItems: TStringList;
+ public
+ constructor Create;
+ destructor Destroy; override;
+ property Items: TStringList read FItems write FItems;
+ end;
+
+ TfpgEditComboColumn = class(TfpgColumnData)
+ private
+ FItems: TStringList;
+ FAutoComplete: boolean;
+ FAllowNew: TAllowNew;
+ public
+ constructor Create;
+ destructor Destroy; override;
+ property Items: TStringList read FItems write FItems;
+ property AutoComplete: boolean read FAutoComplete write FAutoComplete;
+ property AllowNew: TAllowNew read FAllowNew write FAllowNew;
+ end;
+
+ TfpgCheckBoxColumn = class(TfpgColumnData)
+ private
+ FChecked: string;
+ FUnchecked: string;
+ FBoxText: string;
+ public
+ constructor Create;
+ destructor Destroy; override;
+ property CheckedText: string read FChecked write FChecked;
+ property UncheckedText: string read FUnchecked write FUnchecked;
+ property BoxText: string read FBoxText write FBoxText;
+ end;
+
+ TDates = class
+ FDate: TDateTime;
+ end;
+
+ TfpgCalendarColumn = class(TfpgColumnData)
+ private
+ FDatesList: TList;
+ FGridDateFormat: string;
+ FCalendarDateFormat: string;
+ FDateValue: TDateTime;
+ FMaxDate: TDateTime;
+ FMinDate: TDateTime;
+ FWeeklyHoliday: integer;
+ FWeekStartDay: integer;
+ FDayColor: TfpgColor;
+ FHolidayColor: TfpgColor;
+ FSingleClickSelect: boolean;
+ public
+ constructor Create;
+ destructor Destroy; override;
+ property DatesList: TList read FDatesList write FDatesList;
+ property GridDateFormat: string read FGridDateFormat write FGridDateFormat;
+ property CalendarDateFormat: string read FCalendarDateFormat write FCalendarDateFormat;
+ property DateValue: TDateTime read FDateValue write FDateValue;
+ property MaxDate: TDateTime read FMaxDate write FMaxDate;
+ property MinDate: TDateTime read FMinDate write FMinDate;
+ property WeeklyHoliday: integer read FWeeklyHoliday write FWeeklyHoliday;
+ property WeekStartDay: integer read FWeekStartDay write FWeekStartDay;
+ property DayColor: TfpgColor read FDayColor write FDayColor;
+ property HolidayColor: TfpgColor read FHolidayColor write FHolidayColor;
+ property SingleClickSelect: boolean read FSingleClickSelect write FSingleClickSelect;
+ end;
+
+ TfpgEditColumn = class(TfpgStringColumn)
+ private
+ FEditType: TEditType;
+ FData: TfpgColumnData;
+ public
+ property EditType: TEditType read FEditType write FEditType;
+ property Data: TfpgColumnData read FData write FData;
+ end;
+
+ TfpgCustomEditgrid = class(TfpgCustomStringGrid)
+ private
+ FDates: TDates;
+ FCellEditText: TFpgEdit;
+ FCellEditInteger: TFpgEditInteger;
+ FCellEditFloat: TFpgEditFloat;
+ FCellEditCurrency: TFpgEditCurrency;
+ FCellComboBox: TfpgComboBox;
+ FCellEditCombo: TfpgEditCombo;
+ FCellCheckBox: TfpgCheckBox;
+ FCellCalendar: TfpgCalendarCombo;
+// FRefGrid: TfpgStringGrid; // reference uniquement
+ FFocusRect: TfpgRect;
+ FEditing: boolean;
+ FEditWay: TEditing;
+ procedure EditGridFocusChange(Sender: TObject; ARow,ACol: integer);
+ procedure EditGridDoubleClick(Sender: TObject; AButton: TMouseButton; AShift: TShiftState;
+ const AMousePos: TPoint);
+ function GetColumnEditType(AIndex: integer): TEditType;
+ procedure SetEditCell;
+ procedure IniTextCell;
+ procedure FCellEditTextKeyPress(Sender: TObject; var KeyCode: word; var ShiftState: TShiftState;
+ var Consumed: boolean);
+ procedure FCellEditTextExit(Sender: TObject);
+ function GetNumericMaxLimit(AIndex: integer): boolean;
+ procedure SetNumericMaxLimit(AIndex: integer; const AValue: boolean);
+ function GetNumericMinLimit(AIndex: integer): boolean;
+ procedure SetNumericMinLimit(AIndex: integer; const AValue: boolean);
+ function GetNumericDecimals(AIndex: integer): integer;
+ procedure SetNumericDecimals(AIndex: integer; const AValue: integer);
+ function GetNumericDecimalSeparator(AIndex: integer): TfpgChar;
+ procedure SetNumericDecimalSeparator(AIndex: integer; const AValue: TfpgChar);
+ function GetNumericThousandSeparator(AIndex: integer): TfpgChar;
+ procedure SetNumericThousandSeparator(AIndex: integer; const AValue: TfpgChar);
+ function GetNumericShowThousand(AIndex: integer): boolean;
+ procedure SetNumericShowThousand(AIndex: integer; const AValue: boolean);
+ procedure IniIntegerCell;
+ procedure FCellEditIntegerKeyPress(Sender: TObject; var KeyCode: word; var ShiftState: TShiftState;
+ var Consumed: boolean);
+ procedure FCellEditIntegerExit(Sender: TObject);
+ function GetMaxIntValue(AIndex: integer): integer;
+ procedure SetMaxIntValue(AIndex: integer; const AValue: integer);
+ function GetMinIntValue(AIndex: integer): integer;
+ procedure SetMinIntValue(AIndex: integer; const AValue: integer);
+ procedure IniFloatCell;
+ procedure FCellEditFloatKeyPress(Sender: TObject; var KeyCode: word; var ShiftState: TShiftState;
+ var Consumed: boolean);
+ procedure FCellEditFloatExit(Sender: TObject);
+ function GetMaxFloatValue(AIndex: integer): extended;
+ procedure SetMaxFloatValue(AIndex: integer; const AValue: extended);
+ function GetMinFloatValue(AIndex: integer): extended;
+ procedure SetMinFloatValue(AIndex: integer; const AValue: extended);
+ function GetFloatFixedDecimals(AIndex: integer): integer;
+ procedure SetFloatFixedDecimals(AIndex: integer; const AValue: integer);
+ procedure IniCurrencyCell;
+ procedure FCellEditCurrencyKeyPress(Sender: TObject; var KeyCode: word; var ShiftState: TShiftState;
+ var Consumed: boolean);
+ procedure FCellEditCurrencyExit(Sender: TObject);
+ function GetMaxCurrValue(AIndex: integer): currency;
+ procedure SetMaxCurrValue(AIndex: integer; const AValue: currency);
+ function GetMinCurrValue(AIndex: integer): currency;
+ procedure SetMinCurrValue(AIndex: integer; const AValue: currency);
+ procedure IniComboBoxCell;
+ procedure FCellComboBoxKeyPress(Sender: TObject; var KeyCode: word; var ShiftState: TShiftState;
+ var Consumed: boolean);
+ procedure FCellComboBoxExit(Sender: TObject);
+ procedure IniEditComboCell;
+ procedure FCellEditComboKeyPress(Sender: TObject; var KeyCode: word; var ShiftState: TShiftState;
+ var Consumed: boolean);
+ procedure FCellEditComboExit(Sender: TObject);
+ function GetAutoComplete(AIndex: integer): boolean;
+ procedure SetAutoComplete(AIndex: integer; const AValue: boolean);
+ function GetAllowNew(AIndex: integer): TAllowNew;
+ procedure SetAllowNew(AIndex: integer; AValue: TAllowNew);
+ procedure IniCheckBoxCell;
+ procedure FCellCheckBoxKeyPress(Sender: TObject; var KeyCode: word; var ShiftState: TShiftState;
+ var Consumed: boolean);
+ procedure FCellCheckBoxExit(Sender: TObject);
+ function GetBoxCheckedText(AIndex: integer): string;
+ procedure SetBoxCheckedText(AIndex: integer; const AValue: string);
+ function GetBoxUncheckedText(AIndex: integer): string;
+ procedure SetBoxUncheckedText(AIndex: integer; const AValue: string);
+ function GetBoxDisplayText(AIndex: integer): string;
+ procedure SetBoxDisplayText(AIndex: integer; const AValue: string);
+ procedure IniCalendarCell;
+ procedure FCellCalendarKeyPress(Sender: TObject; var KeyCode: word; var ShiftState: TShiftState;
+ var Consumed: boolean);
+ procedure FCellCalendarExit(Sender: TObject);
+ function GetDates(AIndex: integer): TDateTime;
+ procedure SetDates(AIndex: integer; const AValue: TDateTime);
+ function GetDatesList(AIndex: integer): TList;
+ procedure SetDatesList(AIndex: integer; const AValue: TList);
+ function GetGridDateFormat(AIndex: integer): string;
+ procedure SetGridDateFormat(AIndex: integer; const AValue: string);
+ function GetCalendarDateFormat(AIndex: integer): string;
+ procedure SetCalendarDateFormat(AIndex: integer; const AValue: string);
+ function GetDateValue(AIndex: integer): TDateTime;
+ procedure SetDateValue(AIndex: integer; const AValue: TDateTime);
+ function GetMaxDate(AIndex: integer): TDateTime;
+ procedure SetMaxdate(AIndex: integer; const AValue: TDateTime);
+ function GetMinDate(AIndex: integer): TDateTime;
+ procedure SetMinDate(AIndex: integer; const AValue: TDateTime);
+ function GetWeeklyHoliday(AIndex: integer): integer;
+ procedure SetWeeklyHoliday(AIndex: integer; const AValue: integer);
+ function GetWeekStartDay(AIndex: integer): integer;
+ procedure SetWeekStartDay(AIndex: integer; const AValue: integer);
+ function GetDayColor(AIndex: integer): TfpgColor;
+ procedure SetDayColor(AIndex: integer; const AValue: TfpgColor);
+ function GetHolidayColor(AIndex: integer): TfpgColor;
+ procedure SetHolidayColor(AIndex: integer; const AValue: TfpgColor);
+ function GetSingleClickSelect(AIndex: integer): boolean;
+ procedure SetSingleClickSelect(AIndex: integer; const AValue: boolean);
+ protected
+ function GetColumns(AIndex: Integer): TfpgEditColumn; reintroduce;
+ procedure DrawCell(ARow, ACol: Integer; ARect: TfpgRect; AFlags: TfpgGridDrawState); override;
+ procedure HandleKeyPress(var keycode: word; var shiftstate: TShiftState; var consumed: boolean); override;
+ property Columns[AIndex: Integer]: TfpgEditColumn read GetColumns;
+ public
+ constructor Create(AOwner: TComponent); override;
+ destructor Destroy; override;
+ property EditWay: TEditing read FEditWay write FEditWay;
+ function AddColumn(ATitle: string; AWidth: integer; AEditType: TEditType = etNone;
+ AAlignment: TAlignment = taLeftJustify; AbackgroundColor: TfpgColor = clDefault; ATextColor: TfpgColor = clDefault): TfpgEditColumn; overload;
+ property ColumnEditType[AIndex: integer]: TEditType read GetColumnEditType;
+ property NumericMaxLimit[AIndex: integer]: boolean read GetNumericMaxLimit write SetNumericMaxLimit;
+ property NumericMinLimit[AIndex: integer]: boolean read GetNumericMinLimit write SetNumericMinLimit;
+ property NumericDecimals[AIndex: integer]: integer read GetNumericDecimals write SetNumericDecimals;
+ property NumericDecimalSeparator[AIndex: integer]: TfpgChar read GetNumericDecimalSeparator write SetNumericDecimalSeparator;
+ property NumericThousandSeparator[AIndex: integer]: TfpgChar read GetNumericThousandSeparator write SetNumericThousandSeparator;
+ property NumericShowThousand[AIndex: integer]: boolean read GetNumericShowThousand write SetNumericShowThousand;
+ property MaxIntValue[AIndex: integer]: integer read GetMaxIntValue write SetMaxIntValue;
+ property MinIntValue[AIndex: integer]: integer read GetMinIntValue write SetMinIntValue;
+ property MaxFloatValue[AIndex: integer]: extended read GetMaxFloatValue write SetMaxFloatValue;
+ property MinFloatValue[AIndex: integer]: extended read GetMinFloatValue write SetMinFloatValue;
+ property FloatFixedDecimals[AIndex: integer]: integer read GetFloatFixedDecimals write SetFloatFixedDecimals;
+ property MaxCurrValue[AIndex: integer]: currency read GetMaxCurrValue write SetMaxCurrValue;
+ property MinCurrValue[AIndex: integer]: currency read GetMinCurrValue write SetMinCurrValue;
+ procedure AddComboItem(AIndex: integer; const AValue: string);
+ procedure AddEditComboItem(AIndex: integer; const AValue: string);
+ property AutoComplete[AIndex: integer]: boolean read GetAutoComplete write SetAutoComplete;
+ property AllowNew[AIndex: integer]: TAllowNew read GetAllowNew write SetAllowNew;
+ property BoxCheckedText[AIndex: integer]: string read GetBoxCheckedText write SetBoxCheckedText;
+ property BoxUncheckedText[AIndex: integer]: string read GetBoxUncheckedText write SetBoxUncheckedText;
+ property BoxDisplayText[AIndex: integer]: string read GetBoxDisplayText write SetBoxDisplayText;
+ property Dates[AIndex: integer]: TDateTime read GetDates write SetDates;
+ property DatesList[AIndex: integer]: TList read GetDatesList write SetDatesList;
+ property GridDateFormat[AIndex: integer]: string read GetGridDateFormat write SetGridDateFormat;
+ property CalendarDateFormat[AIndex: integer]: string read GetCalendarDateFormat write SetCalendarDateFormat;
+ property DateValue[AIndex: integer]: TDateTime read GetDateValue write SetDatevalue;
+ property MaxDate[AIndex: integer]: TDateTime read GetMaxDate write SetMaxDate;
+ property MinDate[AIndex: integer]: TDateTime read GetMinDate write SetMinDate;
+ property WeeklyHoliday[AIndex: integer]: integer read GetWeeklyHoliday write SetWeeklyHoliday;
+ property WeekStartDay[AIndex: integer]: integer read GetWeekStartDay write SetWeekStartDay;
+ property DayColor[AIndex: integer]: TfpgColor read GetDayColor write SetDayColor;
+ property HolidayColor[AIndex: integer]: TfpgColor read GetHolidayColor write SetHolidayColor;
+ property SingleClickSelect[AIndex: integer]: boolean read GetSingleClickSelect write SetSingleClickSelect;
+ end;
+
+ TfpgEditGrid = class(TfpgCustomEditgrid)
+ public
+ property Font;
+ published
+ property Align;
+ property AlternateBGColor;
+ property BackgroundColor;
+ property BorderStyle;
+// property ColResizing;
+ property ColumnCount;
+ property Columns;
+ property ColumnWidth;
+ property DefaultColWidth;
+ property DefaultRowHeight;
+ property Enabled;
+ property FocusCol;
+ property FocusRow;
+ property FontDesc;
+ property HeaderFontDesc;
+ property HeaderHeight;
+ property HeaderStyle;
+ property Hint;
+ property Options;
+ property ParentShowHint;
+ property PopupMenu;
+ property RowCount;
+ property RowSelect;
+ property ScrollBarStyle;
+ property ShowGrid;
+ property ShowHeader;
+ property ShowHint;
+ property TabOrder;
+ property TopRow;
+ property VisibleRows;
+ property OnCanSelectCell;
+ property OnClick;
+ property OnDoubleClick;
+ property OnDrawCell;
+ property OnFocusChange;
+ property OnKeyPress;
+ property OnMouseDown;
+ property OnMouseEnter;
+ property OnMouseExit;
+ property OnMouseMove;
+ property OnMouseUp;
+ property OnRowChange;
+ property OnShowHint;
+ end;
+
+function CreateEditGrid(AOwner: TComponent; x, y, w, h: Tfpgcoord; AColumnCount: integer = 0): TfpgEditGrid;
+
+implementation
+
+uses
+ fpg_stringutils;
+
+function CreateEditGrid(AOwner: TComponent; x, y, w, h: TfpgCoord; AColumnCount: integer = 0): TfpgEditGrid;
+begin
+ Result := TfpgEditGrid.Create(AOwner);
+ Result.Left := x;
+ Result.Top := y;
+ Result.Width := w;
+ Result.Height := h;
+ Result.ColumnCount := AColumnCount;
+end;
+
+constructor TfpgColumnData.Create;
+begin
+ inherited Create;
+ FMaxSet := False;
+ FMinSet := False;
+end;
+
+destructor TfpgColumnData.Destroy;
+begin
+ inherited Destroy;
+end;
+
+constructor TfpgNumericColumn.Create;
+begin
+ inherited Create;
+ FMaxLimit := False;
+ FMinLimit := False;
+ FDecimals := -1;
+ FDecimalseparator := '.';
+ FThousandSeparator := ' ';
+ FShowThousand := True;
+end;
+
+destructor TfpgNumericColumn.Destroy;
+begin
+ inherited Destroy;
+end;
+
+constructor TfpgIntegerColumn.Create;
+begin
+ inherited Create;
+ FMaxVal := 0;
+ FMinVal := 0;
+end;
+
+destructor TfpgIntegerColumn.Destroy;
+begin
+ inherited Destroy;
+end;
+
+constructor TfpgFloatColumn.Create;
+begin
+ inherited Create;
+ FMaxVal := 0;
+ FMinVal := 0;
+ FFixedDecimals := -1;
+end;
+
+destructor TfpgFloatColumn.Destroy;
+begin
+ inherited Destroy;
+end;
+
+constructor TfpgCurrencyColumn.Create;
+begin
+ inherited Create;
+ FMaxVal := 0;
+ FMinVal := 0;
+end;
+
+destructor TfpgCurrencyColumn.Destroy;
+begin
+ inherited Destroy;
+end;
+
+constructor TfpgComboBoxColumn.Create;
+begin
+ inherited Create;
+ FItems := TStringList.Create;
+end;
+
+destructor TfpgComboBoxColumn.Destroy;
+begin
+ FItems.Free;
+ inherited Destroy;
+end;
+
+constructor TfpgEditComboColumn.Create;
+begin
+ inherited Create;
+ FItems := TStringList.Create;
+end;
+
+destructor TfpgEditComboColumn.Destroy;
+begin
+ FItems.Free;
+ inherited Destroy;
+end;
+
+constructor TfpgCheckBoxColumn.Create;
+begin
+ inherited Create;
+end;
+
+destructor TfpgCheckBoxColumn.Destroy;
+begin
+ inherited Destroy;
+end;
+
+constructor TfpgCalendarColumn.Create;
+begin
+ inherited Create;
+ FDatesList:= TList.Create;
+end;
+
+destructor TfpgCalendarColumn.Destroy;
+var
+ i: integer;
+begin
+ inherited Destroy;
+ if FDatesList.Count> 0 then
+ for i := 0 to Pred(FDatesList.Count) do
+ TDates(FDatesList[i]).Free;
+ FDatesList.Free;
+end;
+
+procedure TfpgCustomEditGrid.EditGridFocusChange(Sender: TObject; ARow,ACol: integer);
+var
+ i: integer;
+begin
+ for i := 0 to Pred(ColumnCount) do
+ case Columns[i].EditType of
+ etText:
+ if Assigned(FCellEditText) then
+ FCellEditText.Visible:= False;
+ etInteger:
+ if Assigned(FCellEditInteger) then
+ FcellEditInteger.Visible:= False;
+ etFloat:
+ if Assigned(FCellEditFloat) then
+ FcellEditFloat.Visible:= False;
+ etCurrency:
+ if Assigned(FCellEditCurrency) then
+ FcellEditCurrency.Visible:= False;
+ etComboBox:
+ if Assigned(FCellComboBox) then
+ FcellComboBox.Visible:= False;
+ etEditCombo:
+ if Assigned(FCellEditCombo) then
+ FcellEditCombo.Visible:= False;
+ etCheckBox:
+ if Assigned(FCellCheckBox) then
+ FCellCheckBox.Visible:= False;
+ etCalendar:
+ if Assigned(FCellCalendar) then
+ FCellCalendar.Visible:= False;
+ end;
+end;
+
+procedure TfpgCustomEditGrid.EditGridDoubleClick(Sender: TObject; AButton: TMouseButton; AShift: TShiftState;
+ const AMousePos: TPoint);
+var
+ lCol, lRow: integer;
+begin
+ MouseToCell(AMousePos.X, AMousePos.Y, lCol, lRow);
+ case Columns[lCol].EditType of
+ etText:
+ IniTextCell;
+ etInteger:
+ IniIntegerCell;
+ etFloat:
+ IniFloatCell;
+ etCurrency:
+ IniCurrencyCell;
+ etComboBox:
+ IniComboBoxCell;
+ etEditCombo:
+ IniEditComboCell;
+ etCheckBox:
+ IniCheckBoxCell;
+ etCalendar:
+ IniCalendarCell;
+ end;
+ FEditing := True;
+end;
+
+function TfpgCustomEditGrid.GetColumnEditType(AIndex: integer): TEditType;
+begin
+ Result := TfpgEditColumn(Columns[AIndex]).EditType;
+end;
+
+procedure TfpgCustomEditGrid.SetEditCell;
+begin
+ case Columns[FocusCol].EditType of
+ etText:
+ IniTextCell;
+ etInteger:
+ IniIntegerCell;
+ etFloat:
+ IniFloatCell;
+ etCurrency:
+ IniCurrencyCell;
+ etComboBox:
+ IniComboBoxCell;
+ etEditCombo:
+ IniEditComboCell;
+ etCheckBox:
+ IniCheckBoxCell;
+ etCalendar:
+ IniCalendarCell;
+ end;
+end;
+
+procedure TfpgCustomEditGrid.IniTextCell;
+var
+ Pt: TPoint;
+begin
+ if Assigned(FCellEditText) then
+ FCellEditText.Free;
+ FCellEditText := TfpgEdit.Create(Self);
+ Pt.X := FFocusRect.Left;
+ Pt.Y := FFocusRect.Top;
+ with FCellEditText do
+ begin
+ Name := 'FCellEditText';
+ SetPosition(Pt.X, Pt.Y, FFocusRect.Width, FFocusRect.Height);
+ BorderStyle := ebsSingle;
+ FontDesc := '#Grid';
+ Text := Cells[FocusCol, FocusRow];
+ OnKeyPress := @FCellEditTextKeyPress;
+ OnExit := @FCellEditTextExit;
+ SetFocus;
+ end;
+end;
+
+procedure TfpgCustomEditGrid.FCellEditTextKeyPress(Sender: TObject; var KeyCode: word; var ShiftState: TShiftState;
+ var Consumed: boolean);
+begin
+ case KeyCode of
+ KeyReturn, KeyPEnter:
+ begin
+ Cells[FocusCol, FocusRow] := FCellEditText.Text;
+ FCellEditText.Text := '';
+ FCellEditText.Visible := False;
+ case FEditWay of
+ edColumn:
+ if FocusCol < FColumns.Count then
+ FocusCol := FocusCol + 1;
+ edRow:
+ if FocusRow < RowCount then
+ FocusRow := FocusRow + 1;
+ end;
+ SetFocus;
+ if FEditing then
+ SetEditCell;
+ end;
+ KeyTab:
+ begin
+ FCellEditText.Text := '';
+ FCellEditText.Visible := False;
+ if FEditing then
+ FEditing := False;
+ if ssShift in ShiftState then
+ begin
+ if FocusCol > 0 then
+ FocusCol := FocusCol - 1;
+ end
+ else
+ if FocusCol < FColumns.Count then
+ FocusCol := FocusCol + 1;
+ FEditing := False;
+ Consumed:= True;
+ end;
+ KeyEscape:
+ begin
+ FCellEditText.Text := '';
+ FCellEditText.Visible := False;
+ if FEditing then
+ FEditing := False;
+ Consumed:= True;
+ end;
+ end;
+end;
+
+procedure TfpgCustomEditGrid.FCellEditTextExit(Sender: TObject);
+begin
+ FCellEditText.Visible := False;
+end;
+
+function TfpgCustomEditGrid.GetNumericMaxLimit(AIndex: integer): boolean;
+begin
+ Result := TfpgNumericColumn(TfpgEditColumn(Columns[AIndex]).Data).MaxLimit;
+end;
+
+procedure TfpgCustomEditGrid.SetNumericMaxLimit(AIndex: integer; const AValue: boolean);
+begin
+ TfpgNumericColumn(TfpgEditColumn(Columns[AIndex]).Data).MaxLimit := AValue;
+end;
+
+function TfpgCustomEditGrid.GetNumericMinLimit(AIndex: integer): boolean;
+begin
+ Result := TfpgNumericColumn(TfpgEditColumn(Columns[AIndex]).Data).MinLimit;
+end;
+
+procedure TfpgCustomEditGrid.SetNumericMinLimit(AIndex: integer; const AValue: boolean);
+begin
+ TfpgNumericColumn(TfpgEditColumn(Columns[AIndex]).Data).MinLimit := AValue;
+end;
+
+function TfpgCustomEditGrid.GetNumericDecimals(AIndex: integer): integer;
+begin
+ Result := TfpgNumericColumn(TfpgEditColumn(Columns[AIndex]).Data).Decimals;
+end;
+
+procedure TfpgCustomEditGrid.SetNumericDecimals(AIndex: integer; const AValue: integer);
+begin
+ TfpgNumericColumn(TfpgEditColumn(Columns[AIndex]).Data).Decimals := AValue;
+end;
+
+function TfpgCustomEditGrid.GetNumericDecimalSeparator(AIndex: integer): TfpgChar;
+begin
+ Result := TfpgNumericColumn(TfpgEditColumn(Columns[AIndex]).Data).DecimalSeparator;
+end;
+
+procedure TfpgCustomEditGrid.SetNumericDecimalSeparator(AIndex: integer; const AValue: TfpgChar);
+begin
+ TfpgNumericColumn(TfpgEditColumn(Columns[AIndex]).Data).DecimalSeparator := AValue
+end;
+
+function TfpgCustomEditGrid.GetNumericThousandSeparator(AIndex: integer): TfpgChar;
+begin
+ Result := TfpgNumericColumn(TfpgEditColumn(Columns[AIndex]).Data).ThousandSeparator;
+end;
+
+procedure TfpgCustomEditGrid.SetNumericThousandSeparator(AIndex: integer; const AValue: TfpgChar);
+begin
+ TfpgNumericColumn(TfpgEditColumn(Columns[AIndex]).Data).ThousandSeparator := AValue;
+end;
+
+function TfpgCustomEditGrid.GetNumericShowThousand(AIndex: integer): boolean;
+begin
+ Result := TfpgNumericColumn(TfpgEditColumn(Columns[AIndex]).Data).ShowThousand;
+end;
+
+procedure TfpgCustomEditGrid.SetNumericShowThousand(AIndex: integer; const AValue: boolean);
+begin
+ TfpgNumericColumn(TfpgEditColumn(Columns[AIndex]).Data).ShowThousand := AValue;
+end;
+
+procedure TfpgCustomEditGrid.IniIntegerCell;
+var
+ Pt: TPoint;
+begin
+ if Assigned(FCellEditInteger) then
+ FCellEditInteger.Free;
+ FCellEditInteger := TfpgEditInteger.Create(Self);
+ Pt.X := FFocusRect.Left;
+ Pt.Y := FFocusRect.Top;
+ with FCellEditInteger do
+ begin
+ Name := 'FCellEditInteger';
+ SetPosition(Pt.X, Pt.Y, FFocusRect.Width, FFocusRect.Height);
+ BorderStyle := ebsSingle;
+ FontDesc := '#Grid';
+ Text := Cells[FocusCol, FocusRow];
+ if TfpgColumnData(TfpgEditColumn(Columns[FocusCol]).Data).MaxSet then
+ MaxValue := MaxIntValue[Focuscol];
+ if TfpgColumnData(TfpgEditColumn(Columns[FocusCol]).Data).MinSet then
+ MinValue := MinIntValue[FocusCol];
+ CustomThousandSeparator := TfpgNumericColumn(TfpgEditColumn(Columns[FocusCol]).Data).ThousandSeparator;
+ ShowThousand := TfpgNumericColumn(TfpgEditColumn(Columns[FocusCol]).Data).ShowThousand;
+ OnKeyPress := @FCellEditIntegerKeyPress;
+ OnExit := @FCellEditIntegerExit;
+ SetFocus;
+ end;
+end;
+
+procedure TfpgCustomEditGrid.FCellEditIntegerKeyPress(Sender: TObject; var KeyCode: word; var ShiftState: TShiftState;
+ var Consumed: boolean);
+begin
+ case KeyCode of
+ KeyReturn, KeyPEnter:
+ begin
+ Cells[FocusCol, FocusRow] := FCellEditInteger.Text;
+ FCellEditInteger.Text:= '';
+ FCellEditInteger.Visible := False;
+ case FEditWay of
+ edColumn:
+ if FocusCol < FColumns.Count then
+ FocusCol := FocusCol + 1;
+ edRow:
+ if FocusRow < RowCount then
+ FocusRow := FocusRow + 1;
+ end;
+ SetFocus;
+ if FEditing then
+ SetEditCell;
+ end;
+ KeyTab:
+ begin
+ FCellEditInteger.Text := '';
+ FCellEditInteger.Visible := False;
+ if FEditing then
+ FEditing := False;
+ if ssShift in ShiftState then
+ begin
+ if FocusCol > 0 then
+ FocusCol := FocusCol - 1;
+ end
+ else
+ if FocusCol < FColumns.Count then
+ FocusCol := FocusCol + 1;
+ Consumed:= True;
+ end;
+ KeyEscape:
+ begin
+ FCellEditInteger.Text := '';
+ FCellEditInteger.Visible := False;
+ if FEditing then
+ FEditing := False;
+ Consumed:= True;
+ end;
+ end;
+end;
+
+procedure TfpgCustomEditGrid.FCellEditIntegerExit(Sender: TObject);
+begin
+ FCellEditInteger.Visible := False;
+end;
+
+function TfpgCustomEditGrid.GetMaxIntValue(AIndex: integer): integer;
+begin
+ Result := TfpgIntegerColumn(TfpgEditColumn(Columns[AIndex]).Data).MaxVal;
+end;
+
+procedure TfpgCustomEditGrid.SetMaxIntValue(AIndex: integer; const AValue: integer);
+begin
+ with TfpgIntegerColumn(TfpgEditColumn(Columns[AIndex]).Data) do
+ begin
+ if AValue > MinVal then
+ MaxVal := AValue
+ else
+ MaxVal := MinVal;
+ MaxSet:= True;
+ end;
+end;
+
+function TfpgCustomEditGrid.GetMinIntValue(AIndex: integer): integer;
+begin
+ Result := TfpgIntegerColumn(TfpgEditColumn(Columns[AIndex]).Data).MinVal;
+end;
+
+procedure TfpgCustomEditGrid.SetMinIntValue(AIndex: integer; const AValue: integer);
+begin
+ with TfpgIntegerColumn(TfpgEditColumn(Columns[AIndex]).Data) do
+ begin
+ if AValue < MaxVal then
+ MinVal := AValue
+ else
+ MinVal := Maxval;
+ MinSet := True;
+ end;
+end;
+
+procedure TfpgCustomEditGrid.IniFloatCell;
+var
+ Pt: TPoint;
+begin
+ if Assigned(FCellEditFloat) then
+ FCellEditFloat.Free;
+ FCellEditFloat := TfpgEditFloat.Create(Self);
+ Pt.X := FFocusRect.Left;
+ Pt.Y := FFocusRect.Top;
+ with FCellEditFloat do
+ begin
+ Name := 'FCellEditFloat';
+ SetPosition(Pt.X, Pt.Y, FFocusRect.Width, FFocusRect.Height);
+ BorderStyle := ebsSingle;
+ FontDesc := '#Grid';
+ Text := Cells[FocusCol, FocusRow];
+ if TfpgColumnData(TfpgEditColumn(Columns[FocusCol]).Data).MaxSet then
+ MaxValue := MaxFloatValue[Focuscol];
+ if TfpgColumnData(TfpgEditColumn(Columns[FocusCol]).Data).MinSet then
+ MinValue := MinFloatValue[FocusCol];
+ Decimals := TfpgNumericColumn(TfpgEditColumn(Columns[FocusCol]).Data).Decimals;
+ FixedDecimals := TfpgFloatColumn(TfpgEditColumn(Columns[FocusCol]).Data).FixedDecimals;
+ CustomDecimalSeparator := TfpgNumericColumn(TfpgEditColumn(Columns[FocusCol]).Data).DecimalSeparator;
+ CustomThousandSeparator := TfpgNumericColumn(TfpgEditColumn(Columns[FocusCol]).Data).ThousandSeparator;
+ ShowThousand := TfpgNumericColumn(TfpgEditColumn(Columns[FocusCol]).Data).ShowThousand;
+ OnKeyPress := @FCellEditFloatKeyPress;
+ OnExit := @FCellEditFloatExit;
+ SetFocus;
+ end;
+end;
+
+procedure TfpgCustomEditGrid.FCellEditFloatKeyPress(Sender: TObject; var KeyCode: word; var ShiftState: TShiftState;
+ var Consumed: boolean);
+begin
+ case KeyCode of
+ KeyReturn, KeyPEnter:
+ begin
+ with FCellEditFloat do
+ begin
+ if FixedDecimals > -1 then
+ begin
+ if UTF8Pos(CustomDecimalSeparator, Text) > 0 then
+ begin
+ if (UTF8Length(Text) - UTF8Pos(CustomDecimalSeparator, Text)) > FixedDecimals then
+ Text := Copy(Text, 1, UTF8Pos(CustomDecimalSeparator, Text) + FixedDecimals);
+ end
+ else
+ begin
+ if UTF8Pos(CustomDecimalSeparator, Text) = 0 then
+ Text := Text + CustomDecimalSeparator;
+ while (UTF8Length(Text) - (UTF8Pos(CustomDecimalSeparator, Text)) < FixedDecimals) do
+ Text := Text +'0';
+ end;
+ end;
+ if Decimals > -1 then
+ if UTF8Pos(CustomDecimalSeparator, Text) > 0 then
+ if (UTF8Length(Text) - UTF8Pos(CustomDecimalSeparator, Text)) > Decimals then
+ Text := Copy(Text, 1, UTF8Pos(CustomDecimalSeparator, Text) + Decimals);
+ end;
+ Cells[FocusCol, FocusRow] := FCellEditFloat.Text;
+ FCellEditFloat.Text:= '';
+ FCellEditFloat.Visible := False;
+ case FEditWay of
+ edColumn:
+ if FocusCol < FColumns.Count then
+ FocusCol := FocusCol + 1;
+ edRow:
+ if FocusRow < RowCount then
+ FocusRow := FocusRow + 1;
+ end;
+ SetFocus;
+ if FEditing then
+ SetEditCell;
+ end;
+ KeyTab:
+ begin
+ FCellEditFloat.Text := '';
+ FCellEditFloat.Visible := False;
+ if FEditing then
+ FEditing := False;
+ if ssShift in ShiftState then
+ begin
+ if FocusCol > 0 then
+ FocusCol := FocusCol - 1;
+ end
+ else
+ if FocusCol < FColumns.Count then
+ FocusCol := FocusCol + 1;
+ Consumed:= True;
+ end;
+ KeyEscape:
+ begin
+ FCellEditFloat.Text := '';
+ FCellEditFloat.Visible := False;
+ if FEditing then
+ FEditing := False;
+ Consumed:= True;
+ end;
+ end;
+end;
+
+procedure TfpgCustomEditGrid.FCellEditFloatExit(Sender: TObject);
+begin
+ FCellEditFloat.Visible := False;
+end;
+
+function TfpgCustomEditGrid.GetMaxFloatValue(AIndex: integer): extended;
+begin
+ Result := TfpgFloatColumn(TfpgEditColumn(Columns[AIndex]).Data).MaxVal;
+end;
+
+procedure TfpgCustomEditGrid.SetMaxFloatValue(AIndex: integer; const AValue: extended);
+begin
+ with TfpgFloatColumn(TfpgEditColumn(Columns[AIndex]).Data) do
+ begin
+ if AValue > MinVal then
+ MaxVal := AValue
+ else
+ MaxVal := MinVal;
+ MaxSet:= True;
+ end;
+end;
+
+function TfpgCustomEditGrid.GetMinFloatValue(AIndex: integer): extended;
+begin
+ Result := TfpgFloatColumn(TfpgEditColumn(Columns[AIndex]).Data).MinVal;
+end;
+
+procedure TfpgCustomEditGrid.SetMinFloatValue(AIndex: integer; const AValue: extended);
+begin
+ with TfpgFloatColumn(TfpgEditColumn(Columns[AIndex]).Data) do
+ begin
+ if AValue < MaxVal then
+ MinVal := AValue
+ else
+ MinVal := Maxval;
+ MinSet := True;
+ end;
+end;
+
+function TfpgCustomEditGrid.GetFloatFixedDecimals(AIndex: integer): integer;
+begin
+ Result := TfpgFloatColumn(TfpgEditColumn(Columns[AIndex]).Data).FFixedDecimals;
+end;
+
+procedure TfpgCustomEditGrid.SetFloatFixedDecimals(AIndex: integer; const AValue: integer);
+begin
+ TfpgFloatColumn(TfpgEditColumn(Columns[AIndex]).Data).FFixedDecimals := AValue;
+end;
+
+procedure TfpgCustomEditGrid.IniCurrencyCell;
+var
+ Pt: TPoint;
+begin
+ if Assigned(FCellEditCurrency) then
+ FCellEditCurrency.Free;
+ FCellEditCurrency := TfpgEditCurrency.Create(Self);
+ Pt.X := FFocusRect.Left;
+ Pt.Y := FFocusRect.Top;
+ with FCellEditCurrency do
+ begin
+ Name := 'FCellEditCurrency';
+ SetPosition(Pt.X, Pt.Y, FFocusRect.Width, FFocusRect.Height);
+ BorderStyle := ebsSingle;
+ FontDesc := '#Grid';
+ Text := Cells[FocusCol, FocusRow];
+ if TfpgColumnData(TfpgEditColumn(Columns[FocusCol]).Data).MaxSet then
+ MaxValue := MaxCurrValue[Focuscol];
+ if TfpgColumnData(TfpgEditColumn(Columns[FocusCol]).Data).MinSet then
+ MinValue := MinCurrValue[FocusCol];
+ CustomDecimalSeparator := TfpgNumericColumn(TfpgEditColumn(Columns[FocusCol]).Data).DecimalSeparator;
+ CustomThousandSeparator := TfpgNumericColumn(TfpgEditColumn(Columns[FocusCol]).Data).ThousandSeparator;
+ ShowThousand := TfpgNumericColumn(TfpgEditColumn(Columns[FocusCol]).Data).ShowThousand;
+ OnKeyPress := @FCellEditCurrencyKeyPress;
+ OnExit := @FCellEditCurrencyExit;
+ SetFocus;
+ end;
+end;
+
+procedure TfpgCustomEditGrid.FCellEditCurrencyKeyPress(Sender: TObject; var KeyCode: word; var ShiftState: TShiftState;
+ var Consumed: boolean);
+begin
+ case KeyCode of
+ KeyReturn, KeyPEnter:
+ begin
+ Cells[FocusCol, FocusRow] := FCellEditCurrency.Text;
+ FCellEditCurrency.Text:= '';
+ FCellEditCurrency.Visible := False;
+ case FEditWay of
+ edColumn:
+ if FocusCol < FColumns.Count then
+ FocusCol := FocusCol + 1;
+ edRow:
+ if FocusRow < RowCount then
+ FocusRow := FocusRow + 1;
+ end;
+ SetFocus;
+ if FEditing then
+ SetEditCell;
+ end;
+ KeyTab:
+ begin
+ FCellEditCurrency.Text := '';
+ FCellEditCurrency.Visible := False;
+ if FEditing then
+ FEditing := False;
+ if ssShift in ShiftState then
+ begin
+ if FocusCol > 0 then
+ FocusCol := FocusCol - 1;
+ end
+ else
+ if FocusCol < FColumns.Count then
+ FocusCol := FocusCol + 1;
+ Consumed:= True;
+ end;
+ KeyEscape:
+ begin
+ FCellEditCurrency.Text := '';
+ FCellEditCurrency.Visible := False;
+ if FEditing then
+ FEditing := False;
+ Consumed:= True;
+ end;
+ end;
+end;
+
+procedure TfpgCustomEditGrid.FCellEditCurrencyExit(Sender: TObject);
+begin
+ FCellEditFloat.Visible := False;
+end;
+
+function TfpgCustomEditGrid.GetMaxCurrValue(AIndex: integer): currency;
+begin
+ Result := TfpgCurrencyColumn(TfpgEditColumn(Columns[AIndex]).Data).MaxVal;
+end;
+
+procedure TfpgCustomEditGrid.SetMaxCurrValue(AIndex: integer; const AValue: currency);
+begin
+ with TfpgCurrencyColumn(TfpgEditColumn(Columns[AIndex]).Data) do
+ begin
+ if AValue > MinVal then
+ MaxVal := AValue
+ else
+ MaxVal := MinVal;
+ MaxSet:= True;
+ end;
+end;
+
+function TfpgCustomEditGrid.GetMinCurrValue(AIndex: integer): currency;
+begin
+ Result := TfpgCurrencyColumn(TfpgEditColumn(Columns[AIndex]).Data).MinVal;
+end;
+
+procedure TfpgCustomEditGrid.SetMinCurrValue(AIndex: integer; const AValue: currency);
+begin
+ with TfpgCurrencyColumn(TfpgEditColumn(Columns[AIndex]).Data) do
+ begin
+ if AValue < MaxVal then
+ MinVal := AValue
+ else
+ MinVal := Maxval;
+ MinSet := True;
+ end;
+end;
+
+procedure TfpgCustomEditGrid.IniComboBoxCell;
+var
+ Pt: TPoint;
+ i: integer;
+begin
+ if Assigned(FCellComboBox) then
+ FCellComboBox.Free;
+ FCellComboBox := TfpgComboBox.Create(Self);
+ Pt.X := FFocusRect.Left;
+ Pt.Y := FFocusRect.Top;
+ with FCellComboBox do
+ begin
+ Name := 'FCellComboBox';
+ SetPosition(Pt.X, Pt.Y, FFocusRect.Width, FFocusRect.Height);
+ BorderStyle := ebsSingle;
+ FontDesc := '#Grid';
+ Items.Assign(TfpgComboBoxColumn(TfpgEditColumn(Columns[FocusCol]).Data).FItems);
+ for i := 0 to Pred(Items.Count) do
+ if Items[i] = Cells[FocusCol, FocusRow] then
+ Text := Items[i];
+ OnKeyPress := @FCellComboBoxKeyPress;
+ OnExit := @FCellComboBoxExit;
+ SetFocus;
+ end;
+end;
+
+procedure TfpgCustomEditGrid.FCellComboBoxKeyPress(Sender: TObject; var KeyCode: word; var ShiftState: TShiftState;
+ var Consumed: boolean);
+begin
+ case KeyCode of
+ KeyReturn, KeyPEnter:
+ begin
+ Cells[FocusCol, FocusRow] := FCellComboBox.Text;
+ FCellComboBox.Text:= '';
+ FCellComboBox.Visible := False;
+ case FEditWay of
+ edColumn:
+ if FocusCol < FColumns.Count then
+ FocusCol := FocusCol + 1;
+ edRow:
+ if FocusRow < RowCount then
+ FocusRow := FocusRow + 1;
+ end;
+ SetFocus;
+ if FEditing then
+ SetEditCell;
+ end;
+ KeyTab:
+ begin
+ FCellComboBox.Text := '';
+ FCellComboBox.Visible := False;
+ if FEditing then
+ FEditing := False;
+ if ssShift in ShiftState then
+ begin
+ if FocusCol > 0 then
+ FocusCol := FocusCol - 1;
+ end
+ else
+ if FocusCol < FColumns.Count then
+ FocusCol := FocusCol + 1;
+ Consumed:= True;
+ end;
+ KeyEscape:
+ begin
+ FCellComboBox.Text := '';
+ FCellComboBox.Visible := False;
+ if FEditing then
+ FEditing := False;
+ Consumed:= True;
+ end;
+ end;
+end;
+
+procedure TfpgCustomEditGrid.FCellComboBoxExit(Sender: TObject);
+begin
+ FCellComboBox.Visible:= False;
+end;
+
+procedure TfpgCustomEditGrid.IniEditComboCell;
+var
+ Pt: TPoint;
+ i: integer;
+begin
+ if Assigned(FCellEditCombo) then
+ FCellEditCombo.Free;
+ FCellEditCombo := TfpgEditCombo.Create(Self);
+ Pt.X := FFocusRect.Left;
+ Pt.Y := FFocusRect.Top;
+ with FCellEditCombo do
+ begin
+ Name := 'FCellEditCombo';
+ SetPosition(Pt.X, Pt.Y, FFocusRect.Width, FFocusRect.Height);
+ BorderStyle := ebsSingle;
+ FontDesc := '#Grid';
+ Items.Assign(TfpgEditComboColumn(TfpgEditColumn(Columns[FocusCol]).Data).FItems);
+ for i := 0 to Pred(Items.Count) do
+ if Items[i] = Cells[FocusCol, FocusRow] then
+ Text := Items[i];
+ AutoCompletion := TfpgEditComboColumn(TfpgEditColumn(Columns[FocusCol]).Data).AutoComplete;
+ AllowNew := TfpgEditComboColumn(TfpgEditColumn(Columns[FocusCol]).Data).AllowNew;
+ OnKeyPress := @FCellEditComboKeyPress;
+ OnExit := @FCellEditComboExit;
+ SetFocus;
+ end;
+end;
+
+procedure TfpgCustomEditGrid.FCellEditComboKeyPress(Sender: TObject; var KeyCode: word; var ShiftState: TShiftState;
+ var Consumed: boolean);
+begin
+ case KeyCode of
+ KeyReturn, KeyPEnter:
+ begin
+ Cells[FocusCol, FocusRow] := FCellEditCombo.Text;
+ if (AllowNew[FocusCol] = anAsk) or (AllowNew[FocusCol] = anYes) then
+ TfpgEditComboColumn(TfpgEditColumn(Columns[FocusCol]).Data).FItems.Add(FCellEditCombo.Text);
+ FCellEditCombo.Text:= '';
+ FCellEditCombo.Visible := False;
+ case FEditWay of
+ edColumn:
+ if FocusCol < FColumns.Count then
+ FocusCol := FocusCol + 1;
+ edRow:
+ if FocusRow < RowCount then
+ FocusRow := FocusRow + 1;
+ end;
+ SetFocus;
+ if FEditing then
+ SetEditCell;
+ end;
+ KeyTab:
+ begin
+ FCellEditCombo.Text := '';
+ FCellEditCombo.Visible := False;
+ if FEditing then
+ FEditing := False;
+ if ssShift in ShiftState then
+ begin
+ if FocusCol > 0 then
+ FocusCol := FocusCol - 1;
+ end
+ else
+ if FocusCol < FColumns.Count then
+ FocusCol := FocusCol + 1;
+ Consumed:= True;
+ end;
+ KeyEscape:
+ begin
+ FCellEditCombo.Text := '';
+ FCellEditCombo.Visible := False;
+ if FEditing then
+ FEditing := False;
+ Consumed:= True;
+ end;
+ end;
+end;
+
+procedure TfpgCustomEditGrid.FCellEditComboExit(Sender: TObject);
+begin
+ FCellEditCombo.Visible:= False;
+end;
+
+function TfpgCustomEditGrid.GetAutoComplete(AIndex: integer): boolean;
+begin
+ Result := TfpgEditComboColumn(TfpgEditColumn(Columns[AIndex]).Data).AutoComplete;
+end;
+
+procedure TfpgCustomEditGrid.SetAutoComplete(AIndex: integer; const AValue: boolean);
+begin
+ TfpgEditComboColumn(TfpgEditColumn(Columns[AIndex]).Data).AutoComplete := AValue;
+end;
+
+function TfpgCustomEditGrid.GetAllowNew(AIndex: integer): TAllowNew;
+begin
+ Result := TfpgEditComboColumn(TfpgEditColumn(Columns[AIndex]).Data).AllowNew;
+end;
+
+procedure TfpgCustomEditGrid.SetAllowNew(AIndex: integer; AValue: TAllowNew);
+begin
+ TfpgEditComboColumn(TfpgEditColumn(Columns[AIndex]).Data).AllowNew := AValue;
+end;
+
+procedure TfpgCustomEditGrid.IniCheckBoxCell;
+var
+ Pt: TPoint;
+begin
+ if Assigned(FCellCheckBox) then
+ FCellCheckBox.Free;
+ FCellCheckBox := TfpgCheckBox.Create(Self);
+ Pt.X := FFocusRect.Left;
+ Pt.Y := FFocusRect.Top;
+ with FCellCheckBox do
+ begin
+ Name := 'FCellCheckBox';
+ SetPosition(Pt.X, Pt.Y, FFocusRect.Width, FFocusRect.Height);
+ BorderStyle := ebsSingle;
+ FontDesc := '#Grid';
+ if Cells[FocusCol, FocusRow] = TfpgCheckBoxColumn(TfpgEditColumn(Columns[FocusCol]).Data).CheckedText then
+ FCellCheckBox.Checked:= True
+ else
+ FCellCheckBox.Checked:= False;
+ Text := TfpgCheckBoxColumn(TfpgEditColumn(Columns[FocusCol]).Data).BoxText;
+ OnKeyPress := @FCellCheckBoxKeyPress;
+ OnExit := @FCellCheckBoxExit;
+ SetFocus;
+ end;
+end;
+
+procedure TfpgCustomEditGrid.FCellCheckBoxKeyPress(Sender: TObject; var KeyCode: word; var ShiftState: TShiftState;
+ var Consumed: boolean);
+begin
+ case KeyCode of
+ KeyReturn, KeyPEnter:
+ begin
+ if FCellCheckBox.Checked then
+ Cells[FocusCol, FocusRow] := TfpgCheckBoxColumn(TfpgEditColumn(Columns[FocusCol]).Data).CheckedText
+ else
+ Cells[FocusCol, FocusRow] := TfpgCheckBoxColumn(TfpgEditColumn(Columns[FocusCol]).Data).UncheckedText;
+ FCellCheckBox.Text:= '';
+ FCellCheckBox.Visible := False;
+ case FEditWay of
+ edColumn:
+ if FocusCol < FColumns.Count then
+ FocusCol := FocusCol + 1;
+ edRow:
+ if FocusRow < RowCount then
+ FocusRow := FocusRow + 1;
+ end;
+ SetFocus;
+ if FEditing then
+ SetEditCell;
+ end;
+ KeyTab:
+ begin
+ FCellCheckBox.Text := '';
+ FCellCheckBox.Visible := False;
+ if FEditing then
+ FEditing := False;
+ if ssShift in ShiftState then
+ begin
+ if FocusCol > 0 then
+ FocusCol := FocusCol - 1;
+ end
+ else
+ if FocusCol < FColumns.Count then
+ FocusCol := FocusCol + 1;
+ Consumed:= True;
+ end;
+ KeyEscape:
+ begin
+ FCellCheckBox.Text := '';
+ FCellCheckBox.Visible := False;
+ if FEditing then
+ FEditing := False;
+ Consumed:= True;
+ end;
+ end;
+end;
+
+procedure TfpgCustomEditGrid.FCellCheckBoxExit(Sender: TObject);
+begin
+ FCellCheckBox.Visible:= False;
+end;
+
+function TfpgCustomEditGrid.GetBoxCheckedText(AIndex: integer): string;
+begin
+ Result := TfpgCheckBoxColumn(TfpgEditColumn(Columns[AIndex]).Data).CheckedText;
+end;
+
+procedure TfpgCustomEditGrid.SetBoxCheckedText(AIndex: integer; const AValue: string);
+begin
+ TfpgCheckBoxColumn(TfpgEditColumn(Columns[AIndex]).Data).CheckedText := AValue;
+end;
+
+function TfpgCustomEditGrid.GetBoxUncheckedText(AIndex: integer): string;
+begin
+ Result := TfpgCheckBoxColumn(TfpgEditColumn(Columns[AIndex]).Data).UncheckedText;
+end;
+
+procedure TfpgCustomEditGrid.SetBoxUncheckedText(AIndex: integer; const AValue: string);
+begin
+ TfpgCheckBoxColumn(TfpgEditColumn(Columns[AIndex]).Data).UncheckedText := AValue;
+end;
+
+function TfpgCustomEditGrid.GetBoxDisplayText(AIndex: integer): string;
+begin
+ Result := TfpgCheckBoxColumn(TfpgEditColumn(Columns[AIndex]).Data).BoxText;
+end;
+
+procedure TfpgCustomEditGrid.SetBoxDisplayText(AIndex: integer; const AValue: string);
+begin
+ TfpgCheckBoxColumn(TfpgEditColumn(Columns[AIndex]).Data).BoxText := AValue;
+end;
+
+procedure TfpgCustomEditGrid.IniCalendarCell;
+var
+ Pt: TPoint;
+begin
+ if Assigned(FCellCalendar) then
+ FCellCalendar.Free;
+ FCellCalendar := TfpgCalendarCombo.Create(Self);
+ Pt.X := FFocusRect.Left;
+ Pt.Y := FFocusRect.Top;
+ with FCellCalendar do
+ begin
+ Name := 'FCellCalendar';
+ SetPosition(Pt.X, Pt.Y, FFocusRect.Width, FFocusRect.Height);
+ BorderStyle := ebsSingle;
+ FontDesc := '#Grid';
+ DateFormat := TfpgCalendarColumn(TfpgEditColumn(Columns[FocusCol]).Data).CalendarDateFormat;
+ DateValue:= TDates(TfpgCalendarColumn(TfpgEditColumn(Columns[FocusCol]).Data).FDatesList[FocusRow]).FDate;
+ WeeklyHoliday := TfpgCalendarColumn(TfpgEditColumn(Columns[FocusCol]).Data).WeeklyHoliday;
+ WeekStartDay := TfpgCalendarColumn(TfpgEditColumn(Columns[FocusCol]).Data).WeekStartDay;
+ DayColor := TfpgCalendarColumn(TfpgEditColumn(Columns[FocusCol]).Data).DayColor;
+ HolidayColor := TfpgCalendarColumn(TfpgEditColumn(Columns[FocusCol]).Data).HolidayColor;
+ SingleClickSelect := TfpgCalendarColumn(TfpgEditColumn(Columns[FocusCol]).Data).SingleClickSelect;
+ OnKeyPress := @FCellCalendarKeyPress;
+ OnExit := @FCellCalendarExit;
+ SetFocus;
+ end;
+end;
+
+procedure TfpgCustomEditGrid.FCellCalendarKeyPress(Sender: TObject; var KeyCode: word; var ShiftState: TShiftState;
+ var Consumed: boolean);
+begin
+ case KeyCode of
+ KeyReturn, KeyPEnter:
+ begin
+ with TfpgCalendarColumn(TfpgEditColumn(Columns[FocusCol]).Data) do
+ begin
+ TDates(FDatesList[FocusRow]).FDate := FCellCalendar.DateValue;
+ Cells[FocusCol, FocusRow] := FormatDateTime(GridDateFormat, TDates(FDatesList[FocusRow]).FDate);
+ end;
+ //FCellCalendar.Text := '';
+ FCellCalendar.Visible := False;
+ case FEditWay of
+ edColumn:
+ if FocusCol < FColumns.Count then
+ FocusCol := FocusCol + 1;
+ edRow:
+ if FocusRow < RowCount then
+ FocusRow := FocusRow + 1;
+ end;
+ SetFocus;
+ if FEditing then
+ SetEditCell;
+ end;
+ KeyTab:
+ begin
+ //FCellCalendar.Text := '';
+ FCellCalendar.Visible := False;
+ if FEditing then
+ FEditing := False;
+ if ssShift in ShiftState then
+ begin
+ if FocusCol > 0 then
+ FocusCol := FocusCol - 1;
+ end
+ else
+ if FocusCol < FColumns.Count then
+ FocusCol := FocusCol + 1;
+ Consumed:= True;
+ end;
+ KeyEscape:
+ begin
+ //FCellCalendar.Text := '';
+ FCellCalendar.Visible := False;
+ if FEditing then
+ FEditing := False;
+ Consumed:= True;
+ end;
+ end;
+end;
+
+procedure TfpgCustomEditGrid.FCellCalendarExit(Sender: TObject);
+begin
+ FCellCalendar.Visible:= False;
+end;
+
+function TfpgCustomEditGrid.GetDates(AIndex: integer): TDateTime;
+begin
+ Result := TDates(TfpgCalendarColumn(TfpgEditColumn(Columns[AIndex]).Data).DatesList[Succ(FocusRow)]).FDate;
+end;
+
+procedure TfpgCustomEditGrid.SetDates(AIndex: integer; const AValue: TDateTime);
+begin
+ FDates := TDates.Create;
+ FDates.FDate:= AValue;
+ TfpgCalendarColumn(TfpgEditColumn(Columns[AIndex]).Data).DatesList.Add(FDates);
+end;
+
+function TfpgCustomEditGrid.GetDatesList(AIndex: integer): TList;
+begin
+ Result := TfpgCalendarColumn(TfpgEditColumn(Columns[AIndex]).Data).DatesList;
+end;
+
+procedure TfpgCustomEditGrid.SetDatesList(AIndex: integer; const AValue: TList);
+begin
+ TfpgCalendarColumn(TfpgEditColumn(Columns[AIndex]).Data).DatesList := AValue;
+end;
+
+function TfpgCustomEditGrid.GetGridDateFormat(AIndex: integer): string;
+begin
+ Result := TfpgCalendarColumn(TfpgEditColumn(Columns[AIndex]).Data).GridDateFormat;
+end;
+
+procedure TfpgCustomEditGrid.SetGridDateFormat(AIndex: integer; const AValue: string);
+begin
+ TfpgCalendarColumn(TfpgEditColumn(Columns[AIndex]).Data).GridDateFormat:= AValue;
+end;
+
+function TfpgCustomEditGrid.GetCalendarDateFormat(AIndex: integer): string;
+begin
+ Result := TfpgCalendarColumn(TfpgEditColumn(Columns[AIndex]).Data).CalendarDateFormat;
+end;
+
+procedure TfpgCustomEditGrid.SetCalendarDateFormat(AIndex: integer; const AValue: string);
+begin
+ TfpgCalendarColumn(TfpgEditColumn(Columns[AIndex]).Data).CalendarDateFormat:= AValue;
+end;
+
+function TfpgCustomEditGrid.GetDateValue(AIndex: integer): TDateTime;
+begin
+ Result := TfpgCalendarColumn(TfpgEditColumn(Columns[AIndex]).Data).DateValue;
+end;
+
+procedure TfpgCustomEditGrid.SetDateValue(AIndex: integer; const AValue: TDateTime);
+begin
+ TfpgCalendarColumn(TfpgEditColumn(Columns[AIndex]).Data).DateValue:= AValue;
+end;
+
+function TfpgCustomEditGrid.GetMaxDate(AIndex: integer): TDateTime;
+begin
+ Result := TfpgCalendarColumn(TfpgEditColumn(Columns[AIndex]).Data).MaxDate;
+end;
+
+procedure TfpgCustomEditGrid.SetMaxdate(AIndex: integer; const AValue: TDateTime);
+begin
+ TfpgCalendarColumn(TfpgEditColumn(Columns[AIndex]).Data).MaxDate:= AValue;
+end;
+
+function TfpgCustomEditGrid.GetMinDate(AIndex: integer): TDateTime;
+begin
+ Result := TfpgCalendarColumn(TfpgEditColumn(Columns[AIndex]).Data).MinDate;
+end;
+
+procedure TfpgCustomEditGrid.SetMinDate(AIndex: integer; const AValue: TDateTime);
+begin
+ TfpgCalendarColumn(TfpgEditColumn(Columns[AIndex]).Data).MinDate:= AValue;
+end;
+
+function TfpgCustomEditGrid.GetWeeklyHoliday(AIndex: integer): integer;
+begin
+ Result := TfpgCalendarColumn(TfpgEditColumn(Columns[AIndex]).Data).WeeklyHoliday;
+end;
+
+procedure TfpgCustomEditGrid.SetWeeklyHoliday(AIndex: integer; const AValue: integer);
+begin
+ TfpgCalendarColumn(TfpgEditColumn(Columns[AIndex]).Data).WeeklyHoliday:= AValue;
+end;
+
+function TfpgCustomEditGrid.GetWeekStartDay(AIndex: integer): integer;
+begin
+ Result := TfpgCalendarColumn(TfpgEditColumn(Columns[AIndex]).Data).WeekStartDay;
+end;
+
+procedure TfpgCustomEditGrid.SetWeekStartDay(AIndex: integer; const AValue: integer);
+begin
+ TfpgCalendarColumn(TfpgEditColumn(Columns[AIndex]).Data).WeekStartDay:= AValue;
+end;
+
+function TfpgCustomEditGrid.GetDayColor(AIndex: integer): TfpgColor;
+begin
+ Result := TfpgCalendarColumn(TfpgEditColumn(Columns[AIndex]).Data).DayColor;
+end;
+
+procedure TfpgCustomEditGrid.SetDayColor(AIndex: integer; const AValue: TfpgColor);
+begin
+ TfpgCalendarColumn(TfpgEditColumn(Columns[AIndex]).Data).DayColor:= AValue;
+end;
+
+function TfpgCustomEditGrid.GetHolidayColor(AIndex: integer): TfpgColor;
+begin
+ Result := TfpgCalendarColumn(TfpgEditColumn(Columns[AIndex]).Data).HolidayColor;
+end;
+
+procedure TfpgCustomEditGrid.SetHolidayColor(AIndex: integer; const AValue: TfpgColor);
+begin
+ TfpgCalendarColumn(TfpgEditColumn(Columns[AIndex]).Data).HolidayColor:= AValue;
+end;
+
+function TfpgCustomEditGrid.GetSingleClickSelect(AIndex: integer): boolean;
+begin
+ Result := TfpgCalendarColumn(TfpgEditColumn(Columns[AIndex]).Data).SingleClickSelect;
+end;
+
+procedure TfpgCustomEditGrid.SetSingleClickSelect(AIndex: integer; const AValue: boolean);
+begin
+ TfpgCalendarColumn(TfpgEditColumn(Columns[AIndex]).Data).SingleClickSelect:= AValue;
+end;
+
+function TfpgCustomEditGrid.GetColumns(AIndex: Integer): TfpgEditColumn;
+begin
+ if (AIndex < 0) or (AIndex > ColumnCount-1) then
+ Result := nil
+ else
+ Result := TfpgEditColumn(FColumns.Items[AIndex]);
+end;
+
+procedure TfpgCustomEditGrid.DrawCell(ARow, ACol: Integer; ARect: TfpgRect; AFlags: TfpgGridDrawState);
+begin
+ inherited DrawCell(ARow, ACol, ARect, AFlags);
+ if (gdSelected in AFlags) then
+ FFocusRect:= ARect;
+end;
+
+procedure TfpgCustomEditGrid.HandleKeyPress(var keycode: word; var shiftstate: TShiftState; var consumed: boolean);
+var
+ i: integer;
+begin
+ inherited HandleKeyPress(keycode, shiftstate, consumed);
+ if not Enabled then
+ consumed := False
+ else
+ begin
+ consumed := True;
+
+ case keycode of
+ keyInsert:
+ for i := 0 to Pred(ColumnCount) do
+ if Columns[i].EditType = etCalendar then
+ begin
+ FDates:= TDates.Create;
+ FDates.FDate:= TfpgCalendarColumn(TfpgEditColumn(Columns[i]).Data).DateValue;
+ TfpgCalendarColumn(TfpgEditColumn(Columns[i]).Data).FDatesList.Add(FDates);
+ end;
+ keyDelete:
+ if RowCount > 0 then
+ begin
+ // specific warning and action should be performed in descendant
+ end;
+ keyReturn, keyPEnter:
+ begin
+ // specific action should be performed in descendant
+ end;
+ keyF2:
+ if RowCount > 0 then
+ begin
+ case Columns[FocusCol].EditType of
+ etText:
+ IniTextCell;
+ etInteger:
+ IniIntegerCell;
+ etFloat:
+ IniFloatCell;
+ etCurrency:
+ IniCurrencyCell;
+ etComboBox:
+ IniComboBoxCell;
+ etEditCombo:
+ IniEditComboCell;
+ etCheckBox:
+ IniCheckBoxCell;
+ etCalendar:
+ IniCalendarCell;
+ end;
+ FEditing := True;
+ end;
+ else
+ Consumed := False;
+ end;
+ end;
+end;
+
+constructor TfpgCustomEditGrid.Create(AOwner: TComponent);
+begin
+ inherited create(AOwner);
+ OnFocusChange := @EditGridFocusChange;
+ OnDoubleClick := @EditGridDoubleClick;
+ FEditing := False;
+ FEditWay := edColumn;
+end;
+
+destructor TfpgCustomEditGrid.Destroy;
+begin
+ inherited Destroy;
+end;
+
+function TfpgCustomEditGrid.AddColumn(ATitle: string; AWidth: integer; AEditType: TEditType = etNone;
+ AAlignment: TAlignment = taLeftJustify; AbackgroundColor: TfpgColor = clDefault; ATextColor: TfpgColor = clDefault): TfpgEditColumn;
+begin
+ Updating;
+ Result := TfpgEditColumn(inherited AddColumn(ATitle, AWidth, AAlignment, ABackgroundColor, ATextColor));
+ with Result do
+ begin
+ FEditType := AEditType;
+ case FEditType of
+ etInteger:
+ Result.FData:= TfpgIntegerColumn.Create;
+ etFloat:
+ Result.FData:= TfpgFloatColumn.Create;
+ etCurrency:
+ Result.FData:= TfpgCurrencyColumn.Create;
+ etComboBox:
+ Result.FData:= TfpgComboBoxColumn.Create;
+ etEditCombo:
+ Result.FData:= TfpgEditComboColumn.Create;
+ etCheckBox:
+ Result.FData:= TfpgCheckBoxColumn.Create;
+ etCalendar:
+ Result.FData := TfpgCalendarColumn.Create;
+ else
+ Result.FData:= nil;
+ end;
+ end;
+
+ if UpdateCount = 0 then
+ Updated;
+end;
+
+procedure TfpgCustomEditGrid.AddComboItem(AIndex: integer; const AValue: string);
+begin
+ TfpgComboBoxColumn(TfpgEditColumn(Columns[AIndex]).Data).FItems.Add(AValue);
+end;
+
+procedure TfpgCustomEditGrid.AddEditComboItem(AIndex: integer; const AValue: string);
+begin
+ TfpgEditComboColumn(TfpgEditColumn(Columns[AIndex]).Data).FItems.Add(AValue);
+end;
+
+end.
+