Delphi создает письма с циклом for

Как вы знаете, имена столбцов в Excel — это буквы. Когда он достигает Z, он продолжает с AA-AB-AC. Можно ли сделать аналогичную функцию в Delphi XE7 + цикл for?

Я пробовал:

var
i:integer;
str:string;
begin
str:='a';
for i := 0 to 26-1 do
begin
inc (str,1);
memo1.Lines.Add(str);
end;

но он вернулся:

[dcc32 Error] FBarkodsuzIndesignVerisiOlustur.pas(249): E2064 Left side cannot be assigned to

Я предполагаю, что это потому, что str не является целым числом.

Я могу преобразовать числа в буквы с помощью этой функции:

function numberToString(number: Integer): String;
begin
    Result := '';
    if (number < 1) or (number > 26) then
        Exit;

    Result := 'abcdefghijklmnopqrstuvwxyz'[number];
end;

Но я понятия не имею, как мы можем создавать такие буквы, как АА, когда их больше 26.

Также с приведенным ниже подходом он отлично создает 26 букв, но когда он превышает 26, он начинает использовать такие символы, как скобки:

  for i := 0 to 27-1 do
  begin
   memo1.Lines.Add(Char(Ord('a') + i));
  end;

Выход из него:

a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
{

когда он достигнет Z, он будет продолжаться как AA BB CC и так далее, как Excel создает имена столбцов.


person Sheshman    schedule 07.10.2020    source источник
comment
Используйте div и мод. Это просто счет по основанию 26. Подумайте, как бы вы реализовали IntToStr, основанный на 10, и использовали бы тот же алгоритм, но с числом 26. О, и упростите жизнь, используя индексы, основанные на нуле.   -  person David Heffernan    schedule 07.10.2020
comment
@DavidHeffernan хорошо, я должен создать цикл, например; for i := 0 to 52-1 действительно начинаются, если (I mod 26 = 0) и (I › 0) then begin memo1.Lines.Add(Char(Ord('a') + i)); конец; конец;   -  person Sheshman    schedule 07.10.2020
comment
Перестаньте думать об этом как о петлях. Вы знаете, как написать цикл for. Вы не знаете, как преобразовать индекс в строковое имя столбца. Напишите функцию для этого. Как только вы это сделаете, вызовите его из цикла. Программирование 101 здесь, разбейте задачи на более мелкие фундаментальные задачи, которые можно легко составить.   -  person David Heffernan    schedule 07.10.2020
comment
@DavidHeffernan да, вы правы насчет функций, ну, я новичок и работаю над этим.   -  person Sheshman    schedule 07.10.2020


Ответы (1)


Это функция, которую я использую для задачи.

function SpreadSheetColName(const Col: Integer): string;
var
  c: Char;
begin
  Assert(Col >= 0);
  if Col<26 then begin
    c := 'A';
    Inc(c, Col);
    Result := c;
  end else begin
    Result := SpreadSheetColName(Col div 26 - 1) + SpreadSheetColName(Col mod 26);
  end;
end;

Обратите внимание, что он использует индексы с нулевым отсчетом. Я бы посоветовал вам также использовать индексы с отсчетом от нуля в качестве общего правила во всем программировании.

Если вы не можете заставить себя сделать это, то версия на основе одной версии будет выглядеть так:

function SpreadSheetColName(const Col: Integer): string;

  function SpreadSheetColNameZeroBased(const Col: Integer): string;
  var
    c: Char;
  begin
    Assert(Col >= 0);
    if Col<26 then begin
      c := 'A';
      Inc(c, Col);
      Result := c;
    end else begin
      Result := SpreadSheetColNameZeroBased(Col div 26 - 1) + SpreadSheetColNameZeroBased(Col mod 26);
    end;
  end;

begin
  Result := SpreadSheetColNameZeroBased(Col - 1);
end;
person David Heffernan    schedule 07.10.2020
comment
просто удивительно, спасибо за вашу помощь, последний вопрос, хотя в php мы используем% для определения кратных, что равно для delphi, я имею в виду, представьте, что вы считаете от 0 до 50, и вы хотите показывать сообщение каждые 2 -4-6-8-10...., я думал, что могу использовать НЕЧЕТНОЕ или ЧЕТНОЕ, например, если нечетное (i), то сделать что-то, это правильный подход? - person Sheshman; 07.10.2020
comment
% соответствует моду в Delphi. Это самое первое, что я сказал вам в своем первом комментарии. Пожалуйста, не берите функции в моем ответе и не используйте их без полного понимания. Используйте документацию Delphi, чтобы узнать, как они работают. - person David Heffernan; 07.10.2020
comment
да, я понимаю, и поверьте мне, я не буду использовать вашу функцию ни в одном из своих проектов, потому что я еще не могу создать проект самостоятельно, я хорошо разбираюсь в php, но изучаю Delphi, и я в самом В начале этого я воссоздаю некоторые из своих php-проектов в Delphi, чтобы изучить логику и методы, поэтому, когда я прочитал ваш комментарий о моде и div, быстро нашел delphi, как использовать мод, delphi, как использовать div и начал читайте примеры и статьи, в предыдущем комментарии мне было интересно, какой будет другой/альтернативный подход к моду, вот почему я спросил. - person Sheshman; 07.10.2020
comment
Я не думаю, что есть альтернатива mod для выполнения той же задачи. Конечно, вы можете использовать функцию Odd в Delphi RTL, но это всего лишь сокращение для mod 2. И % не определяет кратность. Это оператор модуля, он вычисляет остаток от деления. - person David Heffernan; 07.10.2020
comment
о, я вижу, я сказал кратные из-за моего плохого английского :) правильный термин был модуль, вы правы :) Ну, вы думали, что я хорошие предметы для изучения сегодня, если я когда-нибудь встречу вас однажды, я должен вам холодное пиво, потому что я: =0 до 999-1, затем начните memo1.lines.add(Спасибо, сэр); конец; - person Sheshman; 07.10.2020
comment
также спасибо модератору Андреасу Рейбранду, который отредактировал и исправил мои плохие навыки письма на английском языке :) - person Sheshman; 07.10.2020