⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 periodefilter.pas

📁 TPeriodeFilter. Written in Delphi/Indonesian language. Use this component to specify some date range
💻 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 + -