Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2009.08.23;
Скачать: [xml.tar.bz2];

Вниз

Существует в Дельфи функция 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.57 MB
Время: 0.006 c
15-1245766056
Кто б сомневался
2009-06-23 18:07
2009.08.23
Машина времени


15-1245949320
Илья_
2009-06-25 21:02
2009.08.23
Сборка компьютера


15-1244032296
Игорь Шевченко
2009-06-03 16:31
2009.08.23
сделать для формы (фрейма, WinControl) аналог Begin/EndUpdatе


15-1245702601
Юрий
2009-06-23 00:30
2009.08.23
С днем рождения ! 23 июня 2009 вторник


15-1245914217
DVM
2009-06-25 11:16
2009.08.23
Good Quality Applications Built With Delphi





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский