【问题标题】:Display Day & Month Names in Indonesian Format on StatusBar在状态栏上以印度尼西亚格式显示日期和月份名称
【发布时间】:2015-10-14 20:47:33
【问题描述】:

我正在使用以下代码在 Borland Delphi 7 的状态栏上以我的母语印度尼西亚显示 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); 时,结果仍然是英文:

我如何解决这个问题以在印尼语中显示?

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.

【问题讨论】:

  • 请去掉假码,换成真码。实际失败的代码。
  • 无法用上面的代码重现。无论如何,当它说vDate 未声明时,这肯定是真的。声明一个变量,用你想要的任何数据填充它。或者重写该部分并将vDate 更改为更好的内容。
  • 以上代码取自link
  • 请出示能证明您的问题的代码。

标签: delphi date


【解决方案1】:

你快到了。

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。

【讨论】:

  • OP 传入了一个不存在的变量,可能会混淆两者。在屏幕截图中,他们有一些有用的东西,但那只是英语。所以,这就是解决方案。
  • 问题询问编译错误。你能解释一下编译错误在哪里吗?
  • 通过vDate 对FormatDateTime 的调用位于一个参数名为vDate 的方法中。
  • 我认为 OP 在 Timer1Timer 中有它,这就是它不起作用的原因。注释“当我使用 FormatDateTime('dddd, dd mmmm yyyy', Now); then...”时暗示了这一点,并且该行代码在计时器事件中。 Tanggal() 中的行很好。
  • 嗯...我同意,但我认为这是一个不错的第一次尝试。他/她发布了工作代码,他们在修改它时遇到的问题,他们如何修改它,以及他们试图实现的目标。我对否决票感到惊讶,因为目标和问题都非常明确,并且已经付出了一些努力来写这个问题。对于一个对我来说足够好的全新用户。
【解决方案2】:

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

首先制作一个proceudre来设置月份名称并从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;

它将是印度尼西亚语。

【讨论】:

  • 好点。我应该在回答中考虑到这一点。为什么不编辑呢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-06
  • 1970-01-01
  • 1970-01-01
  • 2016-04-25
  • 2021-07-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多