Rzutowanie, konwersje

0
 
 var
    ZakresDat : Char;

    if(CheckBox_ZakresDat.Checked) then ZakresDat:='1'
    else ZakresDat:='0';

Chciałem trochę się pobawić w rzutowanie aby uzyskać ten sam efekt (gdy będzie masa takich checkboxow w mojej aplikacji bazodanowej to troche zaciemnienia wprowadza tyle ifow :-P ), i próbowałem tak:

   ZakresDat:=IntToStr(Integer(CheckBox_ZakresDat.Checked));

Ale naturalnie to nie przechodzi bo konwertuję do łańcucha zamiast pojedynczego znaku. Jak efektownie to zapisać ? :-) (znaczy czy da sie bez dodawania +48 i rzutowania na Char)
Też nie rozumiem dlaczego BoolToStr zwraca '-1' dla True [glowa]

0

Bo tak ma zaimplementowane :)

Mozesz sprobowac podmienic to w SysUtils lub napisac swoja funkcje (nietestowane)

function BoolToStr(B: Boolean; UseBoolStrs: Boolean = False): string;
const
  cSimpleBoolStrs: array [boolean] of String = ('0', '1');
begin
  if UseBoolStrs then
  begin
    VerifyBoolStrArray;
    if B then
      Result := TrueBoolStrs[0]
    else
      Result := FalseBoolStrs[0];
  end
  else
    Result := cSimpleBoolStrs[B];
end;
0

No ja wiem, ale chciałem to w jednej linijce napisać poprzez rzutowanie :P
Ale w ostatecznosci pozostaje podmiana :)

0

var
ZakresDat : Char;

if((Sender as TCheckBox).Checked) then ZakresDat:='1'
else ZakresDat:='0';

coś w ten deseń? w zasadzie mógłbyś dokładniej napisać o co Ci chodzi :P

0

No chyba widać. Przerzutować Boola na Chara. True - '1', False - '0', ale bez ifowania.
Do bazy zapisuje przecież 0 albo 1, na podstawie tego co user sobie pozahaczył w checkboxach...
To co napisałem potem, to działa ale mam tam konwersję na łańcuch więc naturalnie sie nie kompiluje, ale zwraca dokladnie to co chce.

//Edit

ZakresDat:=Char(Integer(CheckBox_ZakresDat.Checked)+48);

Czy da się to szybciej zapisać, bo w porownaniu do ifa to wolniej działa :-)

0

Po co zaraz takie molochy...

ZakresDat := Char(Bool(CheckBox_ZakresDat.Checked));
0
Opi napisał(a)

Po co zaraz takie molochy...

ZakresDat := Char(Bool(CheckBox_ZakresDat.Checked));

Mógłbys chociaż to przetestować. Nie działa bo niby z jakiej racji ? :-P
Póki co, rowziązanie z +48 działa :-)

0
ZakresDat:=IntToStr(Integer(CheckBox_ZakresDat.Checked))[1];
0
Misiekd napisał(a)
ZakresDat:=IntToStr(Integer(CheckBox_ZakresDat.Checked))[1];

Aha.
Czyli właściwie to jest równoznaczne z tym ?..

ZakresDat:=Char(Integer(CheckBox_ZakresDat.Checked)+48);

Zresztą zaraz sprawdzę na 'stoperze' ;-)

0

nie jest - to moje rzutuje na inta, potem konwertuje na string i bierze tylko pierwszy znak, to Twoje rzutuje na inta, dodaje 48 i rzutuje na chara. Przypuszczam, że Twoje jest szybsze

0
const
  BOOL_RESULT_0_1: array[Boolean] of Char = ('0', '1');
begin
  ZakresDat := BOOL_RESULT_0_1[CheckBox_ZakresDat.Checked];

bez dodawania itd. szybciej i sprawniej sie chyba nie da :P

1 użytkowników online, w tym zalogowanych: 0, gości: 1