07.03.2010, 15:30 | #1 |
Участник
|
Может быть я, конечно, долго к этому шел и напишу давным-давно всем известную истину, но меня сей факт поверг в легкое недоумение...
Есть отчет. Допустим в нем есть DataItem на таблицу ААА. И, скажем, есть глобальная переменная типа Record, связанная с таблицей ВВВ. В таблице ААА есть поле Поле1, а в таблице ВВВ есть поле Поле2. Такая конструкция будет работать: ВВВ - OnPostDataItem() WITH AAA DO BEGIN Поле2 = ЗначениеЧегоТоТам; ... END; Т.е. компилятор даже не поймет, что мне нужно работать исключительно с полями таблицы ААА и что я по запаре вместо Поле1 написал Поле2... ИМХО - нонсенс. |
|
07.03.2010, 15:50 | #2 |
Участник
|
Никогда в своем коде не использую with. никакой практической пользы нет от него кроме нечитабельного кода и таких вот косяков при компиляции.
|
|
07.03.2010, 16:03 | #3 |
Участник
|
Цитата:
Но в данном случае речь идет о стандартном пакетнике расчета амортизации. В нем и обнаружил такую странность поведения... |
|
08.03.2010, 00:31 | #4 |
Administrator
|
регулярно использую with, если функция в качестве реки не имеет хоть сколько-нибудь похожей таблицы.
ибо натыкался. помню. использую, например, в юнитах. читабельность кода с with 100% повышается. маленький совет при использовани with, case ets: заканчивайте блоки примерно так: END{With}, END{Case} ибо кто-то пишет, а кто-то потом читает... |
|
10.03.2010, 14:43 | #5 |
Участник
|
не знаю, мне WITH тоже не очень нравится - регулярно приходится PgUp делать чтобы посмотрить, что же там в WITH было Если тело функции большое, то этих операторов может быть несколько - немножко раздражает
|
|
10.03.2010, 15:12 | #6 |
Участник
|
Это скорее не нонсенс, а особенность компилятор, далеко не секрет, что первым делом переменная ищется в глобальных переменных, затем в локальных и видимо лишь потом просматриваются "with" и тп. Приоритеты, без них никак.
Считаю что "with" нельзя размазывать по огромным функциям и триггерам, ибо нечитабельно, но когда "with" содержит 5-10 строчек, смотрится весьма читабельно. |
|
10.03.2010, 17:12 | #7 |
Участник
|
Согласен, преоритеты тут решают.
Не знаю, может я не тру программер, но я пользую F5 и прелесть WITH пропадает |
|
19.03.2010, 13:20 | #8 |
Участник
|
Код: ВВВ - OnPostDataItem() WITH AAA DO BEGIN Поле1 = Поле2; ... END; Код: AAA.Поле1 = Rec.Поле2; Вот набрасаю пример, в табличке Item(Название может быть очень длинным), дела функцию, с параметром Рекорд типа Item И в теле пишу Код: WITH recItemP DO BEGIN Сумма = (Цена*Количество)*Скидка; ... END Код: recItemP.Сумма = (recItemP.СуммаЦена*recItemP.СуммаКоличество)*recItemP.СуммаСкидка; WITH приоритетней, чтоб работать внутри WITH с Rec нужно писать REC.FielnName. |
|