diff options
-rw-r--r-- | extras/contributed/editgrid/EditGridDemo.lpr | 25 | ||||
-rw-r--r-- | extras/contributed/editgrid/fpg_edit.patch | 589 | ||||
-rw-r--r-- | extras/contributed/editgrid/readme.txt | 10 | ||||
-rw-r--r-- | extras/contributed/editgrid/u_demo.pas | 388 | ||||
-rw-r--r-- | extras/contributed/editgrid/u_editgrid.pas | 1743 |
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. + |