Вверх ↑
Этот топик читают: Гость
Ответов: 817
Рейтинг: 52
#16: 2015-07-09 10:17:41 ЛС | профиль | цитата
nesco писал(а):
Прикол If_else в том, что он тип распознает по первой точке, и Null на первой точке он будет считать целым

Стесняюсь просить, это какая то недокументированная возможность?
Ни в одной справке этого не встречал
карма: 1

0
Ответов: 16884
Рейтинг: 1239
#17: 2015-07-09 10:29:01 ЛС | профиль | цитата
Да, блин, читателей нет. Одни писатели.
-= DriveR =-, решение твоей задачи я выложил ещё на первой странице.
-= DriveR =- писал(а):
Стесняюсь просить, это какая то недокументированная возможность?
Ни в одной справке этого не встречал
Об этом неоднократно говорилось на этом форуме.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 2200
Рейтинг: 673
#18: 2015-07-09 10:34:52 ЛС | профиль | цитата
Tad писал(а):
решение твоей задачи я выложил ещё на первой странице
Это не решение, это костыль. Объясню почему, два раза перебирать массив это не правильно. В вашем примере (как и в моем предыдущем) вначале перебирается массив для проверки, на наличие флажков. А потом если они есть, еще раз перебирается для работы с этим массивом.
Вот правильное решение: code_35991.txt
карма: 11

1
Голосовали:-= DriveR =-
Ответов: 16884
Рейтинг: 1239
#19: 2015-07-09 10:56:19 ЛС | профиль | цитата
sla8a писал(а):
два раза перебирать массив это не правильно.
И где это массив перебирается два раза?
Нет там массива. Есть MT-строка.
А так как Len это не MT-компонент, то он читает ТОЛЬКО ПЕРВЫЙ.
(не веришь - поставь _debug() в Len и посмотри)
А заодно объясни зачем там DoData ?
Вывод: Что больше похоже на костыль - вопрос спорный.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 2200
Рейтинг: 673
#20: 2015-07-09 11:12:36 ЛС | профиль | цитата
Tad писал(а):
И где это массив перебирается два раза?
Нет там массива. Есть MT-строка.
Объясню подробней:
1. Вы запрашиваете у MST_CheckBoxes с AllCheck МТ-строку содержащую индексы выделенных флажков.
2. MST_CheckBoxes перебирает массив for i := 0 to sControl.Count - 1 do и выдает вам МТ-строку.
3. Вы проверяете эту МТ-строку и обнаружев что хотябы один флажек включен, сново запрашиваете с AllCheck МТ-строку.
4. MST_CheckBoxes сново перебирает массив for i := 0 to sControl.Count - 1 do и выдает туже самую МТ-строку для её перебора.
Вот и зачем нужно два раза запрашивать МТ-строку, если можно проще:
Запросить МТ-строку и если она не пустая, отдать её на перебор. Без второго запроса.
Tad писал(а):
А заодно объясни зачем там DoData ?
А DoData запускает МТ-строку в поток, чтоб с ней поочередно мог работать компоненты If_Else и потом если не Null, то эта МТ-строка дойдет и до МТ-Enum.
карма: 11

0
Ответов: 186
Рейтинг: 9
#21: 2015-07-09 11:31:50 ЛС | профиль | цитата
sla8a писал(а):
Вот правильное решение: code_35991.txt

sla8a, Тоже считаю данное решение оптимальным, а с этой фишкой IF_Else сталкивался, но забыл
карма: 0

0
Ответов: 16884
Рейтинг: 1239
#22: 2015-07-09 11:39:23 ЛС | профиль | цитата
С пунктами 1..4 полностью согласен. Просто не смотрел в коды AllCheck.
sla8a писал(а):
DoData запускает МТ-строку в поток, чтоб с ней поочередно мог работать компоненты If_Else и потом если не Null, то эта МТ-строка дойдет и до МТ-Enum.
DoData и MT_Add немного разные компоненты.
Tad писал(а):
А заодно объясни зачем там DoData ?
Я про DoData после МТ-Enum.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 2200
Рейтинг: 673
#23: 2015-07-09 11:51:31 ЛС | профиль | цитата
Tad писал(а):
DoData после МТ-Enum.
-= DriveR =- туда поставил, а я и не обратил внимание. Конечно DoData там пятое колесо.
------------ Дoбавленo в 11.51:
Chipset писал(а):
с этой фишкой IF_Else сталкивался, но забыл
И мне припоминается подобное, но слишком много у If_Else "фич" (или правильней "фичей" )
карма: 11

