Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.08.23;
Скачать: CL | DM;

Вниз

Существует в Дельфи функция IIF ?   Найти похожие ветки 

 
Пит   (2009-06-22 18:18) [0]

Судя по тому, что в indy использована собственная реализация - среди стандартных подобной функции нет.

При этом в справке находится некая "IfThen", вроде как должна находится в модуле "MathStrUtils". Забавно то, что у меня такого модуля нету в поставке delphi.
И судя по немного корявой справке всего лишь двух функций этого модуля - где-то что-то не доработано.

Есть таки функция аля IfThen / IIF в дельфе стандартном или нету? Или появилась может, начиная с какой-то версии?


 
Palladin ©   (2009-06-22 18:21) [1]

Function vtIIf(Const a:Boolean;Const t,f:Variant):Variant;
Begin
If a Then Result:=t Else Result:=f;
End;


 
Пит   (2009-06-22 18:28) [2]

Palladin, это ты к чему?


 
jack128_   (2009-06-22 18:28) [3]

Вообще то все стандартные модули в дельфи поставляются в сорцах. А еще есть такая замечательная вещь как поиск по содержимому в файлах. Тебя это не наводит не на какие мысли, как можно самому ответить на твой вопрос??


> Или появилась может, начиная с какой-то версии?

ну очевидно, что если какая то функция есть, то она появилась начиная с какой то версии, с другой стороны если её нету, то она возможно когда нить появится. Тоже начиная с какой нить версии.


 
antonn ©   (2009-06-22 18:36) [4]


> Palladin ©   (22.06.09 18:21) [1]

в каком модуле в поставке дельфи это находится?


 
Sapersky   (2009-06-22 18:50) [5]

При этом в справке находится некая "IfThen", вроде как должна находится в модуле "MathStrUtils". Забавно то, что у меня такого модуля нету в поставке delphi.
И судя по немного корявой справке всего лишь двух функций этого модуля - где-то что-то не доработано.


Пропущена запятая между "Math" и "StrUtils".
Начиная с D7 (или 6 - во всяком случае, в 5-м их нет).


 
Anatoly Podgoretsky ©   (2009-06-22 18:56) [6]

> Пит  (22.06.2009 18:18:00)  [0]

ifthen эта функция.
И что такое Дельфи стандартное?


 
Пит   (2009-06-22 19:05) [7]

jack128_, нравоучительством в данном случае ты занялся поспешно, имхо.


> Пропущена запятая между "Math" и "StrUtils".


точняк... Оказывается, часть набора такой функции (по числам) реализована в Math, а строковая версия реализована в StrUtils...

Блин, тупость... Надо было все реализовывать в System, имхо.

И со справкой накосячили, конечно. Написано:

Unit

[b]MathStrUtilsor[/b]


 
Пит   (2009-06-22 19:06) [8]

хотелось сказать:

Unit

MathStrUtilsor


Я все искал модуль MathStrUtils...


 
Palladin ©   (2009-06-22 19:16) [9]


> Palladin, это ты к чему?

Это текст твоей функции


 
Пит   (2009-06-22 19:35) [10]


> Это текст твоей функции


ты правда считаешь, что я не в состоянии реализовать действие функции аля IIF?


 
Игорь Шевченко ©   (2009-06-22 19:36) [11]

ты тролль и должен быть забанен


 
Student ©   (2009-06-22 23:31) [12]

А вот мой пример глянь. Я тоже тока сёдня узнал про такую


  if FblStateAdr then
  begin
    imgComputer.Picture.Bitmap.FreeImage;
    imgComputer.Picture.Bitmap.LoadFromFile(Ini.ReadString("Dir","Image", "")
         + "CompLime.bmp");
  end else
  begin
    imgComputer.Picture.Bitmap.FreeImage;
    imgComputer.Picture.Bitmap.LoadFromFile(Ini.ReadString("Dir","Image", "")
         + "CompBlue.bmp");
  end;

так:

    imgComputer.Picture.Bitmap.FreeImage;
    imgComputer.Picture.Bitmap.LoadFromFile(Ini.ReadString("Dir","Image", "")
         + IIF(FblStateAdr , "CompLime.bmp", "CompBlue.bmp"));


так нельзя было переписать?

Сказали ужас
Пример из жизни -)))


 
vuk ©   (2009-06-23 00:32) [13]

to Student ©   (22.06.09 23:31) [12]:
IIF приводит к неявному преобразованию в variant и обратно. Наверное, на производительности не лучшим образом отразится. Я бы так сделал:

