Operador IF ternário em Delphi e C#
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 em C# utilizando o if normal

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:

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:

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é +.




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…
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+
não tem uma função chamada IfThen que faz isso?
No D7 tem, acho que no D6 tb tem
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+
procedure TForm1.Button1Click(Sender: TObject);
var
valor: string;
begin
valor := IfThen(CheckBox1.Checked, ‘Sim’, ‘Não’);
ShowMessage(valor);
end;
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’)
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
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.
É 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………
Você pode extender a funcionalidade da função IfThen(), definida nas units Math e StrUtils, para poder atuar com outros tipos de dados. Basta apenas criar uma unit e nela criar todas as funções IfThen() necessárias para cada tipo de dados que precisar usar. Depois, é só colocar essa unit na cláusula uses do form, ou outra unit, na qual você tenha necessidade de usar IfThen() com outros tipos de dados além de string, integer, int64 e double. Se quiser, posso codificar um exemplo disso. Sds.