My Analize about: What's the rationale behind incosistency in Boolean casting? Ask an user on IDERA forum...
by Emailx45 - 23/Jul/2020
My analize:
Let's see if help:
Scenary:
by Emailx45 - 23/Jul/2020
[SHOWTOGROUPS=4,20]
Create an empty form, place a button and have this as the event handler:
Only looking at the source code, what will be the correct answer:
What's even funnier, place this piece of code inside the above event handler:
What will you get?
[/SHOWTOGROUPS]
Create an empty form, place a button and have this as the event handler:
Код:
const
TEST_VALUE = Boolean(256);
procedure TForm1.Button1Click(Sender: TObject);
begin
if TEST_VALUE then
ShowMessage('The TEST_VALUE is ' + BoolToStr(TEST_VALUE, True))
end;
Only looking at the source code, what will be the correct answer:
- It shows the message "The TEST_VALUE is True"
- It does not show the message
- It shows the message "The TEST_VALUE is False"
What's even funnier, place this piece of code inside the above event handler:
Код:
case TEST_VALUE of
False: ShowMessage('False = ' + BoolToStr(TEST_VALUE, True));
True: ShowMessage('True = ' + BoolToStr(TEST_VALUE, True));
end;
What will you get?
[/SHOWTOGROUPS]
My analize:
Let's see if help:
Scenary:
- MSWindows 10 (build 1909) 64bits
- VCL project RAD 10.3.3 Arch 32bits
- see "System.SysUtils.pas, line 8933 procedure VerifyBoolStrArray;" where the transformation occurr
[SHOWTOGROUPS=4,20]
As in Math:
[/SHOWTOGROUPS]
Код:
unit uVCL_FormMain;
interface
uses
Winapi.Windows,
Winapi.Messages,
System.SysUtils,
System.Variants,
System.Classes,
Vcl.Graphics,
Vcl.Controls,
Vcl.Forms,
Vcl.Dialogs,
Vcl.StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
const
TEST_VALUE = Boolean(256); // test negative or positive values: -1000000 until 1000000 (million)
var
lMyBoolean1: Boolean; // by default is False!
lMyBoolean2: Boolean = False;
lMyBoolean3: Boolean = True;
procedure TForm1.Button1Click(Sender: TObject);
begin
{
Value of B Value of UseBoolStrs Value of returned string
true false '-1'
true true The first string in TrueBoolStrs (default 'True');
false false '0'
false true The first string in FalseBoolStrs (default '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!
}
// if TEST_VALUE then { = True = value > 0 }
begin
// ShowMessage('The TEST_VALUE is ' + BoolToStr(TEST_VALUE, True))
//
Memo1.Lines.Add('False should be 0');
Memo1.Lines.Add('True should be 1');
Memo1.Lines.Add('-------------------######-------------------');
Memo1.Lines.Add('Value of B Value of UseBoolStrs Value of returned string');
Memo1.Lines.Add('true false ''-1''');
Memo1.Lines.Add('true true The first string in TrueBoolStrs (default ''True'');');
Memo1.Lines.Add('false false ''0''');
Memo1.Lines.Add('false true The first string in FalseBoolStrs (default ''False'')');
Memo1.Lines.Add('-------------------######-------------------');
Memo1.Lines.Add('var lMyBoolean1: Boolean; // by default is "False"');
Memo1.Lines.Add('var lMyBoolean2: Boolean = False;');
Memo1.Lines.Add('var lMyBoolean3: Boolean = True;');
Memo1.Lines.Add('');
Memo1.Lines.Add(Format('lMyBoolean1.ToString(True) = %s', [lMyBoolean1.ToString(True)]));
Memo1.Lines.Add(Format('lMyBoolean1.ToString(False) = %s', [lMyBoolean1.ToString(False)]));
Memo1.Lines.Add(Format('lMyBoolean2.ToString(True) = %s', [lMyBoolean2.ToString(False)]));
Memo1.Lines.Add(Format('lMyBoolean2.ToString(False) = %s', [lMyBoolean2.ToString(True)]));
Memo1.Lines.Add(Format('lMyBoolean3.ToString(True) = %s', [lMyBoolean3.ToString(False)]));
Memo1.Lines.Add(Format('lMyBoolean3.ToString(False) = %s', [lMyBoolean3.ToString(True)]));
Memo1.Lines.Add('-------------------######-------------------');
Memo1.Lines.Add('');
//
Memo1.Lines.Add('const TEST_VALUE = Boolean(256);');
Memo1.Lines.Add('');
Memo1.Lines.Add(Format('Ord(TEST_VALUE) = %d', [Ord(TEST_VALUE)]));
Memo1.Lines.Add('');
//
Memo1.Lines.Add('-------------------*******-------------------');
Memo1.Lines.Add('class function ...');
Memo1.Lines.Add('...ToString(const Value: Boolean; UseBoolStrs: TUseBoolStrs = TUseBoolStrs.False):');
Memo1.Lines.Add('...string; overload; inline; static;');
Memo1.Lines.Add('-------------------*******-------------------');
//
Memo1.Lines.Add(Format('Boolean(Ord(TEST_VALUE)).ToString(True) = %s', [Boolean(Ord(TEST_VALUE)).ToString(True)]));
Memo1.Lines.Add(Format('Boolean(Ord(TEST_VALUE)).ToString(False) = %s', [Boolean(Ord(TEST_VALUE)).ToString(False)]));
Memo1.Lines.Add('');
Memo1.Lines.Add(Format('TEST_VALUE.ToString(True) = %s', [TEST_VALUE.ToString(True)]));
Memo1.Lines.Add(Format('TEST_VALUE.ToString(False) = %s', [TEST_VALUE.ToString(False)]));
Memo1.Lines.Add('');
Memo1.Lines.Add(Format('BoolToStr(TEST_VALUE, True) = %s', [BoolToStr(TEST_VALUE, True)]));
Memo1.Lines.Add(Format('BoolToStr(TEST_VALUE, False) = %s', [BoolToStr(TEST_VALUE, False)]));
end;
//
// ShowMessage( Integer(Boolean(256)).toString); //256
// ShowMessage( Integer(TEST_VALUE).toString); //256
(*
case TEST_VALUE.ToInteger of {will be False}
Integer(false):
ShowMessage('False = ' + BoolToStr(TEST_VALUE, True));
Integer(true):
ShowMessage('True = ' + BoolToStr(TEST_VALUE, True));
end;
*)
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
if lMyBoolean1 then
ShowMessage('The TEST_VALUE is ' + BoolToStr(TEST_VALUE, True))
else
ShowMessage('lMyBoolean1 by default is False');
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Self.Height := Screen.Height;
end;
end.
As in Math:
- + and + = +
- + and - = -
- - and + = -
- - and - = +
![Result-Test001.png](/proxy.php?image=https%3A%2F%2Fi.ibb.co%2FVxbWJrb%2FResult-Test001.png&hash=2276aec7d5313874389e869d969b0408)
![Result-Test002.png](/proxy.php?image=https%3A%2F%2Fi.ibb.co%2Fc87QHLZ%2FResult-Test002.png&hash=520867ac57207c8c245031676d94108f)
![Result-Test003.png](/proxy.php?image=https%3A%2F%2Fi.ibb.co%2FkSGv827%2FResult-Test003.png&hash=d39ab735658c9044bddfa48e674277dd)
![Result-Test004.png](/proxy.php?image=https%3A%2F%2Fi.ibb.co%2Fdbcfbd8%2FResult-Test004.png&hash=257d31626217bc41fecc84da351ef2a0)
![Result-Test005.png](/proxy.php?image=https%3A%2F%2Fi.ibb.co%2FnDYNmqt%2FResult-Test005.png&hash=f59aa211ed28f0299d09d5e25e0eeae2)