📄 periodefilter.pas
字号:
unit PeriodeFilter;
interface
uses
SysUtils, Classes, Controls, StdCtrls, Buttons, ComCtrls, ExtCtrls;
type
TPeriodeFilter = class(TPanel)
private
{ Private declarations }
FlblPeriode : TLabel;
FbtnTanggal : TSpeedButton;
FbtnBulan : TSpeedButton;
FbtnTahun : TSpeedButton;
FpnlTanggal : TPanel;
FcmbTanggal1 : TDateTimePicker;
FcmbTanggal2 : TDateTimePicker;
FpnlBulan : TPanel;
FcmbBulan : TComboBox;
FcmbBulanTahun : TComboBox;
FpnlTahun : TPanel;
FcmbTahun : TComboBox;
FbtnFilter : TButton;
FTgl1 : TDate;
FTgl2 : TDate;
FPeriode : string;
FTglAwal : TDate;
FTglAkhir : TDate;
FOnClick : TNotifyEvent;
procedure speedClick(Sender : TObject);
procedure cmbChange(Sender : TObject);
procedure btnClick(Sender : TObject);
procedure SetTglAwal(Value : TDate);
procedure SetTglAkhir(Value : TDate);
protected
{ Protected declarations }
public
{ Public declarations }
constructor Create(AOwner: TComponent); override;
procedure CreateWnd; override;
function GetTgl1 : TDate;
function GetTgl1Str : string;
function GetTgl2 : TDate;
function GetTgl2Str : string;
function GetPeriode : string;
published
{ Published declarations }
property OnClick: TNotifyEvent read FOnClick write FOnClick;
property TglAwal : TDate read FTglAwal write SetTglAwal;
property TglAkhir : TDate read FTglAkhir write SetTglAkhir;
end;
procedure Register;
implementation
uses DateUtils;
const
nama_bulan : array[1..12] of string = (
'Januari',
'Pebruari',
'Maret',
'April',
'Mei',
'Juni',
'Juli',
'Agustus',
'September',
'Oktober',
'Nopember',
'Desember'
);
function bulan_index(Value : string) : integer;
var i : integer;
begin
Result := 1;
for i := 1 to 12 do
if Value = nama_bulan[i] then begin
Result := i;
break;
end;
end;
constructor TPeriodeFilter.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
Caption := '';
BorderWidth := 2;
TabStop := False;
FlblPeriode := TLabel.Create(Self);
with FlblPeriode do begin
Parent := Self;
Align := alLeft;
AutoSize := True;
Caption := 'Periode ';
Layout := tlCenter;
Color := $00D5FFFF;
end;
FbtnTanggal := TSpeedButton.Create(Self);
with FbtnTanggal do begin
Parent := Self;
Align := alLeft;
Width := 50;
Caption := 'Tanggal';
GroupIndex := 1;
OnClick := speedClick;
Down := true;
end;
FbtnBulan := TSpeedButton.Create(Self);
with FbtnBulan do begin
Parent := Self;
Align := alLeft;
Width := 50;
Caption := 'Bulan';
GroupIndex := 1;
OnClick := speedClick;
end;
FbtnTahun := TSpeedButton.Create(Self);
with FbtnTahun do begin
Parent := Self;
Align := alLeft;
Width := 50;
Caption := 'Tahun';
GroupIndex := 1;
OnClick := speedClick;
end;
FpnlTanggal := TPanel.Create(Self);
with FpnlTanggal do begin
Parent := Self;
Align := alClient;
BevelOuter := bvNone;
Caption := '';
end;
FcmbTanggal1 := TDateTimePicker.Create(Self);
with FcmbTanggal1 do begin
Parent := FpnlTanggal;
Align := alLeft;
TabStop := false;
end;
FcmbTanggal2 := TDateTimePicker.Create(Self);
with FcmbTanggal2 do begin
Parent := FpnlTanggal;
Align := alLeft;
TabStop := false;
end;
FpnlBulan := TPanel.Create(Self);
with FpnlBulan do begin
Parent := Self;
Align := alClient;
BevelOuter := bvNone;
Caption := '';
Visible := false;
end;
FcmbBulan := TComboBox.Create(Self);
with FcmbBulan do begin
Parent := FpnlBulan;
Align := alLeft;
Style := csDropDownList;
TabStop := false;
end;
FcmbBulanTahun := TComboBox.Create(Self);
with FcmbBulanTahun do begin
Parent := FpnlBulan;
Align := alLeft;
Style := csDropDownList;
TabStop := false;
end;
FpnlTahun := TPanel.Create(Self);
with FpnlTahun do begin
Parent := Self;
Align := alClient;
BevelOuter := bvNone;
Caption := '';
Visible := false;
end;
FcmbTahun := TComboBox.Create(Self);
with FcmbTahun do begin
Parent := FpnlTahun;
Align := alLeft;
Style := csDropDownList;
TabStop := false;
end;
FbtnFilter := TButton.Create(Self);
with FbtnFilter do begin
Parent := Self;
Align := alRight;
Caption := 'Filter';
TabStop := false;
end;
FcmbTanggal1.OnChange := cmbChange;
FcmbTanggal2.OnChange := cmbChange;
FcmbBulan.OnChange := cmbChange;
FcmbBulanTahun.OnChange := cmbChange;
FcmbTahun.OnChange := cmbChange;
FbtnFilter.OnClick := btnClick;
Caption := ' Periode ';
Height := 24;
FTglAwal := StrToDate('01/01/2008');
FTglAkhir := Date;//IncDay(FTglAwal); //date;
end;
procedure TPeriodeFilter.CreateWnd;
var i : integer;
begin
inherited;
FcmbTanggal1.MinDate := FTglAwal;
FcmbTanggal2.MinDate := FTglAwal;
FcmbTanggal1.MaxDate := FTglAkhir;
FcmbTanggal2.MaxDate := FTglAkhir;
FcmbTanggal1.Date := FTglAkhir;
FcmbTanggal2.Date := FTglAkhir;
FcmbBulan.Items.Add('Januari');
FcmbBulan.Items.Add('Pebruari');
FcmbBulan.Items.Add('Maret');
FcmbBulan.Items.Add('April');
FcmbBulan.Items.Add('Mei');
FcmbBulan.Items.Add('Juni');
FcmbBulan.Items.Add('Juli');
FcmbBulan.Items.Add('Agustus');
FcmbBulan.Items.Add('September');
FcmbBulan.Items.Add('Oktober');
FcmbBulan.Items.Add('Nopember');
FcmbBulan.Items.Add('Desember');
FcmbBulan.ItemIndex := MonthOf(date) -1;
for i := YearOf(FTglAwal) to YearOf(FTglAkhir) do begin
FcmbBulanTahun.Items.Add(IntToStr(i));
FcmbTahun.Items.Add(IntToStr(i));
end;
FcmbBulanTahun.ItemIndex := FcmbBulanTahun.Items.IndexOf(IntToStr(YearOf(date)));
FcmbTahun.ItemIndex := FcmbTahun.Items.IndexOf(IntToStr(YearOf(date)));
FTgl1 := FcmbTanggal1.Date;
FTgl2 := FcmbTanggal2.Date;
FPeriode := FormatDateTime('dd/mm/yyyy',FTgl1);
end;
procedure TPeriodeFilter.speedClick(Sender : TObject);
begin
FpnlTanggal.Visible := FbtnTanggal.Down;
FpnlBulan.Visible := FbtnBulan.Down;
FpnlTahun.Visible := FbtnTahun.Down;
cmbChange(nil);
end;
procedure TPeriodeFilter.cmbChange(Sender : TObject);
begin
if FbtnTanggal.Down then begin
FTgl1 := FcmbTanggal1.Date;
FTgl2 := FcmbTanggal2.Date;
if FTgl1 = FTgl2 then
FPeriode := FormatDateTime('dd/mm/yyyy',FTgl1)
else
FPeriode := FormatDateTime('dd/mm/yyyy',FTgl1) + ' s/d ' + FormatDateTime('dd/mm/yyyy',FTgl1);
end else
if FbtnBulan.Down then begin
FTgl1 := StrToDate('01/' + IntToStr(bulan_index(FcmbBulan.Text)) + '/' + FcmbBulanTahun.Text);
if FTgl1 < FTglAwal then
FTgl1 := FTglAwal;
FTgl2 := IncDay(IncMonth(FTgl1),-1);
FPeriode := FcmbBulan.Text + ' ' + FcmbBulanTahun.Text;
end else begin
FTgl1 := StrToDate('01/01/' + FcmbTahun.Text);
FTgl2 := IncDay(IncYear(FTgl1),-1);
FPeriode := FcmbTahun.Text;
end;
end;
procedure TPeriodeFilter.btnClick(Sender : TObject);
begin
if Assigned(FOnClick) then FOnClick(Self);
end;
function TPeriodeFilter.GetTgl1 : TDate;
begin
Result := FTgl1;
end;
function TPeriodeFilter.GetTgl1Str : string;
begin
Result := FormatDateTime('yyyy-mm-dd',FTgl1);
end;
function TPeriodeFilter.GetTgl2 : TDate;
begin
Result := FTgl2;
end;
function TPeriodeFilter.GetTgl2Str : string;
begin
Result := FormatDateTime('yyyy-mm-dd',FTgl2);
end;
function TPeriodeFilter.GetPeriode : string;
begin
Result := FPeriode;
end;
procedure Register;
begin
RegisterComponents('Komponen', [TPeriodeFilter]);
end;
procedure TPeriodeFilter.SetTglAkhir(Value: TDate);
begin
FTglAkhir := Value;
if FcmbTanggal1 <> nil then begin
FcmbTanggal1.MaxDate := IncDay(FTglAkhir);
FcmbTanggal2.MaxDate := FcmbTanggal1.MaxDate;
FcmbTanggal1.Date := FTglAkhir;
FcmbTanggal2.Date := FTglAkhir;
end;
end;
procedure TPeriodeFilter.SetTglAwal(Value: TDate);
var i : integer;
begin
FTglAwal := Value;
if FcmbTanggal1 <> nil then begin
FcmbTanggal1.MinDate := FTglAwal;
FcmbTanggal2.MinDate := FTglAwal;
FcmbBulan.Items.Clear;
if YearOf(FTglAwal) = YearOf(FTglAkhir) then begin
for i := MonthOf(FTglAwal) to MonthOf(FTglAkhir) do
FcmbBulan.Items.Add(nama_bulan[i]);
end else
if YearOf(FTglAwal) < YearOf(FTglAkhir) then begin
for i := MonthOf(FTglAwal) to 12 do begin
if FcmbBulan.Items.IndexOf(nama_bulan[i]) = -1 then
FcmbBulan.Items.Add(nama_bulan[i]);
end;
for i := 1 to MonthOf(FTglAkhir) do begin
if FcmbBulan.Items.IndexOf(nama_bulan[i]) = -1 then
FcmbBulan.Items.Add(nama_bulan[i]);
end;
end;
for i := 0 to FcmbBulan.Items.Count -1 do
if nama_bulan[MonthOf(Date)] = FcmbBulan.Items.Strings[i] then begin
FcmbBulan.ItemIndex := i;
break;
end;
FcmbBulanTahun.Items.Clear;
FcmbTahun.Items.Clear;
for i := YearOf(FTglAwal) to YearOf(FTglAkhir) do begin
FcmbBulanTahun.Items.Add(IntToStr(i));
FcmbTahun.Items.Add(IntToStr(i));
end;
for i := 0 to FcmbBulanTahun.Items.Count -1 do begin
if IntToStr(YearOf(date)) = FcmbBulanTahun.Items.Strings[i] then begin
FcmbBulanTahun.ItemIndex := i;
FcmbTahun.ItemIndex := i;
break;
end;
end;
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -