У меня есть статус, который хранится в виде строки заданной длины, либо в файле, либо в базе данных.
Я хочу перечислить возможный статус '
У меня есть следующий тип, чтобы определить возможный статус '
Type TStatus = (fsNormal = Ord('N'),fsEditedOnScreen = Ord('O'),
fsMissing = Ord('M'),fsEstimated = Ord('E'),fsSuspect = Ord('s'),
fsSuspectFromOnScreen = Ord('o'),fsSuspectMissing = Ord('m'),
fsSuspectEstimated = Ord('e'));
Во-первых, это действительно хорошая идея? или я должен иметь отдельный массив const, хранящий преобразования символов? Это будет означать более одного места для обновления.
Теперь преобразовать строку в массив состояния. У меня есть следующее, но как я могу проверить, является ли символ действительным, не проходя через перечисление?
Function StrToStatus(Value : String):TStatusArray;
var
i: Integer;
begin
if Trim(Value) = '' then
begin
SetLength(Result,0);
Exit;
end;
SetLength(Result,Length(Value));
for i := 1 to Length(Value) do
begin
Result[i] := TStatus(Value[i]); // I don't think this line is safe.
end;
end;
После некоторого тестирования он все же подозревает, что подозрительная строка безопасна (она не падает!), А просто добавляет (выходит за пределы) значения, которые затем необходимо отфильтровать.
Function StrToStatus(Value : String):TStatusArray;
var
i: Integer;
begin
if Trim(Value) = '' then
begin
SetLength(Result,0);
Exit;
end;
SetLength(Result,Length(Value));
for i := 1 to Length(Value) do
begin
Result[i-1] := TStatus(Value[i]);
end;
for i := 0 to Length(Result) - 1 do
begin
case Result[i] of
fsNormal: ;
fsEditedOnScreen: ;
fsMissing: ;
fsEstimated: ;
fsSuspect: ;
fsSuspectFromOnScreen: ;
fsSuspectMissing: ;
fsSuspectEstimated: ;
else
Result [i] := fsNormal;
end;
end;
end;
Это позволяет всем статусам 'и их относительным значениям Char находиться в одном месте и предотвращает циклический просмотр каждого статуса для каждого символа в строке. (Так что в моей голове по крайней мере должно быть немного быстрее)
AFAIK это должно быть хорошо для обратного преобразования.
Function StatusToStr(Value : TStatusArray):String;
var
i: Integer;
begin
for i := 0 to Length(Value) - 1 do
Result := Result + Chr(Ord(Value[i]))
end;
Я использую Delphi 2007