Avatar billede hugopedersen Nybegynder
25. september 2008 - 10:36 Der 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
Avatar billede borrisholt Novice
25. september 2008 - 10:55 #1
Hvis du vil gemme en boolsk værdi i en ini fil er det naturligvis 0 eller 1 !!!

Hvad skulle de ellers være ?
Avatar billede hugopedersen Nybegynder
25. september 2008 - 11:06 #2
Den funktion jeg bruger i VB kan skelne forskel på True/False, Yes/No, 0/1 (har selv lavet så den også skelner på Ja/Nej)
Avatar billede borrisholt Novice
25. september 2008 - 11:08 #3
Du kan jo bare lave en readString og så selv fortolke på det du får ind .. JEg synes det er noget slam ...

Hvad er der i vejen med 0 og 1 ...

Jens Borrisholt
Avatar billede hugopedersen Nybegynder
25. september 2008 - 11:18 #4
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)

Men så må jeg jo selv igang med at kode noget :-)
Avatar billede borrisholt Novice
25. september 2008 - 11:29 #5
nååe kommer an på om du bruger boolean eller bool.
Avatar billede hugopedersen Nybegynder
25. september 2008 - 12:27 #6
Ikke forstået!
Avatar billede hrc Mester
25. september 2008 - 12:38 #7
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.
Avatar billede borrisholt Novice
25. september 2008 - 12:39 #8
en form et memo felt og en knap :

procedure TForm14.Button1Click(Sender: TObject);
var
  a: Bool;
  b: Boolean;
begin
  a := True;
  b := True;
  Memo1.Lines.Add('Bool True : ' + IntToStr(Integer(a)));
  Memo1.Lines.Add('Boolean True : ' + IntToStr(Integer(b)));

  a := False;
  b := False;
  Memo1.Lines.Add('Bool False : ' + IntToStr(Integer(a)));
  Memo1.Lines.Add('Boolean False : ' + IntToStr(Integer(b)));
end;


Jens B
Avatar billede hugopedersen Nybegynder
25. september 2008 - 12:43 #9
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 :-)
Avatar billede borrisholt Novice
25. september 2008 - 12:57 #10
Den her løser dit problem :
læs det som en integer.

function IntToBool(const Value : Integer) : Boolean;
begin
  Result := Value <> 0;
end;
Avatar billede hugopedersen Nybegynder
25. september 2008 - 13:28 #11
borrisholt> jeg kan ikke lige gennemskue hvordan den skulle kunne fortolke Ja/Nej
Avatar billede borrisholt Novice
25. september 2008 - 16:52 #12
Sådan den kan klare det meste ...

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;

  BoolValues := TStringList.Create;
  BoolValues.CaseSensitive := False;

  BoolValues.Add('False');
  BoolValues.Add('True');

  BoolValues.Add('Nej');
  BoolValues.Add('Ja');

  BoolValues.Add('Non');
  BoolValues.Add('Oui');

  BoolValues.Add('No');
  BoolValues.Add('Yes');

  BoolValues.Add('Falsk');
  BoolValues.Add('Sandt');

  BoolValues.Add('Ikke sandt');
  BoolValues.Add('Ikke ikke sandt');

  BoolValues.Add('Nææh');
  BoolValues.Add('Jow');

  BoolValues.Add('Nix');
  BoolValues.Add('Yep');

  BoolValues.Add('Jeg tror det ikke');
  BoolValues.Add('Jeg tror det');

  iValue := BoolValues.IndexOf(S);
  Result := iValue >= 0;
  Value := iValue mod 2 = 1;

  FreeAndNil(BoolValues);
end;

function JbStrToBoolDef(const S: string; Default: Boolean): Boolean;
begin
  if not JbTryStrToBool(s, Result) then
    Result := Default;
end;


Herfra er det kun din egen fantasi der sætter grænsen ..

Jens B
Avatar billede hrc Mester
25. september 2008 - 21:00 #13
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 ;-)
Avatar billede borrisholt Novice
26. september 2008 - 06:05 #14
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;




  BoolValues := TStringList.Create;
  BoolValues.CaseSensitive := False;

  BoolValues.Add('False');
  BoolValues.Add('True');

  BoolValues.Add('Nej');
  BoolValues.Add('Ja');

  BoolValues.Add('Non');
  BoolValues.Add('Oui');

  BoolValues.Add('No');
  BoolValues.Add('Yes');

  BoolValues.Add('Falsk');
  BoolValues.Add('Sandt');

  BoolValues.Add('Ikke sandt');
  BoolValues.Add('Ikke ikke sandt');

  BoolValues.Add('Nææh');
  BoolValues.Add('Jow');

  BoolValues.Add('Nix');
  BoolValues.Add('Yep');

  BoolValues.Add('Jeg tror det ikke');
  BoolValues.Add('Jeg tror det');

  iValue := BoolValues.IndexOf(S);
  Result := iValue >= 0;
  Value := iValue mod 2 = 1;

  FreeAndNil(BoolValues);
end;

Forskellen på min løsning er du selv kan sætte vær dier ind for hvad du vil acceptere som sandt og fals´k
Sådan !!
Avatar billede hugopedersen Nybegynder
26. september 2008 - 06:49 #15
Det vil jeg straks arbejde på at implementere - tak.
Avatar billede hugopedersen Nybegynder
09. oktober 2008 - 07:44 #16
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.
Avatar billede borrisholt Novice
09. oktober 2008 - 08:22 #17
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;
Avatar billede hugopedersen Nybegynder
10. oktober 2008 - 08:26 #18
BoolValues := TStringList.Create;
  BoolValues.CaseSensitive := False; <-----

CaseSensitive findes ikke i Delphi 5. Kan jeg komme rundt om den på nogen måde?
Avatar billede borrisholt Novice
10. oktober 2008 - 08:31 #19
Jo det kan du godt ...

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!

Jens B
Avatar billede hugopedersen Nybegynder
13. oktober 2008 - 07:53 #20
Firmaet vil ikke betale for en opgradering :-)

Næh - det er ikke en god grund, men en forklaring.

Tak for input.
Avatar billede hrc Mester
13. oktober 2008 - 09:25 #21
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.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester