Array 上 13 个月的标题

Headings for 13 months on Array

我想知道是否有人可以帮助我,为什么下面代码的 headers 在 13 个月内没有正确创建它们。我想添加Jan(LY) Feb(LY)......直到Jan(TY).

请看下面的标题代码,

     //Headings
   J:=0;            
   for I:=12 downto 0 do
    begin
         J:=J+1;  
         Amonth:=IntToStr(J);                               
         If basemonth-12 <=0 then Harray[J]:=Basemonth-I+13;  
         If basemonth-12 > 0 then Harray[J]:=Basemonth-I;
         If Harray[J] >13 then Harray[J]:=Harray[J]-13;                                                           
         //showmessage(INTTOSTR(Harray[J]));                                       
    end;           
        Heading1:=Monthcalc(Harray[1]);
        Heading2:=Monthcalc(Harray[2]);
        Heading3:=Monthcalc(Harray[3]);
        Heading4:=Monthcalc(Harray[4]);
        Heading5:=Monthcalc(Harray[5]);
        Heading6:=Monthcalc(Harray[6]);
        Heading7:=Monthcalc(Harray[7]);
        Heading8:=Monthcalc(Harray[8]);
        Heading9:=Monthcalc(Harray[9]);
        Heading10:=Monthcalc(Harray[10]);
        Heading11:=Monthcalc(Harray[11]);
        Heading12:=Monthcalc(Harray[12]);
        Heading13:=Monthcalc(Harray[13]);            

// showmessage(DateToStr(startdate));
// showmessage(DateToStr(enddate));
// Showmassage('test');                                           
end;  

Function Monthcalc(Amonth:integer):String;                                                      
begin
      Monthname[1]:='Jan';
      Monthname[2]:='Feb';
      Monthname[3]:='Mar';
      Monthname[4]:='Apr';
      Monthname[5]:='May';
      Monthname[6]:='Jun';
      Monthname[7]:='Jul';
      Monthname[8]:='Aug';
      Monthname[9]:='Sep';
      Monthname[10]:='Oct';
      Monthname[11]:='Nov';
      Monthname[12]:='Dec';
      Monthname[13]:='LY';          
      Result:=Monthname[Amonth];                                                        

// showmessage(DateToStr(startdate));
// showmessage(DateToStr(enddate));
// Showmassage('test');                                           
end;

我首先建议您将月份名称数组更改为常量:

const
  MonthNames: array[1..12] of string = ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec');

接下来我建议进行一些更改以避免 13 个月的硬编码时间跨度,因为正如您现在所经历的那样,需求确实会发生变化,而硬编码的内容总是比可变的内容更难更改。

声明一个变量,例如MonthSpan: integer 表示应包括多少个月(将来可能会出现 3 个月、6 个月等替代时间跨度的新要求)。同样用动态数组替换所有 Heading1, Heading2 ... 变量,命名为 Headings:

Monthspan: integer;
Headings: array of string;

现在我只是在开始时初始化这些

Monthspan := 13;
SetLength(Headings, Monthspan);

您之前已经计算过 StartDate: TDate,因此使用它和现有变量 M 我们现在可以编写一个简单的循环来获取标题:

M := MonthOf(StartDate);
for i := 0 to MonthSpan-1 do
begin
  Headings[i] := MonthNames[(M + i) mod 12];
  Memo1.Lines.Add(Headings[i]);
end;

MonthOf()是单位System.DateUtils中的一个函数。

以上内容替换了 Function MonthCalc(),并且您的所有代码都在 //Headings 注释下方。在您的代码的其他地方,您使用的地方,例如Heading1 您现在使用 Headings[0](动态数组总是从 0 开始索引)等

我不确定 HArray[] 的目的是什么,但确定标题不需要它。