Стартовый пул
This commit is contained in:
@@ -0,0 +1,585 @@
|
||||
{ rxDateRangeEditUnit unit
|
||||
|
||||
Copyright (C) 2005-2017 Lagunov Aleksey alexs75@yandex.ru and Lazarus team
|
||||
original conception from rx library for Delphi (c)
|
||||
|
||||
This library is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU Library General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or (at your
|
||||
option) any later version with the following modification:
|
||||
|
||||
As a special exception, the copyright holders of this library give you
|
||||
permission to link this library with independent modules to produce an
|
||||
executable, regardless of the license terms of these independent modules,and
|
||||
to copy and distribute the resulting executable under terms of your choice,
|
||||
provided that you also meet, for each linked independent module, the terms
|
||||
and conditions of the license of that module. An independent module is a
|
||||
module which is not derived from or based on this library. If you modify
|
||||
this library, you may extend this exception to your version of the library,
|
||||
but you are not obligated to do so. If you do not wish to do so, delete this
|
||||
exception statement from your version.
|
||||
|
||||
This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
|
||||
for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public License
|
||||
along with this library; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
}
|
||||
|
||||
unit rxDateRangeEditUnit;
|
||||
|
||||
{$mode objfpc}{$H+}
|
||||
|
||||
interface
|
||||
|
||||
uses
|
||||
Classes, SysUtils, types, Controls, Buttons, StdCtrls, Spin;
|
||||
|
||||
type
|
||||
TRxDateRangeEditOption = (reoMonth, reoQuarter, reoHalfYear);
|
||||
TRxDateRangeEditOptions = set of TRxDateRangeEditOption;
|
||||
|
||||
type
|
||||
|
||||
{ TRxCustomDateRangeEdit }
|
||||
|
||||
TRxCustomDateRangeEdit = class(TCustomControl)
|
||||
private
|
||||
FFlat: Boolean;
|
||||
FLockCount:integer;
|
||||
FOnEditChange: TNotifyEvent;
|
||||
FOnEditClick: TNotifyEvent;
|
||||
FOnEditEnter: TNotifyEvent;
|
||||
FOnEditExit: TNotifyEvent;
|
||||
FOptions: TRxDateRangeEditOptions;
|
||||
FsbDecYear: TSpeedButton;
|
||||
FsbDecMonth: TSpeedButton;
|
||||
FsbIncYear: TSpeedButton;
|
||||
FsbIncMonth: TSpeedButton;
|
||||
FEditYear: TSpinEdit;
|
||||
FEditMonth: TComboBox;
|
||||
procedure DoIncMonth(Sender: TObject);
|
||||
procedure DoIncYear(Sender: TObject);
|
||||
procedure DoDecMonth(Sender: TObject);
|
||||
procedure DoDecYear(Sender: TObject);
|
||||
function GetHalfYear: word;
|
||||
function GetMonth: word;
|
||||
function GetPeriod: TDateTime;
|
||||
function GetPeriodEnd: TDateTime;
|
||||
function GetQuarter: word;
|
||||
function GetYear: word;
|
||||
procedure SetFlat(AValue: Boolean);
|
||||
procedure SetHalfYear(AValue: word);
|
||||
procedure SetMonth(AValue: word);
|
||||
procedure SetOptions(AValue: TRxDateRangeEditOptions);
|
||||
procedure SetPeriod(AValue: TDateTime);
|
||||
procedure SetQuarter(AValue: word);
|
||||
procedure SetYear(AValue: word);
|
||||
procedure InternalOnEditChange(Sender: TObject);
|
||||
procedure InternalOnEditClick(Sender: TObject);
|
||||
procedure InternalOnEditEnter(Sender: TObject);
|
||||
procedure InternalOnEditExit(Sender: TObject);
|
||||
procedure Lock;
|
||||
procedure UnLock;
|
||||
protected
|
||||
class function GetControlClassDefaultSize: TSize; override;
|
||||
procedure FillMonthNames;
|
||||
procedure SetAutoSize(AValue: Boolean); override;
|
||||
procedure EditChange; virtual;
|
||||
procedure EditClick; virtual;
|
||||
procedure EditEnter; virtual;
|
||||
procedure EditExit; virtual;
|
||||
public
|
||||
constructor Create(AOwner: TComponent); override;
|
||||
destructor Destroy; override;
|
||||
|
||||
property Quarter:word read GetQuarter write SetQuarter;
|
||||
property HalfYear:word read GetHalfYear write SetHalfYear;
|
||||
property Flat: Boolean read FFlat write SetFlat default False;
|
||||
property Year:word read GetYear write SetYear;
|
||||
property Month:word read GetMonth write SetMonth;
|
||||
property Period:TDateTime read GetPeriod write SetPeriod;
|
||||
property PeriodEnd:TDateTime read GetPeriodEnd;
|
||||
property Options:TRxDateRangeEditOptions read FOptions write SetOptions default [reoMonth];
|
||||
property OnChange: TNotifyEvent read FOnEditChange write FOnEditChange;
|
||||
property OnClick: TNotifyEvent read FOnEditClick write FOnEditClick;
|
||||
property OnEnter: TNotifyEvent read FOnEditEnter write FOnEditEnter;
|
||||
property OnExit: TNotifyEvent read FOnEditExit write FOnEditExit;
|
||||
end;
|
||||
|
||||
type
|
||||
TRxDateRangeEdit = class(TRxCustomDateRangeEdit)
|
||||
published
|
||||
property Align;
|
||||
property Anchors;
|
||||
property Autosize default True;
|
||||
property BiDiMode;
|
||||
property BorderSpacing;
|
||||
property BorderStyle default bsNone;
|
||||
property Color;
|
||||
property Constraints;
|
||||
property Cursor;
|
||||
property Enabled;
|
||||
property Flat;
|
||||
property Hint;
|
||||
property Month;
|
||||
property Options;
|
||||
property ParentBiDiMode;
|
||||
property ParentColor;
|
||||
property ParentFont;
|
||||
property PopupMenu;
|
||||
property ShowHint;
|
||||
property TabOrder;
|
||||
property TabStop;
|
||||
property Visible;
|
||||
property Year;
|
||||
|
||||
property OnChange;
|
||||
property OnClick;
|
||||
property OnEnter;
|
||||
property OnExit;
|
||||
property OnMouseWheel;
|
||||
property OnMouseWheelDown;
|
||||
property OnMouseWheelUp;
|
||||
end;
|
||||
|
||||
implementation
|
||||
uses rxdateutil, rxconst;
|
||||
|
||||
{ TRxCustomDateRangeEdit }
|
||||
|
||||
procedure TRxCustomDateRangeEdit.DoIncMonth(Sender: TObject);
|
||||
var
|
||||
i:integer;
|
||||
begin
|
||||
if FEditMonth.ItemIndex>=0 then
|
||||
begin
|
||||
i:=PtrInt(FEditMonth.Items.Objects[FEditMonth.ItemIndex]);
|
||||
|
||||
if I in [17, 18] then
|
||||
begin
|
||||
if i = 18 then
|
||||
begin
|
||||
i:=17;
|
||||
Year:=Year + 1;
|
||||
end
|
||||
else
|
||||
i:=18;
|
||||
end
|
||||
else
|
||||
if i in [13..16] then
|
||||
begin
|
||||
inc(i);
|
||||
if i> 16 then
|
||||
begin
|
||||
i:=13;
|
||||
Year:=Year + 1;
|
||||
end;
|
||||
end
|
||||
else
|
||||
begin
|
||||
inc(i);
|
||||
if i > 12 then
|
||||
begin
|
||||
i:=1;
|
||||
Year:=Year + 1;
|
||||
end;
|
||||
end;
|
||||
FEditMonth.ItemIndex := i - 1;
|
||||
end
|
||||
else
|
||||
FEditMonth.ItemIndex := 0;
|
||||
InternalOnEditChange(Self);
|
||||
end;
|
||||
|
||||
procedure TRxCustomDateRangeEdit.DoIncYear(Sender: TObject);
|
||||
begin
|
||||
FEditYear.Value:=FEditYear.Value + 1;
|
||||
end;
|
||||
|
||||
procedure TRxCustomDateRangeEdit.DoDecMonth(Sender: TObject);
|
||||
var
|
||||
i:integer;
|
||||
begin
|
||||
if FEditMonth.ItemIndex>=0 then
|
||||
begin
|
||||
i:=PtrInt(FEditMonth.Items.Objects[FEditMonth.ItemIndex]);
|
||||
|
||||
if I in [17, 18] then
|
||||
begin
|
||||
if i = 18 then
|
||||
begin
|
||||
i:=17;
|
||||
Year:=Year - 1;
|
||||
end
|
||||
else
|
||||
i:=18;
|
||||
end
|
||||
else
|
||||
if i in [13..16] then
|
||||
begin
|
||||
Dec(i);
|
||||
if i> 13 then
|
||||
begin
|
||||
i:=16;
|
||||
Year:=Year - 1;
|
||||
end;
|
||||
end
|
||||
else
|
||||
begin
|
||||
Dec(i);
|
||||
if i < 1 then
|
||||
begin
|
||||
i:=12;
|
||||
Year:=Year - 1;
|
||||
end;
|
||||
end;
|
||||
FEditMonth.ItemIndex := i - 1;
|
||||
end
|
||||
else
|
||||
FEditMonth.ItemIndex := 0;
|
||||
InternalOnEditChange(Self);
|
||||
end;
|
||||
|
||||
procedure TRxCustomDateRangeEdit.DoDecYear(Sender: TObject);
|
||||
begin
|
||||
FEditYear.Value:=FEditYear.Value - 1;
|
||||
end;
|
||||
|
||||
function TRxCustomDateRangeEdit.GetHalfYear: word;
|
||||
var
|
||||
i:integer;
|
||||
begin
|
||||
Result:=0;
|
||||
if reoHalfYear in FOptions then
|
||||
begin
|
||||
i:=PtrInt(FEditMonth.Items.Objects[FEditMonth.ItemIndex]);
|
||||
if i in [17..18] then
|
||||
Result:=i - 16;
|
||||
end
|
||||
end;
|
||||
|
||||
function TRxCustomDateRangeEdit.GetMonth: word;
|
||||
var
|
||||
i:integer;
|
||||
begin
|
||||
Result:=0;
|
||||
if (reoMonth in FOptions) or (FOptions = []) then
|
||||
begin
|
||||
i:=PtrInt(FEditMonth.Items.Objects[FEditMonth.ItemIndex]);
|
||||
if i in [1..12] then
|
||||
Result:=i;
|
||||
end
|
||||
end;
|
||||
|
||||
function TRxCustomDateRangeEdit.GetPeriod: TDateTime;
|
||||
var
|
||||
i: PtrInt;
|
||||
M: Word;
|
||||
begin
|
||||
i:=PtrInt(FEditMonth.Items.Objects[FEditMonth.ItemIndex]);
|
||||
|
||||
if I < 13 then
|
||||
M:=Month
|
||||
else
|
||||
if i in [13..16] then
|
||||
M:= (I - 13) * 3 + 1
|
||||
else
|
||||
if i in [17..18] then
|
||||
M:= (I - 17) * 6 + 1;
|
||||
|
||||
Result:=EncodeDate(Year, M, 1);
|
||||
end;
|
||||
|
||||
function TRxCustomDateRangeEdit.GetPeriodEnd: TDateTime;
|
||||
var
|
||||
i: PtrInt;
|
||||
M: Integer;
|
||||
begin
|
||||
i:=PtrInt(FEditMonth.Items.Objects[FEditMonth.ItemIndex]);
|
||||
if I < 13 then
|
||||
M:=Month
|
||||
else
|
||||
if i in [13..16] then
|
||||
M:= (I - 12) * 3
|
||||
else
|
||||
if i in [17..18] then
|
||||
M:= (I - 16) * 6;
|
||||
|
||||
Result:=EncodeDate(Year, M, DaysPerMonth(Year, M))
|
||||
end;
|
||||
|
||||
function TRxCustomDateRangeEdit.GetQuarter: word;
|
||||
var
|
||||
i:integer;
|
||||
begin
|
||||
Result:=0;
|
||||
if reoQuarter in FOptions then
|
||||
begin
|
||||
i:=PtrInt(FEditMonth.Items.Objects[FEditMonth.ItemIndex]);
|
||||
if i in [13..16] then
|
||||
Result:=i - 12;
|
||||
end
|
||||
end;
|
||||
|
||||
function TRxCustomDateRangeEdit.GetYear: word;
|
||||
begin
|
||||
Result:=FEditYear.Value;
|
||||
end;
|
||||
|
||||
procedure TRxCustomDateRangeEdit.SetFlat(AValue: Boolean);
|
||||
begin
|
||||
if FFlat=AValue then Exit;
|
||||
FFlat:=AValue;
|
||||
FsbDecMonth.Flat:=FFlat;
|
||||
FsbDecYear.Flat:=FFlat;
|
||||
FsbIncMonth.Flat:=FFlat;
|
||||
FsbIncYear.Flat:=FFlat;
|
||||
end;
|
||||
|
||||
procedure TRxCustomDateRangeEdit.SetHalfYear(AValue: word);
|
||||
begin
|
||||
|
||||
end;
|
||||
|
||||
procedure TRxCustomDateRangeEdit.SetMonth(AValue: word);
|
||||
begin
|
||||
if (AValue>0) and (AValue < 13) then
|
||||
FEditMonth.ItemIndex:=AValue-1;
|
||||
end;
|
||||
|
||||
procedure TRxCustomDateRangeEdit.SetOptions(AValue: TRxDateRangeEditOptions);
|
||||
begin
|
||||
if FOptions=AValue then Exit;
|
||||
FOptions:=AValue;
|
||||
FillMonthNames;
|
||||
end;
|
||||
|
||||
procedure TRxCustomDateRangeEdit.SetPeriod(AValue: TDateTime);
|
||||
var
|
||||
Y, M, D, Q: word;
|
||||
I: Integer;
|
||||
begin
|
||||
DecodeDate(AValue, Y, M, D);
|
||||
FEditYear.Value:=Y;
|
||||
|
||||
if reoMonth in FOptions then
|
||||
FEditMonth.ItemIndex:=M-1
|
||||
else
|
||||
if reoQuarter in FOptions then
|
||||
begin
|
||||
Q:=M div 4;
|
||||
for I:=0 to FEditMonth.Items.Count - 1 do
|
||||
if FEditMonth.Items.Objects[i] = TObject(Pointer(Q + 13)) then
|
||||
begin
|
||||
FEditMonth.ItemIndex:=i;
|
||||
break;
|
||||
end;
|
||||
end
|
||||
else
|
||||
if reoHalfYear in FOptions then
|
||||
begin
|
||||
Q:=M div 6;
|
||||
for I:=0 to FEditMonth.Items.Count - 1 do
|
||||
if FEditMonth.Items.Objects[i] = TObject(Pointer(Q + 17)) then
|
||||
begin
|
||||
FEditMonth.ItemIndex:=i;
|
||||
break;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TRxCustomDateRangeEdit.SetQuarter(AValue: word);
|
||||
begin
|
||||
|
||||
end;
|
||||
|
||||
procedure TRxCustomDateRangeEdit.SetYear(AValue: word);
|
||||
begin
|
||||
FEditYear.Value:=AValue;
|
||||
end;
|
||||
|
||||
procedure TRxCustomDateRangeEdit.InternalOnEditChange(Sender: TObject);
|
||||
begin
|
||||
if FLockCount = 0 then
|
||||
EditChange;
|
||||
end;
|
||||
|
||||
procedure TRxCustomDateRangeEdit.InternalOnEditClick(Sender: TObject);
|
||||
begin
|
||||
EditClick;
|
||||
end;
|
||||
|
||||
procedure TRxCustomDateRangeEdit.InternalOnEditEnter(Sender: TObject);
|
||||
begin
|
||||
EditEnter;
|
||||
end;
|
||||
|
||||
procedure TRxCustomDateRangeEdit.InternalOnEditExit(Sender: TObject);
|
||||
begin
|
||||
EditExit;
|
||||
end;
|
||||
|
||||
procedure TRxCustomDateRangeEdit.Lock;
|
||||
begin
|
||||
Inc(FLockCount);
|
||||
end;
|
||||
|
||||
procedure TRxCustomDateRangeEdit.UnLock;
|
||||
begin
|
||||
if FLockCount > 0 then
|
||||
Dec(FLockCount)
|
||||
else
|
||||
InternalOnEditChange(Self);
|
||||
end;
|
||||
|
||||
class function TRxCustomDateRangeEdit.GetControlClassDefaultSize: TSize;
|
||||
begin
|
||||
Result.CX := 80 + 70 + 23 * 4;
|
||||
Result.CY := 23;
|
||||
end;
|
||||
|
||||
procedure TRxCustomDateRangeEdit.FillMonthNames;
|
||||
var
|
||||
i: Integer;
|
||||
begin
|
||||
FEditMonth.Items.BeginUpdate;
|
||||
FEditMonth.Items.Clear;
|
||||
if (reoMonth in FOptions) or (FOptions = []) then
|
||||
begin
|
||||
for i:=1 to 12 do
|
||||
FEditMonth.Items.AddObject(DefaultFormatSettings.LongMonthNames[i], TObject(Pointer(i)));
|
||||
end;
|
||||
|
||||
if (reoQuarter in FOptions) or (FOptions = []) then
|
||||
begin
|
||||
FEditMonth.Items.AddObject(sFirstQuarter, TObject(Pointer(13)));
|
||||
FEditMonth.Items.AddObject(sSecondQuarter, TObject(Pointer(14)));
|
||||
FEditMonth.Items.AddObject(sThirdQuarter, TObject(Pointer(15)));
|
||||
FEditMonth.Items.AddObject(sFourthQuarter, TObject(Pointer(16)));
|
||||
end;
|
||||
|
||||
if (reoHalfYear in FOptions) or (FOptions = []) then
|
||||
begin
|
||||
FEditMonth.Items.AddObject(sFirstHalfOfYear, TObject(Pointer(17)));
|
||||
FEditMonth.Items.AddObject(sSecondHalfOfYear, TObject(Pointer(18)));
|
||||
end;
|
||||
FEditMonth.ItemIndex:=0;
|
||||
FEditMonth.Items.EndUpdate;
|
||||
end;
|
||||
|
||||
procedure TRxCustomDateRangeEdit.SetAutoSize(AValue: Boolean);
|
||||
begin
|
||||
if AutoSize = AValue then
|
||||
Exit;
|
||||
inherited SetAutosize(AValue);
|
||||
FEditMonth.AutoSize := AValue;
|
||||
FEditYear.AutoSize := AValue;
|
||||
end;
|
||||
|
||||
procedure TRxCustomDateRangeEdit.EditChange;
|
||||
begin
|
||||
if Assigned(FOnEditChange) then FOnEditChange(Self);
|
||||
end;
|
||||
|
||||
procedure TRxCustomDateRangeEdit.EditClick;
|
||||
begin
|
||||
if Assigned(FOnEditClick) then FOnEditClick(Self);
|
||||
end;
|
||||
|
||||
procedure TRxCustomDateRangeEdit.EditEnter;
|
||||
begin
|
||||
if Assigned(FOnEditEnter) then FOnEditEnter(Self);
|
||||
end;
|
||||
|
||||
procedure TRxCustomDateRangeEdit.EditExit;
|
||||
begin
|
||||
if Assigned(FOnEditExit) then FOnEditExit(Self);
|
||||
end;
|
||||
|
||||
constructor TRxCustomDateRangeEdit.Create(AOwner: TComponent);
|
||||
begin
|
||||
inherited Create(AOwner);
|
||||
FLockCount:=0;
|
||||
FOptions:=[reoMonth];
|
||||
|
||||
FEditYear:=TSpinEdit.Create(Self);
|
||||
FEditMonth:=TComboBox.Create(Self);
|
||||
FEditMonth.Style:=csDropDownList;
|
||||
FEditMonth.DropDownCount:=12;
|
||||
FEditYear.Width:=70;
|
||||
FEditMonth.Width:=100;
|
||||
|
||||
FsbDecYear:=TSpeedButton.Create(Self);
|
||||
FsbDecMonth:=TSpeedButton.Create(Self);
|
||||
FsbIncYear:=TSpeedButton.Create(Self);
|
||||
FsbIncMonth:=TSpeedButton.Create(Self);
|
||||
|
||||
FsbDecYear.OnClick:=@DoDecYear;
|
||||
FsbDecMonth.OnClick:=@DoDecMonth;
|
||||
FsbIncYear.OnClick:=@DoIncYear;
|
||||
FsbIncMonth.OnClick:=@DoIncMonth;
|
||||
|
||||
|
||||
FEditYear.Parent:=Self;
|
||||
FsbDecYear.Parent:=Self;
|
||||
FsbDecMonth.Parent:=Self;
|
||||
FsbIncYear.Parent:=Self;
|
||||
FsbIncMonth.Parent:=Self;
|
||||
FEditMonth.Parent:=Self;
|
||||
|
||||
FsbDecYear.Caption:='<<';
|
||||
FsbDecMonth.Caption:='<';
|
||||
FsbIncYear.Caption:='>>';
|
||||
FsbIncMonth.Caption:='>';
|
||||
|
||||
FsbDecYear.Left:=0;
|
||||
FsbDecMonth.Left:=23;
|
||||
FEditMonth.Left:=46;
|
||||
FEditYear.Left:=126;
|
||||
FsbIncMonth.Left:=206;
|
||||
FsbIncYear.Left:=229;
|
||||
|
||||
|
||||
ControlStyle := ControlStyle + [csNoFocus];
|
||||
|
||||
|
||||
FsbDecYear.Align:=alLeft;
|
||||
FsbDecMonth.Align:=alLeft;
|
||||
FsbIncYear.Align:=alRight;
|
||||
FsbIncMonth.Align:=alRight;
|
||||
|
||||
FEditYear.Align:=alRight;
|
||||
FEditMonth.Align:=alClient;
|
||||
|
||||
FEditYear.MaxValue:=9999;
|
||||
with GetControlClassDefaultSize do
|
||||
SetInitialBounds(0, 0, CX, CY);
|
||||
FillMonthNames;
|
||||
|
||||
SetPeriod(Now);
|
||||
AutoSize := True;
|
||||
|
||||
FEditMonth.OnChange:=@InternalOnEditChange;
|
||||
FEditYear.OnChange:=@InternalOnEditChange;
|
||||
|
||||
FEditMonth.OnClick:=@InternalOnEditClick;
|
||||
FEditYear.OnClick:=@InternalOnEditClick;
|
||||
|
||||
FEditMonth.OnEnter:=@InternalOnEditEnter;
|
||||
FEditYear.OnEnter:=@InternalOnEditEnter;
|
||||
|
||||
FEditMonth.OnExit:=@InternalOnEditExit;
|
||||
FEditYear.OnExit:=@InternalOnEditExit;
|
||||
end;
|
||||
|
||||
destructor TRxCustomDateRangeEdit.Destroy;
|
||||
begin
|
||||
inherited Destroy;
|
||||
end;
|
||||
|
||||
end.
|
||||
|
Reference in New Issue
Block a user