Главная
 Новости
 История
 Персонажи
 Картинки
 Видео
 Звуки
 Музыка
 Игры
 Игры OnLine
 Стафф
 Скачать
 PrideRock 3D
 Дикие кошки
 Библиотека
 Словарик
 Фэн-клуб
 Тусовки
 Чат
 Форум
 Гостевая книга
 Ссылки
 Поиск
 Копирайты
   Форум фэнов The Lion King   

Логин:      Пароль:     [ Регистрация | Поиск ]
Форум pridelands.ru >> Творчество любителей Delphi, C++, HTML, PHP и др.Страницы: [<<<][ 1.. | 11 | 12 | 13 | 14 | 15 | 16 | 17 ][>>>]

Автор Сообщение
Athari
снежный барс
Сообщений: 12966
Город: Казань

24.08.2007 14:40
Инфо | icq | web | цитировать | линк
Если во WritePswd преобразование строки в байтовый массив работало нормально

Как же я люблю Си… 8|

Белтар, не понял, что твой код должен вытворять. XOR’ить строку ключом? У тебя там ещё один XOREncoding, пожирающий в Key array of byte есть?

Зачем вообще столько изврата? Чем тебя memcpy (ну или как там, в Дельфях, CopyMemory?) не удовлетворяет?

 
 
 
Athari
снежный барс
Сообщений: 12966
Город: Казань

24.08.2007 16:33
Инфо | icq | web | цитировать | линк
Белтар, почувствуй разницу…
  void WritePassword (String str)
{
  auto_ptr<TFileStream> f(new TFileStream(filename,
fmCreate | fmShareDenyWrite));
  for (int i=1; i<=str.Length(); ++i)
    str[i] ^= key[i%key.Length()+1];
  f.Write(str.c_str(), str.Length());
}
Зачем так много кода на подобную мелочь?

 
 
 
Dimonius
леффка
Сообщений: 10303
Город: Москва

24.08.2007 16:58
Инфо | e-mail | icq | web | цитировать | линк
Athari, на Delphi точно так же можно написать :) И работать будет нисколько не медленее
 
 
 
Athari
снежный барс
Сообщений: 12966
Город: Казань

24.08.2007 17:04
Инфо | icq | web | цитировать | линк
Димониус, всё равно строчек кода больше понадобится. :р
 
 
 
Athari
снежный барс
Сообщений: 12966
Город: Казань

24.08.2007 20:08
Инфо | icq | web | цитировать | линк
Ну во-первых ты забыл исключения и результат функции

Белтар, просто я предполагаю другое использование функции — вместо архаичного
  if (f())
ShowMessage("Пароль сохранён! :-)");
else
ShowMessage("Что-то заглючило, поди узнай что! :-(");
// код ошибки отсутствует
}
нормальную ловлю исключений
  try {
f();
ShowMessage("Пароль сохранён! :-)");
}
catch (Exception& e) {
ShowMessage("Глюк при сохранении: " + e.Msg + " :-(");
}
(ну, утрируя).

во-вторых процесс написания кода занимает 0,001% всего времени

Если писать как ты — да, времени отнимать не будет. Только читаемость как раз-таки твоего кода нулевая. У меня 4(!) лаконичные строчки, при всём желании не заблудишься (если не знаешь, что такое auto_ptr или оператор %, то ты просто не знаешь C++, а не алгоритм сложный). У тебя же несколько десятков строчек (и ты ещё не всё показал), треть которых не нужна совершенно (преобразование между строками и массивами, инициализация зерна псевдослучайных чисел на каждом вызове функции, коды возвратов), другая треть переизобретает велосипед стандартных операций копирования памяти (и, замечу, далеко не самым эффективным способом с точки зрения скорости), в остатке имеем треть некачественного кода, которая позволяет записывать в файл с паролем другим программам, но не позволяет его читать.

 
 
 
Dimonius
леффка
Сообщений: 10303
Город: Москва

