diff --git a/components/rx/docs/WhatsNew.rus.txt b/components/rx/docs/WhatsNew.rus.txt
index af017a2ee..bbb7969b3 100644
--- a/components/rx/docs/WhatsNew.rus.txt
+++ b/components/rx/docs/WhatsNew.rus.txt
@@ -10,6 +10,8 @@
+ У компоненты TRxDateEdit добавлено свойствой - ValidDate. Определяет коректность введённой даты.
+ Добавлена два исходных компонента: TRxSpinButton и TRxSpinEdit (автор порта - Edward Ivanov)
- исправлены глифы у TRxClock, TRxDateEdit, TAutoPanel (Edward Ivanov)
+ - Исправления в TRxDatePicker (Edward Ivanov)
+ + Добавлены компоненты TRxDBSpinEdit, TRxTimeEdit, TRxDBTimeEdit
22.05.2008 - версия 2.0.0.136 (svn revision 100)
+ У объекта TRxCustomDBLookupCombo введён контроль на CircularDataLink
+ У объекта TRxCustomDBLookupCombo ускорена отрисовка данных
diff --git a/components/rx/images/TRXDBSpinEdit.png b/components/rx/images/TRXDBSpinEdit.png
new file mode 100644
index 000000000..d102b4841
Binary files /dev/null and b/components/rx/images/TRXDBSpinEdit.png differ
diff --git a/components/rx/images/TRxDBTimeEdit.png b/components/rx/images/TRxDBTimeEdit.png
new file mode 100644
index 000000000..7754a99f5
Binary files /dev/null and b/components/rx/images/TRxDBTimeEdit.png differ
diff --git a/components/rx/images/TRxTimeEdit.png b/components/rx/images/TRxTimeEdit.png
new file mode 100644
index 000000000..ca1f3e54f
Binary files /dev/null and b/components/rx/images/TRxTimeEdit.png differ
diff --git a/components/rx/images/mk_res.bat b/components/rx/images/mk_res.bat
index 276eac0db..4ddb69b4c 100644
--- a/components/rx/images/mk_res.bat
+++ b/components/rx/images/mk_res.bat
@@ -1,2 +1,2 @@
del rx.lrs
-D:\lazarus\tools\lazres.exe rx.lrs TDBDateEdit.xpm TRXLookUpEdit.xpm TRxDBCalcEdit.xpm TRxDBLookupCombo.xpm TRxDBGrid.xpm TDualListDialog.xpm TFolderLister.xpm TRxMemoryData.xpm TCURRENCYEDIT.xpm TRXSWITCH.xpm TRXDICE.xpm TRXDBCOMBOBOX.xpm ttoolpanel.xpm trxxpmanifest.xpm TPAGEMANAGER.xpm TRXAPPICON.xpm TSECRETPANEL.xpm TRXLABEL.xpm tautopanel.xpm TRxCalendarGrid.xpm TRxDateEdit.bmp TRxClock.bmp TRxSpeedButton.bmp TRxSpinButton.png TRxSpinEdit.png
+D:\lazarus\tools\lazres.exe rx.lrs TDBDateEdit.xpm TRXLookUpEdit.xpm TRxDBCalcEdit.xpm TRxDBLookupCombo.xpm TRxDBGrid.xpm TDualListDialog.xpm TFolderLister.xpm TRxMemoryData.xpm TCURRENCYEDIT.xpm TRXSWITCH.xpm TRXDICE.xpm TRXDBCOMBOBOX.xpm ttoolpanel.xpm trxxpmanifest.xpm TPAGEMANAGER.xpm TRXAPPICON.xpm TSECRETPANEL.xpm TRXLABEL.xpm tautopanel.xpm TRxCalendarGrid.xpm TRxDateEdit.bmp TRxClock.bmp TRxSpeedButton.bmp TRxSpinButton.png TRxSpinEdit.png TRXDBSpinEdit.png TRxTimeEdit.png TRxDBTimeEdit.png
diff --git a/components/rx/images/mk_res.sh b/components/rx/images/mk_res.sh
index 486afad27..daea233ec 100755
--- a/components/rx/images/mk_res.sh
+++ b/components/rx/images/mk_res.sh
@@ -1,3 +1,3 @@
rm rx.lrs
-/usr/local/share/lazarus/tools/lazres rx.lrs TDBDateEdit.xpm TRXLookUpEdit.xpm TRxDBCalcEdit.xpm TRxDBLookupCombo.xpm TRxDBGrid.xpm TDualListDialog.xpm TFolderLister.xpm TRxMemoryData.xpm TCURRENCYEDIT.xpm TRXSWITCH.xpm TRXDICE.xpm TRXDBCOMBOBOX.xpm ttoolpanel.xpm trxxpmanifest.xpm TPAGEMANAGER.xpm TRXAPPICON.xpm TSECRETPANEL.xpm TRXLABEL.xpm tautopanel.xpm TRxCalendarGrid.xpm TRxDateEdit.png TRxClock.png TRxSpeedButton.png TRxSpinButton.png TRxSpinEdit.png
+/usr/local/share/lazarus/tools/lazres rx.lrs TDBDateEdit.xpm TRXLookUpEdit.xpm TRxDBCalcEdit.xpm TRxDBLookupCombo.xpm TRxDBGrid.xpm TDualListDialog.xpm TFolderLister.xpm TRxMemoryData.xpm TCURRENCYEDIT.xpm TRXSWITCH.xpm TRXDICE.xpm TRXDBCOMBOBOX.xpm ttoolpanel.xpm trxxpmanifest.xpm TPAGEMANAGER.xpm TRXAPPICON.xpm TSECRETPANEL.xpm TRXLABEL.xpm tautopanel.xpm TRxCalendarGrid.xpm TRxDateEdit.png TRxClock.png TRxSpeedButton.png TRxSpinButton.png TRxSpinEdit.png TRXDBSpinEdit.png TRxTimeEdit.png TRxDBTimeEdit.png
diff --git a/components/rx/images/rx.lrs b/components/rx/images/rx.lrs
index 8d54a231f..1befcbd6a 100644
--- a/components/rx/images/rx.lrs
+++ b/components/rx/images/rx.lrs
@@ -453,3 +453,69 @@ LazarusResources.Add('TRxSpinEdit','PNG',[
+'T'#15#160'z4'#159#3#168's'#181'>'#192#191#169#220'9'#185#245#10#158'vWe'#213
+'GM'#130#23#211'$E'#25#128#18#229'#'#0#0#0#0'IEND'#174'B`'#130
]);
+LazarusResources.Add('TRXDBSpinEdit','PNG',[
+ #137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0#24#0#0#0#24#8#6#0#0#0#224'w='#248#0
+ +#0#0#9'pHYs'#0#0#14#156#0#0#14#156#1#7#148'S'#221#0#0#1#230'IDATH'#137#205
+ +#148#193'j'#19'Q'#24#133#191'2'#142'+)}'#129#190'D'#23#226'"P_A'#220#187#200
+ +'n'#210#216'M'#7#178'(C'#9']T"*'#212'd#]'#248#12'n'#5#145','#220#139'o'#224
+ +#170#22#196#166#134#218'af'#174#139#206#157#220#153';'#153#220#22#4#15#4#238
+ +''#239#253#207#185'9'#255'a'#224#31'C'#244'"'#12'C'#165#215#211#233'T@'#169
+ +#230#150#178'U'#218#207#13#132'a'#168#148#162#252#153'b'#205'X'''#222'B'#190
+ +'JD)'#147#212']'#192#3#232#247#195#202'f'#189#6#16#145#194'6Mn'#174'm'#232#7
+ +#249#0#147#201#180'BZ'#175'M'#153'*'#233#234'9'#220'<'#168#16#208#164'n'#208
+ +'"nC'#22#237#181')'#160'_'#191#189#253#208'Q'#180#25#189#222'3i'#181#232#219
+ +#215#217#157#201#15#15'cz'#189'5'#22#189'z'#243#206#218'K'#146#132' '#8#0#200
+ +#178#12'gh'#221'Q'#179'1'#243'_'#223#129'B'#160#223#15#27'-jB'#16#4#229#4
+ +#252#157'!'#217#231#23#214#29#233'F\|x'#190#20'Xe'#209#163#193#167'J'#227#151
+ +#147#199#0#228#10':'#197#136#207#206#23#0'D'#251#3#198'/O,'#177'V'#139'4a]'
+ +#168#227'-'#215#151#243#5#163#209#176#20#137#227'c['#160#205'"M'#174#197#234
+ +#184#248#249#155#189#221#131'JmB'#160#250#161#211'x'#253'vB '#235#5#164#27'Y'
+ +'{z'#200#27#155'['#226#129#157'wWr'#23#148'3'#184'/a\'#196#178#227#216','
+ +#221#200'-E'#26'JA'#206'2!.8;_'#16#237#15#202#186#158'$'#207',D '#184#5'9'
+ +#220#164'H'''''#142#143#185#156'/*'#231#149''#224#145#146#233#173'|'#233'}Z'
+ +#156#231')x'#2#190#225#161'N'#205#222#238#129#149' K@'#169#28'H'#16#229#225
+ +'y>Y'#14'H'#138#200#21#29#30#212'nC:'#27#225'wc'#139#244#207#199'#'#174#175
+ +'~'#0'ELOO'#223#171#167'O'#238#158#148'U'#216#216#220#186#165#225#255'#'#254
+ +#2#182'2'#241'd'#141']'#3'd'#0#0#0#0'IEND'#174'B`'#130
+]);
+LazarusResources.Add('TRxTimeEdit','PNG',[
+ #137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0#24#0#0#0#24#8#6#0#0#0#224'w='#248#0
+ +#0#0#9'pHYs'#0#0#14#156#0#0#14#156#1#7#148'S'#221#0#0#1'TIDATH'#137#237'TAN'
+ +#195'0'#16#156')'#136'7'#181#183#210#15' '#238'H'#28'zm'#223#144#245#7#16#18
+ +#220'P+'#193'C'#218'T'#28#224#140#248#13#18#195'!'#177#177#235#196'mQ'#17#23
+ +'F'#178'6'#235#216#187#179';'#155#0#255#248'k'#16#0'$i'#185'|'#250#149#4#167
+ +#177#243#254#246'|'#212#224#23#151'Wi'#2#0#184#185'}8Z'#130#205'f'#131'A'#223
+ +#203#209'|'#157#216']'#251#30'$'#19#191'7'#193'Op'#194#179',Ig'#2#146'x'#189
+ +#159'$'#150'd'#198'>'#174#130'$>'#241#145#248#1#146#180'X<'#10#128#26#183'Yf'
+ +'&3'#11#254#247'{i8[i'#23#234#186'V'#16'y:'#189'n'#147#245#183'@'#2#200#134
+ +#221'p'#182#194'h'#190#198#203#221'9'#156's'#157#231#199#227'q3E$C`'#231#12
+ +'Ue'#0#16#172#135's'#6#201#218#22'L'#160#18#155#140#156#242'e='#251#190']'
+ +#251#180'h'#208#6#135'sV'#166#144'U'#146#10#233#7'!^E'#246#187'*'#232#170#2
+ +'H'#7'!'#136#236#217#199'=wL'#173'G'#149'T'#155'V-'#169#213'S'#217#254'Q*'
+ +#232#210#128#177#6#219'SS'#210#160#170#12'$P'#215'u'#241#172'o'#192'!'#19#215
+ +'\dr'#191#23#217#175#162'4M'#135'LZ '#18'='#11'H'#191#228'.'#241#227#201#220
+ +'''A\'#1#183#2#228'l'#14#12'^:'#216#167#200#222#129'='#190#0'q'#209'z'#166'R'
+ +'2h'#222#0#0#0#0'IEND'#174'B`'#130
+]);
+LazarusResources.Add('TRxDBTimeEdit','PNG',[
+ #137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0#24#0#0#0#24#8#6#0#0#0#224'w='#248#0
+ +#0#0#9'pHYs'#0#0#14#156#0#0#14#156#1#7#148'S'#221#0#0#1#159'IDATH'#137#181'V'
+ +'1N'#195'0'#20'}?'#148'r'#131'\'#164#3'e3''@'#236#136#165'bq'#138#16'G'#232
+ +#196'X!'#154','#168#11#7')'#223',='#6'Co'#193#242#25#26#187#174'c;'#141#16'O'
+ +#138#226#196#254#239#253#255'l'#199#1#254#25'd'#27'Zk'#177#237#166'i'#8#16
+ +#137#135#184'P'#202#247'{'#208'Z'#139#8#220#229#139#197#209''''#158'!'#207
+ +#139#136't'#175'<'#200#18#213'u'#227'^V'#149#6#0'L&'#151#157#128#217#236#222
+ +#181#215#235#143#222#2'Hk-u'#221'8R+VU'#26#23#231'?'#209#160#229#235';'#158
+ +#159#30'z'#201'on'#239#242#22#253#21#204','#133'oIh'#17#0'\=~'#30#245#217#231
+ +#240#189#179'$X\#'#223#146#208#162#161'8'#163#177#19#145'v'#254'G>i*'#27'Z'
+ +#237#159#167#243'M'#167#138#237#219'u4s"'#2'3'#231'WQY'#150#0#0#165#212#209
+ +']D'#142#200'S0'#198#12#179#136#153#161#148#2#17'a:'#223'8'#145#197'b'#17#21
+ +'PJ'#229'-'#178#25#251#2#204#236#250#228#132#13#157#183#168'i'#160'Z'#194#152
+ +'x'#159#128'1'#6#4'@'#180#238#218#177'\'#213'x)(*`'#173#242'E'#194'I'#182#227
+ +#10#160#251'IX'#174'j'#140'3'#223#202#208':'#0#157'j'#142#150#233'n'#247#141
+ +#178',]'#224#246#203#128#219'6'#7'd'#202#155#135#152#136#191#7#128#253'y '
+ +#169#0'V*9'#7#182#146#220'<'#184'e'#10#28'|'#13#179#141#10'{c'#141'1I'#1#224
+ +'p'#162'%'#171'H'#161#21#232'='#213#138'Xv)'#12'M"'#204'@B'#18'SYx'#237#147
+ +#206'd'#191#2#10#201'B'#12'%'#207#13'L-'#141#211#255'$Z'#252#2'}'#212'D'#152
+ +'a'#180#26#28#0#0#0#0'IEND'#174'B`'#130
+]);
diff --git a/components/rx/pickdate.pas b/components/rx/pickdate.pas
index 43a170286..e097edd22 100644
--- a/components/rx/pickdate.pas
+++ b/components/rx/pickdate.pas
@@ -19,8 +19,16 @@ uses
{ TRxCalendar }
-{ TRxCalendar implementation copied from Borland CALENDAR.PAS sample unit
- and modified }
+{ TRxCalendar implementation copied from Borland CALENDAR.PAS sample
+ unit and modified }
+
+const
+ //TRxShortDaysWeek: array[0..6] of string = ('Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat');
+ TRxShortDaysOfWeek: array[0..6] of string =
+ ('Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa');
+ TRxLongMonthNames: array[0..11] of string =
+ ('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August',
+ 'September', 'October', 'November', 'December');
type
TDayOfWeek = 0..6;
@@ -48,11 +56,14 @@ type
FWeekends: TDaysOfWeek;
FWeekendColor: TColor;
FDaysArray:TDaysArray;
+ FShortDaysOfWeek: TStrings;
function GetDateElement(Index: Integer): Integer;
procedure FillDaysArray;
+ function GetShortDaysOfWeek: TStrings;
procedure SetCalendarDate(Value: TDateTime);
procedure SetDateElement(Index: Integer; Value: Integer);
procedure SetNotInThisMonthColor(const AValue: TColor);
+ procedure SetShortDaysOfWeek(const AValue: TStrings);
procedure SetStartOfWeek(Value: TDayOfWeekName);
procedure SetUseCurrentDate(Value: Boolean);
procedure SetWeekendColor(Value: TColor);
@@ -60,6 +71,8 @@ type
function IsWeekend(ACol, ARow: Integer): Boolean;
procedure CalendarUpdate(DayOnly: Boolean);
function StoreCalendarDate: Boolean;
+ procedure AddWeek;
+ procedure DecWeek;
protected
procedure CreateParams(var Params: TCreateParams); override;
procedure Change; dynamic;
@@ -70,6 +83,9 @@ type
procedure KeyDown(var Key: Word; Shift: TShiftState); override;
procedure KeyPress(var Key: Char); override;
procedure LMSize(var Message: TLMSize); message LM_SIZE;
+ procedure RxCalendarMouseWheelUp(Sender: TObject; Shift: TShiftState; MousePos: TPoint; var Handled: Boolean);
+ procedure RxCalendarMouseWheelDown(Sender: TObject; Shift: TShiftState; MousePos: TPoint; var Handled: Boolean);
+ procedure UpdateShortDaysOfWeek; virtual;
property CalendarDate: TDateTime read FDate write SetCalendarDate
stored StoreCalendarDate;
@@ -85,11 +101,13 @@ type
property NotInThisMonthColor:TColor read FNotInThisMonthColor write SetNotInThisMonthColor default clSilver;
public
constructor Create(AOwner: TComponent); override;
+ destructor Destroy; override;
procedure NextMonth;
procedure NextYear;
procedure PrevMonth;
procedure PrevYear;
procedure UpdateCalendar; virtual;
+ property ShortDaysOfWeek: TStrings read GetShortDaysOfWeek write SetShortDaysOfWeek;
end;
{ TRxCalendar1 }
@@ -112,6 +130,7 @@ type
property PopupMenu;
property ReadOnly;
property SelectedColor;
+ property ShortDaysOfWeek; //
property StartOfWeek;
property TabStop;
property UseCurrentDate;
@@ -149,6 +168,7 @@ type
FFourDigitYear: Boolean;
FBtns: array[0..3] of TSpeedButton;
FMonthMenu:TPopupMenu;
+ FMonthNames: TStrings;
procedure CalendarMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
function GetDate: TDateTime;
@@ -158,6 +178,7 @@ type
procedure NextYearBtnClick(Sender: TObject);
procedure CalendarChange(Sender: TObject);
procedure SetDate(const AValue: TDateTime);
+ procedure SetMonthNames(const AValue: TStrings);
procedure TopPanelDblClick(Sender: TObject);
procedure MonthMenuClick(Sender: TObject);
procedure CalendarDblClick(Sender: TObject);
@@ -170,10 +191,12 @@ type
procedure Deactivate; override;
public
constructor Create(AOwner: TComponent); override;
+ destructor Destroy; override;
procedure AutoSizeForm;
property Date:TDateTime read GetDate write SetDate;
property OnCloseUp: TCloseUpEvent read FCloseUp write FCloseUp;
property Calendar: TCustomRxCalendar read FCalendar;
+ property MonthNames: TStrings read FMonthNames write SetMonthNames;
end;
{ TSelectDateDlg }
@@ -267,7 +290,11 @@ begin
for i:=1 to 12 do
begin
MI:=TMenuItem.Create(Result);
- MI.Caption:=LongMonthNames[i];
+ (*
+ // Old variant
+ // MI.Caption:=LongMonthNames[i];
+ *)
+ MI.Caption := TRxLongMonthNames[i - 1];
MI.OnClick:=AOnClick;
MI.Tag:=i;
Result.Items.Add(MI);
@@ -311,6 +338,7 @@ var
ADefaultTextStyle: TTextStyle;
begin
inherited Create(AOwner);
+ FShortDaysOfWeek := TStringList.Create;
FUseCurrentDate := True;
FStartOfWeek := Mon;
FWeekends := [Sun];
@@ -328,11 +356,20 @@ begin
ADefaultTextStyle.Alignment:=taCenter;
ADefaultTextStyle.Layout:=tlCenter;
DefaultTextStyle:=ADefaultTextStyle;
-
+ FocusRectVisible := False;
+ OnMouseWheelUp := @RxCalendarMouseWheelUp;
+ OnMouseWheelDown := @RxCalendarMouseWheelDown;
+ UpdateShortDaysOfWeek;
UpdateCalendar;
TitleStyle:=tsNative;
end;
+destructor TCustomRxCalendar.Destroy;
+begin
+ FShortDaysOfWeek.Free;
+ inherited Destroy;
+end;
+
procedure TCustomRxCalendar.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
@@ -370,6 +407,7 @@ procedure TCustomRxCalendar.DrawCell(ACol, ARow: Longint; ARect: TRect;
AState: TGridDrawState);
var
DayNum:integer;
+ R: TRect;
begin
PrepareCanvas(aCol, aRow, aState);
@@ -381,17 +419,34 @@ begin
if ARow>0 then
begin
- if not ((gdSelected in aState) and (gdFocused in aState)) then
- Canvas.Font.Color:=FDaysArray[ACol, ARow].DayColor
+ if not ((gdSelected in aState) and (gdFocused in aState)) then begin
+ if (FDaysArray[ACol, ARow].DayDate = Date) and (FDaysArray[ACol, ARow].DayColor <> FNotInThisMonthColor) then begin
+ R := ARect;
+ // Variant 1
+ //Dec(R.Bottom, 1);
+ //Dec(R.Right, 1);
+ //Canvas.Frame3d(R, 1, bvLowered);
+
+ // Variant 2
+ RxFrame3D(Canvas, R, clWindowFrame, clBtnHighlight, 1);
+ RxFrame3D(Canvas, R, clBtnShadow, clBtnFace, 1);
+ end;
+ Canvas.Font.Color:=FDaysArray[ACol, ARow].DayColor;
+ end
else
- Canvas.Font.Color:=clWindow
+ Canvas.Font.Color := clHighlightText // clWindow
;
DrawCellText(ACol, ARow, ARect, AState, IntToStr(FDaysArray[ACol, ARow].DayNum));
+
end
else
begin
Canvas.Font.Color:=clText;
- DrawCellText(ACol, ARow, ARect, AState, ShortDayNames[(Ord(StartOfWeek) + ACol) mod 7 + 1]);
+ //DrawCellText(ACol, ARow, ARect, AState, ShortDayNames[(Ord(StartOfWeek) + ACol) mod 7 + 1]);
+ if FShortDaysOfWeek <> nil then begin
+ if ACol <= FShortDaysOfWeek.Count - 1 then
+ DrawCellText(ACol, ARow, ARect, AState, FShortDaysOfWeek.Strings[(Ord(StartOfWeek) + ACol) mod 7]);
+ end;
end;
end;
@@ -419,6 +474,16 @@ procedure TCustomRxCalendar.KeyDown(var Key: Word; Shift: TShiftState);
begin
if Shift = [] then
case Key of
+ VK_UP:
+ begin
+ DecWeek;
+ Exit;
+ end;
+ VK_DOWN:
+ begin
+ AddWeek;
+ Exit;
+ end;
VK_LEFT, VK_SUBTRACT:
begin
if (Day > 1) then Day := Day - 1
@@ -456,6 +521,20 @@ begin
DefaultRowHeight := (Message.Height - GridLinesH) div 7;
end;
+procedure TCustomRxCalendar.RxCalendarMouseWheelUp(Sender: TObject;
+ Shift: TShiftState; MousePos: TPoint; var Handled: Boolean);
+begin
+ DecWeek;
+ Handled := True;
+end;
+
+procedure TCustomRxCalendar.RxCalendarMouseWheelDown(Sender: TObject;
+ Shift: TShiftState; MousePos: TPoint; var Handled: Boolean);
+begin
+ AddWeek;
+ Handled := True;
+end;
+
procedure TCustomRxCalendar.SetCalendarDate(Value: TDateTime);
begin
if FDate <> Value then
@@ -471,6 +550,22 @@ begin
Result := not FUseCurrentDate;
end;
+procedure TCustomRxCalendar.AddWeek;
+begin
+ if (Day + 7 <= DaysThisMonth) then
+ Day := Day + 7
+ else
+ CalendarDate := CalendarDate + 7;
+end;
+
+procedure TCustomRxCalendar.DecWeek;
+begin
+ if (Day - 7 >= 1) then
+ Day := Day - 7
+ else
+ CalendarDate := CalendarDate - 7;
+end;
+
function TCustomRxCalendar.GetDateElement(Index: Integer): Integer;
var
AYear, AMonth, ADay: Word;
@@ -526,6 +621,25 @@ begin
end;
end;
+procedure TCustomRxCalendar.UpdateShortDaysOfWeek;
+var
+ Ind: Integer;
+ //OldNotify: TNotifyEvent;
+begin
+ if (FShortDaysOfWeek <> nil) and (FShortDaysOfWeek.Count = 0) then begin
+ //OldNotify := FDaysOfWeek.OnChange;
+ //TStringList(FShortDays).OnChange := nil;
+ for Ind := Low(TRxShortDaysOfWeek) to High(TRxShortDaysOfWeek) do
+ FShortDaysOfWeek.Add(TRxShortDaysOfWeek[Ind]);
+ //FShortDaysOfWeek.OnChange := OldNotify;
+ end;
+end;
+
+function TCustomRxCalendar.GetShortDaysOfWeek: TStrings;
+begin
+ Result := FShortDaysOfWeek;
+end;
+
procedure TCustomRxCalendar.SetDateElement(Index: Integer; Value: Integer);
var
AYear, AMonth, ADay: Word;
@@ -561,6 +675,14 @@ begin
end;
end;
+procedure TCustomRxCalendar.SetShortDaysOfWeek(const AValue: TStrings);
+begin
+ if AValue.Text <> FShortDaysOfWeek.Text then begin
+ FShortDaysOfWeek.Assign(AValue);
+ Invalidate; //
+ end;
+end;
+
procedure TCustomRxCalendar.SetWeekendColor(Value: TColor);
begin
if Value <> FWeekendColor then
@@ -822,6 +944,12 @@ begin
if (csDesigning in ComponentState) then Exit;
+ FMonthNames := TStringList.Create;
+ if FMonthNames.Count = 0 then begin
+ for i := Low(TRxLongMonthNames) to High(TRxLongMonthNames) do
+ FMonthNames.Add(TRxLongMonthNames[i]);
+ end;
+
BackPanel := TPanel.Create(Self);
BackPanel.Anchors:=[akLeft, akRight, akTop, akBottom];
@@ -934,6 +1062,12 @@ begin
CalendarChange(nil);
end;
+destructor TPopupCalendar.Destroy;
+begin
+ FMonthNames.Free;
+ inherited Destroy;
+end;
+
procedure TPopupCalendar.AutoSizeForm;
begin
FControlPanel.Height:=FCalendar.Canvas.TextHeight('Wg')+4;
@@ -996,8 +1130,6 @@ begin
else FCalendar.PrevMonth;
end;
VK_ESCAPE:ModalResult:=mrCancel;
- else
- TLocCalendar(FCalendar).KeyDown(Key, Shift);
end;
inherited KeyDown(Key, Shift);
end;
@@ -1056,8 +1188,14 @@ begin
end;
procedure TPopupCalendar.CalendarChange(Sender: TObject);
+var
+ s: string; //
+ AYear, AMonth, ADay: Word;
begin
- FTitleLabel.Caption := FormatDateTime('MMMM, YYYY', FCalendar.CalendarDate);
+ DecodeDate(FCalendar.CalendarDate, AYear, AMonth, ADay);
+ s := Format('%s, %d', [TRxLongMonthNames[AMonth - 1], AYear]);
+ FTitleLabel.Caption := s; //
+ // FTitleLabel.Caption := FormatDateTime('MMMM, YYYY', FCalendar.CalendarDate);
end;
procedure TPopupCalendar.SetDate(const AValue: TDateTime);
@@ -1065,6 +1203,14 @@ begin
FCalendar.CalendarDate:=AValue;
end;
+procedure TPopupCalendar.SetMonthNames(const AValue: TStrings);
+begin
+ if AValue.Text <> FMonthNames.Text then begin
+ FMonthNames.Assign(AValue);
+ CalendarChange(Self);
+ end;
+end;
+
{ TSelectDateDlg }
constructor TSelectDateDlg.Create(AOwner: TComponent);
@@ -1262,14 +1408,14 @@ begin
VK_ESCAPE: ModalResult := mrCancel;
VK_NEXT:
begin
- if ssCtrl in Shift then Calendar.NextYear
- else Calendar.NextMonth;
+ if ssCtrl in Shift then Calendar.NextYear;
+ //else Calendar.NextMonth;
TitleLabel.Update;
end;
VK_PRIOR:
begin
- if ssCtrl in Shift then Calendar.PrevYear
- else Calendar.PrevMonth;
+ if ssCtrl in Shift then Calendar.PrevYear;
+ //else Calendar.PrevMonth;
TitleLabel.Update;
end;
VK_TAB:
diff --git a/components/rx/registerrx.pas b/components/rx/registerrx.pas
index 12fedebbc..de6549cf2 100644
--- a/components/rx/registerrx.pas
+++ b/components/rx/registerrx.pas
@@ -15,7 +15,7 @@ uses
curredit, rxswitch, rxdice, rxdbcomb, rxtoolbar, rxxpman, PageMngr, RxAppIcon,
Dialogs, ComponentEditors, seldsfrm, DBPropEdits, DB, rxctrls, RxLogin,
RxCustomChartPanel, AutoPanel, pickdate, rxconst, tooledit, rxclock,
- rxceEditLookupFields, rxpopupunit, rxspin;
+ rxceEditLookupFields, rxpopupunit, rxspin, RxTimeEdit;
type
@@ -276,6 +276,11 @@ begin
RegisterComponents('RX',[TRxSpinButton, TRxSpinEdit]);
end;
+procedure RegisterRxTimeEdit;
+begin
+ RegisterComponents('RX',[TRxTimeEdit]);
+end;
+
procedure Register;
begin
//RX
@@ -296,6 +301,7 @@ begin
RegisterUnit('tooledit', @RegisterToolEdit);
RegisterUnit('rxclock', @RegisterRxClock);
RegisterUnit('rxspin', @RegisterRxSpin);
+ RegisterUnit('RxTimeEdit', @RegisterRxTimeEdit);
//RX DBAware
RegisterUnit('dbdateedit', @RegisterUnitDBDateEdit);
diff --git a/components/rx/registerrxdb.pas b/components/rx/registerrxdb.pas
new file mode 100644
index 000000000..a34af90d3
--- /dev/null
+++ b/components/rx/registerrxdb.pas
@@ -0,0 +1,31 @@
+unit RegisterRxDB;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+ Classes, SysUtils, LResources, LazarusPackageIntf;
+
+procedure Register;
+implementation
+uses RxDBSpinEdit, RxDBTimeEdit;
+
+procedure RegisterRxDBSpinEdit;
+begin
+ RegisterComponents('RX DBAware',[TRxDBSpinEdit]);
+end;
+
+procedure RegisterRxDBTimeEdit;
+begin
+ RegisterComponents('RX DBAware',[TRxDBTimeEdit]);
+end;
+
+procedure Register;
+begin
+ RegisterUnit('RxDBTimeEdit', @RegisterRxDBTimeEdit);
+ RegisterUnit('RxDBSpinEdit', @RegisterRxDBSpinEdit);
+end;
+
+end.
+
diff --git a/components/rx/rx.lrs b/components/rx/rx.lrs
index 8d54a231f..1befcbd6a 100644
--- a/components/rx/rx.lrs
+++ b/components/rx/rx.lrs
@@ -453,3 +453,69 @@ LazarusResources.Add('TRxSpinEdit','PNG',[
+'T'#15#160'z4'#159#3#168's'#181'>'#192#191#169#220'9'#185#245#10#158'vWe'#213
+'GM'#130#23#211'$E'#25#128#18#229'#'#0#0#0#0'IEND'#174'B`'#130
]);
+LazarusResources.Add('TRXDBSpinEdit','PNG',[
+ #137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0#24#0#0#0#24#8#6#0#0#0#224'w='#248#0
+ +#0#0#9'pHYs'#0#0#14#156#0#0#14#156#1#7#148'S'#221#0#0#1#230'IDATH'#137#205
+ +#148#193'j'#19'Q'#24#133#191'2'#142'+)}'#129#190'D'#23#226'"P_A'#220#187#200
+ +'n'#210#216'M'#7#178'(C'#9']T"*'#212'd#]'#248#12'n'#5#145','#220#139'o'#224
+ +#170#22#196#166#134#218'af'#174#139#206#157#220#153';'#153#220#22#4#15#4#238
+ +''#239#253#207#185'9'#255'a'#224#31'C'#244'"'#12'C'#165#215#211#233'T@'#169
+ +#230#150#178'U'#218#207#13#132'a'#168#148#162#252#153'b'#205'X'''#222'B'#190
+ +'JD)'#147#212']'#192#3#232#247#195#202'f'#189#6#16#145#194'6Mn'#174'm'#232#7
+ +#249#0#147#201#180'BZ'#175'M'#153'*'#233#234'9'#220'<'#168#16#208#164'n'#208
+ +'"nC'#22#237#181')'#160'_'#191#189#253#208'Q'#180#25#189#222'3i'#181#232#219
+ +#215#217#157#201#15#15'cz'#189'5'#22#189'z'#243#206#218'K'#146#132' '#8#0#200
+ +#178#12'gh'#221'Q'#179'1'#243'_'#223#129'B'#160#223#15#27'-jB'#16#4#229#4
+ +#252#157'!'#217#231#23#214#29#233'F\|x'#190#20'Xe'#209#163#193#167'J'#227#151
+ +#147#199#0#228#10':'#197#136#207#206#23#0'D'#251#3#198'/O,'#177'V'#139'4a]'
+ +#168#227'-'#215#151#243#5#163#209#176#20#137#227'c['#160#205'"M'#174#197#234
+ +#184#248#249#155#189#221#131'JmB'#160#250#161#211'x'#253'vB '#235#5#164#27'Y'
+ +'{z'#200#27#155'['#226#129#157'wWr'#23#148'3'#184'/a\'#196#178#227#216','
+ +#221#200'-E'#26'JA'#206'2!.8;_'#16#237#15#202#186#158'$'#207',D '#184#5'9'
+ +#220#164'H'''''#142#143#185#156'/*'#231#149''#224#145#146#233#173'|'#233'}Z'
+ +#156#231')x'#2#190#225#161'N'#205#222#238#129#149' K@'#169#28'H'#16#229#225
+ +'y>Y'#14'H'#138#200#21#29#30#212'nC:'#27#225'wc'#139#244#207#199'#'#174#175
+ +'~'#0'ELOO'#223#171#167'O'#238#158#148'U'#216#216#220#186#165#225#255'#'#254
+ +#2#182'2'#241'd'#141']'#3'd'#0#0#0#0'IEND'#174'B`'#130
+]);
+LazarusResources.Add('TRxTimeEdit','PNG',[
+ #137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0#24#0#0#0#24#8#6#0#0#0#224'w='#248#0
+ +#0#0#9'pHYs'#0#0#14#156#0#0#14#156#1#7#148'S'#221#0#0#1'TIDATH'#137#237'TAN'
+ +#195'0'#16#156')'#136'7'#181#183#210#15' '#238'H'#28'zm'#223#144#245#7#16#18
+ +#220'P+'#193'C'#218'T'#28#224#140#248#13#18#195'!'#177#177#235#196'mQ'#17#23
+ +'F'#178'6'#235#216#187#179';'#155#0#255#248'k'#16#0'$i'#185'|'#250#149#4#167
+ +#177#243#254#246'|'#212#224#23#151'Wi'#2#0#184#185'}8Z'#130#205'f'#131'A'#223
+ +#203#209'|'#157#216']'#251#30'$'#19#191'7'#193'Op'#194#179',Ig'#2#146'x'#189
+ +#159'$'#150'd'#198'>'#174#130'$>'#241#145#248#1#146#180'X<'#10#128#26#183'Yf'
+ +'&3'#11#254#247'{i8[i'#23#234#186'V'#16'y:'#189'n'#147#245#183'@'#2#200#134
+ +#221'p'#182#194'h'#190#198#203#221'9'#156's'#157#231#199#227'q3E$C`'#231#12
+ +'Ue'#0#16#172#135's'#6#201#218#22'L'#160#18#155#140#156#242'e='#251#190']'
+ +#251#180'h'#208#6#135'sV'#166#144'U'#146#10#233#7'!^E'#246#187'*'#232#170#2
+ +'H'#7'!'#136#236#217#199'=wL'#173'G'#149'T'#155'V-'#169#213'S'#217#254'Q*'
+ +#232#210#128#177#6#219'SS'#210#160#170#12'$P'#215'u'#241#172'o'#192'!'#19#215
+ +'\dr'#191#23#217#175#162'4M'#135'LZ '#18'='#11'H'#191#228'.'#241#227#201#220
+ +'''A\'#1#183#2#228'l'#14#12'^:'#216#167#200#222#129'='#190#0'q'#209'z'#166'R'
+ +'2h'#222#0#0#0#0'IEND'#174'B`'#130
+]);
+LazarusResources.Add('TRxDBTimeEdit','PNG',[
+ #137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0#24#0#0#0#24#8#6#0#0#0#224'w='#248#0
+ +#0#0#9'pHYs'#0#0#14#156#0#0#14#156#1#7#148'S'#221#0#0#1#159'IDATH'#137#181'V'
+ +'1N'#195'0'#20'}?'#148'r'#131'\'#164#3'e3''@'#236#136#165'bq'#138#16'G'#232
+ +#196'X!'#154','#168#11#7')'#223',='#6'Co'#193#242#25#26#187#174'c;'#141#16'O'
+ +#138#226#196#254#239#253#255'l'#199#1#254#25'd'#27'Zk'#177#237#166'i'#8#16
+ +#137#135#184'P'#202#247'{'#208'Z'#139#8#220#229#139#197#209''''#158'!'#207
+ +#139#136't'#175'<'#200#18#213'u'#227'^V'#149#6#0'L&'#151#157#128#217#236#222
+ +#181#215#235#143#222#2'Hk-u'#221'8R+VU'#26#23#231'?'#209#160#229#235';'#158
+ +#159#30'z'#201'on'#239#242#22#253#21#204','#133'oIh'#17#0'\=~'#30#245#217#231
+ +#240#189#179'$X\#'#223#146#208#162#161'8'#163#177#19#145'v'#254'G>i*'#27'Z'
+ +#237#159#167#243'M'#167#138#237#219'u4s"'#2'3'#231'WQY'#150#0#0#165#212#209
+ +']D'#142#200'S0'#198#12#179#136#153#161#148#2#17'a:'#223'8'#145#197'b'#17#21
+ +'PJ'#229'-'#178#25#251#2#204#236#250#228#132#13#157#183#168'i'#160'Z'#194#152
+ +'x'#159#128'1'#6#4'@'#180#238#218#177'\'#213'x)(*`'#173#242'E'#194'I'#182#227
+ +#10#160#251'IX'#174'j'#140'3'#223#202#208':'#0#157'j'#142#150#233'n'#247#141
+ +#178',]'#224#246#203#128#219'6'#7'd'#202#155#135#152#136#191#7#128#253'y '
+ +#169#0'V*9'#7#182#146#220'<'#184'e'#10#28'|'#13#179#141#10'{c'#141'1I'#1#224
+ +'p'#162'%'#171'H'#161#21#232'='#213#138'Xv)'#12'M"'#204'@B'#18'SYx'#237#147
+ +#206'd'#191#2#10#201'B'#12'%'#207#13'L-'#141#211#255'$Z'#252#2'}'#212'D'#152
+ +'a'#180#26#28#0#0#0#0'IEND'#174'B`'#130
+]);
diff --git a/components/rx/rxdbspinedit.pas b/components/rx/rxdbspinedit.pas
new file mode 100644
index 000000000..081401917
--- /dev/null
+++ b/components/rx/rxdbspinedit.pas
@@ -0,0 +1,288 @@
+unit RxDBSpinEdit;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+ Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, Spin,
+ DbCtrls, DB, LMessages, LCLType;
+
+const
+ IntegerDataTypes = [ftSmallint, ftInteger, ftWord, ftLargeint];
+
+ NumericDataTypes = IntegerDataTypes + [ftFloat, ftCurrency, ftBCD];
+
+
+type
+
+ { TCustomRxDBSpinEdit }
+
+ TCustomRxDBSpinEdit = class(TCustomFloatSpinEdit)
+ private
+ FDataLink: TFieldDataLink;
+
+ procedure DataChange(Sender: TObject);
+ function GetDataField: string;
+ function GetDataSource: TDataSource;
+ function GetField: TField;
+ function GetReadOnly: Boolean;
+ procedure SetDataField(const AValue: string);
+ procedure SetDataSource(const AValue: TDataSource);
+ procedure SetReadOnly(const AValue: Boolean);
+ procedure UpdateData(Sender: TObject);
+ procedure FocusRequest(Sender: TObject);
+ procedure ActiveChange(Sender: TObject);
+ procedure LayoutChange(Sender: TObject);
+ procedure CMGetDataLink(var Message: TLMessage); message CM_GETDATALINK;
+ function IsReadOnly: boolean;
+ protected
+ property DataField: string read GetDataField write SetDataField;
+ property DataSource: TDataSource read GetDataSource write SetDataSource;
+ property ReadOnly: Boolean read GetReadOnly write SetReadOnly default False;
+
+ procedure KeyDown(var Key: Word; Shift: TShiftState); override;
+ procedure Change; override;
+
+ procedure Loaded; override;
+ procedure Notification(AComponent: TComponent;
+ Operation: TOperation); override;
+ procedure WMSetFocus(var Message: TLMSetFocus); message LM_SETFOCUS;
+ procedure WMKillFocus(var Message: TLMKillFocus); message LM_KILLFOCUS;
+ public
+ constructor Create(AOwner: TComponent); override;
+ destructor Destroy; override;
+ property Field: TField read GetField;
+ published
+ { Published declarations }
+ end;
+
+ TRxDBSpinEdit = class(TCustomRxDBSpinEdit)
+ published
+ property DataField;
+ property DataSource;
+ property ReadOnly;
+
+ property Align;
+ property Anchors;
+ property AutoSelect;
+ property AutoSize;
+ property BorderSpacing;
+ property Constraints;
+ property DecimalPlaces;
+ property Enabled;
+ property Font;
+ property Increment;
+ property MaxValue;
+ property MinValue;
+ property OnChange;
+ property OnChangeBounds;
+ property OnClick;
+ property OnEditingDone;
+ property OnEnter;
+ property OnExit;
+ property OnKeyDown;
+ property OnKeyPress;
+ property OnKeyUp;
+ property OnMouseDown;
+ property OnMouseMove;
+ property OnMouseUp;
+ property OnResize;
+ property OnUTF8KeyPress;
+ property ParentFont;
+ property ParentShowHint;
+ property PopupMenu;
+ property ShowHint;
+ property TabStop;
+ property TabOrder;
+ property Value;
+ property Visible;
+ end;
+
+implementation
+
+type
+ TFieldDataLinkHack = class(TFieldDataLink)
+ end;
+
+{ TCustomRxDBSpinEdit }
+
+procedure TCustomRxDBSpinEdit.DataChange(Sender: TObject);
+begin
+ if Assigned(FDataLink.Field) and (FDataLink.Field.DataType in NumericDataTypes) then
+ begin
+ if (FDataLink.Field.DataType in IntegerDataTypes) then
+ DecimalPlaces:=0
+ else
+ begin
+ if FDataLink.Field.DataType = ftBCD then
+ DecimalPlaces:=(FDatalink.Field as TBCDField).Precision
+ else
+ DecimalPlaces:=(FDatalink.Field as TFloatField).Precision;
+ end;
+ Value:=FDatalink.Field.AsFloat;
+ end
+ else
+ begin
+ Text := '';
+ end;
+end;
+
+function TCustomRxDBSpinEdit.GetDataField: string;
+begin
+ Result := FDataLink.FieldName;
+end;
+
+function TCustomRxDBSpinEdit.GetDataSource: TDataSource;
+begin
+ Result := FDataLink.DataSource;
+end;
+
+function TCustomRxDBSpinEdit.GetField: TField;
+begin
+ Result := FDataLink.Field;
+end;
+
+function TCustomRxDBSpinEdit.GetReadOnly: Boolean;
+begin
+ Result := FDataLink.ReadOnly;
+end;
+
+procedure TCustomRxDBSpinEdit.SetDataField(const AValue: string);
+begin
+ FDataLink.FieldName := AValue;
+end;
+
+procedure TCustomRxDBSpinEdit.SetDataSource(const AValue: TDataSource);
+begin
+ ChangeDataSource(Self,FDataLink,AValue);
+end;
+
+procedure TCustomRxDBSpinEdit.SetReadOnly(const AValue: Boolean);
+begin
+ inherited;
+ FDataLink.ReadOnly := AValue;
+end;
+
+procedure TCustomRxDBSpinEdit.UpdateData(Sender: TObject);
+begin
+ FDataLink.Field.Value := Value;
+end;
+
+procedure TCustomRxDBSpinEdit.FocusRequest(Sender: TObject);
+begin
+ SetFocus;
+end;
+
+procedure TCustomRxDBSpinEdit.ActiveChange(Sender: TObject);
+begin
+ if FDatalink.Active then
+ DataChange(Sender)
+ else
+ begin
+ Text := '';
+ FDataLink.Reset;
+ end;
+end;
+
+procedure TCustomRxDBSpinEdit.LayoutChange(Sender: TObject);
+begin
+ DataChange(Sender);
+end;
+
+procedure TCustomRxDBSpinEdit.CMGetDataLink(var Message: TLMessage);
+begin
+ Message.Result := PtrUInt(FDataLink);
+end;
+
+procedure TCustomRxDBSpinEdit.KeyDown(var Key: Word; Shift: TShiftState);
+begin
+ inherited KeyDown(Key, Shift);
+ if Key=VK_ESCAPE then
+ begin
+ //cancel out of editing by reset on esc
+ FDataLink.Reset;
+ SelectAll;
+ Key := VK_UNKNOWN;
+ end
+ else
+ if Key=VK_DELETE then
+ begin
+ if not IsReadOnly then
+ FDatalink.Edit;
+ end
+ else
+ if Key=VK_TAB then
+ begin
+ if FDataLink.CanModify and FDatalink.Editing then
+ FDataLink.UpdateRecord;
+ end;
+end;
+
+procedure TCustomRxDBSpinEdit.Change;
+begin
+ FDatalink.Edit;
+ FDataLink.Modified;
+ inherited Change;
+end;
+
+function TCustomRxDBSpinEdit.IsReadOnly: boolean;
+begin
+ result := true;
+ if FDatalink.Active and not Self.ReadOnly then
+ result := (Field=nil) or Field.ReadOnly;
+end;
+
+procedure TCustomRxDBSpinEdit.Loaded;
+begin
+ inherited Loaded;
+ if (csDesigning in ComponentState) then
+ DataChange(Self);
+end;
+
+procedure TCustomRxDBSpinEdit.Notification(AComponent: TComponent;
+ Operation: TOperation);
+begin
+ inherited Notification(AComponent, Operation);
+ if (Operation=opRemove) then
+ begin
+ if (FDataLink<>nil) and (AComponent=DataSource) then
+ DataSource:=nil;
+ end;
+end;
+
+procedure TCustomRxDBSpinEdit.WMSetFocus(var Message: TLMSetFocus);
+begin
+ inherited WMSetFocus(Message);
+ if not FDatalink.Editing then
+ FDatalink.Reset;
+end;
+
+procedure TCustomRxDBSpinEdit.WMKillFocus(var Message: TLMKillFocus);
+begin
+ inherited WMKillFocus(Message);
+ if not FDatalink.Editing then
+ FDatalink.Reset
+ else
+ TFieldDataLinkHack(FDatalink).UpdateData;
+end;
+
+constructor TCustomRxDBSpinEdit.Create(AOwner: TComponent);
+begin
+ inherited Create(AOwner);
+ FDataLink := TFieldDataLink.Create;
+ FDataLink.Control := Self;
+ FDataLink.OnDataChange := @DataChange;
+ FDataLink.OnUpdateData := @UpdateData;
+ FDataLink.OnActiveChange := @ActiveChange;
+ FDataLink.OnLayoutChange := @LayoutChange;
+end;
+
+destructor TCustomRxDBSpinEdit.Destroy;
+begin
+ FDataLink.Free;
+ FDataLink := nil;
+ inherited Destroy;
+end;
+
+end.
diff --git a/components/rx/rxdbtimeedit.pas b/components/rx/rxdbtimeedit.pas
new file mode 100644
index 000000000..a348214e8
--- /dev/null
+++ b/components/rx/rxdbtimeedit.pas
@@ -0,0 +1,30 @@
+unit RxDBTimeEdit;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+ Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs,
+ RxTimeEdit;
+
+type
+ TCustomRxDBTimeEdit = class(TCustomRxTimeEdit)
+ private
+ { Private declarations }
+ protected
+ { Protected declarations }
+ public
+ { Public declarations }
+ published
+ { Published declarations }
+ end;
+
+ TRxDBTimeEdit = class(TCustomRxDBTimeEdit)
+ end;
+
+
+implementation
+
+
+end.
diff --git a/components/rx/rxnew.lpk b/components/rx/rxnew.lpk
index 50569d915..512e30f7b 100644
--- a/components/rx/rxnew.lpk
+++ b/components/rx/rxnew.lpk
@@ -16,12 +16,12 @@
-
-
+
+
@@ -207,6 +207,23 @@ translate to Lazarus by alexs in 2005 - 2007
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -225,11 +242,10 @@ translate to Lazarus by alexs in 2005 - 2007
-
+
-
diff --git a/components/rx/rxnew.pas b/components/rx/rxnew.pas
index 3cc2a8b3f..089203403 100644
--- a/components/rx/rxnew.pas
+++ b/components/rx/rxnew.pas
@@ -15,13 +15,15 @@ uses
fduallst, rxxpman, pagemngr, rxappicon, seldsfrm, rxctrls, rxlogin,
rxdbgrid_findunit, rxdbgrid_columsunit, rxpopupunit, rxcustomchartpanel,
rxsortmemds, AutoPanel, pickdate, rxiconv, rxceEditLookupFields, rxclock,
- rxspin, LazarusPackageIntf;
+ rxspin, RxDBSpinEdit, RegisterRxDB, RxTimeEdit, RxDBTimeEdit,
+ LazarusPackageIntf;
implementation
procedure Register;
begin
RegisterUnit('registerrx', @registerrx.Register);
+ RegisterUnit('RegisterRxDB', @RegisterRxDB.Register);
end;
initialization
diff --git a/components/rx/rxtimeedit.pas b/components/rx/rxtimeedit.pas
new file mode 100644
index 000000000..3dc5a6a5c
--- /dev/null
+++ b/components/rx/rxtimeedit.pas
@@ -0,0 +1,271 @@
+unit RxTimeEdit;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+ Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, rxspin,
+ MaskEdit, LMessages, LCLType;
+
+type
+
+ { TCustomRxTimeEdit }
+
+ TCustomRxTimeEdit = class(TCustomMaskEdit)
+ private
+ FButton: TRxSpinButton;
+ FButtonNeedsFocus: Boolean;
+ FOnButtonClick : TNotifyEvent;
+ procedure CheckButtonVisible;
+ function GetButtonHint: TTranslateString;
+ function GetTime: TTime;
+ procedure SetButtonHint(const AValue: TTranslateString);
+ procedure SetButtonNeedsFocus(const AValue: Boolean);
+ procedure SetTime(const AValue: TTime);
+ procedure DoChangeValue(AValue:integer);
+ procedure WMSetFocus(var Message: TLMSetFocus); message LM_SETFOCUS;
+ procedure WMKillFocus(var Message: TLMKillFocus); message LM_KILLFOCUS;
+ protected
+ procedure SetParent(AParent: TWinControl); override;
+ procedure DoPositionButton; virtual;
+ procedure UpClick(Sender: TObject); virtual;
+ procedure DownClick(Sender: TObject); virtual;
+ property ButtonOnlyWhenFocused: Boolean read FButtonNeedsFocus write SetButtonNeedsFocus default False;
+ property OnButtonClick : TNotifyEvent read FOnButtonClick write FOnButtonClick;
+ property ButtonHint: TTranslateString read GetButtonHint write SetButtonHint;
+ public
+ constructor Create(AOwner: TComponent); override;
+ destructor Destroy; override;
+ property Time:TTime read GetTime write SetTime;
+ end;
+
+type
+ TRxTimeEdit = class(TCustomRxTimeEdit)
+ published
+ property AutoSize;
+ property AutoSelect;
+ property Align;
+ property Anchors;
+ property BorderSpacing;
+ property ButtonOnlyWhenFocused;
+ property ButtonHint;
+ property CharCase;
+ property Color;
+// property DirectInput;
+ property DragCursor;
+ property DragMode;
+ property EchoMode;
+ property Enabled;
+// property Flat;
+ property Font;
+// property Glyph;
+ property MaxLength;
+// property NumGlyphs;
+ property OnButtonClick;
+ property OnChange;
+ property OnClick;
+ property OnDblClick;
+ property OnDragDrop;
+ property OnDragOver;
+ property OnEditingDone;
+ property OnEndDrag;
+ property OnEnter;
+ property OnExit;
+ property OnKeyDown;
+ property OnKeyPress;
+ property OnKeyUp;
+ property OnMouseDown;
+ property OnMouseMove;
+ property OnMouseUp;
+ property OnStartDrag;
+ property OnUTF8KeyPress;
+ property ParentColor;
+ property ParentFont;
+ property ParentShowHint;
+ property PasswordChar;
+ property PopupMenu;
+ property ReadOnly;
+ property ShowHint;
+ property TabOrder;
+ property TabStop;
+ property Text;
+ property Visible;
+ end;
+
+implementation
+
+
+{ TCustomRxTimeEdit }
+
+procedure TCustomRxTimeEdit.CheckButtonVisible;
+begin
+ If Assigned(FButton) then
+ FButton.Visible:=(csdesigning in ComponentState) or
+ (Visible and (Focused or not FButtonNeedsFocus));
+end;
+
+function TCustomRxTimeEdit.GetButtonHint: TTranslateString;
+begin
+ Result:=FButton.Hint;
+end;
+
+function TCustomRxTimeEdit.GetTime: TTime;
+begin
+ Result:=StrToTimeDef(Text, 0);
+end;
+
+procedure TCustomRxTimeEdit.SetButtonHint(const AValue: TTranslateString);
+begin
+ if AValue = '' then
+ FButton.Hint:=Hint
+ else
+ FButton.Hint:=AValue;
+end;
+
+procedure TCustomRxTimeEdit.SetButtonNeedsFocus(const AValue: Boolean);
+begin
+ if FButtonNeedsFocus<>AValue then
+ begin
+ FButtonNeedsFocus:=AValue;
+ CheckButtonVisible;
+ end;
+end;
+
+procedure TCustomRxTimeEdit.SetTime(const AValue: TTime);
+begin
+ Text:=TimeToStr(AValue);
+end;
+
+procedure TCustomRxTimeEdit.DoChangeValue(AValue: integer);
+var
+ S:ShortString;
+ H1, M2, S3:byte;
+ i,p:integer;
+
+procedure IncHour;
+begin
+ H1:=H1+AValue;
+ if H1<0 then H1:=0;
+end;
+
+procedure IncMin;
+begin
+ M2:=M2+AValue;
+ if M2>59 then
+ M2:=0
+ else
+ if M2<0 then
+ M2:=59
+ else
+ exit;
+ IncHour;
+end;
+
+procedure IncSec;
+begin
+ S3:=S3+AValue;
+ if S3>59 then
+ S3:=0
+ else
+ if S3<0 then
+ S3:=59
+ else
+ exit;
+ IncMin;
+end;
+
+begin
+ S:=Text;
+ for i:=1 to Length(S) do
+ if S[i]=' ' then
+ S[i]:='0';
+
+ H1:=StrToInt(S[1]+S[2]);
+ M2:=StrToInt(S[4]+S[5]);
+ S3:=StrToInt(S[7]+S[8]);
+ P:=GetSelStart;
+ if P < 3 then IncHour
+ else
+ if P < 6 then IncMin
+ else IncSec;
+ Text:=Format('%2.2d'+ TimeSeparator +'%2.2d'+ TimeSeparator +'%2.2d', [H1, M2, S3]);
+ SetSelStart(P);
+end;
+
+procedure TCustomRxTimeEdit.WMSetFocus(var Message: TLMSetFocus);
+begin
+ FButton.Visible:=True;
+ inherited;
+end;
+
+procedure TCustomRxTimeEdit.WMKillFocus(var Message: TLMKillFocus);
+begin
+ if FButtonNeedsFocus then
+ FButton.Visible:=False;
+ inherited;
+end;
+
+procedure TCustomRxTimeEdit.SetParent(AParent: TWinControl);
+begin
+ inherited SetParent(AParent);
+ if FButton <> nil then
+ begin
+ DoPositionButton;
+ CheckButtonVisible;
+ end;
+end;
+
+procedure TCustomRxTimeEdit.DoPositionButton;
+begin
+ if FButton = nil then exit;
+ FButton.Parent := Parent;
+ FButton.Visible := Visible;
+ FButton.AnchorToCompanion(akLeft,0,Self);
+// if FButton.Width = 0 then
+ FButton.Width:=26;//Height;
+end;
+
+procedure TCustomRxTimeEdit.UpClick(Sender: TObject);
+begin
+ if not ReadOnly then
+ begin
+ DoChangeValue(1);
+ if Assigned(FOnButtonClick) then
+ FOnButtonClick(Self);
+ end;
+end;
+
+procedure TCustomRxTimeEdit.DownClick(Sender: TObject);
+begin
+ if not ReadOnly then
+ begin
+ DoChangeValue(-1);
+ if Assigned(FOnButtonClick) then
+ FOnButtonClick(Self);
+ end;
+end;
+
+constructor TCustomRxTimeEdit.Create(AOwner: TComponent);
+begin
+ inherited Create(AOwner);
+ FButton := TRxSpinButton.Create(Self);
+ FButton.FocusControl := Self;
+ FButton.Width := Self.Height;
+ FButton.Height := Self.Height;
+ FButton.FreeNotification(Self);
+ FButton.ControlStyle := FButton.ControlStyle + [csNoDesignSelectable];
+ FButton.OnTopClick := @UpClick;
+ FButton.OnBottomClick := @DownClick;
+
+ EditMask:='##'+TimeSeparator + '##'+TimeSeparator + '##';
+end;
+
+destructor TCustomRxTimeEdit.Destroy;
+begin
+ if FButton <> nil then
+ FreeAndNil(FButton);
+ inherited Destroy;
+end;
+
+end.