const BitmapNames: array[boolean] of string = ("CompBlue.bmp", "CompLime.bmp");
...

  imgComputer.Picture.Bitmap.FreeImage;
   imgComputer.Picture.Bitmap.LoadFromFile(Ini.ReadString("Dir","Image", "")
        + BitmapNames[FblStateAdr]);


 
Игорь Шевченко ©   (2009-06-23 01:17) [14]

IIF приводит прежде всего к нечитаемости кода.


>  if FblStateAdr then
>   begin
>     imgComputer.Picture.Bitmap.FreeImage;
>     imgComputer.Picture.Bitmap.LoadFromFile(Ini.ReadString("Dir",
> "Image", "")
>          + "CompLime.bmp");
>   end else
>   begin
>     imgComputer.Picture.Bitmap.FreeImage;
>     imgComputer.Picture.Bitmap.LoadFromFile(Ini.ReadString("Dir",
> "Image", "")
>          + "CompBlue.bmp");
>   end;


В первую очередь не надо писать повторяющийся код в ветках условного оператора, то есть, начать с

 imgComputer.Picture.Bitmap.FreeImage;
 if FblStateAdr then
   imgComputer.Picture.Bitmap.LoadFromFile(Ini.ReadString("Dir","Image", "")
        + "CompLime.bmp")
 else
   imgComputer.Picture.Bitmap.LoadFromFile(Ini.ReadString("Dir","Image", "")
        + "CompBlue.bmp");


Ну и чтобы не загромождать программу немецким языком, использовать with

 with imgComputer.Picture.Bitmap do
 begin
    FreeImage;
   if FblStateAdr then
     LoadFromFile(Ini.ReadString("Dir","Image", "")  + "CompLime.bmp")
  else
    LoadFromFile(Ini.ReadString("Dir","Image", "")  + "CompBlue.bmp");
end;


А если учесть, что LoadFromFile тоже вызывает очистку (правда несколько иную, чем FreeImage), то FreeImage можно убрать и получится

 with imgComputer.Picture.Bitmap do
   if FblStateAdr then
     LoadFromFile(Ini.ReadString("Dir","Image", "")  + "CompLime.bmp")
  else
    LoadFromFile(Ini.ReadString("Dir","Image", "")  + "CompBlue.bmp");


 
TIniFile   (2009-06-23 06:31) [15]

А потом, осознав, что явно объявленная локальная переменная ничем не хуже неявной, написать наконец так, чтобы это нормально читалось

var
 s: string;

if FblStateAdr
 then s:= Ini.ReadString("Dir","Image", "")  + "CompLime.bmp"
 else  s:= Ini.ReadString("Dir","Image", "")  + "CompBlue.bmp";

imgComputer.Picture.Bitmap.LoadFromFile(s);


 
test ©   (2009-06-23 07:54) [16]

Palladin ©   (22.06.09 18:21) [1]
Она так тормозить будет, они поэтому от Variant отказались и на каждый тип свою реализацию сделали.


 
Плохиш ©   (2009-06-23 11:08) [17]


> А потом, осознав, что явно объявленная локальная переменная
> ничем не хуже неявной, написать наконец так,


var
s: string;

if FblStateAdr
then s:= "CompLime.bmp"
else  s:= "CompBlue.bmp";
s:= Ini.ReadString("Dir","Image", "") + s;

imgComputer.Picture.Bitmap.LoadFromFile(s);

:-P


 
KSergey ©   (2009-06-23 11:22) [18]

> Игорь Шевченко ©   (23.06.09 01:17) [14]
> IIF приводит прежде всего к нечитаемости кода.

Это не есть правда навсегда и везде.
Использую, радуюсь. Когда надо состряпать длинную строку из кусочков, при этом один из кусочков должен быть "либо-либо" - все отлично читается.


 
Игорь Шевченко ©   (2009-06-23 11:36) [19]

KSergey ©   (23.06.09 11:22) [18]

Читаемость чужого кода IIF ухудшает вдвойне. Собственно, испытано на опыте чтения исходников EhLib


 
ANB   (2009-06-23 11:48) [20]


> Читаемость чужого кода IIF ухудшает вдвойне. Собственно,
>  испытано на опыте чтения исходников EhLib

Привычки у тебя нету. На клиппере iif вовсю используется и нормально всегда читалось.
Можно и с if код так написать, что черт ногу потом сломит. А можно и с iif написать понятно.

var
s: string;

if FblStateAdr
then s:= "Lime"
else  s:= "Blue";
s:= Ini.ReadString("Dir","Image", "") + "Comp" + s + ".BMP";