24.08.2007 21:31
Инфо | e-mail | icq | web | цитировать | линк
Athari, только если считать описание переменных за отдельную строку :) Иначе код модно чуть ли не 1:1 переписать на дельфя
 
 
 
Athari
снежный барс
Сообщений: 12966
Город: Казань

24.08.2007 21:43
Инфо | icq | web | цитировать | линк
Димониус, фокус с auto_ptr в Дельфях не пройдёт — придётся удалять вручную, а это одна лишняя строчка. ;) В остальном — да, разница только в определении переменных.
 
 
 
Athari
снежный барс
Сообщений: 12966
Город: Казань

24.08.2007 23:01
Инфо | icq | web | цитировать | линк
Ну строго говоря можно ограничится и fmCreate ибо вероятность, что кому-то этот файл понадобиться 0.0000000000000000000000000000000001.

Белтар, строго говоря, ты эту ошибку, скорее всего, допустил не только в этом месте. И по закону Мерфи именно там именно этот файл кому-то понадобится. :р

Обертка ф-ии в try это бредятина, каких свет не видел.

Гы. :)

У тебя обёртка в if (а вызывать функцию предполагается так, если я правильно понимаю) чем лучше? Вот чем хуже — перечислить нетрудно. Во-первых, оборачивать тебе придётся каждую функцию, в то время как try ты можешь обернуть последовательность. Во-вторых, твой false не несёт совершенно никакой информации о возникшей проблеме, если же ты используешь исключения, то программа тебе ясно скажет, что произошла ошибка записи, например.

А Си я на дух не переношу.

Почему? :) Слишком мощный язык? :)

 
 
 
Мя[ут]
Медвед :)
Сообщений: 896
Город: г. Пушкин

24.08.2007 23:08
Инфо | e-mail | icq | web | цитировать | линк

Beltar писал:
Обертка ф-ии в try это бредятина,

Ты, знаешь, по безопасности исключений немало статей написано, так что там очень много факторов влияет на расположение try-блоков.

 
 
 
Is this the end of everything?
Athari
снежный барс
Сообщений: 12966
Город: Казань

24.08.2007 23:11
Инфо | icq | web | цитировать | линк
Мя[ут], «очень много факторов» — это, несомненно, полезная информация, которую можно применить на практике.
 
 
 
Beltar
Смотрю я на вас и думаю...
Сообщений: 3251
Город:

24.08.2007 23:18
Инфо | e-mail | цитировать | линк
................................................
......................................
<Удалил все>

 
 
 
За что же ТЫ ненавидишь Симбу? Про SP вот и <a href="http://www.pridelands.ru/?p=texts&a=get&id=328" target="blank">вот<
Athari
снежный барс
Сообщений: 12966
Город: Казань

24.08.2007 23:27
Инфо | icq | web | цитировать | линк
Нечитаемый.

Белтар, как напишешь — настолько читаемо и будет. Вот твои макароны читать сложно.

Толкаемый MS.

Мелкомягкие толкают всё, что движется. Над плюсами, кстати, они безжалостно надругались, вогнав их в дотнеты, поэтому то, что они сейчас продвигают, имеет весьма отдалённое отношение к плюсам (что, впрочем, не мешает им развивать и нормальные плюсы).

Кстати, почему ты до сих пор пользуешься Виндами, а не Линуксом? А Вордом? Их же Мелкомягкие «толкают». :р

 
 
 
Мя[ут]
Медвед :)
Сообщений: 896
Город: г. Пушкин

25.08.2007 00:07
Инфо | e-mail | icq | web | цитировать | линк

Athari писал:
Мя[ут], «очень много факторов» — это, несомненно, полезная информация, которую можно применить на практике.

Я ж обзорно говорю. По поводу безопасности исключений - это надо в соотв. литературу обращаться. Хотя бы к Меерсу / Саттеру.

