25. september 2008 - 10:36Der er
19 kommentarer og 2 løsninger
ReadBool fra .ini fil
Så vidt jeg kan konstatere, så giver funktionen ReadBool fra en .ini fil ikke mulighed for at skrive andet end 0 og 1 som værdier. Er det korrekt opfattet og er der så en anden funktion man kan benytte der kan bruge Ja-Nej True-False o.s.v. som man kan normalt i en .ini fil
Der er i bund og grund ikke noget i vejen med 0 og 1 :-) Dog har jeg lidt et problem med at i nogle sprog er True og False ikke nødvendigvis 0 og 1. I nogle tilfælde er det rent fakstisk -1 og 0 - og det er noget gris.
Mit 'problem' er at det er nogle værdier som 'almindelige dødelige' retter direkte i en .ini fil. Og det er nu en gang nemmere at forklare at hvis de skriver Ja så er funktionen aktiv. Alternativt skal jeg til at lave en setupformular og det vil tage lænegere tid og det er ikke ret tit der skal ændres (kun hvis vores SMS service er offline)
Hugo: Kan du ikke altid antage at 0 = false? Hvad true har af værdi derved helt underordnet.
Mere eller mindre pasted fra hjælpen i 2007'eren (måske findes funktionen ikke i D7). Fandt denne funktion du måske kan bruge:
function StrToBool(const S: string): Boolean;
Converts a string to a Boolean value.
Description StrToBool converts the string specified by S to a Boolean.
If S can be converted to a number, StrToBool returns false if that number is 0, true otherwise.
If S can't be converted to a number, StrToBool returns true if S is any of the strings listed in TrueBoolStrs (or differs from one only by case) and false if it is any of the strings listed in FalseBoolStrs (or differs from one only by case).
If S is not a number and not one of the strings listed in TrueBoolStrs or FalseBoolStrs, StrToBool raises an EConvertError exception.
Note: If you do not assign a value to TrueBoolStrs, it is treated as if it contains the single string 'True'. Similarly, if you do not assign a value to FalseBoolStrs, it is treated as if it contains the single string 'False'; Note: The TrueBoolStrs and FalseBoolStrs variables are undefined when an application starts. Any use of StrToBool, BoolToStr or TryStrToBool will cause these variables to be initialised with the default values above.
Det ser ud til du kan definere hvad der er true og false for din ini-fil - og det er vel det du behøver.
Det lyder rent faktisk som noget der kunne laves til at fungere. Kan du se hvilken unit funktionen ligger i? Så vil jeg lige checke på den laptop jeg har lånt med 2009 på - det kan være sovsen er der til at pille i :-)
function JbTryStrToBool(const S: string; out Value: Boolean): Boolean; var iValue: Integer; BoolValues: TStringList; begin Result := TryStrToBool(S, Value); if Result then Exit;
Result := TryStrToInt(S, iValue);
if Result then begin Value := iValue <> 0; Exit; end;
StrToBool kan det samme som Jens' eksempel - men han har lavet en god løsning; omtrent den samme som Borland/Codegear eller hvad de hedder for tiden, gør med TrueBoolStrs and FalseBoolStrs.
Jens' linje "Value := iValue mod 2 = 1" kunne klares således: "Value := odd(iValue)"; Endelig glemte han at lægge 0 og 1 ind ;-)
hrc>> Jeg glemte ikke 0 og 1 .... Definitionen på at konvetere et tal til en boolean er hvis det er 0 så er de falsk ellers er det sandt !!! Men jeg glemte floatig point ...
function JbTryStrToBool(const S: string; out Value: Boolean): Boolean; var iValue: Integer; eValue: Extended; BoolValues: TStringList; begin Result := TryStrToBool(S, Value); if Result then Exit;
Result := TryStrToInt(S, iValue);
if Result then begin Value := iValue <> 0; Exit; end;
Result := TryStrToFloat(S, eValue);
if Result then begin Value := eValue <> 0; Exit; end;
Jeg er nu endelig nået til at skulle have dette prøvet, men TryStrToBool skulle efter sigende være at finde i SysUtils. Men det må så være en nyere Delphi end den 5'er jeg har. Der findes den i hvert fald ikke.
function TryStrToBool(const S: string; out Value: Boolean): Boolean; function CompareWith(const aArray: array of string): Boolean; var I: Integer; begin Result := False; for I := Low(aArray) to High(aArray) do if AnsiSameText(S, aArray[I]) then begin Result := True; Break; end; end; var LResult: Extended; begin Result := TryStrToFloat(S, LResult); if Result then Value := LResult <> 0 else begin VerifyBoolStrArray; Result := CompareWith(TrueBoolStrs); if Result then Value := True else begin Result := CompareWith(FalseBoolStrs); if Result then Value := False; end; end; end;
function TryStrToInt(const S: string; out Value: Integer): Boolean; var E: Integer; begin Val(S, Value, E); Result := E = 0; end;
function TryStrToFloat(const S: string; out Value: Extended): Boolean; begin Result := TextToFloat(PChar(S), Value, fvExtended); end;
du fjerner sætningen BoolValues.CaseSensitive; Lige før iValue := BoolValues.IndexOf(S); til føjer du BoolValues.Text := AnsiUpperCase(BoolValues.Text);
iValue := BoolValues.IndexOf(S); laves om til iValue := BoolValues.IndexOf(AnsiUpperCase(S));
Nogen speciel grund til du holder fast i Delphi 5 ?
Jeg kan ikke komme i tanke om en eneste god grund til at kode Delphi 5!
Et firma der ikke vil bruge sølle 2000,- på en opdatering af din udviklingsplatform (sådan noget kan trækkes fra)? Jeg ved godt at du ikke er fuldtidsprogrammør, men alligevel! Det svarer lidt til de giver dig en Messerschmitt KR200 som firmabil. Bevares, den er eksotisk men tidsvarende er den sgu ikke.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.