0
Разработчик
Ответов: 26066
Рейтинг: 2120
#24: 2015-07-09 12:01:39 ЛС | профиль | цитата
sla8a писал(а):
И мне припоминается подобное

Это испокон веков так было у этого компонента. Все это прописано в модуле If_arg, который используется в If_Else и Case

function Compare(Op1,Op2:TData; OpType:byte ):boolean;
var
i:integer;
r:real;
s:string;
begin
Result := false;
case _IsType(op1) of

Как видно из кода, тип определяется первым аргументом
карма: 22

0
Ответов: 16884
Рейтинг: 1239
#25: 2015-07-09 12:28:55 ЛС | профиль | цитата
nesco писал(а):
Как видно из кода, тип определяется первым аргументом
И то же следует из описания точки
doCompare=Сравнивает первый операнд со вторым. Тип сравнения определяется параметром Type|1|
Первый со вторым, а не наоборот.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 2200
Рейтинг: 673
#26: 2015-07-09 12:36:18 ЛС | профиль | цитата
Ну раз все так понятно и логично, то почему регулярно возникают такие "заморочки"?
Вот на первой странице видно что и nesco не сразу разобрался почему не работает If_Else.
карма: 11

0
Разработчик
Ответов: 26066
Рейтинг: 2120
#27: 2015-07-09 12:42:25 ЛС | профиль | цитата
sla8a писал(а):
Вот на первой странице видно что и nesco не сразу разобрался почему не работает If_Else.

Я сначала вообще не понял задачу, пока не запустил тестовый пример
карма: 22

0
Ответов: 2200
Рейтинг: 673
#28: 2015-07-09 12:47:19 ЛС | профиль | цитата
nesco писал(а):
Я сначала вообще не понял задачу, пока не запустил тестовый пример

nesco, ну вот зачем вы увиливаете? Да вы вначале не поняли, согласен, но потом предложили схему где вообще задействовали ArraySum (от прямого использования If_Else вы отказались), и только потом вернулись к If_Else.

Не могу утверждать каким ходом шли ваши размышления, но по постам видно, что вы тоже не сразу поняли проблему "не правильной" работы If_Else.
карма: 11

0
Разработчик
Ответов: 26066
Рейтинг: 2120
#29: 2015-07-09 13:07:07 ЛС | профиль | цитата
sla8a писал(а):
что вы тоже не сразу поняли проблему "не правильной" работы If_Else

Я сначала вообще не обратил внимания куда там что подключено, тк была мысль проверить что-то альтернативное. А вот когда выложил схему с ArrySum, то возникла мысль -- СТОП, а почему If_Else не работает, а ведь должен? Проверил -- точно, подключено на первую точку, что означает, что срабатывать будет и на Null и на 0.
Если ты заметил, то решение с If_Else я выложил практически сразу же после альтернативной схемы.
карма: 22

0
Ответов: 9906
Рейтинг: 351
#30: 2015-07-10 12:00:05 ЛС | профиль | цитата
А я вообще не понял, зачем вы тренируетесь в сравнениях...
И так же работает, вроде
Add(MainForm,3063237,238,91)
{
Width=409
Height=286
Position=1
link(onCreate,1976442:doEnum,[])
}
Add(MTStrTbl,15043066,392,35)
{
Width=390
Height=210
Name="MTStrTbl"
Columns=#3:Имя|7:Фамилия|8:Отчество|
CheckBoxes=0
}
Add(StrList,4383086,280,35)
{
Strings=#20:Иван;Иванов;Иванович|24:Андрей;Андреев;Андреевич|21:Гадя;Хренова;Петрович|
}
Add(ArrayEnum,1976442,294,105)
{
link(onItem,16356153:doMT,[])
link(Array,4383086:Array,[])
}
Add(MST_RowAction,15395190,392,98)
{
MSTControl="MTStrTbl"
}
Add(MT_String,16356153,343,98)
{
link(onResult,15395190:doRowAction,[])
}
Add(MST_CheckBoxes,9099572,294,168)
{
MSTControl="MTStrTbl"
}
Add(MST_RowAction,2680349,392,238)
{
Action=3
MSTControl="MTStrTbl"
}
Add(MT_Enum,5834739,301,238)
{
Type=1
link(onItem,2680349:doRowAction,[])
link(MT,9099572:AllCheck,[])
}
Add(Button,7465548,238,238)
{
Left=5
Top=220
Width=85
Caption="Удалить"
link(onClick,5834739:doEnum,[])
}
карма: 9

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)