Beltar, я так понимаю вы намекаете, что C++ - приблуда MS. Ошибаетесь, комитет по стандартизации ISO - относительно независимая организация, пускай там и присутствуют представители от MS.

 
 
 
Is this the end of everything?
Dimonius
леффка
Сообщений: 10303
Город: Москва

26.08.2007 20:50
Инфо | e-mail | icq | web | цитировать | линк
Мя[ут], наличие консорциума W3C никак не мешало Микрософту делать свой Microsoft HTML совместимый с обычным HTML процентов на 50... Вопрос расскажи это людям, у которых сайт не открывается...
 
 
 
Athari
снежный барс
Сообщений: 12966
Город: Казань

26.08.2007 20:56
Инфо | icq | web | цитировать | линк
Димониус, так alt добавишь?
 
 
 
Beltar
Смотрю я на вас и думаю...
Сообщений: 3251
Город:

13.09.2007 10:59
Инфо | e-mail | цитировать | линк
Алгоритмическая задачка. Вот форма, как видно часть контролов на ней, которые не используются в выбранном отчете дизэйблится. Как реализовать это используя <число контролов>+1 строк кода? :)
 
 
 
За что же ТЫ ненавидишь Симбу? Про SP вот и <a href="http://www.pridelands.ru/?p=texts&a=get&id=328" target="blank">вот<
Athari
снежный барс
Сообщений: 12966
Город: Казань

13.09.2007 16:18
Инфо | icq | web | цитировать | линк
Белтар, можно тривиально:
    ListMonth->Enabled = RadioButtonMonth->Checked;
ListOrganization->Enabled = CheckBoxOnly->Checked &&
ListBoxSector->ItemIndex != -1;
Можно с перегруженными функциями, чтобы сэкономить на символах в случае большого количества элементов управления и двухуровневой организации:
    void EnableControl (TControl* ctl, bool en)
{ ctl->Enabled = en; }
void EnableControl (TControl* ctl, TCheckBox* chk)
{ ctl->Enabled = chk->State != csUnchecked; }
void EnableControl (TControl* ctl, TRadioButton* rbt)
{ ctl->Enabled = rbt->Checked; }

(...)

EnableControl(LBMonth, RBMonth);
EnableControl(LBOrg, CBOrg);
А, да. Всё это обновление засунуть в функцию а-ля
    void __fastcall UpdateControls (TObject*)
и рекурсией повесить на события изменения. Функция может получиться длинной, если классов много, но её надо будет написать только один раз. Можно и вручную события назначать, но мне лень. :)

P.S. Только сейчас возникла мысль о трёхуровневой организации…
    template <class T1, class T2>
void EnableControl (TControl* ctl, T1* t1, T2* t2)
{
bool b1 = (EnableControl(ctl, t1), ctl->Enabled),
b2 = (EnableControl(ctl, t2), ctl->Enabled);
EnableControl(ctl, b1 && b2);
}
Не очень элегантно, но для интерфейсных бубенцов сойдёт.

[Добавлено 13.09.2007 16:27:23]:

Вариант с функциями можно ещё укоротить. :)
    #define FUN_ENCTRL(cls, cond) \
void EnableControl (TControl* ctl, T##cls cls, bool rev) \
{ ctl->Enabled = (cls->cond) ^ rev; }
FUN_ENCTRL(CheckBox, State != csUnchecked)
FUN_ENCTRL(RadioButton, Checked)
FUN_ENCTRL(ListBox, ItemIndex != -1)
(...)
Разумеется, это для самых распространённых случаев. Иногда придётся по старинке писать, без функций.

 
 
 
Beltar
Смотрю я на вас и думаю...
Сообщений: 3251
Город:

13.09.2007 16:27
Инфо | e-mail | цитировать | линк
Э-э? Ты как понял? Я спрашиваю, как реализовать простейшим способом дизейблинг при переключении вида отчета. У меня их, как видишь 4 и примитивный case\Switch дадут 60+ строк уродского кода.
 
 
 
За что же ТЫ ненавидишь Симбу? Про SP вот и <a href="http://www.pridelands.ru/?p=texts&a=get&id=328" target="blank">вот<
Athari
снежный барс
Сообщений: 12966
Город: Казань

13.09.2007 16:32
Инфо | icq | web | цитировать | линк
Белтар, я понял так: элемент управления должен отображаться включённым, если он на что-то влияет, иначе отключённым.

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

 
 
 
Мя[ут]
Медвед :)
Сообщений: 896
Город: г. Пушкин

