Operador IF ternário em Delphi e C#

Publicado por Marcos Dell Antonio em 14/06/2007 | .NET, Delphi

Quem usa o Delphi 4, 5 ou 6 (talvez as versões mais novas também) deve sentir muita falta do if ternário. Este operador, além de dar mais produtividade durante o desenvolvimento da aplicação, torna o código final muito mais legível.

No livro 58+ Soluções em .NET o Thiago Fernandez fala sobre este operador no C#. Exemplificando o que ele definiu como Dado Travestido de Código, segue um breve trecho de uma solução implementada com o if normal e o equivalente com o if ternário:

Exemplo utilizando IF normal em C#
Exemplo em C# utilizando o if normal

Exemplo em C# utilizando o IF ternário
Exemplo em C# utilizando o if ternário

If ternário no Delphi

Infelizmente nas versões 4, 5 e 6 do Delphi (e talvez nas mais novas, como disse anteriormente) este operador não está disponível. Porém, existe uma maneira muito simples de simular ele.

Veja a função que utilizamos na empresa onde trabalho:

IF ternário em Delphi

Agora imagine a seguinte situação: você tem vários checkboxes em um formulário. Quando o usuário clica no botão salvar, o valor gravado no banco de dados deverá ser Sim para os checkboxes marcados e Nao para os não marcados. Com o if ternário isto pode ser facilmente resolvido assim:

Exemplo utilizando if ternário em Delphi

Sem a função iif você precisaria testar a propriedade Checked utilizando um if/then/else. Ou seja, teria algumas linhas a mais de código. Isto a princípio não prejudica em nada o código, mas imagine se você tiver 30 checkboxes. Vai fazer um if para cada um?

É isso ae.

Até +.

9 comentários

  1. 1
    Marcus // June 16th, 2007 at 3:42 am

    Mas isso está longe de ser a mesma coisa…

    Se você fizer iif(CheckBox1.Checked, str + ‘: Sim’, str + ‘: Não’);
    as duas concatenações de strings serão executadas e passadas à função, que então descartará uma. A função pode ser ainda útil, mas tem uma limitação importante!

    Para solucionar isso, a linguagem deveria prover algum recurso como macros ou “lazy arguments” (como em na linguagem D), aí sim permitindo escolher o que será avaliado. Ou então o if-then-else poderia ser uma expressão em vez de um “statement”…
    Seria bom se mais linguagens saíssem do “feijão-com-arroz” e adicionassem alguns recursos como esses…

  2. 2
    Marcos Dell Antonio // June 16th, 2007 at 12:20 pm

    Marcus,

    Concordo com você. O iif executa as duas “expressões” independente do resultado. Isto é um problema, pois imagine algo do tipo:

    result := iif(num = 0, 0, 5 / num);

    Esse trecho de código deveria evitar uma divisão por zero. Porém ele acaba causando ela se num for igual a 0.

    Mas, ainda assim gosto do iif :).

    No caso dos checkboxes poupa muito código e como me acostumei com o estilo do C# (usando ?) , não abro mão, apesar de as vezes me deparar com erros como o acima.

    T+

  3. 3
    Joel // June 26th, 2007 at 11:48 am

    não tem uma função chamada IfThen que faz isso?

    No D7 tem, acho que no D6 tb tem

  4. 4
    Marcos Dell Antonio // June 26th, 2007 at 12:12 pm

    Joel,

    Eu não conhecia o IfThen. Acabei de testar e ele existe no Delphi 6, só tem um porém: os resultados são limitados aos tipos string, integer, int64 e double.

    Algo desde tipo:

    procedure TForm1.BitBtn1Click(Sender: TObject);
    var
    obj: TObj;
    begin
    obj := IfThen(1=1, TObj.Create(1), TObj.Create(2));
    end;

    não funcionará. Mas no caso dos checkboxes (ex. do post), é uma ótima alternativa.

    Valeu pela contribuição :).

    T+

  5. 5
    Odail // March 24th, 2008 at 8:06 pm

    procedure TForm1.Button1Click(Sender: TObject);
    var
    valor: string;
    begin
    valor := IfThen(CheckBox1.Checked, ‘Sim’, ‘Não’);
    ShowMessage(valor);
    end;

  6. 6
    George // July 15th, 2008 at 3:44 pm

    Marcus, você não deve estar acostumado a usar o iif não é?
    Não se usa ele dessa forma que você falou, usa-se assim:
    str := str+iif(CheckBox1.Checked,’Sim’,'Não’)
    :)

  7. 7
    Martins de Oliveira // April 20th, 2009 at 10:26 am

    o delphi nao da suporte a operadores ternários.

    Este operador é muito perigoso.

    Veja que o papel do operador ter nário é criar apenas um variavel e, neste caso do delphi ele cria 3 variáveis

    ele cria o result da função e nesta função ele executa os dois valores e preenxem as duas possibilidades de valres, somente após isso ele testar o valor para o resulte.

    o maior perigo deste operador é que se um dos valores forem inválidos termos um exeção no windows.

    estes valores podem ser um campo inexistente em umm tabela por exemplo, ou que seja um função matemática do tipo divisor por zero.

    o Delphi tem centenas de pegadinhas como esta. é mais válido criar um lib e nela um função do tipo doIfThen e nela testar e executar os paramentros, diferente do que ocorre no delphi.

    abração

  8. 8
    Linces Marques // November 21st, 2009 at 12:00 am

    Eu sinto muita falta de operadores ternários no Delphi, como os que existem no php por exemplo:

    $var1 = (!isset($var1)) ? ‘valor padrão’ : $var1;

    E esse iif do Delphi, como o Martins disse, não é de todo confiavel.

  9. 9
    Scoth // February 19th, 2010 at 8:18 pm

    É o seguinte eu copiei este último código Checkbox desta página pois estou com dificuldades para abilitar tanto as Checkbox quanto os radioButton estou usando o delphi 7 as tabelas com paradox7 quero colocar 02 radioButton para sexo M.F e 04 Checkbox para outras opções só não sei por onde começar qual o código onde é colocado
    procedure TForm1.RadioButton1Click(Sender: TObject);
    begin

    end;

    end.
    é isso ai espero que sua equipe possa me ajudar
    Desde de Já a Marcos Dell Antonio
    Muito obrigado
    até mais.
    Scoth…Fim da tranmissão………

Deixe o seu comentário

Anúncios

Anúncio provido pelo BuscaPé