Net als VideoRipper raad ik het gebruik van "with...do" nog af. En ik wil zelfs een stapje verder gaan en "with...do" voor altijd afraden. Er is niets mis met het concept, maar de leesbaarheid (en overdraagbaarheid) van de code wordt beperkt. Ik heb weleens code onder handen gekregen waar grote blokken code in "with...do" blokken zaten, en dan ook nog "with..do" blokken binnen andere "with...do" blokken (nesting). Het risico dat een andere developer die je code moet onderhouden dan de weg kwijt raakt is groter.
Terug naar je vraag. Je oplossing met de stringlist heeft ook mijn voorkeur boven de delphi arrays als "LongMonthNames". Die arrays worden voorgevuld met de info zoals het OS opgeeft. Daarmee wordt je code dus meteen afhankelijk van de OS taalinstelling. Op zich is dat wel te omzeilen, maar jouw oplossing is rechtlijniger.
In aanvulling op VideoRipper zou een verder complete implementatie zoals onderstaand kunnen zijn. Op zich allemaal niet spannend, maar ter info:
Code:
function MaandNaarNummer(AMaand: String): String;
var
ASl: TStringList;
AIdx: Integer;
begin
ASl := TStringList.Create;
try
ASl.CaseSensitive := False;
ASl.CommaText := 'jan,feb,mrt,apr,mei,jun,jul,aug,sep,okt,nov,dec';
AIdx := ASl.IndexOf(AMaand);
if AIdx <> -1 then
Result := Format('%.*d',[2, AIdx + 1])
else
raise Exception.CreateFmt('De maand "%s" is ongeldig', [AMaand])
finally
ASl.Free;
end;
end;
Wat heb ik aangepast:
1. Naamgeving van de parameter (optioneel)
2. Case insensitive zoeken in de stringlist (dus MaandNaarNummer('DEC') werkt ook)
3. "with...do" geëlimineerd (optioneel)
4. Leading zero met Format (optioneel)
5. Exception raising (optioneel)
Je zou ook nog met een singleton maand "stringlist" kunnen werken zodat de stringlist niet telkens weer gecreëerd hoeft te worden.
Bookmarks