13.09.2007 17:41
Инфо | e-mail | icq | web | цитировать | линк
Athari, твой код имхо делается проще: на каждый из "важных" контролов вешается обработчик, передергивающий состояние контролов.

Белтару нужно чтобы оно передергивалось по выбору режима.

P.S. уродливая все таки вещица VCL =) Из дельфи портированная со всеми вытекающими. По идее можно было извратнуться с MPL или хотя бы лямбда-функциями. =) Но это VCL. В голову только приходит карта 4*60 энейблинга/дисаблинга контролов.

 
 
 
Is this the end of everything?
Beltar
Смотрю я на вас и думаю...
Сообщений: 3251
Город:

13.09.2007 19:11
Инфо | e-mail | цитировать | линк
2 Athari:

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


Ты правильно понял. Надо сделать это без Switch\case, который здесь был бы на 4 значения по 15 строк на каждое, что очень некрасиво.

на каждый из "важных" контролов вешается обработчик, передергивающий состояние контролов.


Процедура всего одна и вызывается она только при первом показе формы и в обработчике выбора нового значения в группе кнопок слева.

 
 
 
За что же ТЫ ненавидишь Симбу? Про SP вот и <a href="http://www.pridelands.ru/?p=texts&a=get&id=328" target="blank">вот<
Athari
снежный барс
Сообщений: 12966
Город: Казань

13.09.2007 19:46
Инфо | icq | web | цитировать | линк
на каждый из "важных" контролов вешается обработчик, передергивающий состояние контролов

Мяут, каким местом проще? У тебя будет точь-в-точь тот же самый код, только расфасованный по десятку (или десяткам) событий. Глаза же будут разбегаться. А добавишь новый элемент в иерархии — вперёд, выискивай все зависимости. В одной же функции это сделать гораздо проще.

По идее можно было извратнуться с MPL или хотя бы лямбда-функциями.

Первое дешифруй. А второе в настолько тривиальной задаче — именно извращение.

Ты правильно понял. Надо сделать это без Switch\case, который здесь был бы на 4 значения по 15 строк на каждое, что очень некрасиво.

Белтар, я не вижу очевидной зависимости между списком слева и элементами управления справа.

Напиши один (лучше два) case. (Надеюсь, имена элементов управления нормальные? Если нет, то подпиши имена на скриншоте.)

 
 
 
Beltar
Смотрю я на вас и думаю...
Сообщений: 3251
Город:

13.09.2007 20:55
Инфо | e-mail | цитировать | линк
я не вижу очевидной зависимости между списком слева и элементами управления справа.


Ну что неясного?? Я выбираю слева вид отчета, элементы управления для выбранного отчета ненужные отключаются, а нужные включаются (можно было и так же менять видимость). Нужно написать код для этого как можно короче, а не
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
Инфо | e-mail | цитировать | линк
Тогда можно использовать матрицу + один цикл по контролам от 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 и др.Страницы: [<<<][ 1.. | 11 | 12 | 13 | 14 | 15 | 16 | 17 ][>>>]
 
Новое сообщение
Ваш ник
Пароль (если вы зарегистрированы)
Вложение
Добавить еще одно поле для файла
Сообщение

[ Смайлики ]
[ Ubb теги ]
Проверочный код
 
 

 © SimBa aka Dimoniusis