Последнее время я не программирую, а рaзгpебаю зaвалы которые оставили до меня покoления программистов. Чтобы внести минимальное декоративное изменение требуется исправить несколько модулей и потратить несопоставимую по сложности работу по выискиванию всех мест, в которые надо внести изменения.
Дело в том, что тем методы, которые допустимы в примерах, олимпиадах и лабах по программированию, совершенно неприемлемы при создании крупных и долгоживущих прикладных программ.
Предлагаю в этой теме публиковать примеры, как не надо программировать на Delphi, что бы потом не было мучительно больно от встречи с теми, кто исправлял твой код.
Всего в теме 421 сообщение
Добавить свое сообщение
Отслеживать это обсуждение 
№ 171 27-02-2008 14:51 |  |
Ответ на »сообщение 170« (panda)
___________________________
Правда становится важным порядок элементов в массиве.
Ну это и в варианте с try-except было, так что подходит. Так и сделаю, только массив константный.
Всем спасибо.
№ 170 27-02-2008 14:33 |  |
Ответ на »сообщение 169« (bems)
___________________________
Как это переделать чтобы функция возвращала обработчик для ближайшего по иерархии класса?
Вместо равенства классов использовать InheritsFrom. Правда становится важным порядок элементов в массиве.
№ 169 27-02-2008 11:51 |  |
Ответ на »сообщение 167« (Cepгей Poщин)
___________________________
Спасибо, идея ясна.
Как это переделать чтобы функция возвращала обработчик для ближайшего по иерархии класса?
№ 168 27-02-2008 11:38 |  |
Ответ на »сообщение 167« (Cepгей Poщин)
___________________________
Если входной класс является ошибкой, как я понял, то она должна генерироваться?Нет, это для ошибок в конструкторе
№ 167 27-02-2008 11:34 |  |
Ответ на »сообщение 166« (bems)
___________________________
Загнать все классы и соответствующие им события в массив.
Если входной класс является ошибкой, как я понял, то она должна генерироваться?
function TfrmMain.FindGetTextEvent(ClassRef: TClass): TNotifyEvent;
type
TClassRefEvent = record
ClassRef: TClass;
Event: TNotifyEvent;
end;
var I: integer;
E: Exception;
ClassRefEvents: array of TClassRefEvent;
begin
result := Button2Click;
if ClassRef = nil then Exit;
SetLength(ClassRefEvents, 1);
ClassRefEvents[0].ClassRef := TForm;
ClassRefEvents[1].Event := Button2Click;
if ClassRef.InheritsFrom(Exception) then
begin
E := Exception(ClassRef.Create);
E.Message := 'Ошибочка вышла';
raise E;
end
else
begin
for I := 0 to Length(ClassRefEvents) - 1 do
if ClassRefEvents[I].ClassRef = ClassRef then
begin
result := ClassRefEvents[I].Event;
Exit;
end;
end;
end;
№ 166 27-02-2008 11:20 |  |
Ответ на »сообщение 164«
___________________________
Кроме того простая проверка на равенство тут не подходит, потому что нужно предусмотреть случаи когда ClassRef наследуется от класса, для которого у меня есть обработчик
№ 165 27-02-2008 10:57 |  |
Ответ на »сообщение 164«
___________________________
это и написано чтобы избежать сложного if
Одно другого стОит
№ 164 27-02-2008 10:31 |  |
Ответ на »сообщение 163« (bems)
___________________________
А в чем проблема? Переписывается это набором IF'ов.
if ClassRef = TBlobField then result:=MemoOnGetText else
//не знаю сколько классов полей придется сюда добавить
result:=DefaultGetText
№ 163 27-02-2008 09:52 |  |
Я написал вот такое. Я знаю, что так не нужно. Подскажите как переписать без большого многоэтажного if
function TDBGridEx.FindGetTextEvent(ClassRef: TClass): TFieldGetTextEvent;
begin
try raise ClassRef.Create;
except
on Exception do raise;
on TBlobField do result:=MemoOnGetText;
else result:=DefaultGetText
end;
end;
№ 162 27-02-2008 04:14 |  |
Ой да прям-таки!
Разгильдяйство - принцип нашего общества!
Вышел человек на работу - унюхал запах мусорника.
Потому что дворник поленился утром встать и попшикать
дезиком. Сел в автобус. А там тетя не так улыбнулась.
Потому что ей вечером пришлось. Человек вышел из
автобуса - надо дорогу переходить. А крутелык на
иномарке тоже вчера горчёного пива выпил. Дошел
человек до работы - а там - начальник!!! А у
начальника сын вчера двойку получил. И т.д.
Потому у "них" - мерседесы, а у "нас" - жиклеры
вместо Windows CE. У "них" дорожки по-диагонали, а
у "нас" - два квартала обходить, чтобы попасть во
двор.
Но, судя по всему, в Редмонде тоже жизнь не сахар!
Эмансипация, или дискриминация по цвету штанов - не
знаю. А может, Билли Затворщик просто слишком жадный!
Добавить свое сообщение
Отслеживать это обсуждение 
Дополнительная навигация: |
|