imgComputer.Picture.Bitmap.LoadFromFile(s);

с иифом :

var
s: string;

s:= Ini.ReadString("Dir","Image", "") + "Comp" + IfThen(FblStateAdr, "Lime", "Blue") + ".BMP";

imgComputer.Picture.Bitmap.LoadFromFile(s);


 
Игорь Шевченко ©   (2009-06-23 11:53) [21]

ANB   (23.06.09 11:48) [20]


> Привычки у тебя нету


Я стараюсь от плохих привычек избавляться. Кроме того, клиппер есть клиппер, а паскаль есть паскаль - разные конструкции. В С, например, я  использую оператор ? : и не вижу причин его не использовать.


 
AndreyV ©   (2009-06-23 14:03) [22]

А то, что оба выражения будут вычислены - это не мешает?

Совсем недавно была ветка об операторе "? :" в Си и Iif(). Кстати в Фоксе, неверно и в Клиппере, вычисляется одно, проверял, но немного теперь сомневаюсь.


 
Пит   (2009-06-23 14:31) [23]


> А если учесть, что LoadFromFile тоже вызывает очистку (правда
> несколько иную, чем FreeImage), то FreeImage можно убрать
> и получится
>
>  with imgComputer.Picture.Bitmap do
>    if FblStateAdr then
>      LoadFromFile(Ini.ReadString("Dir","Image", "")  + "CompLime.
> bmp")
>   else
>     LoadFromFile(Ini.ReadString("Dir","Image", "")  + "CompBlue.
> bmp");


это именно привычка. Как привычка выхватывать взглядом begin..end"ы или те же { и }. По мне так гораздо читабельнее:

imgComputer.Picture.Bitmap.LoadFromFile(Ini.ReadString("Dir", "Image", "")  + IIF(FblStateAdr, "CompLime.bmp", "CompBlue.bmp") );

Хотя никто не спорит, что с помозью IIF можно составлять нечитаемые конструкции. Как и с помощью if"а


 
Rouse_ ©   (2009-06-23 16:08) [24]


> По мне так гораздо читабельнее:
>
> imgComputer.Picture.Bitmap.LoadFromFile(Ini.ReadString("Dir",
>  "Image", "")  + IIF(FblStateAdr, "CompLime.bmp", "CompBlue.
> bmp") );

Обычно, после такого кода, следует команда от технического: "переписать все и сделать правильно".


 
Пит   (2009-06-23 16:45) [25]

Я говорил лишь только то, что приведенный мной код считаю читабельнее, чем код приведенный в [14]

Если ты не согласен - готов выслушать мнения )))


 
Rouse_ ©   (2009-06-23 18:09) [26]


> Я говорил лишь только то, что приведенный мной код считаю
> читабельнее, чем код приведенный в [14]
>
> Если ты не согласен - готов выслушать мнения )))

Если бы это было так, я не писал бы [24]


 
Пит   (2009-06-23 18:23) [27]

Не очень понял, что ты имеешь в виду. В общем, есть два варианта:

1.

with imgComputer.Picture.Bitmap do
 if FblStateAdr then
   LoadFromFile(Ini.ReadString("Dir","Image", "")  + "CompLime.bmp")
 else
   LoadFromFile(Ini.ReadString("Dir","Image", "")  + "CompBlue.bmp");


2.

imgComputer.Picture.Bitmap.LoadFromFile(Ini.ReadString("Dir", "Image", "")  + IIF(FblStateAdr, "CompLime.bmp", "CompBlue.bmp") );

Какой тебе код кажется более читабельным? Понятно, что ты хочешь ответить "никакой", но вопрос не в этом.

ИШ считает более читабельным первый вариант, утверждая что IIF только ухудшает читабельность.

Мне более читабельным кажется второй вариант. И я считаю, что IIF при правильном применении улучшает читабельность.
Я сейчас вывожу HTML на дельфи - это само по себе гемор относительно WEB-ориентированных языков, но IIF упрощает на мой взгляд.


 
Пит   (2009-06-23 18:30) [28]

Как пример могу привести вырезку из текущего кода:

case PropInfo.tp of
 tpText: Result := Result + FormatMy(
       "<tr><td>%s</td><td><input type=text name="%s" value="%s" %s %s /></td></tr>",
       [FPropertyList.ValueFromIndex[i], FPropertyList.Names[i],
       HTMLtoSpecialChars( DBFieldAsText(q, i) ),
       IfThen(PropInfo.HTMLSize > 0, "size="+IntToStr(PropInfo.HTMLSize)),
       IfThen(PropInfo.HTMLMaxLength > 0, "maxlength="+IntToStr(PropInfo.HTMLSize)) ]);
