Подходит ли тип набора для итерации цикла?

Имейте следующее перечисление:

TDays = (tdSunday, tdMonday, tdTuesday, tdWednesday, tdThursday, tdFriday, tdSaturday);

И следующий набор этого перечисления:

TChoosenDays = set of TDays;

Теперь определите следующий массив:

var
  ArrayStringDaysAcronym : array [TDays] of String = ('SD', 'MD', 'TU', 'WE', 'TH', 'FR', 'ST');

Предположим, у меня есть переменная, объявленная как:

var
  Foo: TChoosenDays;
begin
  Foo:= [tdSunday, tdMonday, tdTuesday];

Как я могу перебрать все элементы, присутствующие в наборе?

Примечание. Следующее не компилируется, я знаю, что могу использовать массив вместо «набора», это единственный способ?

function ConcatAcronyms: String;
var
  Item: TDays; 
begin
  Result:= '';
  for Item:= Low(Foo) to High(Foo) do
  begin
    Result:= Result + '; '+ ArrayStringDaysAcronym[Item];
  end;
end;     

person EProgrammerNotFound    schedule 08.10.2015    source источник
comment
Насчет Delphi 6 не уверен, но в современных версиях возможен такой цикл: var D:TDay; begin for D in Foo do begin SmFnc(D)... end; end;   -  person asd-tm    schedule 08.10.2015
comment
@ asd-tm Спасибо, но я пока застрял на этой старой версии.   -  person EProgrammerNotFound    schedule 08.10.2015
comment
@ asd-tm: конструкция if Element in [] существует с тех пор, как Pascal был впервые определен, iirc. Для чего это вирт.   -  person MartynA    schedule 08.10.2015
comment
@MartynA Я не говорил о if Element in MySet then. Я написал цикл for Element in MySet do   -  person asd-tm    schedule 08.10.2015
comment
@asd-tm: Конечно. Я не хотел противоречить...   -  person MartynA    schedule 08.10.2015
comment
@MartynA Я только что нашел. Этот цикл был введен в Delphi 2007 для Win32 http://edn.embarcadero.com/article/34324 К сожалению, это не устраивает ОП.   -  person asd-tm    schedule 08.10.2015
comment
@ asd-tm: Да, я знаю. Я не говорил, что это неправильно, но, как вы видели, ОП использует D6.   -  person MartynA    schedule 08.10.2015


Ответы (1)


Да. Поскольку вы используете D6, вы можете сделать это следующим образом:

function ConcatAcronyms: String;
var
  Item: TDays;
begin
  Result:= '';
  for Item:= Low(TDays) to High(TDays) do
  begin
    if Item in Foo then begin
      if Result <> '' then
        Result := Result + ';'  // assuming you don't want Result to start with  a ';'
      Result:= Result + ArrayStringDaysAcronym[Item];
    end;
  end;
end;
person MartynA    schedule 08.10.2015
comment
Хорошо, но на самом деле я хочу начать с ';'. - person EProgrammerNotFound; 08.10.2015
comment
Я тоже, хотя я не очень вижу актуальность!! ;-) Я считаю ошибкой нарушать здесь DRY. И я также думаю, что вариант в моем редактировании, который был забрызган, когда мы пересеклись, на самом деле чище, чем ваши оба. - person David Heffernan; 08.10.2015