展示日& StatusBar上印尼格式的月份名称

时间:2015-04-19 14:48:59

标签: delphi date

我使用以下代码在Borland Delphi 7的StatusBar中以我的母语印度尼西亚显示LongDayName,LongMonthName和Year。

但是当我将FormatDateTime('dddd, dd mmmm yyyy', vDate);放入状态栏时,我收到了错误消息:

[Error] Unit1.pas(47): Undeclared identifier: 'vDate'
[Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas'

当我使用FormatDateTime('dddd, dd mmmm yyyy', Now);时,结果仍为英文:

FormatDateTime showing in English

如何解决此问题以在印尼语中显示?

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, ComCtrls;

type
  TForm1 = class(TForm)
    StatusBar1: TStatusBar;
    Timer1: TTimer;
    procedure Timer1Timer(Sender: TObject);
  private
  public
    function Tanggal(vDate: TDateTime): String;
  end;

var
  Form1: TForm1;

implementation

 function TForm1.Tanggal(vDate: TDateTime): String;
var
  Counter: byte;
const
  NamaHari : Array [1..7] of string = ('Minggu','Senin','Selasa','Rabu','Kamis','Jumat','Sabtu');
  NamaBulan: Array [1..12] of String = ('Januari','Februari','Maret','April','Mei','Juni','Juli',
  'Agustus','September','Oktober','November','Desember');
begin
  For Counter := 1 to 7 do
  LongDayNames[Counter]:=NamaHari[Counter];
  For Counter := 1 to 12 do
  LongMonthNames[Counter]:=NamaBulan[Counter];
  Result := FormatdateTime('dddd, dd mmmm yyyy', vDate);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
Statusbar1.Panels[0].Text := FormatDateTime('dddd, dd mmmm yyyy', Now);
end;

end.

2 个答案:

答案 0 :(得分:4)

你几乎就在那里。

FormatDateTime('dddd, dd mmmm yyyy', vDate);
由于Undeclared identifier: 'vDate'不存在,

vDate而失败 - 它是Tanggal()方法中参数的名称,因此不存在在Timer1Timer方法中。

其次,您只能在Timer1Timer获得英语结果,因为您从未调用Tanggal(),这是设置全局格式设置并返回印尼格式化日期字符串的内容。

也就是说,Timer1Timer根据全局格式设置触发并格式化日期。它永远不会使用您的自定义设置,因为您还没有将它们设置为全局设置。工作代码是:

Statusbar1.Panels[0].Text := Tanggal(Now);

Now的结果传递给Tanggal(),其中它是参数vDate;设置设置;使用它们格式化日期;返回该字符串;并将该字符串设置为状态栏面板。

但是,您不应每次都设置格式设置(在程序启动时执行一次),或者您应该使用单独的TFormatSettings变量,这样您就不会覆盖全局变量。然后,您可以将其作为第三个参数传递给FormatDateTime

答案 1 :(得分:2)

当您可以直接从Windows获取月份名称时,没有理由对其进行硬编码:

首先制作一个程序来设置月份名称并从 FormCreate

中调用它
procedure SetupMonthDayNames;
var
  I, Day: Integer;
const
  IndonesianLCID = 1057;

begin
  for I := 1 to 12 do
  begin
    ShortMonthNames[I] := GetLocaleStr(IndonesianLCID,  LOCALE_SABBREVMONTHNAME1 + I - 1, ShortMonthNames[I]);
    LongMonthNames[I] := GetLocaleStr(IndonesianLCID,  LOCALE_SMONTHNAME1 + I - 1, LongMonthNames[I]);
  end;

  for I := 1 to 7 do
  begin
    Day := (I + 5) mod 7;
    ShortDayNames[I] := GetLocaleStr(IndonesianLCID,  LOCALE_SABBREVDAYNAME1 + Day, ShortDayNames[I]);
    LongDayNames[I] := GetLocaleStr(IndonesianLCID,  LOCALE_SDAYNAME1 + Day, LongDayNames[I]);
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  SetupMonthDayNames;
end;

然后你可以从你的计时器更新状态栏:

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Statusbar1.Panels[0].Text := FormatDateTime('dddd, dd mmmm yyyy', Now);
end;

它将是印度尼西亚语。