...........


Достаточно сильно сокращает запись, а такого кода много.
Ну и плюс читабельность более-менее на уровне имхо (не фонтан, но как сделать лучше выглядящим - не знаю).


 
AndreyV ©   (2009-06-23 19:25) [29]

> [28] Пит   (23.06.09 18:30)
> Достаточно сильно сокращает запись, а такого кода много.

Я, как-то, это подозревал. Сокращение записи хорошо, там, где к месту.


 
Пит   (2009-06-23 19:35) [30]


> Я, как-то, это подозревал. Сокращение записи хорошо, там,
>  где к месту.


очевиднейший факт. Все хорошо там, где к месту.
if хорош к месту, IIF хорош к месту, даже delphi хороша там, где к месту.

Непонятно только одно - что ты этим хотел сказать.

В данном конкретном примере [28] IfThen очень даже хорош. Без него на мой взгляд было бы длиннее и запутаннее.


 
AndreyV ©   (2009-06-23 20:02) [31]

> [30] Пит   (23.06.09 19:35)
Я пропуск сделаю, оригинал перед глазами выще
...
> Непонятно только одно - что ты этим хотел сказать.
>
> В данном конкретном примере [28] IfThen очень даже хорош.
> Без него на мой взгляд было бы длиннее и запутаннее.

Да, ты сократил запись до одного оператора, но я с трудом не смог продраться через этот лес. Это так и надо?


 
AndreyV ©   (2009-06-23 20:21) [32]

> [31] AndreyV ©   (23.06.09 20:02)
> Да, ты сократил запись до одного оператора, но я с трудом
> не смог продраться через этот лес. Это так и надо?

Или надо взять мачету и разбить всё на строки с отступом?:)


 
Rouse_ ©   (2009-06-24 00:26) [33]


> Пит   (23.06.09 18:30) [28]
> Достаточно сильно сокращает запись, а такого кода много.

Ты сам себе деньги платишь и являешся техдиром или ответстенным за сдачу проекта?
Я тебе рассказываю то, что происходит на самом деле в коммерческих проектах.
Перестань уже крутиться среди ветрянных мельниц.


 
ANB   (2009-06-24 10:11) [34]


> Ты сам себе деньги платишь и являешся техдиром или ответстенным
> за сдачу проекта?
> Я тебе рассказываю то, что происходит на самом деле в коммерческих
> проектах.
> Перестань уже крутиться среди ветрянных мельниц.

Вашего бы тех.дира, дам к нам в контору.
Какой ииф вс иф ?????
Приходит код писанный как попало, по 5-10 пустых строк, выравнивание разношерстное.
exception
 when others then
   return 1;
- такое сплошь и рядом.

в лучшем случае :
exception
 when others then
   dbms_output.("Случилась ошибка");
   return 1;

Это коммерческий проект, стоящий весьма приличных бабок.


 
Пит   (2009-06-24 12:37) [35]


> Да, ты сократил запись до одного оператора, но я с трудом
> не смог продраться через этот лес. Это так и надо?

