во-вторых процесс написания кода занимает 0,001% всего времени
Если писать как ты — да, времени отнимать не будет. Только читаемость как раз-таки твоего кода нулевая. У меня 4(!) лаконичные строчки, при всём желании не заблудишься (если не знаешь, что такое auto_ptr или оператор %, то ты просто не знаешь C++, а не алгоритм сложный). У тебя же несколько десятков строчек (и ты ещё не всё показал), треть которых не нужна совершенно (преобразование между строками и массивами, инициализация зерна псевдослучайных чисел на каждом вызове функции, коды возвратов), другая треть переизобретает велосипед стандартных операций копирования памяти (и, замечу, далеко не самым эффективным способом с точки зрения скорости), в остатке имеем треть некачественного кода, которая позволяет записывать в файл с паролем другим программам, но не позволяет его читать.
Димониус, фокус с auto_ptr в Дельфях не пройдёт — придётся удалять вручную, а это одна лишняя строчка. ;) В остальном — да, разница только в определении переменных.
Ну строго говоря можно ограничится и fmCreate ибо вероятность, что кому-то этот файл понадобиться 0.0000000000000000000000000000000001.
Белтар, строго говоря, ты эту ошибку, скорее всего, допустил не только в этом месте. И по закону Мерфи именно там именно этот файл кому-то понадобится. :р
Обертка ф-ии в try это бредятина, каких свет не видел.
Гы. :)
У тебя обёртка в if (а вызывать функцию предполагается так, если я правильно понимаю) чем лучше? Вот чем хуже — перечислить нетрудно. Во-первых, оборачивать тебе придётся каждую функцию, в то время как try ты можешь обернуть последовательность. Во-вторых, твой false не несёт совершенно никакой информации о возникшей проблеме, если же ты используешь исключения, то программа тебе ясно скажет, что произошла ошибка записи, например.
Белтар, как напишешь — настолько читаемо и будет. Вот твои макароны читать сложно.
Толкаемый MS.
Мелкомягкие толкают всё, что движется. Над плюсами, кстати, они безжалостно надругались, вогнав их в дотнеты, поэтому то, что они сейчас продвигают, имеет весьма отдалённое отношение к плюсам (что, впрочем, не мешает им развивать и нормальные плюсы).
Кстати, почему ты до сих пор пользуешься Виндами, а не Линуксом? А Вордом? Их же Мелкомягкие «толкают». :р
Athari писал: Мя[ут], «очень много факторов» — это, несомненно, полезная информация, которую можно применить на практике.
Я ж обзорно говорю. По поводу безопасности исключений - это надо в соотв. литературу обращаться. Хотя бы к Меерсу / Саттеру.
Beltar, я так понимаю вы намекаете, что C++ - приблуда MS. Ошибаетесь, комитет по стандартизации ISO - относительно независимая организация, пускай там и присутствуют представители от MS.
Is this the end of everything?
Dimonius леффка Сообщений: 10303 Город: Москва 26.08.2007 20:50
Мя[ут], наличие консорциума W3C никак не мешало Микрософту делать свой Microsoft HTML совместимый с обычным HTML процентов на 50... Вопрос расскажи это людям, у которых сайт не открывается...
Алгоритмическая задачка. Вот форма, как видно часть контролов на ней, которые не используются в выбранном отчете дизэйблится. Как реализовать это используя <число контролов>+1 строк кода? :)
За что же ТЫ ненавидишь Симбу? Про SP вот и <a href="http://www.pridelands.ru/?p=texts&a=get&id=328" target="blank">вот<
и рекурсией повесить на события изменения. Функция может получиться длинной, если классов много, но её надо будет написать только один раз. Можно и вручную события назначать, но мне лень. :)
P.S. Только сейчас возникла мысль о трёхуровневой организации…
Э-э? Ты как понял? Я спрашиваю, как реализовать простейшим способом дизейблинг при переключении вида отчета. У меня их, как видишь 4 и примитивный case\Switch дадут 60+ строк уродского кода.
За что же ТЫ ненавидишь Симбу? Про SP вот и <a href="http://www.pridelands.ru/?p=texts&a=get&id=328" target="blank">вот<
Athari, твой код имхо делается проще: на каждый из "важных" контролов вешается обработчик, передергивающий состояние контролов.
Белтару нужно чтобы оно передергивалось по выбору режима.
P.S. уродливая все таки вещица VCL =) Из дельфи портированная со всеми вытекающими. По идее можно было извратнуться с MPL или хотя бы лямбда-функциями. =) Но это VCL. В голову только приходит карта 4*60 энейблинга/дисаблинга контролов.
Is this the end of everything?
Beltar Смотрю я на вас и думаю... Сообщений: 3251 Город: 13.09.2007 19:11
на каждый из "важных" контролов вешается обработчик, передергивающий состояние контролов
Мяут, каким местом проще? У тебя будет точь-в-точь тот же самый код, только расфасованный по десятку (или десяткам) событий. Глаза же будут разбегаться. А добавишь новый элемент в иерархии — вперёд, выискивай все зависимости. В одной же функции это сделать гораздо проще.
По идее можно было извратнуться с MPL или хотя бы лямбда-функциями.
Первое дешифруй. А второе в настолько тривиальной задаче — именно извращение.
Ты правильно понял. Надо сделать это без Switch\case, который здесь был бы на 4 значения по 15 строк на каждое, что очень некрасиво.
Белтар, я не вижу очевидной зависимости между списком слева и элементами управления справа.
Напиши один (лучше два) case. (Надеюсь, имена элементов управления нормальные? Если нет, то подпиши имена на скриншоте.)
я не вижу очевидной зависимости между списком слева и элементами управления справа.
Ну что неясного?? Я выбираю слева вид отчета, элементы управления для выбранного отчета ненужные отключаются, а нужные включаются (можно было и так же менять видимость). Нужно написать код для этого как можно короче, а не
case ButtonGroup1.Itemidex of
0:begin
seYear.Enabled:=true;
...
end;
1:begin
seYear.Enabled:=false;
...
end;
2:...
3:...
end
За что же ТЫ ненавидишь Симбу? Про SP вот и <a href="http://www.pridelands.ru/?p=texts&a=get&id=328" target="blank">вот<
Mkiwa гепард с вершины Килиманджаро Сообщений: 3709 Город: Москва 14.09.2007 00:14
Beltar, зависимость активности контролов от выбранного типа отчёта в общем случае произвольна, каких-либо групп активности нет. То есть действительно имеем битовую матрицу 4*15, где элемент (i,j) задаёт то, активен ли элемент j в отчёте i.
Закодировать такую матрицу можно по-разному. Можно действительно большим свитчем. Для программирования интерфейса - сойдёт.
Можно задать реальную матрицу bool[4,15] и потом для каждого контрола enabled = значение соответствующей клетки. Если задавать матрицу на одной строчке, то действительно получится 15+1 строк кода.
Я бы, наверное, сделал компромиссный вариант. Написал бы функцию, принимающую на вход булевский массив из 15 элементов, и включающую/выключающую контролы. А потом бы в зависимости от выбранного типа отчёта вызывал бы эту функцию с тем или иным вектором. Получился бы один свитч из 4 элементов + функция из 15 строк. Длиннее, но я не люблю многомерные массивы. А при программировании интерфейсов чем понятнее и кондовее код - тем лучше.
Ну и, наконец, можно использовать какую-нибудь content-management систему, Где эти контролы будут аккуратно лежать в массиве "свойств формы", и доступны по номеру а не по имени. Тогда можно использовать матрицу + один цикл по контролам от 1 до 15.
Beltar Смотрю я на вас и думаю... Сообщений: 3251 Город: 14.09.2007 08:11
Тогда можно использовать матрицу + один цикл по контролам от 1 до 15.
Ну и в Delphi я могу у формы свойство Controls перебрать, или просто сложить все на панель, чтобы лишнего не попадало, в любом случае придется делать case для каждого контрола да еще и явно тип приводить.
Короче, реально написанный мной код.
procedure TfmReports.BGClick(Sender: TObject);
begin
SetEnabled;
end;
procedure TfmReports.SetEnabled;
var Mask:Integer;
begin
Mask:=1 shl BG.ItemIndex;
cbObl.Enabled:=(cbObl.Tag and Mask)>0;
seYear.Enabled:=(seYear.Tag and Mask)>0;
cbCheck.Enabled:=(cbCheck.Tag and Mask)>0;
cbAtt.Enabled:=(cbAtt.Tag and Mask)>0;
cbCal.Enabled:=(cbCal.Tag and Mask)>0;{невидимый в рун-тайм}
RG2.Enabled:=(RG2.Tag and Mask)>0;
cbMonth.Enabled:=(cbMonth.Tag and Mask)>0;
DTP1.Enabled:=(DTP1.Tag and Mask)>0;
DTP2.Enabled:=(DTP2.Tag and Mask)>0;
RG.Enabled:=(RG.Tag and Mask)>0;
cbFactory.Enabled:=(cbFactory.Tag and Mask)>0;
cbDivision.Enabled:=(cbDivision.Tag and Mask)>0;
cboxZone.Enabled:=(cboxZone.Tag and Mask)>0;
cbZone.Enabled:=(cbZone.Tag and Mask)>0;
cbOrg.Enabled:=(cbOrg.Tag and Mask)>0;
end;
i-ый бит тега контрола, 1 если контрол входит в i-ый отчет и 0 в противном случае. Все. :) Причем код не изменится, если будет не 4, а больше вариантов. Матрица 4х15 проще, но ведь ее еще надо хранить как константу. Т. е. 4 стр на ее объявление и опять-таки забивать в тег номер контрола, обращаясь:
i:=BG.ItemIndex;
Control.Enabled:=M[i,Control.Tag]; т. е. <число контролов>+1 стр + 4 на матрицу.
За что же ТЫ ненавидишь Симбу? Про SP вот и <a href="http://www.pridelands.ru/?p=texts&a=get&id=328" target="blank">вот<
Форум pridelands.ru >> Творчество любителей Delphi, C++, HTML, PHP и др.