уважаемый Андрей! Все же написано в посте [28], если ты перепишешь данный пример более читабельным - я тебе скажу только спасибо. Я не знаю как это сделать ((

Если совсем непонятно - объясню словами. Данная вырезка кода формирует строчку в HTML-таблице (<tr> ... </tr>). Описание параметра и его название берется из FPropertyList, который TStringList. Значение параметра берется из БД.

Также в структуре PropInfo прописаны некоторые характеристики.
Если PropInfo.HTMLSize больше нуля, то нужно его задать как свойство длины строки ввода. Если не задано (меньше равно нулю), то значит размер должен подбираться автоматически, в терминах HTML это просто отсутствие свойства Size у тега.
Аналогично с PropInfo.HTMLMaxLength.

Перепиши более удобоваримо на твой взгляд?


> Я тебе рассказываю то, что происходит на самом деле в коммерческих
> проектах.
> Перестань уже крутиться среди ветрянных мельниц.

Саааш... Ты сейчас такой, прости пожалуйста (!), галимый понт написал. Я уже несколько лет пишу за деньги. Ну а то что контора - лажа и проект - лажа, ну это понятно, тут обсуждать нечего.

Давай все таки будем общаться по существу. Если ты также как ИШ считаешь IfThen "плохим" оператором - пожалуйста, перепиши плиз пример из [28] в более читабельным виде.

Хочу повторить - то что проект полностью уродский, неправильно спроектированный и т.д. - это очевидно, это можно не писать.


 
AndreyV ©   (2009-06-24 13:22) [36]

> [35] Пит   (24.06.09 12:37)
>
> > Да, ты сократил запись до одного оператора, но я с трудом
> > не смог продраться через этот лес. Это так и надо?
>
> уважаемый Андрей! Все же написано в посте [28], если ты
> перепишешь данный пример более читабельным - я тебе скажу
> только спасибо. Я не знаю как это сделать ((
...
расшифровку опускаю

Хорошо. Для простоты будем считать, что одновременно формируем один HTML.

Да хоть вот так бы, в таоём случае, определил бы парные функции с соответсвующими параметрами, для упрощения стороковые, и то уже лучше

Псевдокод в стиле Си++

hHTML OpenHTML(string s);
void CloseHTML(hHTML);

void OpenTag(string name, string s = "");
void CloseTag(string s);

Формирование
hHTML h = OpenHTML("MyHTML");
 OpenTag("MyTag1");
   OpenTag("MyTag2", MyFormat(...));
   CloseTag("MyTag2");
 CloseTag("MyTag1");
CloseHTML(h);


 
Пит   (2009-06-24 13:43) [37]


> Формирование
> hHTML h = OpenHTML("MyHTML");
>  OpenTag("MyTag1");
>    OpenTag("MyTag2", MyFormat(...));
>    CloseTag("MyTag2");
>  CloseTag("MyTag1");
> CloseHTML(h);


во-первых, не кажется ли тебе что этот набор комманд (кстати, с явно нестандартным форматированием) можно переписать куда проще:

HTML := Format(
   "<html><MyTag1><MyTag2>%s</MyTag2></MyTag1></html>",
   [...]);

Эта запись будет наверняка куда привычнее людям, которые работают с HTML и полюбому в свое время писали в том же блокноте.

Впрочем, мы начинаем каждый о своем. Я привел конкретный пример  в [28]. Ты сказал нечитабельно. Перепиши плиз ТОТ ЖЕ ФУНКЦИОНАЛ более читабельно. Вот и все, это же просто?

Я сам считаю, что с позиции некоего идеала написано криво. Но лично я не могу написать более читабельно. Более того, я уж привык к такой конструкции и она мне кажется вполне читабельной. Но это ладно, лирика.

Перепишите приведенный пример в более удобном виде - я только за. Я не смог.


 
AndreyV ©   (2009-06-24 13:55) [38]

> [37] Пит   (24.06.09 13:43)
> Перепишите приведенный пример в более удобном виде - я только
> за. Я не смог.

Напрягаться переписыванием мне сейчас не хочется.

Ну чем тебе не шаблон. И вспомнив о теме топика, не находишь, что вставленные условия if then else, будут куда читабельнее. Впрочем ты сам сказал, что тебе по-твоему удобнее.


 
ANB   (2009-06-24 14:04) [39]


> hHTML h = OpenHTML("MyHTML");
>  OpenTag("MyTag1");
>    OpenTag("MyTag2", MyFormat(...));
>    CloseTag("MyTag2");
>  CloseTag("MyTag1");
> CloseHTML(h);

Жуть.
1) У ПИТа все намного легче читается.
2) Тут еще придется репу чесать - а как оно в виде HTML получиться.


 
Пит   (2009-06-24 14:07) [40]

напрягаться? Ну хз, в реальном проекте я этот кусок кода написал за пару минут не более. Это, видимо, еще один плюс данного подхода.

Мне уже и так советовали, и так советовали. Но никто не желает переписать пример в [28] )))

Давайте если будет пример - обсудим. А так какая-то чистая теория получается.



Страницы: 1 2 вся ветка

Текущий архив: 2009.08.23;
Скачать: CL | DM;

Наверх




Память: 0.59 MB
Время: 0.015 c
4-1213946298
GanibalLector
2008-06-20 11:18
2009.08.23
TAPI и состояние счета


15-1245911928
desc
2009-06-25 10:38
2009.08.23
Не получается "слиять" два поля... Postgres


15-1246004611
Knight
2009-06-26 12:23
2009.08.23
Скрин не передаётся по сети..


15-1245517111
Инкогнито
2009-06-20 20:58
2009.08.23
Возможность получить подсказку


6-1200297698
JanMihail
2008-01-14 11:01
2009.08.23
Как подождать загрузки WebBrowser a