Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.11;
Скачать: CL | DM;

Вниз

О провилах хорошего тона в программировании.   Найти похожие ветки 

 
int64   (2004-04-07 10:29) [0]

Приходил человек устраиваться на работу, приносил тексты программ. В одном проекте у него 20 форм. Разница у большенства этих форм только в Caption и они все в Auto-Create.
Конечно, главный аргумент - "мне удобнее и быстрее делать так", тем более, если руководитель(заказчик) разницы не видел.
И таких вот программиств дохрена, они даже занимают реальные
должности. Судя по назначении их программ и автобиографии.

Берутся тексты соискателей на работу, делается поиск по StrToInt, и если этот самый StrToInt неоправдано используется - сразу в урну.
А прочитал бы этот юзер раньше: "Не храните данные в конторолах", даже без объяснений - почему. И программы бы у него всегда отличались структурностью и самодокументированностью. Он бы и сам себя как кодера уважал больше.
Вот сейчас разбираю код. Писал уважаемый человек - преподаватель информатики, полковник. Заводит глобальную переменную, а потом юзает её, где как локальную, а где как буфер между функциями. Я не говорю уже о других "примудростях". Черт ногу сломает в таком коде.
"ТАК ВЕДЬ РАБОТАЕТ"
Ненавижу!
Если бы кто-то, когда-то взялся собрать "свод законов" о правилах хорошего тона в программировании, об азах, сей документ был бы куда полезнее всяких факов. Потому что без этих правил кодить можно, а без факов - нет.


 
int64   (2004-04-07 10:29) [0]

Приходил человек устраиваться на работу, приносил тексты программ. В одном проекте у него 20 форм. Разница у большенства этих форм только в Caption и они все в Auto-Create.
Конечно, главный аргумент - "мне удобнее и быстрее делать так", тем более, если руководитель(заказчик) разницы не видел.
И таких вот программиств дохрена, они даже занимают реальные
должности. Судя по назначении их программ и автобиографии.

Берутся тексты соискателей на работу, делается поиск по StrToInt, и если этот самый StrToInt неоправдано используется - сразу в урну.
А прочитал бы этот юзер раньше: "Не храните данные в конторолах", даже без объяснений - почему. И программы бы у него всегда отличались структурностью и самодокументированностью. Он бы и сам себя как кодера уважал больше.
Вот сейчас разбираю код. Писал уважаемый человек - преподаватель информатики, полковник. Заводит глобальную переменную, а потом юзает её, где как локальную, а где как буфер между функциями. Я не говорю уже о других "примудростях". Черт ногу сломает в таком коде.
"ТАК ВЕДЬ РАБОТАЕТ"
Ненавижу!
Если бы кто-то, когда-то взялся собрать "свод законов" о правилах хорошего тона в программировании, об азах, сей документ был бы куда полезнее всяких факов. Потому что без этих правил кодить можно, а без факов - нет.


 
Мараканец ©   (2004-04-07 10:37) [1]

дело не в том как писать, по большому счету, а в правильном документировании


 
Мараканец ©   (2004-04-07 10:37) [1]

дело не в том как писать, по большому счету, а в правильном документировании


 
VAleksey ©   (2004-04-07 10:53) [2]


> int64   (07.04.04 10:29)  

Кофе попей.


 
VAleksey ©   (2004-04-07 10:53) [2]


> int64   (07.04.04 10:29)  

Кофе попей.


 
serge35   (2004-04-07 10:58) [3]

Согласен с автором. Мне тоже приходилось разбираться с исходниками одного профессионального программера, ему уже за 40.
На каждом шагу изобретен новый велосипед.
Смотрю новая функция fround4. Ищу ее код, нахожу в файле Utils. Код состоит из одной строки - вызов функции round.
И это самый простой велосипед.
Я бы заставлял всех, кто собирается заниматься программированием проходить медицинскую экспертизу, как водители для получения прав на вождение. Особенно психиатора.


 
serge35   (2004-04-07 10:58) [3]

Согласен с автором. Мне тоже приходилось разбираться с исходниками одного профессионального программера, ему уже за 40.
На каждом шагу изобретен новый велосипед.
Смотрю новая функция fround4. Ищу ее код, нахожу в файле Utils. Код состоит из одной строки - вызов функции round.
И это самый простой велосипед.
Я бы заставлял всех, кто собирается заниматься программированием проходить медицинскую экспертизу, как водители для получения прав на вождение. Особенно психиатора.


 
int64   (2004-04-07 10:59) [4]

Значит я один такой придирчивый.
А вот не приходилось вам править чужой код. Никакое документирование не спасет, если там гемерой один.


 
int64   (2004-04-07 10:59) [4]

Значит я один такой придирчивый.
А вот не приходилось вам править чужой код. Никакое документирование не спасет, если там гемерой один.


 
VAleksey ©   (2004-04-07 11:01) [5]


> int64   (07.04.04 10:59) [4]

Только этим и занимаюсь практически :-)). Правда того о чем ты писал нет. Таких не дёржють :-))).
Я просто имею в виду, что чего психовать-то? Спокойнее надо быть.


 
VAleksey ©   (2004-04-07 11:01) [5]


> int64   (07.04.04 10:59) [4]

Только этим и занимаюсь практически :-)). Правда того о чем ты писал нет. Таких не дёржють :-))).
Я просто имею в виду, что чего психовать-то? Спокойнее надо быть.


 
Игорь Шевченко ©   (2004-04-07 11:03) [6]

Тейксейра, Пачеко, Delphi 5, руководство разработчика, глава 6.

Наизусть.


 
Игорь Шевченко ©   (2004-04-07 11:03) [6]

Тейксейра, Пачеко, Delphi 5, руководство разработчика, глава 6.

Наизусть.


 
pasha_golub ©   (2004-04-07 11:06) [7]

Игорь Шевченко ©   (07.04.04 11:03) [6]
Игорь, тама хорошие советы бесспорно, но мало. :-) На все случаи не помогет.


 
pasha_golub ©   (2004-04-07 11:06) [7]

Игорь Шевченко ©   (07.04.04 11:03) [6]
Игорь, тама хорошие советы бесспорно, но мало. :-) На все случаи не помогет.


 
int64   (2004-04-07 11:12) [8]

Игорь Шевченко ©   (07.04.04 11:03) [6]
Там больше о форматировании и именовании идентификаторов.
Я знаю контору, где за несоответсвие таким стандартам штраф 5$.


 
int64   (2004-04-07 11:12) [8]

Игорь Шевченко ©   (07.04.04 11:03) [6]
Там больше о форматировании и именовании идентификаторов.
Я знаю контору, где за несоответсвие таким стандартам штраф 5$.


 
Saturn_   (2004-04-07 11:13) [9]

2 int64   (07.04.04 10:59) [4]
нет ты не один такой придирчевый.
Но просто у каждого свой стиль прграмирования. и с эти ничего нельзя сделать.


 
Saturn_   (2004-04-07 11:13) [9]

2 int64   (07.04.04 10:59) [4]
нет ты не один такой придирчевый.
Но просто у каждого свой стиль прграмирования. и с эти ничего нельзя сделать.


 
Vovchik_A ©   (2004-04-07 11:15) [10]

2int64   (07.04.04 10:59) [4]
Чужой код править  - занятие неблагодарное. Лучше свой написать. (ИМХО, конечно)...


 
Vovchik_A ©   (2004-04-07 11:15) [10]

2int64   (07.04.04 10:59) [4]
Чужой код править  - занятие неблагодарное. Лучше свой написать. (ИМХО, конечно)...


 
pasha_golub ©   (2004-04-07 11:16) [11]

Vovchik_A ©   (07.04.04 11:15) [10]
Переписать все нафиг..ю (с) Российский программист

Кстати, а где можно эту байку прочесть?


 
pasha_golub ©   (2004-04-07 11:16) [11]

Vovchik_A ©   (07.04.04 11:15) [10]
Переписать все нафиг..ю (с) Российский программист

Кстати, а где можно эту байку прочесть?


 
Игорь Шевченко ©   (2004-04-07 11:18) [12]

pasha_golub ©   (07.04.04 11:06)


> хорошие советы бесспорно, но мало. :-) На все случаи не
> помогет


Опыт, сын ошибок трудных....Оно рулез :)

int64   (07.04.04 11:12)

> Я знаю контору, где за несоответсвие таким стандартам штраф
> 5$.


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


 
Игорь Шевченко ©   (2004-04-07 11:18) [12]

pasha_golub ©   (07.04.04 11:06)


> хорошие советы бесспорно, но мало. :-) На все случаи не
> помогет


Опыт, сын ошибок трудных....Оно рулез :)

int64   (07.04.04 11:12)

> Я знаю контору, где за несоответсвие таким стандартам штраф
> 5$.


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


 
serge35   (2004-04-07 11:19) [13]

Поэтому брать на работу лучше студентов и сразу им объяснять, в каком стиле они должны писать. После них можно будет разобраться в коде, а маститый дяденька сделает может быть и правильно, но разбираться в его коде будет очень сложно.
А вообще сейчас центр тяжести переносится с написания кода в проектирование системы, написания грамотного и глубокого ТЗ.


 
serge35   (2004-04-07 11:19) [13]

Поэтому брать на работу лучше студентов и сразу им объяснять, в каком стиле они должны писать. После них можно будет разобраться в коде, а маститый дяденька сделает может быть и правильно, но разбираться в его коде будет очень сложно.
А вообще сейчас центр тяжести переносится с написания кода в проектирование системы, написания грамотного и глубокого ТЗ.


 
Мараканец ©   (2004-04-07 11:21) [14]

http://diesel.elcat.kg/prog/messages/12958.html

это не оно?

гугл фарэва)


 
Мараканец ©   (2004-04-07 11:21) [14]

http://diesel.elcat.kg/prog/messages/12958.html

это не оно?

гугл фарэва)


 
Vovchik_A ©   (2004-04-07 11:21) [15]

2serge35   (07.04.04 11:19) [13]
Совершенно согласен. Глубокое и грамотное ТЗ это 50% если не 70% успеха. Жаль только, что это случается редко.

2pasha_golub ©   (07.04.04 11:16) [11]

Не смешно.


 
Vovchik_A ©   (2004-04-07 11:21) [15]

2serge35   (07.04.04 11:19) [13]
Совершенно согласен. Глубокое и грамотное ТЗ это 50% если не 70% успеха. Жаль только, что это случается редко.

2pasha_golub ©   (07.04.04 11:16) [11]

Не смешно.


 
passlight ©   (2004-04-07 11:28) [16]

int64   (07.04.04 11:12) [8]
Блин, вот нам бы так


 
passlight ©   (2004-04-07 11:28) [16]

int64   (07.04.04 11:12) [8]
Блин, вот нам бы так


 
Nikolay M. ©   (2004-04-07 11:36) [17]


> Я знаю контору, где за несоответсвие таким стандартам штраф
> 5$

И что, текучка программистов там просто большая или очень большая?
Уже неоднократно замечено, что каждый новый начальник пытается насадить свой формат расстановки скобок, отступов, заглавных-строчных букв и прочей белиберды.
Если программист грамотный, он пишет такой код, что поймет его и он сам через год, и любой другой программист. А всякое палево "перед begin ставить два пробела, а For писать с большой буквы" - пустая трата времени и удовлетворение непонятных амбиций со стороны людей, занимающихся издательством такой бессмыслицы. А зачастую - банальное прикрытие собственной некомпетентности или повод платить программистам меньшую зарплату  за счет таких штрафов.
Работать в таких конторах крайне противопоказано. Имхо.


 
Nikolay M. ©   (2004-04-07 11:36) [17]


> Я знаю контору, где за несоответсвие таким стандартам штраф
> 5$

И что, текучка программистов там просто большая или очень большая?
Уже неоднократно замечено, что каждый новый начальник пытается насадить свой формат расстановки скобок, отступов, заглавных-строчных букв и прочей белиберды.
Если программист грамотный, он пишет такой код, что поймет его и он сам через год, и любой другой программист. А всякое палево "перед begin ставить два пробела, а For писать с большой буквы" - пустая трата времени и удовлетворение непонятных амбиций со стороны людей, занимающихся издательством такой бессмыслицы. А зачастую - банальное прикрытие собственной некомпетентности или повод платить программистам меньшую зарплату  за счет таких штрафов.
Работать в таких конторах крайне противопоказано. Имхо.


 
sniknik ©   (2004-04-07 11:39) [18]

> Смотрю новая функция fround4. Ищу ее код, нахожу в файле Utils. Код состоит из одной строки - вызов функции round.
> И это самый простой велосипед.

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


 
sniknik ©   (2004-04-07 11:39) [18]

> Смотрю новая функция fround4. Ищу ее код, нахожу в файле Utils. Код состоит из одной строки - вызов функции round.
> И это самый простой велосипед.

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


 
Иксик ©   (2004-04-07 11:42) [19]

На www.xprogramming.ru предлагался в частности стандарт для Дельфи.


 
Иксик ©   (2004-04-07 11:42) [19]

На www.xprogramming.ru предлагался в частности стандарт для Дельфи.


 
Style ©   (2004-04-07 11:42) [20]

Nikolay M. ©
Нужно просто фильтр написать который у атачментов *.pas в слове for первую букву меняет на заглавную :)
И поставить на отправку почты начальнику :)
Чего мучаться то :))


 
Style ©   (2004-04-07 11:42) [20]

Nikolay M. ©
Нужно просто фильтр написать который у атачментов *.pas в слове for первую букву меняет на заглавную :)
И поставить на отправку почты начальнику :)
Чего мучаться то :))


 
zzet ©   (2004-04-07 11:48) [21]

Программист творит "по своему образу и подобию". Стиль написания кода - это как почерк, должен быть индивидуален. Не увольняют же врачей за трудночитаемые рецепты. Да и где доказано, что правильно писать именно так или так? имхо, это проблемы тех кто потом читать будет, программист пишет рабочую программу, а не художественный рассказ. Другое дело если он работает в команде, тогда нужно писать что бы поняли остальные. (но нужна ли команда не умеющая читать чужой код?)....


 
zzet ©   (2004-04-07 11:48) [21]

Программист творит "по своему образу и подобию". Стиль написания кода - это как почерк, должен быть индивидуален. Не увольняют же врачей за трудночитаемые рецепты. Да и где доказано, что правильно писать именно так или так? имхо, это проблемы тех кто потом читать будет, программист пишет рабочую программу, а не художественный рассказ. Другое дело если он работает в команде, тогда нужно писать что бы поняли остальные. (но нужна ли команда не умеющая читать чужой код?)....


 
serge35   (2004-04-07 11:49) [22]

Насчет 5$ может и сурово, но когда программист уходит, а начальник остается один на один с его кодом, то он не будет
рвать на себе волосы, а спокойно разберется.
Кстати только так и можно написать большую систему, к которой привлечено большое количество людей.
Удачное именование переменных в этом случае играет огромную роль, когда каждому челу по имени переменной понятно для чего она нужна и как ее использовать.


 
serge35   (2004-04-07 11:49) [22]

Насчет 5$ может и сурово, но когда программист уходит, а начальник остается один на один с его кодом, то он не будет
рвать на себе волосы, а спокойно разберется.
Кстати только так и можно написать большую систему, к которой привлечено большое количество людей.
Удачное именование переменных в этом случае играет огромную роль, когда каждому челу по имени переменной понятно для чего она нужна и как ее использовать.


 
nick_   (2004-04-07 11:49) [23]


> Style ©   (07.04.04 11:42) [20]

Ну вот еще!
Кстати, один раз наблюдал такой круговорот событий.
Начальник начал насаживать очередной "стандарт", как следствие, программист, который писал программу в едином стиле уволился (кому охота фигней страдать?), на его место пришел другой, который не сразу включился в "стандарт", после трений с начальником также уволился, начальника заменили, поскольку не может обеспечить нормальную работу, на его место приходит новый, со своим "стандартом", все начинается по новой.
Я этот процесс застал на n-дцатой итерации и имел счастье видеть ужасно кривую программу, к тому же без единого комментария. больше 2 месяцев я не выдержал.


 
nick_   (2004-04-07 11:49) [23]


> Style ©   (07.04.04 11:42) [20]

Ну вот еще!
Кстати, один раз наблюдал такой круговорот событий.
Начальник начал насаживать очередной "стандарт", как следствие, программист, который писал программу в едином стиле уволился (кому охота фигней страдать?), на его место пришел другой, который не сразу включился в "стандарт", после трений с начальником также уволился, начальника заменили, поскольку не может обеспечить нормальную работу, на его место приходит новый, со своим "стандартом", все начинается по новой.
Я этот процесс застал на n-дцатой итерации и имел счастье видеть ужасно кривую программу, к тому же без единого комментария. больше 2 месяцев я не выдержал.


 
uny   (2004-04-07 11:50) [24]

бывают такие правила -
можно "закрыть" курсор мыши в таком то прямоугольнике, но использование этой функции = плохой тон

эти правила не только программистам важны:)


 
uny   (2004-04-07 11:50) [24]

бывают такие правила -
можно "закрыть" курсор мыши в таком то прямоугольнике, но использование этой функции = плохой тон

эти правила не только программистам важны:)


 
Игорь Шевченко ©   (2004-04-07 11:54) [25]

Nikolay M. ©   (07.04.04 11:36)
zzet ©   (07.04.04 11:48)

Вы поработайте в команде над серьезным проектом, потом вернемся к разговору.

Неужели вы всерьез считаете, что Тейксейра с Пачеко, да и многие другие, пишут о том, что стандартизация кода есть хорошо, только потому, что им просто хочется поговорить или засорить мозги читателям ? :))


 
Игорь Шевченко ©   (2004-04-07 11:54) [25]

Nikolay M. ©   (07.04.04 11:36)
zzet ©   (07.04.04 11:48)

Вы поработайте в команде над серьезным проектом, потом вернемся к разговору.

Неужели вы всерьез считаете, что Тейксейра с Пачеко, да и многие другие, пишут о том, что стандартизация кода есть хорошо, только потому, что им просто хочется поговорить или засорить мозги читателям ? :))


 
Alex Konshin ©   (2004-04-07 11:59) [26]

Где-то была ссылка на сайт, где представлены образцы как хорошего интерфейса, так и такие, как не надо делать. Помню там перлы типа выбор пола через два чекбокса (видимо решили все варианты предусмотреть). А у нас на работе вполне реально используется такой образец того, как делать не надо - Siebel CaRDS. Это система для трекинга багов и проблем. Такого ублюдского интефейса я давно не видел.

Да, возвращаемся к теме.
Стрелял бы тех, кто не пишет комментарии.
Все, пошел вешаться...


 
Alex Konshin ©   (2004-04-07 11:59) [26]

Где-то была ссылка на сайт, где представлены образцы как хорошего интерфейса, так и такие, как не надо делать. Помню там перлы типа выбор пола через два чекбокса (видимо решили все варианты предусмотреть). А у нас на работе вполне реально используется такой образец того, как делать не надо - Siebel CaRDS. Это система для трекинга багов и проблем. Такого ублюдского интефейса я давно не видел.

Да, возвращаемся к теме.
Стрелял бы тех, кто не пишет комментарии.
Все, пошел вешаться...


 
zzet ©   (2004-04-07 11:59) [27]

>[25] Игорь Шевченко ©   (07.04.04 11:54)

Я же согласен, при работе в команде нужно что бы тебя понимали, но и команда должна быть понимающая..


 
zzet ©   (2004-04-07 11:59) [27]

>[25] Игорь Шевченко ©   (07.04.04 11:54)

Я же согласен, при работе в команде нужно что бы тебя понимали, но и команда должна быть понимающая..


 
zzet ©   (2004-04-07 12:03) [28]

Если б меня мой босс попробовал оштрафовать за то что не может прочитать мой код на 5$, я бы ему эти 5$ в *** засунул и расчитался.
(поэтому я, как начальник, никогда так не поступаю)


 
zzet ©   (2004-04-07 12:03) [28]

Если б меня мой босс попробовал оштрафовать за то что не может прочитать мой код на 5$, я бы ему эти 5$ в *** засунул и расчитался.
(поэтому я, как начальник, никогда так не поступаю)


 
Игорь Шевченко ©   (2004-04-07 12:04) [29]

Alex Konshin ©   (07.04.04 11:59)

http://www.akzhan.midi.ru/iarchitect/ ?


 
Игорь Шевченко ©   (2004-04-07 12:04) [29]

Alex Konshin ©   (07.04.04 11:59)

http://www.akzhan.midi.ru/iarchitect/ ?


 
Alex Konshin ©   (2004-04-07 12:04) [30]

Насчет понимающих команд: я сам свой код после трех месяцев перерыва разбираю как чужой - ни хрена не помню. Занятно, бывает, сделать открытие в своей же собственной программе. Другому же человеку во много раз труднее. Так что я не верю в понимающие команды. Нужно просто писать так, что было понятно.


 
Alex Konshin ©   (2004-04-07 12:04) [30]

Насчет понимающих команд: я сам свой код после трех месяцев перерыва разбираю как чужой - ни хрена не помню. Занятно, бывает, сделать открытие в своей же собственной программе. Другому же человеку во много раз труднее. Так что я не верю в понимающие команды. Нужно просто писать так, что было понятно.


 
SoftX   (2004-04-07 12:06) [31]

Вот напрмер пример моего кода, говорят тяжелый, а я так не думаю:)

function ReadCarrentSid(var UserInfo:TUserVariables):boolean;
Var Username:String;
var CUsername:longword;
Var TSid,Sid:PSID;
var Csid:longword;
var Domain:String;
Var Cdomain:longword;
Var PUse:SID_NAME_USE;
Var BlobStream:TStream;
var i:integer;
var found:boolean;
begin
 //получаем текущий SID пользователя
 CUsername:=0;
 GetUserName(nil,CUsername);
 SetLength(Username,CUsername);
 GetUserName(@Username[1],CUsername);
 //
 Csid:=0;Cdomain:=0;
 LookupAccountName(nil,@Username[1],nil,Csid,nil,Cdomain,PUse);
 SetLength(Domain,cDomain);
 GetMem(SID,cSID);
 LookupAccountName(nil,@Username[1],Sid,Csid,@Domain[1],Cdomain,PUse);
 //создаем запрос на пользователя
 MainData.UserQuery.Active:=false;
 MainData.UserQuery.SQL.Clear;

 MainData.UserQuery.SQL.Add("select * from faxusers;");
 MainData.UserQuery.Active:=True;
 //ищем нужный SID
 found:=False;
 MainData.UserQuery.first;
 if (MainData.UserQuery.RecordCount>0) then
   begin
   while (not MainData.UserQuery.Eof) and (found=false) do
     begin
     BlobStream:=MainData.UserQuery.CreateBlobStream(MainData.UserQuery.FieldByName("winsid"),bmRead);
     if BlobStream.Size=CSid then
       begin
       found:=True;
       GetMem(TSid,BlobStream.Size);
       BlobStream.ReadBuffer(PByteArray(TSid)[0],BlobStream.Size);
       for i:=0 to Csid-1 do
         if (PByteArray(Sid)[i]<>PByteArray(TSid)[i]) then found:=false;
       FreeMem(TSid);
       end;
     BlobStream.Free;
     if found=false then MainData.UserQuery.Next;
     end;
   end;

 //получам данные если запрос с данной информацией найден
 if (found=True) then
   begin
   UserInfo.LOGIN:=MainData.UserQuery.FieldByName("LOGIN").AsString;
   UserInfo.USERNAME:=MainData.UserQuery.FieldByName("USERNAME").AsString;
   UserInfo.CANDELETEFAX:=MainData.UserQuery.FieldByName("CANDELETEFAX").AsInteger;
   UserInfo.IMMORTAL:=MainData.UserQuery.FieldByName("IMMORTAL").AsInteger;
   UserInfo.CANGETFAX:=MainData.UserQuery.FieldByName("CANGETFAX").AsInteger;
   UserInfo.ADMINISTRATOR:=MainData.UserQuery.FieldByName("ADMINISTRATOR").AsInteger;
   //
   ReadCarrentSid:=True;
   end
 else
   ReadCarrentSid:=false;
 //
 Username:="";
 Domain:="";
 FreeMem(Sid);
 //закрываем запрос
 MainData.UserQuery.Active:=false;
 MainData.UserQuery.SQL.Clear;
end;


 
SoftX   (2004-04-07 12:06) [31]

Вот напрмер пример моего кода, говорят тяжелый, а я так не думаю:)

function ReadCarrentSid(var UserInfo:TUserVariables):boolean;
Var Username:String;
var CUsername:longword;
Var TSid,Sid:PSID;
var Csid:longword;
var Domain:String;
Var Cdomain:longword;
Var PUse:SID_NAME_USE;
Var BlobStream:TStream;
var i:integer;
var found:boolean;
begin
 //получаем текущий SID пользователя
 CUsername:=0;
 GetUserName(nil,CUsername);
 SetLength(Username,CUsername);
 GetUserName(@Username[1],CUsername);
 //
 Csid:=0;Cdomain:=0;
 LookupAccountName(nil,@Username[1],nil,Csid,nil,Cdomain,PUse);
 SetLength(Domain,cDomain);
 GetMem(SID,cSID);
 LookupAccountName(nil,@Username[1],Sid,Csid,@Domain[1],Cdomain,PUse);
 //создаем запрос на пользователя
 MainData.UserQuery.Active:=false;
 MainData.UserQuery.SQL.Clear;

 MainData.UserQuery.SQL.Add("select * from faxusers;");
 MainData.UserQuery.Active:=True;
 //ищем нужный SID
 found:=False;
 MainData.UserQuery.first;
 if (MainData.UserQuery.RecordCount>0) then
   begin
   while (not MainData.UserQuery.Eof) and (found=false) do
     begin
     BlobStream:=MainData.UserQuery.CreateBlobStream(MainData.UserQuery.FieldByName("winsid"),bmRead);
     if BlobStream.Size=CSid then
       begin
       found:=True;
       GetMem(TSid,BlobStream.Size);
       BlobStream.ReadBuffer(PByteArray(TSid)[0],BlobStream.Size);
       for i:=0 to Csid-1 do
         if (PByteArray(Sid)[i]<>PByteArray(TSid)[i]) then found:=false;
       FreeMem(TSid);
       end;
     BlobStream.Free;
     if found=false then MainData.UserQuery.Next;
     end;
   end;

 //получам данные если запрос с данной информацией найден
 if (found=True) then
   begin
   UserInfo.LOGIN:=MainData.UserQuery.FieldByName("LOGIN").AsString;
   UserInfo.USERNAME:=MainData.UserQuery.FieldByName("USERNAME").AsString;
   UserInfo.CANDELETEFAX:=MainData.UserQuery.FieldByName("CANDELETEFAX").AsInteger;
   UserInfo.IMMORTAL:=MainData.UserQuery.FieldByName("IMMORTAL").AsInteger;
   UserInfo.CANGETFAX:=MainData.UserQuery.FieldByName("CANGETFAX").AsInteger;
   UserInfo.ADMINISTRATOR:=MainData.UserQuery.FieldByName("ADMINISTRATOR").AsInteger;
   //
   ReadCarrentSid:=True;
   end
 else
   ReadCarrentSid:=false;
 //
 Username:="";
 Domain:="";
 FreeMem(Sid);
 //закрываем запрос
 MainData.UserQuery.Active:=false;
 MainData.UserQuery.SQL.Clear;
end;


 
Игорь Шевченко ©   (2004-04-07 12:09) [32]

SoftX   (07.04.04 12:06)


> говорят тяжелый,


Справедливо говорят.


 
Игорь Шевченко ©   (2004-04-07 12:09) [32]

SoftX   (07.04.04 12:06)


> говорят тяжелый,


Справедливо говорят.


 
Паниковский ©   (2004-04-07 12:09) [33]

Можно и утилитку написать

стандарт засовываеш в утилитку находит ключивое слово вставляет пробелы или пишет с большой буквы пиши как хочеш а потом в утилитку загнал она все выправила и все зер гут и все довольны!

Кстати может кто напишет? Что скажите Мастера?


 
Паниковский ©   (2004-04-07 12:09) [33]

Можно и утилитку написать

стандарт засовываеш в утилитку находит ключивое слово вставляет пробелы или пишет с большой буквы пиши как хочеш а потом в утилитку загнал она все выправила и все зер гут и все довольны!

Кстати может кто напишет? Что скажите Мастера?


 
NAlexey ©   (2004-04-07 12:10) [34]

>SoftX   (07.04.04 12:06) [31]
Мдя... С самого начала все ясно: ReadCarrentSid...


 
NAlexey ©   (2004-04-07 12:10) [34]

>SoftX   (07.04.04 12:06) [31]
Мдя... С самого начала все ясно: ReadCarrentSid...


 
Alex Konshin ©   (2004-04-07 12:11) [35]

Игорь Шевченко ©   (07.04.04 12:04) [29]
Alex Konshin ©   (07.04.04 11:59)
http://www.akzhan.midi.ru/iarchitect/ ?

Это перевод оригинала. Там есть ссылка на него.


 
Alex Konshin ©   (2004-04-07 12:11) [35]

Игорь Шевченко ©   (07.04.04 12:04) [29]
Alex Konshin ©   (07.04.04 11:59)
http://www.akzhan.midi.ru/iarchitect/ ?

Это перевод оригинала. Там есть ссылка на него.


 
Игорь Шевченко ©   (2004-04-07 12:19) [36]

Паниковский ©   (07.04.04 12:09)


> Можно и утилитку написать


> Кстати может кто напишет?


STFW: DelForEx


 
Игорь Шевченко ©   (2004-04-07 12:19) [36]

Паниковский ©   (07.04.04 12:09)


> Можно и утилитку написать


> Кстати может кто напишет?


STFW: DelForEx


 
NAlexey ©   (2004-04-07 12:20) [37]

>Паниковский ©   (07.04.04 12:09) [33]
Ничего себе загнул:)
из строк
Var i:integer;
moyaperemennaja:String;
begin
i:=1;moyaperemennaja:="раз";
end;
мне надо получить:

var
 I: Integer;
 Str: string;
begin
 I := 1;
 Str := "Раз";
end;


Есть предложения какие ключевые слова использовать?


 
NAlexey ©   (2004-04-07 12:20) [37]

>Паниковский ©   (07.04.04 12:09) [33]
Ничего себе загнул:)
из строк
Var i:integer;
moyaperemennaja:String;
begin
i:=1;moyaperemennaja:="раз";
end;
мне надо получить:

var
 I: Integer;
 Str: string;
begin
 I := 1;
 Str := "Раз";
end;


Есть предложения какие ключевые слова использовать?


 
mfender ©   (2004-04-07 12:23) [38]

Давайте будем честны: правильное форматирование исходного текста := лучшее понимание собою же написанного. Бывает, понавалишь там временно всякого барахла, потом сам не поймешь, зачем так всего и много. А чтобы прочитать все это можно было - хотя бы тот же банальный 2 пробела перед begin поставить-таки следует.
Руководство просто вероломствует и самодурит по причине своей, порой, малограмотности и недостатка образования.


 
mfender ©   (2004-04-07 12:23) [38]

Давайте будем честны: правильное форматирование исходного текста := лучшее понимание собою же написанного. Бывает, понавалишь там временно всякого барахла, потом сам не поймешь, зачем так всего и много. А чтобы прочитать все это можно было - хотя бы тот же банальный 2 пробела перед begin поставить-таки следует.
Руководство просто вероломствует и самодурит по причине своей, порой, малограмотности и недостатка образования.


 
Nikolay M. ©   (2004-04-07 12:24) [39]


> zzet ©   (07.04.04 12:03) [28]
> Если б меня мой босс попробовал оштрафовать за то что не
> может прочитать мой код на 5$, я бы ему эти 5$ в *** засунул
> и расчитался.

Аналогично.


 
Nikolay M. ©   (2004-04-07 12:24) [39]


> zzet ©   (07.04.04 12:03) [28]
> Если б меня мой босс попробовал оштрафовать за то что не
> может прочитать мой код на 5$, я бы ему эти 5$ в *** засунул
> и расчитался.

Аналогично.


 
KSergey ©   (2004-04-07 12:25) [40]

> [32] Игорь Шевченко ©   (07.04.04 12:09)
> Справедливо говорят.

Не в плане спора, а из любопытства: приведите свой.


 
KSergey ©   (2004-04-07 12:25) [40]

> [32] Игорь Шевченко ©   (07.04.04 12:09)
> Справедливо говорят.

Не в плане спора, а из любопытства: приведите свой.


 
Style ©   (2004-04-07 12:25) [41]

>>>Есть предложения какие ключевые слова использовать?

moyaperemennaja

Можно перевести сначала с транслита на русский, затем с русского на английский и каждое слово написать с большой буквы :)))


 
Style ©   (2004-04-07 12:25) [41]

>>>Есть предложения какие ключевые слова использовать?

moyaperemennaja

Можно перевести сначала с транслита на русский, затем с русского на английский и каждое слово написать с большой буквы :)))


 
Игорь Шевченко ©   (2004-04-07 12:29) [42]

zzet ©   (07.04.04 12:03)

Я только одного не понимаю - зачем ламерством гордиться ?


 
Игорь Шевченко ©   (2004-04-07 12:29) [42]

zzet ©   (07.04.04 12:03)

Я только одного не понимаю - зачем ламерством гордиться ?


 
Rouse_ ©   (2004-04-07 12:29) [43]

Юрий Зотов однажды сказал замечательную фразу:
"Ё-мае, я то думаю - чего у меня в проге ошибки, оказывается я перед begin отступы не делаю :)"

Стандарт ИМХО, конечно нужен - а стандартом я считаю VCL...


 
Rouse_ ©   (2004-04-07 12:29) [43]

Юрий Зотов однажды сказал замечательную фразу:
"Ё-мае, я то думаю - чего у меня в проге ошибки, оказывается я перед begin отступы не делаю :)"

Стандарт ИМХО, конечно нужен - а стандартом я считаю VCL...


 
Сергей Суровцев ©   (2004-04-07 12:31) [44]

Есть понятие читаемости кода. Как и понятие читаемости почерка. Этого вполне достаточно. Естественно если есть переменная, нужно при объявлении описать для чего она. Но заставлять расставлять пробелы - это уже глупость ибо мешает человеку работать максимально эффективно. Другой вопрос - что, скажем begin и end одного блока должны иметь равные отступы и т.д. Но если все по два, да в сложном логическом блоке... На мой взгляд коментарии и равные отступы решают 90% проблем читаемости. Ну и еще желательно отсутствие длинных переменных с разницей в один символ. Остальное на усмотрение исполнителя.

>serge35   (07.04.04 10:58) [3]
>Смотрю новая функция fround4. Ищу ее код, нахожу в файле Utils. >Код состоит из одной строки - вызов функции round.

Когда нужно быстро перенести проект на другую платформу удобнее именно так, особенно если нужно поддерживать оба варианта. А уж если и скриптовый язык используется с таким же синтаксисом, то и жизненно необходимо. Первое, что мы сделали, перейдя с Клиппера - полностью воссоздали его библиотеку строковых ф-й и перенесли большинство текстов почти без изменений. Сберегли кучу времени и нервов.


 
Сергей Суровцев ©   (2004-04-07 12:31) [44]

Есть понятие читаемости кода. Как и понятие читаемости почерка. Этого вполне достаточно. Естественно если есть переменная, нужно при объявлении описать для чего она. Но заставлять расставлять пробелы - это уже глупость ибо мешает человеку работать максимально эффективно. Другой вопрос - что, скажем begin и end одного блока должны иметь равные отступы и т.д. Но если все по два, да в сложном логическом блоке... На мой взгляд коментарии и равные отступы решают 90% проблем читаемости. Ну и еще желательно отсутствие длинных переменных с разницей в один символ. Остальное на усмотрение исполнителя.

>serge35   (07.04.04 10:58) [3]
>Смотрю новая функция fround4. Ищу ее код, нахожу в файле Utils. >Код состоит из одной строки - вызов функции round.

Когда нужно быстро перенести проект на другую платформу удобнее именно так, особенно если нужно поддерживать оба варианта. А уж если и скриптовый язык используется с таким же синтаксисом, то и жизненно необходимо. Первое, что мы сделали, перейдя с Клиппера - полностью воссоздали его библиотеку строковых ф-й и перенесли большинство текстов почти без изменений. Сберегли кучу времени и нервов.


 
Игорь Шевченко ©   (2004-04-07 12:31) [45]

KSergey ©   (07.04.04 12:25)

В анкете ссылочка есть


 
Игорь Шевченко ©   (2004-04-07 12:31) [45]

KSergey ©   (07.04.04 12:25)

В анкете ссылочка есть


 
blackman ©   (2004-04-07 12:32) [46]

>взялся собрать "свод законов" о правилах хорошего тона в программировании
Никто не возьмется его написать :)
Что ни программист, то новый стандарт.


 
blackman ©   (2004-04-07 12:32) [46]

>взялся собрать "свод законов" о правилах хорошего тона в программировании
Никто не возьмется его написать :)
Что ни программист, то новый стандарт.


 
zzet ©   (2004-04-07 12:33) [47]

>[42] Игорь Шевченко ©   (07.04.04 12:29)

Возможно мы друг друга непоняли.


 
zzet ©   (2004-04-07 12:33) [47]

>[42] Игорь Шевченко ©   (07.04.04 12:29)

Возможно мы друг друга непоняли.


 
Style ©   (2004-04-07 12:33) [48]

>>>>Стандарт ИМХО, конечно нужен - а стандартом я считаю VCL...

Вот она ключевая фраза. Стандартом нужно считать то как пишет сам Borland.


 
Style ©   (2004-04-07 12:33) [48]

>>>>Стандарт ИМХО, конечно нужен - а стандартом я считаю VCL...

Вот она ключевая фраза. Стандартом нужно считать то как пишет сам Borland.


 
SoftX   (2004-04-07 12:34) [49]

>>NAlexey ©   (07.04.04 12:10) [34]
>>>SoftX   (07.04.04 12:06) [31]
>>Мдя... С самого начала все ясно: ReadCarrentSid...

Ну очепятался. Когда писал написал сразу имя функции написал сразу а потом Ctrl+C Ctrl+V и пошло... В принципе код локальный так что такие ошибки заметить трудно, компилятор говорит что все нормально, а у нас самое главное не красивый код, а само приложение(быстро и функционально сделать).

Игорь Шевченко ©   (07.04.04 12:09) [32]
Мне это интересно, можете прокомментировать, где у меня тяжесть в коде? Если сочту ваши доводы разумными, то исправлюсь. Можете дать пример своей процедуры?


 
SoftX   (2004-04-07 12:34) [49]

>>NAlexey ©   (07.04.04 12:10) [34]
>>>SoftX   (07.04.04 12:06) [31]
>>Мдя... С самого начала все ясно: ReadCarrentSid...

Ну очепятался. Когда писал написал сразу имя функции написал сразу а потом Ctrl+C Ctrl+V и пошло... В принципе код локальный так что такие ошибки заметить трудно, компилятор говорит что все нормально, а у нас самое главное не красивый код, а само приложение(быстро и функционально сделать).

Игорь Шевченко ©   (07.04.04 12:09) [32]
Мне это интересно, можете прокомментировать, где у меня тяжесть в коде? Если сочту ваши доводы разумными, то исправлюсь. Можете дать пример своей процедуры?


 
Nikolay M. ©   (2004-04-07 12:35) [50]


> Никто не возьмется его написать :)

http://delphi.vitpc.com/asp/viewitem.asp?UrlItem=/article/coderules.htm


 
Nikolay M. ©   (2004-04-07 12:35) [50]


> Никто не возьмется его написать :)

http://delphi.vitpc.com/asp/viewitem.asp?UrlItem=/article/coderules.htm


 
Alex Konshin ©   (2004-04-07 12:35) [51]

SoftX   (07.04.04 12:06) [31]

Без обид?

Я бы оценил такой стиль как плохой, потому как:
1. Нет защиты от дурака: не проверяются ни входные данные, ни результаты выполнения функций.
2. Не умеешь использовать try..finally когда он необходим.
3. Нет обработки ошибок и их удобоваримой диагностики.

Это, так сказать, претензии по общему стилю, независящие от языка.
Если учесть, что это Delphi, то можно было бы избавится от ненужной писанины, если воспользоваться with...do, например, MainData.UserQuery мозолит глаза. И видно твое незнание ньюансов использования типа String.

Обычно еще желательно выносить названия полей и т.п. константы вовне, чтобы потом было проще их поменять, если это потребуется.

Я даже не придираюсь к орфографии.


 
Alex Konshin ©   (2004-04-07 12:35) [51]

SoftX   (07.04.04 12:06) [31]

Без обид?

Я бы оценил такой стиль как плохой, потому как:
1. Нет защиты от дурака: не проверяются ни входные данные, ни результаты выполнения функций.
2. Не умеешь использовать try..finally когда он необходим.
3. Нет обработки ошибок и их удобоваримой диагностики.

Это, так сказать, претензии по общему стилю, независящие от языка.
Если учесть, что это Delphi, то можно было бы избавится от ненужной писанины, если воспользоваться with...do, например, MainData.UserQuery мозолит глаза. И видно твое незнание ньюансов использования типа String.

Обычно еще желательно выносить названия полей и т.п. константы вовне, чтобы потом было проще их поменять, если это потребуется.

Я даже не придираюсь к орфографии.


 
NAlexey ©   (2004-04-07 12:37) [52]

Справедливо было сказано, что форматировние исходного кода, значительно экономит время при работе нескольких человек над одним проектом. Если код удобочитаем, и содержит комментарии, на ознакомление с ним уходит минимум времени. Как следствие повышается скорость разработки, экономия времени и денег. А стандарты уже давно есть, и как правильно сказал - Rouse_ ©   (07.04.04 12:29) [43] - можно посмотреть в VCL.


 
NAlexey ©   (2004-04-07 12:37) [52]

Справедливо было сказано, что форматировние исходного кода, значительно экономит время при работе нескольких человек над одним проектом. Если код удобочитаем, и содержит комментарии, на ознакомление с ним уходит минимум времени. Как следствие повышается скорость разработки, экономия времени и денег. А стандарты уже давно есть, и как правильно сказал - Rouse_ ©   (07.04.04 12:29) [43] - можно посмотреть в VCL.


 
Style ©   (2004-04-07 12:37) [53]

SoftX а зачем на каждой строчке при объявлении переменных var писать??


 
Style ©   (2004-04-07 12:37) [53]

SoftX а зачем на каждой строчке при объявлении переменных var писать??


 
panov ©   (2004-04-07 12:37) [54]

>mfender ©   (07.04.04 12:23) [38]
хотя бы тот же банальный 2 пробела перед begin

2 пробела не перед begin вставляются, а в строке, следующей после begin:


function MyFuncDelta: Boolean;
begin
 if a>b then
 begin
   Result := a - b;
 end
 else
 begin
   Result := b - a;
 end;
end;


-)


 
panov ©   (2004-04-07 12:37) [54]

>mfender ©   (07.04.04 12:23) [38]
хотя бы тот же банальный 2 пробела перед begin

2 пробела не перед begin вставляются, а в строке, следующей после begin:


function MyFuncDelta: Boolean;
begin
 if a>b then
 begin
   Result := a - b;
 end
 else
 begin
   Result := b - a;
 end;
end;


-)


 
Alex Konshin ©   (2004-04-07 12:39) [55]

Да и мое замечание о том, что я поубывав бы тех, кто не пишет комментарии, к тебе тоже относится.


 
Alex Konshin ©   (2004-04-07 12:39) [55]

Да и мое замечание о том, что я поубывав бы тех, кто не пишет комментарии, к тебе тоже относится.


 
Alex Konshin ©   (2004-04-07 12:41) [56]

Alex Konshin ©   (07.04.04 12:39) [55]
Хм... Впредь надо вставлять ссылку на цитату, а то как-то неудобно получилось :)


 
Alex Konshin ©   (2004-04-07 12:41) [56]

Alex Konshin ©   (07.04.04 12:39) [55]
Хм... Впредь надо вставлять ссылку на цитату, а то как-то неудобно получилось :)


 
Style ©   (2004-04-07 12:44) [57]

//2 пробела не перед begin

не ну без этого совсем нельзя.
Если без разделений то Блоки  begin end; становятся вообще не читаемыми, а если  у вас целая связка if begin end else begin end; затем циклы и case в нутри каждого блока, то если не ставить перед каждым новым блоком два пробела то с таким кодом без пива не разобораться, а на работе пиво нельзя пить, поэтому нельзя с таким кодом разбираться ИМХО! :)

Вообще рекомендуют после каждого end; писать комментарий к чему он пренадлежит т.е.

if (a>b) then
begin
...
end
else
begin
...
end; //if a>b


 
Style ©   (2004-04-07 12:44) [57]

//2 пробела не перед begin

не ну без этого совсем нельзя.
Если без разделений то Блоки  begin end; становятся вообще не читаемыми, а если  у вас целая связка if begin end else begin end; затем циклы и case в нутри каждого блока, то если не ставить перед каждым новым блоком два пробела то с таким кодом без пива не разобораться, а на работе пиво нельзя пить, поэтому нельзя с таким кодом разбираться ИМХО! :)

Вообще рекомендуют после каждого end; писать комментарий к чему он пренадлежит т.е.

if (a>b) then
begin
...
end
else
begin
...
end; //if a>b


 
Anatoly Podgoretsky ©   (2004-04-07 12:50) [58]

SoftX   (07.04.04 12:34) [49]
Трудно читать, а остальное связано с этим. Какое оформление, такой и код. Вот Alex Konshin ©   (07.04.04 12:35) [51] рискнул это прочитать и вникнуть и сразу сделал некоторые самые первые замечания.


 
Anatoly Podgoretsky ©   (2004-04-07 12:50) [58]

SoftX   (07.04.04 12:34) [49]
Трудно читать, а остальное связано с этим. Какое оформление, такой и код. Вот Alex Konshin ©   (07.04.04 12:35) [51] рискнул это прочитать и вникнуть и сразу сделал некоторые самые первые замечания.


 
panov ©   (2004-04-07 12:51) [59]

>Style ©   (07.04.04 12:44) [57]

Внутри каждого блока - отступ на 2 символа. И вложенный блок тоже с отступом соответственно.


 
panov ©   (2004-04-07 12:51) [59]

>Style ©   (07.04.04 12:44) [57]

Внутри каждого блока - отступ на 2 символа. И вложенный блок тоже с отступом соответственно.


 
Agent13 ©   (2004-04-07 12:53) [60]


> KSergey ©   (07.04.04 12:25) [40]
> > [32] Игорь Шевченко ©   (07.04.04 12:09)
> > Справедливо говорят.
>
> Не в плане спора, а из любопытства: приведите свой.

Присоединяюсь. Здесь на форуме мастера очень часто критикуют чей-то код, а примера как НАДО писать я так и не видел. Очень хотелось бы посмотреть.


 
Agent13 ©   (2004-04-07 12:53) [60]


> KSergey ©   (07.04.04 12:25) [40]
> > [32] Игорь Шевченко ©   (07.04.04 12:09)
> > Справедливо говорят.
>
> Не в плане спора, а из любопытства: приведите свой.

Присоединяюсь. Здесь на форуме мастера очень часто критикуют чей-то код, а примера как НАДО писать я так и не видел. Очень хотелось бы посмотреть.


 
Игорь Шевченко ©   (2004-04-07 12:55) [61]

panov ©   (07.04.04 12:37)

Если один оператор обрамлять в  begin end получается зашумленный код. Читается медленнее.


 
Игорь Шевченко ©   (2004-04-07 12:55) [61]

panov ©   (07.04.04 12:37)

Если один оператор обрамлять в  begin end получается зашумленный код. Читается медленнее.


 
panov ©   (2004-04-07 12:57) [62]

>Игорь Шевченко ©   (07.04.04 12:55) [61]

panov ©   (07.04.04 12:37)

Если один оператор обрамлять в  begin end получается зашумленный код. Читается медленнее.


Это просто пример с отступами. Естественно в блок нужно оформлять не один операитор.


 
panov ©   (2004-04-07 12:57) [62]

>Игорь Шевченко ©   (07.04.04 12:55) [61]

panov ©   (07.04.04 12:37)

Если один оператор обрамлять в  begin end получается зашумленный код. Читается медленнее.


Это просто пример с отступами. Естественно в блок нужно оформлять не один операитор.


 
panov ©   (2004-04-07 13:04) [63]

Вот как я оформил бы код, не вникая в суть:


function ReadCurrentSid(var UserInfo:TUserVariables): boolean;
var
 Username: String;
 CUsername: longword;
 TSid, Sid:PSID;
 Csid: longword;
 Domain: String;
 Cdomain: longword;
 PUse: SID_NAME_USE;
 BlobStream: TStream;
 i: integer;
 found: boolean;
begin
//получаем текущий SID пользователя
CUsername := 0;
GetUserName(nil, CUsername);
SetLength(Username, CUsername);
GetUserName(@Username[1], CUsername);
//
Csid := 0;
Cdomain := 0;
LookupAccountName(nil, @Username[1], nil, Csid, nil, Cdomain, PUse);
SetLength(Domain, cDomain);
GetMem(SID, cSID);
LookupAccountName(nil, @Username[1], Sid, Csid, @Domain[1], Cdomain, PUse);
//создаем запрос на пользователя
MainData.UserQuery.Active := false;
MainData.UserQuery.SQL.Clear;

MainData.UserQuery.SQL.Add("select * from faxusers;");
MainData.UserQuery.Active := True;
//ищем нужный SID
found := False;
MainData.UserQuery.first;
if (MainData.UserQuery.RecordCount>0) then
begin
  while (not MainData.UserQuery.Eof) and (found=false) do
  begin
    BlobStream:=MainData.UserQuery.CreateBlobStream(MainData.UserQuery.FieldByName("winsid"), bmRead);
    if BlobStream.Size=CSid then
    begin
      found:=True;
      GetMem(TSid,BlobStream.Size);
      BlobStream.ReadBuffer(PByteArray(TSid)[0], BlobStream.Size);
      for i:=0 to Csid-1 do
      begin
        if (PByteArray(Sid)[i]<>PByteArray(TSid)[i]) then found:=false;
      end;
      FreeMem(TSid);
    end;
    BlobStream.Free;
    if found=false then MainData.UserQuery.Next;
  end;
end;

//получам данные если запрос с данной информацией найден
if (found=True) then
begin
  UserInfo.LOGIN := MainData.UserQuery.FieldByName("LOGIN").AsString;
  UserInfo.USERNAME := MainData.UserQuery.FieldByName("USERNAME").AsString;
  UserInfo.CANDELETEFAX := MainData.UserQuery.FieldByName("CANDELETEFAX").AsInteger;
  UserInfo.IMMORTAL := MainData.UserQuery.FieldByName("IMMORTAL").AsInteger;
  UserInfo.CANGETFAX := MainData.UserQuery.FieldByName("CANGETFAX").AsInteger;
  UserInfo.ADMINISTRATOR := MainData.UserQuery.FieldByName("ADMINISTRATOR").AsInteger;
  //
  ReadCarrentSid := True;
end
else ReadCarrentSid := false;
//
Username := "";
Domain := "";
FreeMem(Sid);
//закрываем запрос
MainData.UserQuery.Active := false;
MainData.UserQuery.SQL.Clear;
end;


 
panov ©   (2004-04-07 13:04) [63]

Вот как я оформил бы код, не вникая в суть:


function ReadCurrentSid(var UserInfo:TUserVariables): boolean;
var
 Username: String;
 CUsername: longword;
 TSid, Sid:PSID;
 Csid: longword;
 Domain: String;
 Cdomain: longword;
 PUse: SID_NAME_USE;
 BlobStream: TStream;
 i: integer;
 found: boolean;
begin
//получаем текущий SID пользователя
CUsername := 0;
GetUserName(nil, CUsername);
SetLength(Username, CUsername);
GetUserName(@Username[1], CUsername);
//
Csid := 0;
Cdomain := 0;
LookupAccountName(nil, @Username[1], nil, Csid, nil, Cdomain, PUse);
SetLength(Domain, cDomain);
GetMem(SID, cSID);
LookupAccountName(nil, @Username[1], Sid, Csid, @Domain[1], Cdomain, PUse);
//создаем запрос на пользователя
MainData.UserQuery.Active := false;
MainData.UserQuery.SQL.Clear;

MainData.UserQuery.SQL.Add("select * from faxusers;");
MainData.UserQuery.Active := True;
//ищем нужный SID
found := False;
MainData.UserQuery.first;
if (MainData.UserQuery.RecordCount>0) then
begin
  while (not MainData.UserQuery.Eof) and (found=false) do
  begin
    BlobStream:=MainData.UserQuery.CreateBlobStream(MainData.UserQuery.FieldByName("winsid"), bmRead);
    if BlobStream.Size=CSid then
    begin
      found:=True;
      GetMem(TSid,BlobStream.Size);
      BlobStream.ReadBuffer(PByteArray(TSid)[0], BlobStream.Size);
      for i:=0 to Csid-1 do
      begin
        if (PByteArray(Sid)[i]<>PByteArray(TSid)[i]) then found:=false;
      end;
      FreeMem(TSid);
    end;
    BlobStream.Free;
    if found=false then MainData.UserQuery.Next;
  end;
end;

//получам данные если запрос с данной информацией найден
if (found=True) then
begin
  UserInfo.LOGIN := MainData.UserQuery.FieldByName("LOGIN").AsString;
  UserInfo.USERNAME := MainData.UserQuery.FieldByName("USERNAME").AsString;
  UserInfo.CANDELETEFAX := MainData.UserQuery.FieldByName("CANDELETEFAX").AsInteger;
  UserInfo.IMMORTAL := MainData.UserQuery.FieldByName("IMMORTAL").AsInteger;
  UserInfo.CANGETFAX := MainData.UserQuery.FieldByName("CANGETFAX").AsInteger;
  UserInfo.ADMINISTRATOR := MainData.UserQuery.FieldByName("ADMINISTRATOR").AsInteger;
  //
  ReadCarrentSid := True;
end
else ReadCarrentSid := false;
//
Username := "";
Domain := "";
FreeMem(Sid);
//закрываем запрос
MainData.UserQuery.Active := false;
MainData.UserQuery.SQL.Clear;
end;


 
panov ©   (2004-04-07 13:04) [64]

К сожалению, в первом блоке пробелы куда-то исчезли...


 
panov ©   (2004-04-07 13:04) [64]

К сожалению, в первом блоке пробелы куда-то исчезли...


 
Игорь Шевченко ©   (2004-04-07 13:06) [65]


> if (found=True) then


if found then


> if found=false then MainData.UserQuery.Next;


if not found then
 MainData.UserQuery.Next

Почему на двух строчках: чтобы можно было остановиться на конкретной строчке отладчиком.


 
Игорь Шевченко ©   (2004-04-07 13:06) [65]


> if (found=True) then


if found then


> if found=false then MainData.UserQuery.Next;


if not found then
 MainData.UserQuery.Next

Почему на двух строчках: чтобы можно было остановиться на конкретной строчке отладчиком.


 
Style ©   (2004-04-07 13:08) [66]

Игорь Шевченко ©  
зато если возможно что в дальнейшем я сюда что-нить добавлю
лучше сразу написать begin end;


 
Style ©   (2004-04-07 13:08) [66]

Игорь Шевченко ©  
зато если возможно что в дальнейшем я сюда что-нить добавлю
лучше сразу написать begin end;


 
stone ©   (2004-04-07 13:12) [67]


> GetMem(TSid,BlobStream.Size);
>       BlobStream.ReadBuffer(PByteArray(TSid)[0], BlobStream.Size);
>       for i:=0 to Csid-1 do
>       begin
>         if (PByteArray(Sid)[i]<>PByteArray(TSid)[i]) then
> found:=false;
>       end;
>       FreeMem(TSid);


не хватает try finally
не понятен цикл, т.е. получается found может меняться на True False несколько раз. Значит надо или сразу брать последнее значение i или прерывать цикл при выполнении определенного условия


 
stone ©   (2004-04-07 13:12) [67]


> GetMem(TSid,BlobStream.Size);
>       BlobStream.ReadBuffer(PByteArray(TSid)[0], BlobStream.Size);
>       for i:=0 to Csid-1 do
>       begin
>         if (PByteArray(Sid)[i]<>PByteArray(TSid)[i]) then
> found:=false;
>       end;
>       FreeMem(TSid);


не хватает try finally
не понятен цикл, т.е. получается found может меняться на True False несколько раз. Значит надо или сразу брать последнее значение i или прерывать цикл при выполнении определенного условия


 
int64   (2004-04-07 13:13) [68]

panov ©   (07.04.04 13:04) [63]

Или так, тоже не вникая:

GetCurentSID;
OpenQuery;
if FindNeedSID then
GetData;
CloseQuery;


 
int64   (2004-04-07 13:13) [68]

panov ©   (07.04.04 13:04) [63]

Или так, тоже не вникая:

GetCurentSID;
OpenQuery;
if FindNeedSID then
GetData;
CloseQuery;


 
Игорь Шевченко ©   (2004-04-07 13:13) [69]

Style ©   (07.04.04 13:08)


> лучше сразу написать begin end;


Лучше, все-таки, думать. А все эти резервирования до хорошего кода не доводят


 
Игорь Шевченко ©   (2004-04-07 13:13) [69]

Style ©   (07.04.04 13:08)


> лучше сразу написать begin end;


Лучше, все-таки, думать. А все эти резервирования до хорошего кода не доводят


 
Rouse_ ©   (2004-04-07 13:15) [70]

Я бы оформил как и Александр, только с небольшим изменением

//создаем запрос на пользователя
with MainData.UserQuery do
begin
 Active := false;
 SQL.Clear;
 SQL.Add("select * from faxusers;");
 UserQuery.Active := True;
...
   BlobStream.Free;
   if not Found then Next;
 end;
end;
end;

Тоже относится и к UserInfo.LOGIN и т.д.


 
Rouse_ ©   (2004-04-07 13:15) [70]

Я бы оформил как и Александр, только с небольшим изменением

//создаем запрос на пользователя
with MainData.UserQuery do
begin
 Active := false;
 SQL.Clear;
 SQL.Add("select * from faxusers;");
 UserQuery.Active := True;
...
   BlobStream.Free;
   if not Found then Next;
 end;
end;
end;

Тоже относится и к UserInfo.LOGIN и т.д.


 
panov ©   (2004-04-07 13:15) [71]

>int64   (07.04.04 13:13) [68]

if FindNeedSID then
GetData;


В таком случае код получается разорванным и читается хуже, чем
if FindNeedSID then GetData;


 
panov ©   (2004-04-07 13:15) [71]

>int64   (07.04.04 13:13) [68]

if FindNeedSID then
GetData;


В таком случае код получается разорванным и читается хуже, чем
if FindNeedSID then GetData;


 
panov ©   (2004-04-07 13:15) [72]

Удалено модератором
Примечание: Дубль


 
panov ©   (2004-04-07 13:15) [72]

Удалено модератором
Примечание: Дубль


 
Игорь Шевченко ©   (2004-04-07 13:16) [73]

Agent13 ©   (07.04.04 12:53)

Я не выставляю свой код как образец того, как надо писать всем.

Образец находится в Program Files\Borland\Delphi\Source\Vcl

Образец моего кода: http://www.schevchenko.net.ru/


 
Игорь Шевченко ©   (2004-04-07 13:16) [73]

Agent13 ©   (07.04.04 12:53)

Я не выставляю свой код как образец того, как надо писать всем.

Образец находится в Program Files\Borland\Delphi\Source\Vcl

Образец моего кода: http://www.schevchenko.net.ru/


 
Anatoly Podgoretsky ©   (2004-04-07 13:17) [74]

panov ©   (07.04.04 13:04) [64]
Совет, это особенность форума, один пробел съедается, поэтому надо писать так.

begin
...xx
...begin
.....xxx
...end
end

то есть добавлять на первом уровне один пробел


 
Anatoly Podgoretsky ©   (2004-04-07 13:17) [74]

panov ©   (07.04.04 13:04) [64]
Совет, это особенность форума, один пробел съедается, поэтому надо писать так.

begin
...xx
...begin
.....xxx
...end
end

то есть добавлять на первом уровне один пробел


 
panov ©   (2004-04-07 13:17) [75]

>Rouse_ ©   (07.04.04 13:15) [70]

Я стараюсь как можно меньше пользоваться оператором with во избежание коллизий в названиях методов.
Такие ошибки трудно обнаруживаются.


 
panov ©   (2004-04-07 13:17) [75]

>Rouse_ ©   (07.04.04 13:15) [70]

Я стараюсь как можно меньше пользоваться оператором with во избежание коллизий в названиях методов.
Такие ошибки трудно обнаруживаются.


 
Игорь Шевченко ©   (2004-04-07 13:18) [76]

Agent13 ©   (07.04.04 12:53)

P.S. Любая конструктивная критика принимается :)


 
Игорь Шевченко ©   (2004-04-07 13:18) [76]

Agent13 ©   (07.04.04 12:53)

P.S. Любая конструктивная критика принимается :)


 
panov ©   (2004-04-07 13:18) [77]

>Anatoly Podgoretsky ©   (07.04.04 13:17) [74]

Век живи, век учись-)


 
panov ©   (2004-04-07 13:18) [77]

>Anatoly Podgoretsky ©   (07.04.04 13:17) [74]

Век живи, век учись-)


 
Alex Konshin ©   (2004-04-07 13:19) [78]

Rouse_ ©   (07.04.04 13:15) [70]
Про try...finally забываете.
Лично у меня всегда как правило, когда что-то берется на время и тут же отдается в той же функции, сразу пишу try...finally. Это почти никогда не бывает лишним. Я бы и всем так советовал.


 
Alex Konshin ©   (2004-04-07 13:19) [78]

Rouse_ ©   (07.04.04 13:15) [70]
Про try...finally забываете.
Лично у меня всегда как правило, когда что-то берется на время и тут же отдается в той же функции, сразу пишу try...finally. Это почти никогда не бывает лишним. Я бы и всем так советовал.


 
int64   (2004-04-07 13:20) [79]

panov ©   (07.04.04 13:15) [71]
Нормально. Пробел только при посте схавался.


 
int64   (2004-04-07 13:20) [79]

panov ©   (07.04.04 13:15) [71]
Нормально. Пробел только при посте схавался.


 
Rouse_ ©   (2004-04-07 13:23) [80]

> [78] Alex Konshin ©   (07.04.04 13:19)
Ну так я ж не вникал - просто указал на излишнюю захламленность кода, которую обычно убираю при помощи with...


 
Rouse_ ©   (2004-04-07 13:23) [80]

> [78] Alex Konshin ©   (07.04.04 13:19)
Ну так я ж не вникал - просто указал на излишнюю захламленность кода, которую обычно убираю при помощи with...


 
SoftX   (2004-04-07 13:28) [81]

>>Agent13 ©   (07.04.04 12:53) [60]
>>Присоединяюсь. Здесь на форуме мастера очень часто критикуют чей-то код, а примера как НАДО писать я так и не видел. Очень хотелось бы посмотреть.

Ну мне в принципе была полезна критика именно моего кода, и его недостатков, так как часто я ориентируюсь на скорость работы и функциональность, а не на красивость исходников. Теперь буду стараться учесть и это. Я думаю, что мастера тоже код не очень хорошо пишут, иногда, думаю, жертвуют функциональности за счет красивости...


 
SoftX   (2004-04-07 13:28) [81]

>>Agent13 ©   (07.04.04 12:53) [60]
>>Присоединяюсь. Здесь на форуме мастера очень часто критикуют чей-то код, а примера как НАДО писать я так и не видел. Очень хотелось бы посмотреть.

Ну мне в принципе была полезна критика именно моего кода, и его недостатков, так как часто я ориентируюсь на скорость работы и функциональность, а не на красивость исходников. Теперь буду стараться учесть и это. Я думаю, что мастера тоже код не очень хорошо пишут, иногда, думаю, жертвуют функциональности за счет красивости...


 
}|{yk ©   (2004-04-07 13:30) [82]

А я код вообще не форматирую. Для этого в Delphi есть DelForEx,
для оракловских скриптов - в SQL Navigator Source Formatter
Получается правильное и красивое оформление. А если ктото чскажет что лучше ручками форматировать, то это будет бред - зачем будучи программистом не упрощать себе жизнь?


 
}|{yk ©   (2004-04-07 13:30) [82]

А я код вообще не форматирую. Для этого в Delphi есть DelForEx,
для оракловских скриптов - в SQL Navigator Source Formatter
Получается правильное и красивое оформление. А если ктото чскажет что лучше ручками форматировать, то это будет бред - зачем будучи программистом не упрощать себе жизнь?


 
Dmitriy O. ©   (2004-04-07 13:32) [83]


> SoftX   (07.04.04 12:06)

http://dmitriyo.narod.ru/Skrin/kod.jpg

Да такой код трудно понять :))))


 
Dmitriy O. ©   (2004-04-07 13:32) [83]


> SoftX   (07.04.04 12:06)

http://dmitriyo.narod.ru/Skrin/kod.jpg

Да такой код трудно понять :))))


 
Alex Konshin ©   (2004-04-07 13:34) [84]

Ты не учитываешь
а) стоимость поддержки твоего кода (а все время, "съэкономленное" тобой будет просто ничто, по сравнению с тем, сколько ты сам или другие люди потратят на разбор твоего кода).
б) стиль позволяет избегать ошибок и упрощает отладку. Я, собственно, тебе указал именно на эти недостатки.


 
Alex Konshin ©   (2004-04-07 13:34) [84]

Ты не учитываешь
а) стоимость поддержки твоего кода (а все время, "съэкономленное" тобой будет просто ничто, по сравнению с тем, сколько ты сам или другие люди потратят на разбор твоего кода).
б) стиль позволяет избегать ошибок и упрощает отладку. Я, собственно, тебе указал именно на эти недостатки.


 
DiamondShark ©   (2004-04-07 13:34) [85]


if (found=True) then with UserInfo, MainData.UserQuery do
begin
 LOGIN := FieldByName("LOGIN").AsString;
 USERNAME := FieldByName("USERNAME").AsString;
 CANDELETEFAX := FieldByName("CANDELETEFAX").AsInteger;
 IMMORTAL := FieldByName("IMMORTAL").AsInteger;
 CANGETFAX := FieldByName("CANGETFAX").AsInteger;
 ADMINISTRATOR := FieldByName("ADMINISTRATOR").AsInteger;
 //
 ReadCarrentSid := True;
end


ЗЫ
Var Username:String;
var CUsername:longword;
Var TSid,Sid:PSID;
var Csid:longword;
var Domain:String;
Var Cdomain:longword;
Var PUse:SID_NAME_USE;
Var BlobStream:TStream;
var i:integer;
var found:boolean;

if (found=True)

Тяжёлое наследие жабы?


 
DiamondShark ©   (2004-04-07 13:34) [85]


if (found=True) then with UserInfo, MainData.UserQuery do
begin
 LOGIN := FieldByName("LOGIN").AsString;
 USERNAME := FieldByName("USERNAME").AsString;
 CANDELETEFAX := FieldByName("CANDELETEFAX").AsInteger;
 IMMORTAL := FieldByName("IMMORTAL").AsInteger;
 CANGETFAX := FieldByName("CANGETFAX").AsInteger;
 ADMINISTRATOR := FieldByName("ADMINISTRATOR").AsInteger;
 //
 ReadCarrentSid := True;
end


ЗЫ
Var Username:String;
var CUsername:longword;
Var TSid,Sid:PSID;
var Csid:longword;
var Domain:String;
Var Cdomain:longword;
Var PUse:SID_NAME_USE;
Var BlobStream:TStream;
var i:integer;
var found:boolean;

if (found=True)

Тяжёлое наследие жабы?


 
Внук ©   (2004-04-07 13:36) [86]

>>Rouse_ ©   (07.04.04 13:23) [80]
 А я вот за использование with кроме самых простейших случаев караю расстрелом через повешение. О чем, впрочем, неоднократно говорил, переубедить ни у кого не получилось.


 
Внук ©   (2004-04-07 13:36) [86]

>>Rouse_ ©   (07.04.04 13:23) [80]
 А я вот за использование with кроме самых простейших случаев караю расстрелом через повешение. О чем, впрочем, неоднократно говорил, переубедить ни у кого не получилось.


 
}|{yk ©   (2004-04-07 13:37) [87]

Игорю Шевченко:
посмотрел вашу программу "СуперМаркет"
Скажите, а зачем вам было изобретать велосипед?
Есть же специальные языки и среды для моделирования таких процессов. GPSS например.


 
}|{yk ©   (2004-04-07 13:37) [87]

Игорю Шевченко:
посмотрел вашу программу "СуперМаркет"
Скажите, а зачем вам было изобретать велосипед?
Есть же специальные языки и среды для моделирования таких процессов. GPSS например.


 
sniknik ©   (2004-04-07 13:39) [88]

хотите посмотреть на действительно ужастный код? или форматирование это как сказать. посмотрите этот, и все ваши претензии покажутся детским лепетом. ;о))
http://delphi.chertenok.ru/forum/my_download.php?tema=del&action=show&id=172
а мне приходилось его еще и разбирать. ;о) (там глюк был, возможно не один но мне хватило. про глюк в ридми написано)


 
sniknik ©   (2004-04-07 13:39) [88]

хотите посмотреть на действительно ужастный код? или форматирование это как сказать. посмотрите этот, и все ваши претензии покажутся детским лепетом. ;о))
http://delphi.chertenok.ru/forum/my_download.php?tema=del&action=show&id=172
а мне приходилось его еще и разбирать. ;о) (там глюк был, возможно не один но мне хватило. про глюк в ридми написано)


 
Игорь Шевченко ©   (2004-04-07 13:49) [89]

}|{yk ©   (07.04.04 13:37)

1) Вопрос к Джеффри Рихтеру (это его пример, переведенный мной на Delphi)
2) Иллюстрация работы с объектами синхронизации в многопоточном приложении


 
Игорь Шевченко ©   (2004-04-07 13:49) [89]

}|{yk ©   (07.04.04 13:37)

1) Вопрос к Джеффри Рихтеру (это его пример, переведенный мной на Delphi)
2) Иллюстрация работы с объектами синхронизации в многопоточном приложении


 
passlight ©   (2004-04-07 13:56) [90]

DiamondShark ©   (07.04.04 13:34) [85]
Похоже на VBA...


 
passlight ©   (2004-04-07 13:56) [90]

DiamondShark ©   (07.04.04 13:34) [85]
Похоже на VBA...


 
Romkin ©   (2004-04-07 13:59) [91]

Внук ©  (07.04.04 13:36) [86]
ну-ну

 with TCustomFrameShowAnswerClass(FindClass(FrameClassName)).Create(Self) do
 begin
   Parent := self;
   Align := alClient;
   ...
 end;

И не убедишь ты меня, что with - это плохо. Конструкция есть в языке, следовательно - пользуем :)
Единственная причина непользования - неудобно просматривать при отладке? Но у меня пошаговая отладка с просмотром переменных самый крайний случай. Обычно хватает пары точек останова, ну и Ctrl+Alt+W :)

sniknik ©  (07.04.04 13:39) [88] ААААА!!! :)))


 
Romkin ©   (2004-04-07 13:59) [91]

Внук ©  (07.04.04 13:36) [86]
ну-ну

 with TCustomFrameShowAnswerClass(FindClass(FrameClassName)).Create(Self) do
 begin
   Parent := self;
   Align := alClient;
   ...
 end;

И не убедишь ты меня, что with - это плохо. Конструкция есть в языке, следовательно - пользуем :)
Единственная причина непользования - неудобно просматривать при отладке? Но у меня пошаговая отладка с просмотром переменных самый крайний случай. Обычно хватает пары точек останова, ну и Ctrl+Alt+W :)

sniknik ©  (07.04.04 13:39) [88] ААААА!!! :)))


 
Rouse_ ©   (2004-04-07 14:01) [92]

> [86] Внук ©   (07.04.04 13:36)
Не в моих правилах кого-то разубеждать.

к примеру не буду я писать везде IP.<параметр>
вместо
   with IP do
   begin
     Ttl := 1;
     Tos := 0;
     IPFlags := 0;
     OptSize := 0;
     Options := nil;
   end;


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


 
Rouse_ ©   (2004-04-07 14:01) [92]

> [86] Внук ©   (07.04.04 13:36)
Не в моих правилах кого-то разубеждать.

к примеру не буду я писать везде IP.<параметр>
вместо
   with IP do
   begin
     Ttl := 1;
     Tos := 0;
     IPFlags := 0;
     OptSize := 0;
     Options := nil;
   end;


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


 
SoftX   (2004-04-07 14:02) [93]

>>DiamondShark ©   (07.04.04 13:34) [85]
>>Тяжёлое наследие жабы?

Вообще-то я писал и на Жабе и на C++ и на Ada и на Асме  и на Прологе..., так что после изучения довольно немалого количества языков у меня сформировался свой стиль, возможно кривой, но мне все равно на чем писать(только FoxPro ненавижу). В принципе многим более непонятна логика моей программы, чем код. Так как многие вещи я реализую(для ускорения) так как обычный программист делать не стал бы, но в каждом данном случае это является более целесообразным, чем нормальный подход. Хоть это и затрудняет удобочитаемость кода, код ориентирован на одного человека...


 
SoftX   (2004-04-07 14:02) [93]

>>DiamondShark ©   (07.04.04 13:34) [85]
>>Тяжёлое наследие жабы?

Вообще-то я писал и на Жабе и на C++ и на Ada и на Асме  и на Прологе..., так что после изучения довольно немалого количества языков у меня сформировался свой стиль, возможно кривой, но мне все равно на чем писать(только FoxPro ненавижу). В принципе многим более непонятна логика моей программы, чем код. Так как многие вещи я реализую(для ускорения) так как обычный программист делать не стал бы, но в каждом данном случае это является более целесообразным, чем нормальный подход. Хоть это и затрудняет удобочитаемость кода, код ориентирован на одного человека...


 
Rouse_ ©   (2004-04-07 14:06) [94]

> [88] sniknik ©   (07.04.04 13:39)
Тебе только за попытку разобраться в ЭТОМ (боюсь назвать коде) нужно давать орден Героя Соц Труда, и Красную Звезду на все пузо :)))))


 
Rouse_ ©   (2004-04-07 14:06) [94]

> [88] sniknik ©   (07.04.04 13:39)
Тебе только за попытку разобраться в ЭТОМ (боюсь назвать коде) нужно давать орден Героя Соц Труда, и Красную Звезду на все пузо :)))))


 
Игорь Шевченко ©   (2004-04-07 14:10) [95]


> код ориентирован на одного человека...


Это и есть показатель неудобочитаемого кода. При увольнении, допустим, этого человека, его код с большой долей вероятности придется переписывать, если потребуется в нем что-либо исправлять или дополнять.


 
Игорь Шевченко ©   (2004-04-07 14:10) [95]


> код ориентирован на одного человека...


Это и есть показатель неудобочитаемого кода. При увольнении, допустим, этого человека, его код с большой долей вероятности придется переписывать, если потребуется в нем что-либо исправлять или дополнять.


 
Romkin ©   (2004-04-07 14:16) [96]

Кстати, а ведь неплохой вопрос...
имеем:

type
 TCustomFrameShowAnswer = class(TFrame)
 ...
 end;

 TFrameShowText = class(TCustomFrameShowAnswer)
 ...
 public
   constructor Create(AOwner: TComponent); override;  
 ...
 end;

 Вызов

 FrameClassName := "TFrameShowText";
 with TCustomFrameShowAnswerClass(FindClass(FrameClassName)).Create(Self) do
 begin
  Parent := self;
  Align := alClient;
  ...
 end;

Вопрос: конструктор Create какого класса будет вызван?


 
Romkin ©   (2004-04-07 14:16) [96]

Кстати, а ведь неплохой вопрос...
имеем:

type
 TCustomFrameShowAnswer = class(TFrame)
 ...
 end;

 TFrameShowText = class(TCustomFrameShowAnswer)
 ...
 public
   constructor Create(AOwner: TComponent); override;  
 ...
 end;

 Вызов

 FrameClassName := "TFrameShowText";
 with TCustomFrameShowAnswerClass(FindClass(FrameClassName)).Create(Self) do
 begin
  Parent := self;
  Align := alClient;
  ...
 end;

Вопрос: конструктор Create какого класса будет вызван?


 
mfender ©   (2004-04-07 14:19) [97]

panov ©   (07.04.04 12:37)
>mfender ©   (07.04.04 12:23) [38]
хотя бы тот же банальный 2 пробела перед begin
2 пробела не перед begin вставляются, а в строке, следующей после begin:


А вот я обычно пишу так:
function MyFuncDelta: Boolean;
begin
if a>b then
  begin
    Result := a - b;
  end
else
  begin
    Result := b - a;
  end;
end;


Я не прав?


 
mfender ©   (2004-04-07 14:19) [97]

panov ©   (07.04.04 12:37)
>mfender ©   (07.04.04 12:23) [38]
хотя бы тот же банальный 2 пробела перед begin
2 пробела не перед begin вставляются, а в строке, следующей после begin:


А вот я обычно пишу так:
function MyFuncDelta: Boolean;
begin
if a>b then
  begin
    Result := a - b;
  end
else
  begin
    Result := b - a;
  end;
end;


Я не прав?


 
Внук ©   (2004-04-07 14:20) [98]

>>Romkin ©   (07.04.04 13:59) [91]
 Попробую изложить свои соображения. Чтение такого кода подразумевает знание структуры используемых (иногда - специфических) VCL-классов. Что не является обязательным для чтения этого кода другим человеком (не автором), не говоря уже о собственноручно написанных классах. Поиск на всякий случай наличие в проекте глобальных переменных Parent и Align тоже не добавляет положительных эмоций. Не говоря уже о том, когда with применяется для нескольких объектов или вложенный with.
 Оператор goto тоже есть в языке, так и что?
 Когда сам начинал писать на С++, долго ругался по поводу отсутствия там with (до этого на TP7.0 писал). А потом понял всю прелесть, когда пришлось разбираться в сотнях килобайт чужого кода.
 Перешел на Delphi - теперь для меня with не существует.


 
Внук ©   (2004-04-07 14:20) [98]

>>Romkin ©   (07.04.04 13:59) [91]
 Попробую изложить свои соображения. Чтение такого кода подразумевает знание структуры используемых (иногда - специфических) VCL-классов. Что не является обязательным для чтения этого кода другим человеком (не автором), не говоря уже о собственноручно написанных классах. Поиск на всякий случай наличие в проекте глобальных переменных Parent и Align тоже не добавляет положительных эмоций. Не говоря уже о том, когда with применяется для нескольких объектов или вложенный with.
 Оператор goto тоже есть в языке, так и что?
 Когда сам начинал писать на С++, долго ругался по поводу отсутствия там with (до этого на TP7.0 писал). А потом понял всю прелесть, когда пришлось разбираться в сотнях килобайт чужого кода.
 Перешел на Delphi - теперь для меня with не существует.


 
Игорь Шевченко ©   (2004-04-07 14:20) [99]


> конструктор Create какого класса будет вызван?


TFrameShowText - он же виртуальный


 
Игорь Шевченко ©   (2004-04-07 14:20) [99]


> конструктор Create какого класса будет вызван?


TFrameShowText - он же виртуальный


 
olookin ©   (2004-04-07 14:21) [100]

[32] Игорь Шевченко ©   (07.04.04 12:09)
SoftX   (07.04.04 12:06)
> говорят тяжелый,
Справедливо говорят.

А про это что скажете?

procedure TEQAPbase.EqapAllsizediagram1Click(Sender: TObject);
var Form: TForm;
   Chart: TChart;
   dataser,trendser: TLineSeries;
   i,j,n: integer;
   str: array of string;
   a,s: string;
   lst: TStringList;
   curdate: TDate;
   vals: TIntegerArray;
   p: PChar;
   m: TDoubleArray;
   pm: PDoubleArray;
   psource,pdest: PChartSeries;
   source,dest: TChartSeries;
begin
 Form:=TForm.Create(Application);
 with Form do begin Caption:="EqapAll execution file size diagram";
 BorderIcons:=[biSystemMenu]; BorderStyle:=bsSingle;
 Width:=500; Height:=200; Position:=poScreenCenter; end;
 Chart:=TChart.Create(Form);
 with Chart do begin Parent:=Form; Align:=alClient;
 MarginTop:=3;  MarginBottom:=1; MarginLeft:=1; MarginRight:=3;
 View3D:=false; BevelInner:=bvNone; BevelOuter:=bvNone;
 Title.Visible:=false; Legend.Visible:=false;
 BackWall.Brush.Style:=bsSolid; BackWall.Color:=clWhite;
 with LeftAxis do begin LabelsFont.Size:=6; Grid.Visible:=false;
 Title.Caption:="Size, kB"; Title.Font.Size:=6; BorderWidth:=2; end;
 with BottomAxis do begin LabelsFont.Size:=6; Grid.Visible:=false;
 Title.Caption:="Date"; Title.Font.Size:=6;
 DateTimeFormat:="dd.MM.yyyy"; end;
 dataser:=TLineSeries.Create(Chart);
 with dataser do begin ParentChart:=Chart;
 XValues.DateTime:=true; SeriesColor:=clRed; LinePen.Width:=2;
 with Pointer do begin Visible:=true; Style:=psCircle;
 VertSize:=3; HorizSize:=3; Brush.Color:=clRed;
 Pen.Color:=clBlack; end; end;
 trendser:=TLineSeries.Create(Chart);
 with trendser do begin ParentChart:=Chart; XValues.DateTime:=true;
 SeriesColor:=clBlack; LinePen.Width:=2; end; end;

 for i:=0 to Chart.SeriesCount-1 do Chart.Series[i].Clear;
 if FileExists(dir+"\System\SizeDiagram.eqs") then begin
 i:=0; curdate:=0; lst:=TStringList.Create;
 lst.LoadFromFile(dir+"\System\SizeDiagram.eqs");
 for j:=0 to lst.Count-1 do begin a:=lst.Strings[j];
 s:=Copy(a,1,Pos("=",a)-1); n:=StrToInt(Copy(a,Pos("=",a)+1,Length(a)));
 if StrToDate(s)<>curdate then begin SetLength(vals,i+1); vals[i]:=n;
 Chart.Series[0].AddXY(StrToDate(s),trunc(vals[i]/1000));
 SetLength(str,i+1); str[i]:=a; curdate:=StrToDate(s); Inc(i); end else
 str[i-1]:=a; end; lst.Clear;
 for i:=0 to Length(str)-1 do lst.Add(str[i]);
 lst.SaveToFile(dir+"\System\SizeDiagram.eqs");
 pm:=@m; source:=TChartSeries.Create(nil); source.Assign(dataser);
 dest:=TChartSeries.Create(nil); dest.Assign(trendser);
 psource:=@source; pdest:=@dest;
 PolynomialRegression(nil,nil,psource,pdest,3,pm,clBlack,p);
 trendser.Assign(dest); m:=nil; pm:=nil;
 psource:=nil; source.Free; pdest:=nil; dest.Free;
 ChartMinMax(Chart); end; vals:=nil; str:=nil; Form.ShowModal;
 dataser.Clear; dataser.Free; trendser.Clear; trendser.Free;
 Chart.FreeAllSeries; Chart.Destroy; Form.Destroy; lst.Clear; lst.Free;
end;

PS: я жуть как не люблю длинные листинги - мне нравится когда все перед глазами. Распишите представленное выше по правилам оформления кода, и у вас получится страниц 10 в доковском документе, размер шрифта 12.


 
olookin ©   (2004-04-07 14:21) [100]

[32] Игорь Шевченко ©   (07.04.04 12:09)
SoftX   (07.04.04 12:06)
> говорят тяжелый,
Справедливо говорят.

А про это что скажете?

procedure TEQAPbase.EqapAllsizediagram1Click(Sender: TObject);
var Form: TForm;
   Chart: TChart;
   dataser,trendser: TLineSeries;
   i,j,n: integer;
   str: array of string;
   a,s: string;
   lst: TStringList;
   curdate: TDate;
   vals: TIntegerArray;
   p: PChar;
   m: TDoubleArray;
   pm: PDoubleArray;
   psource,pdest: PChartSeries;
   source,dest: TChartSeries;
begin
 Form:=TForm.Create(Application);
 with Form do begin Caption:="EqapAll execution file size diagram";
 BorderIcons:=[biSystemMenu]; BorderStyle:=bsSingle;
 Width:=500; Height:=200; Position:=poScreenCenter; end;
 Chart:=TChart.Create(Form);
 with Chart do begin Parent:=Form; Align:=alClient;
 MarginTop:=3;  MarginBottom:=1; MarginLeft:=1; MarginRight:=3;
 View3D:=false; BevelInner:=bvNone; BevelOuter:=bvNone;
 Title.Visible:=false; Legend.Visible:=false;
 BackWall.Brush.Style:=bsSolid; BackWall.Color:=clWhite;
 with LeftAxis do begin LabelsFont.Size:=6; Grid.Visible:=false;
 Title.Caption:="Size, kB"; Title.Font.Size:=6; BorderWidth:=2; end;
 with BottomAxis do begin LabelsFont.Size:=6; Grid.Visible:=false;
 Title.Caption:="Date"; Title.Font.Size:=6;
 DateTimeFormat:="dd.MM.yyyy"; end;
 dataser:=TLineSeries.Create(Chart);
 with dataser do begin ParentChart:=Chart;
 XValues.DateTime:=true; SeriesColor:=clRed; LinePen.Width:=2;
 with Pointer do begin Visible:=true; Style:=psCircle;
 VertSize:=3; HorizSize:=3; Brush.Color:=clRed;
 Pen.Color:=clBlack; end; end;
 trendser:=TLineSeries.Create(Chart);
 with trendser do begin ParentChart:=Chart; XValues.DateTime:=true;
 SeriesColor:=clBlack; LinePen.Width:=2; end; end;

 for i:=0 to Chart.SeriesCount-1 do Chart.Series[i].Clear;
 if FileExists(dir+"\System\SizeDiagram.eqs") then begin
 i:=0; curdate:=0; lst:=TStringList.Create;
 lst.LoadFromFile(dir+"\System\SizeDiagram.eqs");
 for j:=0 to lst.Count-1 do begin a:=lst.Strings[j];
 s:=Copy(a,1,Pos("=",a)-1); n:=StrToInt(Copy(a,Pos("=",a)+1,Length(a)));
 if StrToDate(s)<>curdate then begin SetLength(vals,i+1); vals[i]:=n;
 Chart.Series[0].AddXY(StrToDate(s),trunc(vals[i]/1000));
 SetLength(str,i+1); str[i]:=a; curdate:=StrToDate(s); Inc(i); end else
 str[i-1]:=a; end; lst.Clear;
 for i:=0 to Length(str)-1 do lst.Add(str[i]);
 lst.SaveToFile(dir+"\System\SizeDiagram.eqs");
 pm:=@m; source:=TChartSeries.Create(nil); source.Assign(dataser);
 dest:=TChartSeries.Create(nil); dest.Assign(trendser);
 psource:=@source; pdest:=@dest;
 PolynomialRegression(nil,nil,psource,pdest,3,pm,clBlack,p);
 trendser.Assign(dest); m:=nil; pm:=nil;
 psource:=nil; source.Free; pdest:=nil; dest.Free;
 ChartMinMax(Chart); end; vals:=nil; str:=nil; Form.ShowModal;
 dataser.Clear; dataser.Free; trendser.Clear; trendser.Free;
 Chart.FreeAllSeries; Chart.Destroy; Form.Destroy; lst.Clear; lst.Free;
end;

PS: я жуть как не люблю длинные листинги - мне нравится когда все перед глазами. Распишите представленное выше по правилам оформления кода, и у вас получится страниц 10 в доковском документе, размер шрифта 12.


 
Игорь Шевченко ©   (2004-04-07 14:23) [101]

olookin ©   (07.04.04 14:21)

Его нельзя прочитать.


 
Игорь Шевченко ©   (2004-04-07 14:23) [101]

olookin ©   (07.04.04 14:21)

Его нельзя прочитать.


 
Style ©   (2004-04-07 14:26) [102]

[100]
Мдя...
А теперь пощитайте время на его прочтение до полного осознания что там происходит :)

А отладчик вы вообще не используете???
Или к такому виду исходник приводят после отладки :)


 
Style ©   (2004-04-07 14:26) [102]

[100]
Мдя...
А теперь пощитайте время на его прочтение до полного осознания что там происходит :)

А отладчик вы вообще не используете???
Или к такому виду исходник приводят после отладки :)


 
Romkin ©   (2004-04-07 14:27) [103]

Внук ©  (07.04.04 14:20) [98] Ты, эда, не усугубливай :))) Все дело в культуре: уверяю, в моем коде ты можешь быть уверен, что засады нет, переменные в блоке with либо принадлежат этому объекту, либо локальные данного метода (очень редко на F - приватные). Все.
Иначе ты увидишь полную расшифровку... Полностью там написано:

 with TCustomFrameShowAnswerClass(FindClass(FrameClassName)).Create(Self) do
 begin
   Parent := self;
   Align := alClient;
   ShowAnswers(DMTasks.cdsQuestion.FieldByName("QUEST_KIND").asString);
 end;

Неужели код плох для чтения?


 
Romkin ©   (2004-04-07 14:27) [103]

Внук ©  (07.04.04 14:20) [98] Ты, эда, не усугубливай :))) Все дело в культуре: уверяю, в моем коде ты можешь быть уверен, что засады нет, переменные в блоке with либо принадлежат этому объекту, либо локальные данного метода (очень редко на F - приватные). Все.
Иначе ты увидишь полную расшифровку... Полностью там написано:

 with TCustomFrameShowAnswerClass(FindClass(FrameClassName)).Create(Self) do
 begin
   Parent := self;
   Align := alClient;
   ShowAnswers(DMTasks.cdsQuestion.FieldByName("QUEST_KIND").asString);
 end;

Неужели код плох для чтения?


 
Anatoly Podgoretsky ©   (2004-04-07 14:28) [104]

mfender ©   (07.04.04 14:19) [97]
Право имеешь, но логически как бы добавляешь новые уровни вложенности, там где их нет.


 
Anatoly Podgoretsky ©   (2004-04-07 14:28) [104]

mfender ©   (07.04.04 14:19) [97]
Право имеешь, но логически как бы добавляешь новые уровни вложенности, там где их нет.


 
Style ©   (2004-04-07 14:31) [105]

>>[100]
Form:=TForm.Create(Application);
....
Form.Free;

таже беда где у тя try finally????


 
Style ©   (2004-04-07 14:31) [105]

>>[100]
Form:=TForm.Create(Application);
....
Form.Free;

таже беда где у тя try finally????


 
VAleksey ©   (2004-04-07 14:34) [106]


> olookin ©   (07.04.04 14:21) [100]

Вот матерится будет тот кому это придется разгребать.


 
VAleksey ©   (2004-04-07 14:34) [106]


> olookin ©   (07.04.04 14:21) [100]

Вот матерится будет тот кому это придется разгребать.


 
Внук ©   (2004-04-07 14:34) [107]

>>Romkin ©   (07.04.04 14:27) [103]
 Дык, я и говорю - если аккуратно :))) Иначе - расстрел, с занесением в личное дело. А что до меня касается - вообще не применяю такого.


 
Внук ©   (2004-04-07 14:34) [107]

>>Romkin ©   (07.04.04 14:27) [103]
 Дык, я и говорю - если аккуратно :))) Иначе - расстрел, с занесением в личное дело. А что до меня касается - вообще не применяю такого.


 
mfender ©   (2004-04-07 14:35) [108]


> Anatoly Podgoretsky ©   (07.04.04 14:28) [104]
> mfender ©   (07.04.04 14:19) [97]
> Право имеешь, но логически как бы добавляешь новые уровни
> вложенности, там где их нет.


Нет, ну приведенный пример, конечно, содержит лишние begin...end, для одного движения я, разумеется, не стану делать блок. Но в целом я так всегда делаю. Просто самому понятней (я - не программист, это мое хобби. Пишу только для себя. Вот последнее творение - админский клиент для сайта, БД обслуживать.) Да, еще когда пишу, обычно сразу пишу begin...end, чтобы потом не было мучительно трудно концы искать.


 
mfender ©   (2004-04-07 14:35) [108]


> Anatoly Podgoretsky ©   (07.04.04 14:28) [104]
> mfender ©   (07.04.04 14:19) [97]
> Право имеешь, но логически как бы добавляешь новые уровни
> вложенности, там где их нет.


Нет, ну приведенный пример, конечно, содержит лишние begin...end, для одного движения я, разумеется, не стану делать блок. Но в целом я так всегда делаю. Просто самому понятней (я - не программист, это мое хобби. Пишу только для себя. Вот последнее творение - админский клиент для сайта, БД обслуживать.) Да, еще когда пишу, обычно сразу пишу begin...end, чтобы потом не было мучительно трудно концы искать.


 
Anatoly Podgoretsky ©   (2004-04-07 14:38) [109]

Всегда пишу скобки парой, а begin...end это операторные скобки
Также поступаю и с другими конструкциями, типа try, case и подобное, уменьшает количество ошибок.


 
Anatoly Podgoretsky ©   (2004-04-07 14:38) [109]

Всегда пишу скобки парой, а begin...end это операторные скобки
Также поступаю и с другими конструкциями, типа try, case и подобное, уменьшает количество ошибок.


 
Style ©   (2004-04-07 14:42) [110]

Кстати сабж. интересный
О провилах! Или вилы хорошего тона :)


 
Style ©   (2004-04-07 14:42) [110]

Кстати сабж. интересный
О провилах! Или вилы хорошего тона :)


 
Anatoly Podgoretsky ©   (2004-04-07 14:44) [111]

Это грабли только плохие бывают, а вилы нет.


 
Anatoly Podgoretsky ©   (2004-04-07 14:44) [111]

Это грабли только плохие бывают, а вилы нет.


 
Style ©   (2004-04-07 14:49) [112]


> Это грабли только плохие бывают, а вилы нет.

А я и написал - вилы хорошего тона!


 
Style ©   (2004-04-07 14:49) [112]


> Это грабли только плохие бывают, а вилы нет.

А я и написал - вилы хорошего тона!


 
Vuk ©   (2004-04-07 14:53) [113]

to olookin ©   (07.04.04 14:21) [100]:
>А про это что скажете?
Эффект почти как от обфускатора.


 
Vuk ©   (2004-04-07 14:53) [113]

to olookin ©   (07.04.04 14:21) [100]:
>А про это что скажете?
Эффект почти как от обфускатора.


 
panov ©   (2004-04-07 14:57) [114]

>mfender ©

begin...end должны быть на том же уровне по вертикали со строкой с if, do, with и т.п.


 
panov ©   (2004-04-07 14:57) [114]

>mfender ©

begin...end должны быть на том же уровне по вертикали со строкой с if, do, with и т.п.


 
Style ©   (2004-04-07 14:57) [115]

Вот я щас на грабли чуть не наступил :)

Всего лишь то забыл в DotReplace result := ""; в
начале функции поставить :)
Дык у меня сейчас такие миллиарды в банк пошли :)


//Экспорт в БОГОРДСК БАНК!
procedure TFrm_Export.Bogorodsk();
var
 Str: TStringList;
 f,i: integer;

 function DotReplace(Str: string):string;
 var
  i: integer;
 begin
   for i := 1 to Length(Str) do
   begin
     if(Str[i] = ",") then
      result := result + "."
     else
      result := result + Str[i];
   end;

 end;
 
begin
 if(not SaveDialog.Execute) then Exit;

 if(FileExists(SaveDialog.FileName)) then
 begin
   if(MessageBox(Handle,"Файл существует. Заменить?","Сообщение", MB_ICONQUESTION or MB_YESNO) = ID_NO) then
    exit
   else
    deletefile(SaveDialog.FileName);
 end;

 Str := TStringList.Create();
 try

   qry_export.Close;
   qry_export.ParamByName("DateOper").AsDate := CurrentDate;
   qry_export.ParamByName("Flag").AsInteger := 0;
   qry_export.ParamByName("BankID").AsFLoat := qry_banklist.FieldByName("BankID").AsFLoat;
   
  OpenQueryWait(nil,qry_export,STATE_OPEN);

   qry_export.first();
   for i := 1 to qry_export.RecordCount do
   begin
    Str.Add("#"+IntTOStr(i)+"|PayDocRuXE");

     for f := 0 to Qry_Export.Fields.Count-1 do
     begin
      if(qry_export.fields[f].DataType = ftFloat) then
      begin
        Str.Add( WinToDos(DotReplace(qry_export.fields[f].AsString)));
      end
      else
        Str.Add( WinToDos(qry_export.fields[f].AsString));
     end;

    Str.Add(";end");
    qry_export.Next();
   end;

   Str.SaveToFile(SaveDialog.FileName);
   ShowMessage("Экспорт успешно завершен!" + CHR($0D) + CHR($0A) + "Экспортировано записей: " + IntToStr(qry_export.RecordCount));
 finally
   str.Free;
 end;
end;


 
Style ©   (2004-04-07 14:57) [115]

Вот я щас на грабли чуть не наступил :)

Всего лишь то забыл в DotReplace result := ""; в
начале функции поставить :)
Дык у меня сейчас такие миллиарды в банк пошли :)


//Экспорт в БОГОРДСК БАНК!
procedure TFrm_Export.Bogorodsk();
var
 Str: TStringList;
 f,i: integer;

 function DotReplace(Str: string):string;
 var
  i: integer;
 begin
   for i := 1 to Length(Str) do
   begin
     if(Str[i] = ",") then
      result := result + "."
     else
      result := result + Str[i];
   end;

 end;
 
begin
 if(not SaveDialog.Execute) then Exit;

 if(FileExists(SaveDialog.FileName)) then
 begin
   if(MessageBox(Handle,"Файл существует. Заменить?","Сообщение", MB_ICONQUESTION or MB_YESNO) = ID_NO) then
    exit
   else
    deletefile(SaveDialog.FileName);
 end;

 Str := TStringList.Create();
 try

   qry_export.Close;
   qry_export.ParamByName("DateOper").AsDate := CurrentDate;
   qry_export.ParamByName("Flag").AsInteger := 0;
   qry_export.ParamByName("BankID").AsFLoat := qry_banklist.FieldByName("BankID").AsFLoat;
   
  OpenQueryWait(nil,qry_export,STATE_OPEN);

   qry_export.first();
   for i := 1 to qry_export.RecordCount do
   begin
    Str.Add("#"+IntTOStr(i)+"|PayDocRuXE");

     for f := 0 to Qry_Export.Fields.Count-1 do
     begin
      if(qry_export.fields[f].DataType = ftFloat) then
      begin
        Str.Add( WinToDos(DotReplace(qry_export.fields[f].AsString)));
      end
      else
        Str.Add( WinToDos(qry_export.fields[f].AsString));
     end;

    Str.Add(";end");
    qry_export.Next();
   end;

   Str.SaveToFile(SaveDialog.FileName);
   ShowMessage("Экспорт успешно завершен!" + CHR($0D) + CHR($0A) + "Экспортировано записей: " + IntToStr(qry_export.RecordCount));
 finally
   str.Free;
 end;
end;


 
Dmitriy O. ©   (2004-04-07 15:00) [116]


> olookin ©   (07.04.04 14:21)
Да такой код  не смогла обработать до конца даже моя AvtoShema.
http://dmitriyo.narod.ru/Skrin/olookin.jpg


 
Dmitriy O. ©   (2004-04-07 15:00) [116]


> olookin ©   (07.04.04 14:21)
Да такой код  не смогла обработать до конца даже моя AvtoShema.
http://dmitriyo.narod.ru/Skrin/olookin.jpg


 
Игорь Шевченко ©   (2004-04-07 15:10) [117]


> function DotReplace(Str: string):string;
>  var
>   i: integer;
>  begin
>    for i := 1 to Length(Str) do
>    begin
>      if(Str[i] = ",") then
>       result := result + "."
>      else
>       result := result + Str[i];
>    end;
>
>  end;
>  


Result := StringReplace(Str, ",", ".", [rfReplaceAll]);


 
Игорь Шевченко ©   (2004-04-07 15:10) [117]


> function DotReplace(Str: string):string;
>  var
>   i: integer;
>  begin
>    for i := 1 to Length(Str) do
>    begin
>      if(Str[i] = ",") then
>       result := result + "."
>      else
>       result := result + Str[i];
>    end;
>
>  end;
>  


Result := StringReplace(Str, ",", ".", [rfReplaceAll]);


 
Nikolay M. ©   (2004-04-07 15:11) [118]


> olookin ©   (07.04.04 14:21) [100]

Ха-ха 3 раза :)
Это все детский сад. Учу, пока я жив:

#include
#include

#define m(x)(x#define g tj()-J
#define a(x)(x#define h(x)((x)#define f 9999
#define A return
#define H printf(
#define R double
#define U int
#define V for
#define b else
#define u while
#define B if
U v,w,Y= -1,W,J,p,F,o=f,M,N,K,X,YY,_,P[f],s(); typedef U(*L)(); L q[f]; tj(){
U S=m(v)+(m(w)
v?a(v)>1||w-Y||!q[J]:(w-Y  (w-Y*2||q[W+Y*(N+1)]|| (J>>K)-K+(Y-1)/
v?a(v)>2))||q[J];

} z(){ _=5; A v*w||g; } e(){ _= -2;
A(v*v*v-v||w*w*w-w)  (J-W-2||(W N)-4||(W>>K!=(Y-1?N:0))||
q[W+1]||q[W+2]||q[W+K]!=z||P[W+K]*YA(R)(rand() PZ)/(R)PZ; } l(){ _=K+1; A(v*w
a(v)-a(w))||g; } R UC(){ R i=0,d;
u((i+=d=VR())J=n; B(P[W]!=Y||P[J]==Y)A J+1; v=(J N)-(W N); w=(J>>K)-(W>>K); A
q[W]()||(x  QL(W,J,s)); } TT(W){ v=w=0; A q[W]()+K; } s(){ U j= -1,i; Y= -Y;
V(i=0; i
B(j>=0  !I(i,j,0))A Y= -Y; } A!(Y= -Y); } bb(){ _=1; A a(v*w)-2; } uv(){

V(v=0; v>K)==0){ U S=h(v N);
q[v]=!S?z:(S==1?bb:(S==2?c:(v N>K?l:e))); } b B(h(v>>K)==1)q[v]=k; b q[v]=0;
P[v]=!!q[v]*(28-v); } } y(){ U G=Y,i; J=0; V(i=0; ii%8||H"\n%4o ",i);
B((Y=P[i]=m(P[i]))   TT(i))H"%c ",_+93+Y*16); b H"- "); }
H"\n "); do H"%2d",i++ N); u(i N); Y=G; H"\n"); } O(W,J){
B((q[J]=q[W])==k  h(J>>K)==0)q[J]=l; B(q[W]==e)B(J-W==2)O(J+1,J-1); b
B(W-J==2)O(W-1,W+1); P[J]=P[W]; q[W]=0; P[W]=0; } QL(W,J,D)L D; { U
HQ=P[J],YX; L AJ=q[J],XY=q[W]; O(W,J); YX=D(); O(J,W); q[J]=AJ; q[W]=XY;
P[J]=HQ; A YX; } C(){ U i,j,BZ=0; V(i=0; i
r=h(i>>K)+h(i N),G=Y, S=Z==z?88:(Z==k?11 +r+(P[i]>K):(i>>K)):

(Z==l?124-((YY>K)!=(P[i]>0?0:N)))?M:0):
(Z==c?41+r:(Z==e?f-r-r:36+r+r)))); Y=P[i]; V(j=0; j++j)B(!I(i,j,0))S+=(P[j]?5:1);
BZ+=G==Y?S:-S; Y=G; } }
B(!(++X M-1))write(1,".",1); A BZ; } PX(){ U i,Q=0,XP=0,JZ=M*M,E= -f,t,S=o;
B(!F--)A++F+C(); V(i=0; i>K+K,i M-1,1)){ Y= -Y; o= -E; t=

-QL(i>>K+K,i M-1,PX); Y= -Y; B(t>E){ ++XP; Q=i; E=t; B(E>=S) A++F,E; } }

B(!XP)E=s()?-f+1:0; p=Q; A++F,E; } RZ(){ U i,j,T=0; V(; ; ){ y(); o=f; do{
H"\n%d %d %d %s ",X,T,C(),s()?"!":">"); fflush(stdout); }
u(scanf("%o%o", i, j)!=2||I(i,j,1));
O(i,j); y(); X=0; ++YY; Y= -Y; T=PX();

i=p>>(KB(T>M*M)H"\nHar har.\n"); } } main(ac,av)char**av; { long
B(T>time(),j=time( j);

R i=0; srand((U)j); V(M=0; MV(N=1; N*N1?atoi(av[1]):2; uv(); RZ(); }


Кстати, полностью рабочий код. =))


 
Nikolay M. ©   (2004-04-07 15:11) [118]


> olookin ©   (07.04.04 14:21) [100]

Ха-ха 3 раза :)
Это все детский сад. Учу, пока я жив:

#include
#include

#define m(x)(x#define g tj()-J
#define a(x)(x#define h(x)((x)#define f 9999
#define A return
#define H printf(
#define R double
#define U int
#define V for
#define b else
#define u while
#define B if
U v,w,Y= -1,W,J,p,F,o=f,M,N,K,X,YY,_,P[f],s(); typedef U(*L)(); L q[f]; tj(){
U S=m(v)+(m(w)
v?a(v)>1||w-Y||!q[J]:(w-Y  (w-Y*2||q[W+Y*(N+1)]|| (J>>K)-K+(Y-1)/
v?a(v)>2))||q[J];

} z(){ _=5; A v*w||g; } e(){ _= -2;
A(v*v*v-v||w*w*w-w)  (J-W-2||(W N)-4||(W>>K!=(Y-1?N:0))||
q[W+1]||q[W+2]||q[W+K]!=z||P[W+K]*YA(R)(rand() PZ)/(R)PZ; } l(){ _=K+1; A(v*w
a(v)-a(w))||g; } R UC(){ R i=0,d;
u((i+=d=VR())J=n; B(P[W]!=Y||P[J]==Y)A J+1; v=(J N)-(W N); w=(J>>K)-(W>>K); A
q[W]()||(x  QL(W,J,s)); } TT(W){ v=w=0; A q[W]()+K; } s(){ U j= -1,i; Y= -Y;
V(i=0; i
B(j>=0  !I(i,j,0))A Y= -Y; } A!(Y= -Y); } bb(){ _=1; A a(v*w)-2; } uv(){

V(v=0; v>K)==0){ U S=h(v N);
q[v]=!S?z:(S==1?bb:(S==2?c:(v N>K?l:e))); } b B(h(v>>K)==1)q[v]=k; b q[v]=0;
P[v]=!!q[v]*(28-v); } } y(){ U G=Y,i; J=0; V(i=0; ii%8||H"\n%4o ",i);
B((Y=P[i]=m(P[i]))   TT(i))H"%c ",_+93+Y*16); b H"- "); }
H"\n "); do H"%2d",i++ N); u(i N); Y=G; H"\n"); } O(W,J){
B((q[J]=q[W])==k  h(J>>K)==0)q[J]=l; B(q[W]==e)B(J-W==2)O(J+1,J-1); b
B(W-J==2)O(W-1,W+1); P[J]=P[W]; q[W]=0; P[W]=0; } QL(W,J,D)L D; { U
HQ=P[J],YX; L AJ=q[J],XY=q[W]; O(W,J); YX=D(); O(J,W); q[J]=AJ; q[W]=XY;
P[J]=HQ; A YX; } C(){ U i,j,BZ=0; V(i=0; i
r=h(i>>K)+h(i N),G=Y, S=Z==z?88:(Z==k?11 +r+(P[i]>K):(i>>K)):

(Z==l?124-((YY>K)!=(P[i]>0?0:N)))?M:0):
(Z==c?41+r:(Z==e?f-r-r:36+r+r)))); Y=P[i]; V(j=0; j++j)B(!I(i,j,0))S+=(P[j]?5:1);
BZ+=G==Y?S:-S; Y=G; } }
B(!(++X M-1))write(1,".",1); A BZ; } PX(){ U i,Q=0,XP=0,JZ=M*M,E= -f,t,S=o;
B(!F--)A++F+C(); V(i=0; i>K+K,i M-1,1)){ Y= -Y; o= -E; t=

-QL(i>>K+K,i M-1,PX); Y= -Y; B(t>E){ ++XP; Q=i; E=t; B(E>=S) A++F,E; } }

B(!XP)E=s()?-f+1:0; p=Q; A++F,E; } RZ(){ U i,j,T=0; V(; ; ){ y(); o=f; do{
H"\n%d %d %d %s ",X,T,C(),s()?"!":">"); fflush(stdout); }
u(scanf("%o%o", i, j)!=2||I(i,j,1));
O(i,j); y(); X=0; ++YY; Y= -Y; T=PX();

i=p>>(KB(T>M*M)H"\nHar har.\n"); } } main(ac,av)char**av; { long
B(T>time(),j=time( j);

R i=0; srand((U)j); V(M=0; MV(N=1; N*N1?atoi(av[1]):2; uv(); RZ(); }


Кстати, полностью рабочий код. =))


 
Игорь Шевченко ©   (2004-04-07 15:11) [119]


>  if(not SaveDialog.Execute) then Exit;
>
>  if(FileExists(SaveDialog.FileName)) then
>  begin
>    if(MessageBox(Handle,"Файл существует. Заменить?","Сообщение",
> MB_ICONQUESTION or MB_YESNO) = ID_NO) then
>     exit
>    else
>     deletefile(SaveDialog.FileName);
>  end;


SaveDialog.Options := SaveDialog.Options + [ofOverwritePrompt]


 
Игорь Шевченко ©   (2004-04-07 15:11) [119]


>  if(not SaveDialog.Execute) then Exit;
>
>  if(FileExists(SaveDialog.FileName)) then
>  begin
>    if(MessageBox(Handle,"Файл существует. Заменить?","Сообщение",
> MB_ICONQUESTION or MB_YESNO) = ID_NO) then
>     exit
>    else
>     deletefile(SaveDialog.FileName);
>  end;


SaveDialog.Options := SaveDialog.Options + [ofOverwritePrompt]


 
Игорь Шевченко ©   (2004-04-07 15:13) [120]

Nikolay M. ©   (07.04.04 15:11)

Suxx. Оцени:

/*
* Program to compute an approximation of pi
* by Brian Westley, 1988
* (requires pcc macro concatenation; try gcc -traditional-cpp)
*/

#define _ -F<00||--F-OO--;
int F=00,OO=00;
main(){F_OO();printf("%1.3f\n",4.*-F/OO/OO);}F_OO()
{
           _-_-_-_
      _-_-_-_-_-_-_-_-_
   _-_-_-_-_-_-_-_-_-_-_-_
 _-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
 _-_-_-_-_-_-_-_-_-_-_-_-_-_
   _-_-_-_-_-_-_-_-_-_-_-_
       _-_-_-_-_-_-_-_
           _-_-_-_
}


 
Игорь Шевченко ©   (2004-04-07 15:13) [120]

Nikolay M. ©   (07.04.04 15:11)

Suxx. Оцени:

/*
* Program to compute an approximation of pi
* by Brian Westley, 1988
* (requires pcc macro concatenation; try gcc -traditional-cpp)
*/

#define _ -F<00||--F-OO--;
int F=00,OO=00;
main(){F_OO();printf("%1.3f\n",4.*-F/OO/OO);}F_OO()
{
           _-_-_-_
      _-_-_-_-_-_-_-_-_
   _-_-_-_-_-_-_-_-_-_-_-_
 _-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
 _-_-_-_-_-_-_-_-_-_-_-_-_-_
   _-_-_-_-_-_-_-_-_-_-_-_
       _-_-_-_-_-_-_-_
           _-_-_-_
}


 
Style ©   (2004-04-07 15:16) [121]

>>Игорь Шевченко ©  
Помню что есть такая ф-я, но почему то каждый раз пишу свою :)))


 
Style ©   (2004-04-07 15:16) [121]

>>Игорь Шевченко ©  
Помню что есть такая ф-я, но почему то каждый раз пишу свою :)))


 
Игорь Шевченко ©   (2004-04-07 15:17) [122]

Style ©   (07.04.04 15:16)

Общее правило: чем меньше строчек в коде, тем он надежнее и легче читается. Следуй ему всегда и будет тебе счастье.


 
Игорь Шевченко ©   (2004-04-07 15:17) [122]

Style ©   (07.04.04 15:16)

Общее правило: чем меньше строчек в коде, тем он надежнее и легче читается. Следуй ему всегда и будет тебе счастье.


 
Style ©   (2004-04-07 15:22) [123]

Игорь Шевченко ©
но это уже ближе к оптимизации :)
Нельзя сразу идеально написать программу, ее вообще наверное идеально нельзя написать.
А еще особенно когда тебя торопят, здесь подправь, тут нужно быстрее сделать. ТО ничего Хорошего из этого не получается.

А знание функций и умение их оптимально использовать - наверное есть опыт.


 
Style ©   (2004-04-07 15:22) [123]

Игорь Шевченко ©
но это уже ближе к оптимизации :)
Нельзя сразу идеально написать программу, ее вообще наверное идеально нельзя написать.
А еще особенно когда тебя торопят, здесь подправь, тут нужно быстрее сделать. ТО ничего Хорошего из этого не получается.

А знание функций и умение их оптимально использовать - наверное есть опыт.


 
Nikolay M. ©   (2004-04-07 15:23) [124]


> Игорь Шевченко ©   (07.04.04 15:13) [120]

Пи по Монте-Карло? Достойно :)
До сотого знака подсчитает?

А про невидимый язык Whitespace читал?
http://www.computerra.ru/focus/coment/25538/


 
Nikolay M. ©   (2004-04-07 15:23) [124]


> Игорь Шевченко ©   (07.04.04 15:13) [120]

Пи по Монте-Карло? Достойно :)
До сотого знака подсчитает?

А про невидимый язык Whitespace читал?
http://www.computerra.ru/focus/coment/25538/


 
Игорь Шевченко ©   (2004-04-07 15:29) [125]

Style ©   (07.04.04 15:22)


> Нельзя сразу идеально написать программу, ее вообще наверное
> идеально нельзя написать


Можно сразу, можно вообще :)

Nikolay M. ©   (07.04.04 15:23)


> До сотого знака подсчитает?


Запусти ? :))


> http://www.computerra.ru/focus/coment/25538/


LOL

Ты про язык INTERCAL не читал ? :)


 
Игорь Шевченко ©   (2004-04-07 15:29) [125]

Style ©   (07.04.04 15:22)


> Нельзя сразу идеально написать программу, ее вообще наверное
> идеально нельзя написать


Можно сразу, можно вообще :)

Nikolay M. ©   (07.04.04 15:23)


> До сотого знака подсчитает?


Запусти ? :))


> http://www.computerra.ru/focus/coment/25538/


LOL

Ты про язык INTERCAL не читал ? :)


 
Style ©   (2004-04-07 15:36) [126]

Игорь Шевченко ©  
Думаю что даже мастера ошибаются :) - поэтому и говорю  что нельзя идеально писать.

А иногда еще бывает смотрю на свою программу снова и думаю, кто такю чушь написал, здесь же можно проще :)


 
Style ©   (2004-04-07 15:36) [126]

Игорь Шевченко ©  
Думаю что даже мастера ошибаются :) - поэтому и говорю  что нельзя идеально писать.

А иногда еще бывает смотрю на свою программу снова и думаю, кто такю чушь написал, здесь же можно проще :)


 
Nikolay M. ©   (2004-04-07 15:36) [127]


> > До сотого знака подсчитает?
> Запусти ? :))

Дома :)


> Ты про язык INTERCAL не читал ? :)

Compiler Language With No Pronounceable Acronym
?
Уже прочитал :))))

А еще в этом году в ноябре Фортрану исполняется 50 лет. По одной из версии генеалогического древа - это пра-пра-прадедушка Алгола, B, C и, как следствие, Perl, PHP и C++. :)


 
Nikolay M. ©   (2004-04-07 15:36) [127]


> > До сотого знака подсчитает?
> Запусти ? :))

Дома :)


> Ты про язык INTERCAL не читал ? :)

Compiler Language With No Pronounceable Acronym
?
Уже прочитал :))))

А еще в этом году в ноябре Фортрану исполняется 50 лет. По одной из версии генеалогического древа - это пра-пра-прадедушка Алгола, B, C и, как следствие, Perl, PHP и C++. :)


 
KSergey ©   (2004-04-07 15:46) [128]

>  [88] sniknik ©   (07.04.04 13:39)

Явно с Сишными наклонностями написано
По первости я тоже отчасти так писал...
Но оакзалось, что для дельфи это не читабельно... (хотя, конечно, ставить end в той же строке :(((


 
KSergey ©   (2004-04-07 15:46) [128]

>  [88] sniknik ©   (07.04.04 13:39)

Явно с Сишными наклонностями написано
По первости я тоже отчасти так писал...
Но оакзалось, что для дельфи это не читабельно... (хотя, конечно, ставить end в той же строке :(((


 
Игорь Шевченко ©   (2004-04-07 15:48) [129]

Nikolay M. ©   (07.04.04 15:36)


> Compiler Language With No Pronounceable Acronym


Он самый. У нас, часом, версия jargon.htm не одна и та же ? :)


> Думаю что даже мастера ошибаются :) - поэтому и говорю  
> что нельзя идеально писать.


Смотря что считать за идеал. В моем понимании это работающая читабельная (не только автором) программа, легко расширяемая или корректируемая при надобности.
Я все-таки советую изучать исходные тексты VCL, хотя бы как примеры.


 
Игорь Шевченко ©   (2004-04-07 15:48) [129]

Nikolay M. ©   (07.04.04 15:36)


> Compiler Language With No Pronounceable Acronym


Он самый. У нас, часом, версия jargon.htm не одна и та же ? :)


> Думаю что даже мастера ошибаются :) - поэтому и говорю  
> что нельзя идеально писать.


Смотря что считать за идеал. В моем понимании это работающая читабельная (не только автором) программа, легко расширяемая или корректируемая при надобности.
Я все-таки советую изучать исходные тексты VCL, хотя бы как примеры.


 
Nikolay M. ©   (2004-04-07 15:53) [130]


> У нас, часом, версия jargon.htm не одна и та же ? :)

Не исключено, где-то валяется в недрах винчестера. Прочитал давно еще, для ликбеза :)


 
Nikolay M. ©   (2004-04-07 15:53) [130]


> У нас, часом, версия jargon.htm не одна и та же ? :)

Не исключено, где-то валяется в недрах винчестера. Прочитал давно еще, для ликбеза :)


 
Style ©   (2004-04-07 15:57) [131]


> В моем понимании это работающая читабельная (не только автором)
> программа, легко расширяемая или корректируемая при надобности.

 Ну мой код вы вроде откорректировали при надобности ;)


> Я все-таки советую изучать исходные тексты VCL, хотя бы
> как примеры.

Изачую время от времени, но это не значит, что можно сразу охватить весь объем информации. Все равно приходится учится на своих ошибках, так как чужие ошибки  понять тяжело пока сам через это не пройдешь :)
В последнее время часто бываю в исходниках т.к. пишу компоненты


 
Style ©   (2004-04-07 15:57) [131]


> В моем понимании это работающая читабельная (не только автором)
> программа, легко расширяемая или корректируемая при надобности.

 Ну мой код вы вроде откорректировали при надобности ;)


> Я все-таки советую изучать исходные тексты VCL, хотя бы
> как примеры.

Изачую время от времени, но это не значит, что можно сразу охватить весь объем информации. Все равно приходится учится на своих ошибках, так как чужие ошибки  понять тяжело пока сам через это не пройдешь :)
В последнее время часто бываю в исходниках т.к. пишу компоненты


 
olookin ©   (2004-04-07 16:18) [132]

[116] Dmitriy O. ©   (07.04.04 15:00)
Про твою автосхему я в курсе - пробовал...

А что касается вида кода... Для меня важнее, как код воспринимаю я, а не как код будет воспринимать другой.


 
olookin ©   (2004-04-07 16:18) [132]

[116] Dmitriy O. ©   (07.04.04 15:00)
Про твою автосхему я в курсе - пробовал...

А что касается вида кода... Для меня важнее, как код воспринимаю я, а не как код будет воспринимать другой.


 
Style ©   (2004-04-07 16:29) [133]


> А что касается вида кода... Для меня важнее, как код воспринимаю
> я, а не как код будет воспринимать другой.


Значит тебе не судьба работать в команде


 
Style ©   (2004-04-07 16:29) [133]


> А что касается вида кода... Для меня важнее, как код воспринимаю
> я, а не как код будет воспринимать другой.


Значит тебе не судьба работать в команде


 
olookin ©   (2004-04-07 16:33) [134]

[133] Style ©   (07.04.04 16:29)

Ага!


 
olookin ©   (2004-04-07 16:33) [134]

[133] Style ©   (07.04.04 16:29)

Ага!


 
int64   (2004-04-07 16:34) [135]

olookin ©   (07.04.04 16:18) [132]

> А что касается вида кода... Для меня важнее, как код воспринимаю
> я, а не как код будет воспринимать другой

Вот о таких недалеких лаймерах, оставшихся без работы, я и завел разговор.


 
int64   (2004-04-07 16:34) [135]

olookin ©   (07.04.04 16:18) [132]

> А что касается вида кода... Для меня важнее, как код воспринимаю
> я, а не как код будет воспринимать другой

Вот о таких недалеких лаймерах, оставшихся без работы, я и завел разговор.


 
Dmitriy O. ©   (2004-04-07 16:41) [136]


> olookin ©   (07.04.04 16:18)
Вот именно для разбора такого кода я и писал программу в том числе и своего. Т.к. тоже пишу не очень понятно а потом вспоминаю что и как там работает :))))


 
Dmitriy O. ©   (2004-04-07 16:41) [136]


> olookin ©   (07.04.04 16:18)
Вот именно для разбора такого кода я и писал программу в том числе и своего. Т.к. тоже пишу не очень понятно а потом вспоминаю что и как там работает :))))


 
serge35   (2004-04-07 16:43) [137]

Правило хорошего тона в программировании - это хорошо работающая программа.


 
serge35   (2004-04-07 16:43) [137]

Правило хорошего тона в программировании - это хорошо работающая программа.


 
pasha_golub ©   (2004-04-07 16:43) [138]

Игорь Шевченко ©   (07.04.04 15:13) [120]
А можно мне сирому донести сизюминку этой вот программки, для подсчета Пи? Спасибо


 
pasha_golub ©   (2004-04-07 16:43) [138]

Игорь Шевченко ©   (07.04.04 15:13) [120]
А можно мне сирому донести сизюминку этой вот программки, для подсчета Пи? Спасибо


 
Иксик ©   (2004-04-07 16:50) [139]

Удалено модератором
Примечание: Личная переписка


 
Иксик ©   (2004-04-07 16:50) [139]

Удалено модератором
Примечание: Личная переписка


 
olookin ©   (2004-04-07 16:54) [140]

[135] int64   (07.04.04 16:34)

Ну, надеюсь, ты отчетливо представляешь себе, что такое ламер. Особенно недалекий. Если да - то поразмысли над собственной же фразой

"Если бы кто-то, когда-то взялся собрать "свод законов" о правилах хорошего тона в программировании, об азах, сей документ был бы куда полезнее всяких факов. Потому что без этих правил кодить можно, а без факов - нет."

Кажется, ты сам себе противоречишь. Первое предложение исключает логику второго, и наоборот. Так что вывод - дело не в форме (как записан код), а в содержании (что записано в коде).


 
olookin ©   (2004-04-07 16:54) [140]

[135] int64   (07.04.04 16:34)

Ну, надеюсь, ты отчетливо представляешь себе, что такое ламер. Особенно недалекий. Если да - то поразмысли над собственной же фразой

"Если бы кто-то, когда-то взялся собрать "свод законов" о правилах хорошего тона в программировании, об азах, сей документ был бы куда полезнее всяких факов. Потому что без этих правил кодить можно, а без факов - нет."

Кажется, ты сам себе противоречишь. Первое предложение исключает логику второго, и наоборот. Так что вывод - дело не в форме (как записан код), а в содержании (что записано в коде).


 
Style ©   (2004-04-07 16:54) [141]


> А можно мне сирому донести сизюминку этой вот программки,
> для подсчета Пи? Спасибо

Здеся без пива не разобраться явно :)


 
Style ©   (2004-04-07 16:54) [141]


> А можно мне сирому донести сизюминку этой вот программки,
> для подсчета Пи? Спасибо

Здеся без пива не разобраться явно :)


 
Игорь Шевченко ©   (2004-04-07 16:59) [142]

olookin ©   (07.04.04 16:54)

Если ты этот код пишешь для себя, то, сам понимаешь, никто тебя не может заставить писать иначе. Только просьба будет, если ты код в форум выкладываешь на предмет вопросов, причеши его так, чтобы не только ты мог в нем разобраться :))


 
Игорь Шевченко ©   (2004-04-07 16:59) [142]

olookin ©   (07.04.04 16:54)

Если ты этот код пишешь для себя, то, сам понимаешь, никто тебя не может заставить писать иначе. Только просьба будет, если ты код в форум выкладываешь на предмет вопросов, причеши его так, чтобы не только ты мог в нем разобраться :))


 
int64   (2004-04-07 17:03) [143]

olookin ©   (07.04.04 16:54) [140]

>... сей документ был бы куда полезнее всяких факов. Потому
> что без этих правил кодить можно, а без факов - нет.

Подписуюсь под каждым словом.


 
int64   (2004-04-07 17:03) [143]

olookin ©   (07.04.04 16:54) [140]

>... сей документ был бы куда полезнее всяких факов. Потому
> что без этих правил кодить можно, а без факов - нет.

Подписуюсь под каждым словом.


 
olookin ©   (2004-04-07 17:09) [144]

[143] int64   (07.04.04 17:03)

Хитер. Ты подпишись под всей фразой

"Если бы кто-то, когда-то взялся собрать "свод законов" о правилах хорошего тона в программировании, об азах, сей документ был бы куда полезнее всяких факов. Потому что без этих правил кодить можно, а без факов - нет."

А потом проверь ее на логичность.

PS Если при твоей любви к правильному написанию кода ты допускаешь такие промахи в построении цепочки мыслей, то какие же программы у тебя выходят из-под пера?


 
olookin ©   (2004-04-07 17:09) [144]

[143] int64   (07.04.04 17:03)

Хитер. Ты подпишись под всей фразой

"Если бы кто-то, когда-то взялся собрать "свод законов" о правилах хорошего тона в программировании, об азах, сей документ был бы куда полезнее всяких факов. Потому что без этих правил кодить можно, а без факов - нет."

А потом проверь ее на логичность.

PS Если при твоей любви к правильному написанию кода ты допускаешь такие промахи в построении цепочки мыслей, то какие же программы у тебя выходят из-под пера?


 
Calm ©   (2004-04-07 17:16) [145]


> А потом проверь ее на логичность.

А там все верно.
Опасность именно в том и состоит, что ее можно не заметить. Не соблюдая правила писать можно - наступишь на грабли неминуемо.

Не зная FAQов писать нельзя - соответственно на грабли не наступишь, пока не выучишь.


 
Calm ©   (2004-04-07 17:16) [145]


> А потом проверь ее на логичность.

А там все верно.
Опасность именно в том и состоит, что ее можно не заметить. Не соблюдая правила писать можно - наступишь на грабли неминуемо.

Не зная FAQов писать нельзя - соответственно на грабли не наступишь, пока не выучишь.


 
smb   (2004-04-07 19:10) [146]

2 Calm ©   (07.04.04 17:16) [145]
может вы бы были бы вполне правы, если бы не это:
"Если бы кто-то, когда-то взялся собрать "свод законов" о правилах хорошего тона в программировании, об азах, сей документ был бы куда полезнее всяких факов. Потому что без этих правил кодить можно, а без факов - нет."
это означает, что второе предложение следует из первого.
Аналогичная фраза:
Если бы вы одели носки и ботинки при хождении на морозе, то носки были бы куда важнее, чем ботинки. Потому что без носков в ботинках ходить можно, а без ботинок нельзя.
имхо она бредова там же, как и предыдущая. :)
что касается кода SoftX"а, имхо не такой уж он и не читабельный.


 
smb   (2004-04-07 19:10) [146]

2 Calm ©   (07.04.04 17:16) [145]
может вы бы были бы вполне правы, если бы не это:
"Если бы кто-то, когда-то взялся собрать "свод законов" о правилах хорошего тона в программировании, об азах, сей документ был бы куда полезнее всяких факов. Потому что без этих правил кодить можно, а без факов - нет."
это означает, что второе предложение следует из первого.
Аналогичная фраза:
Если бы вы одели носки и ботинки при хождении на морозе, то носки были бы куда важнее, чем ботинки. Потому что без носков в ботинках ходить можно, а без ботинок нельзя.
имхо она бредова там же, как и предыдущая. :)
что касается кода SoftX"а, имхо не такой уж он и не читабельный.


 
Алхимик ©   (2004-04-07 21:08) [147]

                                                   extern int
                                                          errno
                                                            ;char
                                                               grrr
                                ;main(                           r,
     argv, argc )            int    argc                           ,
      r        ;           char *argv[];{int                     P( );
   #define x int i,        j,cc[4];printf("    choo choo\n"        ) ;
   x  ;if    (P(  !        i              )      |  cc[   !        j ]
   &  P(j    )>2  ?        j              :      i  ){*   argv[i++ +!-i]
   ;              for    (i=              0;;    i++                  );
   _exit(argv[argc- 2    / cc[1*argc]|-1<<4 ]    ) ;printf("%d",P("");}}
     P  (    a  )   char a   ;  {    a  ;   while(    a  >      "  B  "
     /* -    by E            ricM    arsh             all-      */)"   }


:)
Не моё. Работоспособность не проверял.


 
Алхимик ©   (2004-04-07 21:08) [147]

                                                   extern int
                                                          errno
                                                            ;char
                                                               grrr
                                ;main(                           r,
     argv, argc )            int    argc                           ,
      r        ;           char *argv[];{int                     P( );
   #define x int i,        j,cc[4];printf("    choo choo\n"        ) ;
   x  ;if    (P(  !        i              )      |  cc[   !        j ]
   &  P(j    )>2  ?        j              :      i  ){*   argv[i++ +!-i]
   ;              for    (i=              0;;    i++                  );
   _exit(argv[argc- 2    / cc[1*argc]|-1<<4 ]    ) ;printf("%d",P("");}}
     P  (    a  )   char a   ;  {    a  ;   while(    a  >      "  B  "
     /* -    by E            ricM    arsh             all-      */)"   }


:)
Не моё. Работоспособность не проверял.


 
Сергей Суровцев ©   (2004-04-08 00:20) [148]

>Игорь Шевченко ©   (07.04.04 15:10) [117]

Вы будете смеяться, но :

function StrTran (uk_str80, uk_str81, uk_str82 : string ) : string;
var
asv312 : string;
begin
asv312:=uk_str80;
if Pos(uk_str81, asv312) <> 0 then
begin
 if (uk_str81 <> uk_str82) or (length(uk_str81) <> length (uk_str82)) then
begin
 while Pos(uk_str81, asv312) <> 0 do
 asv312 := Copy(asv312 ,1, Pos(uk_str81, asv312)-1) + uk_str82 + Copy(asv312 ,Pos(uk_str81, asv312)+length(uk_str81) ,length(asv312));
end;
end;
Result:=asv312;
end;

работает ~ на 10% быстрее

StringReplace(Str, ",", ".", [rfReplaceAll]);

хотя, конечно, и не является образцом кода :))

Прошу прощения у Alex Konshin © за отсутствие try..finally и полностью солидарен с Внук © в нелюбви и игнорировании With.


 
Сергей Суровцев ©   (2004-04-08 00:20) [148]

>Игорь Шевченко ©   (07.04.04 15:10) [117]

Вы будете смеяться, но :

function StrTran (uk_str80, uk_str81, uk_str82 : string ) : string;
var
asv312 : string;
begin
asv312:=uk_str80;
if Pos(uk_str81, asv312) <> 0 then
begin
 if (uk_str81 <> uk_str82) or (length(uk_str81) <> length (uk_str82)) then
begin
 while Pos(uk_str81, asv312) <> 0 do
 asv312 := Copy(asv312 ,1, Pos(uk_str81, asv312)-1) + uk_str82 + Copy(asv312 ,Pos(uk_str81, asv312)+length(uk_str81) ,length(asv312));
end;
end;
Result:=asv312;
end;

работает ~ на 10% быстрее

StringReplace(Str, ",", ".", [rfReplaceAll]);

хотя, конечно, и не является образцом кода :))

Прошу прощения у Alex Konshin © за отсутствие try..finally и полностью солидарен с Внук © в нелюбви и игнорировании With.


 
Сергей Суровцев ©   (2004-04-08 00:23) [149]

Нда... В оригинале это выглядет куда читабельнее чем здесь, звиняйте, забыл кодом отметить. :))


 
Сергей Суровцев ©   (2004-04-08 00:23) [149]

Нда... В оригинале это выглядет куда читабельнее чем здесь, звиняйте, забыл кодом отметить. :))


 
Undert ©   (2004-04-08 00:23) [150]


> Сергей Суровцев ©  


А  ещё вместо POS сделать хешированный поиск -
if large(text) or (length(text)>1024) then скорость = скорость * 2 как мимнимум;


 
Undert ©   (2004-04-08 00:23) [150]


> Сергей Суровцев ©  


А  ещё вместо POS сделать хешированный поиск -
if large(text) or (length(text)>1024) then скорость = скорость * 2 как мимнимум;


 
Сергей Суровцев ©   (2004-04-08 00:26) [151]

>Undert ©   (08.04.04 00:23) [150]
Попробую, но уже завтра. Спасибо на добром слове. :))


 
Сергей Суровцев ©   (2004-04-08 00:26) [151]

>Undert ©   (08.04.04 00:23) [150]
Попробую, но уже завтра. Спасибо на добром слове. :))


 
Ihor Osov'yak ©   (2004-04-08 01:31) [152]

Интересно было почитать.

Зы.  
А я зверею, когда при компиляции чужого кода компилятор варнинги и хинты дает. Если автор в зоне досягаемости - ему можно не завидовать...


 
Ihor Osov'yak ©   (2004-04-08 01:31) [152]

Интересно было почитать.

Зы.  
А я зверею, когда при компиляции чужого кода компилятор варнинги и хинты дает. Если автор в зоне досягаемости - ему можно не завидовать...


 
Aristarh ©   (2004-04-08 02:03) [153]

>Ihor Osov"yak ©   (08.04.04 01:31) [152]
>А я зверею, когда при компиляции чужого кода компилятор
>варнинги и хинты дает.

А я нет. Вы возьмите компиляцию сторонних библиотек, причем уважаемых библиотек, например, RxLib. Там же десятки хинтов и варнингов! Но оно работает, и работает так, что и позавидовать можно. Просто автор использовал в своих классах определенные соглашения, которые при любых условиях будут выполняться.
Неужели у вас ни одного хинта? :)


 
Aristarh ©   (2004-04-08 02:03) [153]

>Ihor Osov"yak ©   (08.04.04 01:31) [152]
>А я зверею, когда при компиляции чужого кода компилятор
>варнинги и хинты дает.

А я нет. Вы возьмите компиляцию сторонних библиотек, причем уважаемых библиотек, например, RxLib. Там же десятки хинтов и варнингов! Но оно работает, и работает так, что и позавидовать можно. Просто автор использовал в своих классах определенные соглашения, которые при любых условиях будут выполняться.
Неужели у вас ни одного хинта? :)


 
Soft ©   (2004-04-08 06:57) [154]

>>Ihor Osov"yak ©   (08.04.04 01:31) [152]

Сразу видно мнение непрофессионала, который знает только один язык. Вы просто некоторых компиляторов, с того C++ не видели. Иногда на обычные сравнения ругаются...

ЗЫ
Я всегда к программе отношусь как к модели взаимодействия данных. Тоесть рассматривают работу программы как Data Flow, это позволяет абстрагироваться от платформы языка и метода написания программы, так что без малейших усилий я смог бы свой проект перевести на любую платформу и архитектуру, которая удовлетворяет минимальным требованиям к программе, за очень короткие сроки.

Люди которые заботятся о красоте кода, а не о красоте "управления данные данными" (Code Flow) часто не представляют, что у них творится в программе, что делает данные программы(работы более 10 профессиональных программистов) иногда хуже работ студентов-одиночек.

Так что можно сделать вывод - функциональность определяет красоту.


 
Soft ©   (2004-04-08 06:57) [154]

>>Ihor Osov"yak ©   (08.04.04 01:31) [152]

Сразу видно мнение непрофессионала, который знает только один язык. Вы просто некоторых компиляторов, с того C++ не видели. Иногда на обычные сравнения ругаются...

ЗЫ
Я всегда к программе отношусь как к модели взаимодействия данных. Тоесть рассматривают работу программы как Data Flow, это позволяет абстрагироваться от платформы языка и метода написания программы, так что без малейших усилий я смог бы свой проект перевести на любую платформу и архитектуру, которая удовлетворяет минимальным требованиям к программе, за очень короткие сроки.

Люди которые заботятся о красоте кода, а не о красоте "управления данные данными" (Code Flow) часто не представляют, что у них творится в программе, что делает данные программы(работы более 10 профессиональных программистов) иногда хуже работ студентов-одиночек.

Так что можно сделать вывод - функциональность определяет красоту.


 
KSergey ©   (2004-04-08 08:15) [155]

> [154] Soft ©   (08.04.04 06:57)

Ага, вот только выясняется, что чтобы внести мелкое (внешне) изменение в программу этого студента - надо переписать ее заново.
В другом же случае - лишь малую часть.
Впрочем, возможно я не до конца понял мысль.


 
KSergey ©   (2004-04-08 08:15) [155]

> [154] Soft ©   (08.04.04 06:57)

Ага, вот только выясняется, что чтобы внести мелкое (внешне) изменение в программу этого студента - надо переписать ее заново.
В другом же случае - лишь малую часть.
Впрочем, возможно я не до конца понял мысль.


 
Игорь Шевченко ©   (2004-04-08 10:43) [156]

Сергей Суровцев ©   (08.04.04 00:20)

А написав на ассемблере, можно добиться еще большего быстродействия и еще большей нечитабельности :))
Дерзайте :)

Soft ©   (08.04.04 06:57)

> Сразу видно мнение непрофессионала, который знает только
> один язык. Вы просто некоторых компиляторов, с того C++
> не видели. Иногда на обычные сравнения ругаются...


Сразу видно мнение ламера, уж извините...


 
Игорь Шевченко ©   (2004-04-08 10:43) [156]

Сергей Суровцев ©   (08.04.04 00:20)

А написав на ассемблере, можно добиться еще большего быстродействия и еще большей нечитабельности :))
Дерзайте :)

Soft ©   (08.04.04 06:57)

> Сразу видно мнение непрофессионала, который знает только
> один язык. Вы просто некоторых компиляторов, с того C++
> не видели. Иногда на обычные сравнения ругаются...


Сразу видно мнение ламера, уж извините...


 
Игорь Шевченко ©   (2004-04-08 10:45) [157]

Aristarh ©   (08.04.04 02:03)

Мне, наверное, не повезло, я в RxLib не увидел hints и warnings при компиляции.

Целиком и полностью согласен с Ihor Osov"yak ©   (08.04.04 01:31) [152] , компилятор предупржедает и дает советы не зря - либо в коде ошибка, либо код написан не очень грамотно.


 
Игорь Шевченко ©   (2004-04-08 10:45) [157]

Aristarh ©   (08.04.04 02:03)

Мне, наверное, не повезло, я в RxLib не увидел hints и warnings при компиляции.

Целиком и полностью согласен с Ihor Osov"yak ©   (08.04.04 01:31) [152] , компилятор предупржедает и дает советы не зря - либо в коде ошибка, либо код написан не очень грамотно.


 
Anatoly Podgoretsky ©   (2004-04-08 11:04) [158]

Игорь Шевченко ©   (08.04.04 10:43) [156]
Это подтверждается только при хорошем знании об оптимизации процессора и правильных алгоритмах, а то чаще наблюдается обратное.

Правилом хорошего тона в программирование является следование соглашениям и внутрифирменным стандартам, иначе моветон.


 
Anatoly Podgoretsky ©   (2004-04-08 11:04) [158]

Игорь Шевченко ©   (08.04.04 10:43) [156]
Это подтверждается только при хорошем знании об оптимизации процессора и правильных алгоритмах, а то чаще наблюдается обратное.

Правилом хорошего тона в программирование является следование соглашениям и внутрифирменным стандартам, иначе моветон.


 
KSergey ©   (2004-04-08 11:15) [159]

Хм, что-то и мне захотелось...
Вот некий кусочек...

// работа с одним файлом на FTP: загрузка или удаление
// Здесь создается компонент работы с FTP, здесь же и уничтожается (т.к. при ошибах он начитает глючить)
// Это не эффективно с точки зрения ресурсов, но во главу угла при разработке
// данного модуля была поставлена дубовая надежность.
// Вход:
//   Action - выполняемое действие
//   AFTPFileName - имя файла на FTP
//   ALocalFileName - имя файла на локальном (сетевом) диске (если необходимо для данного действия, иначе произвольные данные)
// Выход:
//   результат типа TDownloadErrors
//   AErrTxt - сообщение об ошибке, если произошла фатальная ошибка
function TFTPLoadThread.FTPActionsBody(Action: TFTPManagActions;
                                      const AFTPFileName, ALocalFileName: String;
                                      var AErrTxt: String): TFTPDownloadErrors;
begin
 FFtp := TNMFTP.Create(nil);  // для закачки каждого файла создаем новый экземпляр, т.к., как показала практика, при ошбках компонент начинает сильно глючить
 try
   with FFtp do
   try
     FWAuthenticate := FALSE;
     Host      := g_WEB_FTP_HOST;
     Passive   := TRUE;
     UserID    := WEB_FTP_USER;
     Password  := WEB_FTP_PASSWORD;
     TimeOut   := 0;  // здесь ставим безлимитку, т.к. компонент считает, что это так же тайм-аут на общее время закачки файла (идиот!)
     OnPacketRecvd      := OnPacketRecvdHandler;
     OnTransactionStart := OnTransactionStartHandler;
     OnTransactionStop  := OnTransactionStopHandler;
     OnFailure          := OnFailureHandler;  // этот обработчик обязательно необходимо задать, хоть и пустой по содержанию, иначе при ошибках закачки (есключениях) сразу возникает Acces Violation, из-за чего невозможно получить исходную ошибку
     try
       Connect;
       Mode (MODE_IMAGE);  // мода - 8 бит
       if Trim(g_WEB_FTP_DIR) <> EmptyStr then  ChangeDir(g_WEB_FTP_DIR);
       case Action of
         mactDownload: Download (AFTPFileName, ALocalFileName);  // закрузка файла
{$IFDEF DELETE_FTP_FILES}
         mactDelete:   Delete (AFTPFileName);                    // удаление файла
{$ENDIF}
       end;  // case Action of
       AErrTxt := EmptyStr;
       Result := derrOk;  // похоже повезло....
     except
       on E: Exception do
       begin
         AErrTxt := E.Message;
         if E is FTPException then
         begin
           if E.Message[1] = "5" then
             Result := derrFatal  // если срвер вернул ошибку 5xx - это фатальная ошибка
           else
             Result := derrTemp;  // иначе есть надежда ее исправить
         end
         else  // if E is FTPException
           Result := derrTemp;
       end;  // on E: Exception do
     end;  // try/except
   finally
     FreeAndNil(FFtp);
   end;
 except   // ошибки съесть, результат - вернуть
   on E: Exception do
   begin
     OutLogErr ("Загрузка/удаление файла", E);
     Result := derrTemp;
   end;
 end;
 FTimer.Enabled := FALSE;  // на всякий случай, если ранее не отключили
end;


 
KSergey ©   (2004-04-08 11:15) [159]

Хм, что-то и мне захотелось...
Вот некий кусочек...

// работа с одним файлом на FTP: загрузка или удаление
// Здесь создается компонент работы с FTP, здесь же и уничтожается (т.к. при ошибах он начитает глючить)
// Это не эффективно с точки зрения ресурсов, но во главу угла при разработке
// данного модуля была поставлена дубовая надежность.
// Вход:
//   Action - выполняемое действие
//   AFTPFileName - имя файла на FTP
//   ALocalFileName - имя файла на локальном (сетевом) диске (если необходимо для данного действия, иначе произвольные данные)
// Выход:
//   результат типа TDownloadErrors
//   AErrTxt - сообщение об ошибке, если произошла фатальная ошибка
function TFTPLoadThread.FTPActionsBody(Action: TFTPManagActions;
                                      const AFTPFileName, ALocalFileName: String;
                                      var AErrTxt: String): TFTPDownloadErrors;
begin
 FFtp := TNMFTP.Create(nil);  // для закачки каждого файла создаем новый экземпляр, т.к., как показала практика, при ошбках компонент начинает сильно глючить
 try
   with FFtp do
   try
     FWAuthenticate := FALSE;
     Host      := g_WEB_FTP_HOST;
     Passive   := TRUE;
     UserID    := WEB_FTP_USER;
     Password  := WEB_FTP_PASSWORD;
     TimeOut   := 0;  // здесь ставим безлимитку, т.к. компонент считает, что это так же тайм-аут на общее время закачки файла (идиот!)
     OnPacketRecvd      := OnPacketRecvdHandler;
     OnTransactionStart := OnTransactionStartHandler;
     OnTransactionStop  := OnTransactionStopHandler;
     OnFailure          := OnFailureHandler;  // этот обработчик обязательно необходимо задать, хоть и пустой по содержанию, иначе при ошибках закачки (есключениях) сразу возникает Acces Violation, из-за чего невозможно получить исходную ошибку
     try
       Connect;
       Mode (MODE_IMAGE);  // мода - 8 бит
       if Trim(g_WEB_FTP_DIR) <> EmptyStr then  ChangeDir(g_WEB_FTP_DIR);
       case Action of
         mactDownload: Download (AFTPFileName, ALocalFileName);  // закрузка файла
{$IFDEF DELETE_FTP_FILES}
         mactDelete:   Delete (AFTPFileName);                    // удаление файла
{$ENDIF}
       end;  // case Action of
       AErrTxt := EmptyStr;
       Result := derrOk;  // похоже повезло....
     except
       on E: Exception do
       begin
         AErrTxt := E.Message;
         if E is FTPException then
         begin
           if E.Message[1] = "5" then
             Result := derrFatal  // если срвер вернул ошибку 5xx - это фатальная ошибка
           else
             Result := derrTemp;  // иначе есть надежда ее исправить
         end
         else  // if E is FTPException
           Result := derrTemp;
       end;  // on E: Exception do
     end;  // try/except
   finally
     FreeAndNil(FFtp);
   end;
 except   // ошибки съесть, результат - вернуть
   on E: Exception do
   begin
     OutLogErr ("Загрузка/удаление файла", E);
     Result := derrTemp;
   end;
 end;
 FTimer.Enabled := FALSE;  // на всякий случай, если ранее не отключили
end;


 
KSergey ©   (2004-04-08 11:16) [160]

> [159] KSergey ©   (08.04.04 11:15)
> Вот некий кусочек...

Типичный имелось в виду..
Правда, на форуме он смотрится менее читабельным, чем в оригинале... Мдя...


 
KSergey ©   (2004-04-08 11:16) [160]

> [159] KSergey ©   (08.04.04 11:15)
> Вот некий кусочек...

Типичный имелось в виду..
Правда, на форуме он смотрится менее читабельным, чем в оригинале... Мдя...


 
Alex Konshin ©   (2004-04-08 11:37) [161]

Нормально. Лучше, чем у меня.


 
Alex Konshin ©   (2004-04-08 11:37) [161]

Нормально. Лучше, чем у меня.


 
Alex Konshin ©   (2004-04-08 11:39) [162]

Мне обычно лень комментарии писать. Надо бы на английском, но у меня правильнописание хромает, оно хорошее, но хромает (c) Винни Пух.


 
Alex Konshin ©   (2004-04-08 11:39) [162]

Мне обычно лень комментарии писать. Надо бы на английском, но у меня правильнописание хромает, оно хорошее, но хромает (c) Винни Пух.


 
DiamondShark ©   (2004-04-08 11:59) [163]


> Сергей Суровцев ©   (08.04.04 00:20) [148]

Скажите, а во всех этих uk, 81, и прочих 312 есть какой-то глобальный общечеловеческий смысл?


 
DiamondShark ©   (2004-04-08 11:59) [163]


> Сергей Суровцев ©   (08.04.04 00:20) [148]

Скажите, а во всех этих uk, 81, и прочих 312 есть какой-то глобальный общечеловеческий смысл?


 
Ihor Osov'yak ©   (2004-04-08 12:21) [164]

2 [154] Soft ©   (08.04.04 06:57)

Хм. Если честно, то мне Вас жаль. Но ничем помочь не могу.

Зы. Позволю себе пару реплик, в ответ на некоторые версии о моих личностных качествах.

>Сразу видно мнение непрофессионала,

Вы бы объяснили, что Вы под словом "непрофессионал" понимаете. А заодно и под словом "профессионал"

> который знает только один язык.

А Вы мне экзамен устраивали? И есть ли у Вас квалификация, позволяющая экзамены устраивать?

> Вы просто некоторых компиляторов, с того C++ не видели.

Некоторых не видел. Некоторые - видел.

>Иногда на обычные сравнения ругаются...

Смею предположить, что имеют на то веские основания.

2[153] Aristarh ©   (08.04.04 02:03)

> Неужели у вас ни одного хинта? :)
Представьте себе - нет. Во всяком случае, в коде, написанном за последние 2-3 года.  

Кстати - см. [157]:
>либо в коде ошибка, либо код написан не очень грамотно.

В истинности этого убеждался не единожды, и не только на собственной шкуре. И сохранил очень много нервных клеток, избежав поиска довольно трудно улавливаемых ошибок в рантайме, из-за того, что уважаю сообщения компилятора.


 
Ihor Osov'yak ©   (2004-04-08 12:21) [164]

2 [154] Soft ©   (08.04.04 06:57)

Хм. Если честно, то мне Вас жаль. Но ничем помочь не могу.

Зы. Позволю себе пару реплик, в ответ на некоторые версии о моих личностных качествах.

>Сразу видно мнение непрофессионала,

Вы бы объяснили, что Вы под словом "непрофессионал" понимаете. А заодно и под словом "профессионал"

> который знает только один язык.

А Вы мне экзамен устраивали? И есть ли у Вас квалификация, позволяющая экзамены устраивать?

> Вы просто некоторых компиляторов, с того C++ не видели.

Некоторых не видел. Некоторые - видел.

>Иногда на обычные сравнения ругаются...

Смею предположить, что имеют на то веские основания.

2[153] Aristarh ©   (08.04.04 02:03)

> Неужели у вас ни одного хинта? :)
Представьте себе - нет. Во всяком случае, в коде, написанном за последние 2-3 года.  

Кстати - см. [157]:
>либо в коде ошибка, либо код написан не очень грамотно.

В истинности этого убеждался не единожды, и не только на собственной шкуре. И сохранил очень много нервных клеток, избежав поиска довольно трудно улавливаемых ошибок в рантайме, из-за того, что уважаю сообщения компилятора.


 
Юрий Зотов ©   (2004-04-08 12:48) [165]

> [157, 164]

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

> [153] Aristarh ©   (08.04.04 02:03)
> Неужели у вас ни одного хинта? :)

Ни одного, можете поверить. Ни в одной строчке моего кода, написанной за все годы, начиная еще с Delphi 1, нет ни единого хинта и, тем более, ни единого варнинга. Так писать совсем несложно и практически не отнимает лишнего времени - если, конечно, правильно писать СРАЗУ, а не оставлять разгребание грязи на неопределенное будущее.

Благодаря этому любой хинт или варнинг, появляющийся в только что написанном коде просто не может остаться незамеченным в море других. Он сразу же бросается в гдаза и тут же устраняется ВМЕСТЕ С ПОТЕНЦИАЛЬНОЙ ОШИБКОЙ В ПРОГРАММЕ (что, кстати, экономит гораздо больше времени на отладке).


 
Юрий Зотов ©   (2004-04-08 12:48) [165]

> [157, 164]

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

> [153] Aristarh ©   (08.04.04 02:03)
> Неужели у вас ни одного хинта? :)

Ни одного, можете поверить. Ни в одной строчке моего кода, написанной за все годы, начиная еще с Delphi 1, нет ни единого хинта и, тем более, ни единого варнинга. Так писать совсем несложно и практически не отнимает лишнего времени - если, конечно, правильно писать СРАЗУ, а не оставлять разгребание грязи на неопределенное будущее.

Благодаря этому любой хинт или варнинг, появляющийся в только что написанном коде просто не может остаться незамеченным в море других. Он сразу же бросается в гдаза и тут же устраняется ВМЕСТЕ С ПОТЕНЦИАЛЬНОЙ ОШИБКОЙ В ПРОГРАММЕ (что, кстати, экономит гораздо больше времени на отладке).


 
Думкин ©   (2004-04-08 12:52) [166]

Хинтов и варнингов в версиях меньше 7-й нет, и давлю. Но в 7-й появились 3 предупреждения. В списке предупрждений в конце. Как быть с ними? При их отключении - варнингов нет.
Не работать в 7-й? Отключать эти 3? Или писать так чтобы их не было?


 
Думкин ©   (2004-04-08 12:52) [166]

Хинтов и варнингов в версиях меньше 7-й нет, и давлю. Но в 7-й появились 3 предупреждения. В списке предупрждений в конце. Как быть с ними? При их отключении - варнингов нет.
Не работать в 7-й? Отключать эти 3? Или писать так чтобы их не было?


 
Игорь Шевченко ©   (2004-04-08 12:54) [167]


> Или писать так чтобы их не было?


Писать так, чтобы их не было


 
Игорь Шевченко ©   (2004-04-08 12:54) [167]


> Или писать так чтобы их не было?


Писать так, чтобы их не было


 
Думкин ©   (2004-04-08 12:54) [168]

Речь идет о:

Unsafe type
Unsafe code
Unsafe typecast


 
Думкин ©   (2004-04-08 12:54) [168]

Речь идет о:

Unsafe type
Unsafe code
Unsafe typecast


 
Думкин ©   (2004-04-08 12:56) [169]

Unsafe type "<element><element><element>"

List of compiler error messages

You have used a data type or operation for which static code analysis cannot prove that it does not overwrite memory. In a secured execution environment such as .NET, such code is assumed to be unsafe and a potential security risk.


Но ведь .NET только в следующей версии.


 
Думкин ©   (2004-04-08 12:56) [169]

Unsafe type "<element><element><element>"

List of compiler error messages

You have used a data type or operation for which static code analysis cannot prove that it does not overwrite memory. In a secured execution environment such as .NET, such code is assumed to be unsafe and a potential security risk.


Но ведь .NET только в следующей версии.


 
Ihor Osov'yak ©   (2004-04-08 13:01) [170]

2 Думкин

А написать что-то типа

{$IFDEF VER150}
  {$WARN UNSAFE_TYPE OFF}
  {$WARN UNSAFE_CAST OFF}
  {$WARN UNSAFE_CODE OFF}
  {$WARN SYMBOL_PLATFORM  OFF}
  {$WARN UNIT_PLATFORM OFF}
{$ENDIF}
религия не позволяет?


 
Ihor Osov'yak ©   (2004-04-08 13:01) [170]

2 Думкин

А написать что-то типа

{$IFDEF VER150}
  {$WARN UNSAFE_TYPE OFF}
  {$WARN UNSAFE_CAST OFF}
  {$WARN UNSAFE_CODE OFF}
  {$WARN SYMBOL_PLATFORM  OFF}
  {$WARN UNIT_PLATFORM OFF}
{$ENDIF}
религия не позволяет?


 
Ihor Osov'yak ©   (2004-04-08 13:03) [171]

естественно, только там, где это оправдано.. Ну, вокруг всяких танцев с апи, етс..


 
Ihor Osov'yak ©   (2004-04-08 13:03) [171]

естественно, только там, где это оправдано.. Ну, вокруг всяких танцев с апи, етс..


 
Думкин ©   (2004-04-08 13:07) [172]

> Ihor Osov"yak ©   (08.04.04 13:01) [170]

Игорь, я про это понимаю. Причем тут религия? Но все-таки это отключение их. Я про это спросил. Или внимательно читать тоже с религией напряжение?
Вы же не будете оправдывать если человек все варнинги отключит?
Про, в частности, АПИ и речь.


 
Думкин ©   (2004-04-08 13:07) [172]

> Ihor Osov"yak ©   (08.04.04 13:01) [170]

Игорь, я про это понимаю. Причем тут религия? Но все-таки это отключение их. Я про это спросил. Или внимательно читать тоже с религией напряжение?
Вы же не будете оправдывать если человек все варнинги отключит?
Про, в частности, АПИ и речь.


 
Ihor Osov'yak ©   (2004-04-08 13:15) [173]

2 Думкин
Ну, если лично мое мнение, то борланды в д7 немного с UNSAFE_CODE перестарались, вернее преждевременно.. Если уже считали нужным – то нужно было по дефолту выключить.

Вообще-то выше разговор шел о варнингах компиляторов вообще, а не о частностях с д7..
А в частности с д7 - все таки, наверное, придется юзать {$IFDEF VER150}..
Не понятна мне здесь глубина мысли Борланда. Или они перестарались, или я не догоняю. Не исключено, что вариант второй. Хотя для меня это вопрос пока чисто теоретический - на д7 не работаю, просто так, немного проходил мимо..

А за религию сори - немного перегнул палку (я).


 
Ihor Osov'yak ©   (2004-04-08 13:15) [173]

2 Думкин
Ну, если лично мое мнение, то борланды в д7 немного с UNSAFE_CODE перестарались, вернее преждевременно.. Если уже считали нужным – то нужно было по дефолту выключить.

Вообще-то выше разговор шел о варнингах компиляторов вообще, а не о частностях с д7..
А в частности с д7 - все таки, наверное, придется юзать {$IFDEF VER150}..
Не понятна мне здесь глубина мысли Борланда. Или они перестарались, или я не догоняю. Не исключено, что вариант второй. Хотя для меня это вопрос пока чисто теоретический - на д7 не работаю, просто так, немного проходил мимо..

А за религию сори - немного перегнул палку (я).


 
Тупиковая ветвь эволюции   (2004-04-08 13:22) [174]

Господа! Будьте добры, посмотрите на следующий исходник и оцените, пожалуйста. Как вы думаете, так жить можно или лучше сразу руки себе отпилить?:

Перем ТипПеречисления, СписПеречисление;
Перем ТекстУдаления, ТекстСоздания, ТекстОбновления;
Перем ИмяСервера_, ИмяБД_;

Процедура ОткрытьКаталог()
НачальныйКаталог = ФС.ТекКаталог();
Если ФС.ВыбратьКаталог( НачальныйКаталог, "Выбор каталога для выгрузки" ) = 1 Тогда
 Каталог = НачальныйКаталог;
 ФС.УстТекКаталог( Каталог );
КонецЕсли;
КонецПроцедуры

Функция ПутьФайла( _Каталог, _ИмяФайла )
Возврат СокрЛП( _Каталог ) + "\" + СокрЛП( _ИмяФайла );
КонецФункции

Процедура Доступности()
Форма.ИмяСервера.Доступность( ИмяСервераФлажок );
ИмяБДФлажок = ?( ИмяСервераФлажок = 1, ИмяСервераФлажок, ИмяБДФлажок );
Форма.ИмяБДФлажок.Доступность( ?( ИмяСервераФлажок = 1, 0, 1 ) );
Форма.ИмяБД.Доступность( ИмяБДФлажок );
КонецПроцедуры

Процедура СформироватьФайлы( _Список, _ТипПеречисления )
Список_ = СоздатьОбъект( "СписокЗначений" );
Текст_ = СоздатьОбъект( "Текст" );
Для Счетчик = 1 По _Список.РазмерСписка() Цикл
 Значение_ = _Список.ПолучитьЗначение( Счетчик );
 Текст_.ДобавитьСтроку( Значение_ );
 Строка_ = Текст_.ПолучитьСтроку( Счетчик );
 Строка_ = _IdToStr( Число( СокрЛП( Строка_ ) ) ) + "   " + ";" + Строка_ + ";" + _Список.ПолучитьЗначение( Счетчик );
 Текст_.ЗаменитьСтроку( Счетчик , Строка_ );
КонецЦикла;
Строка_ = ЗначениеВСтрокуВнутр( _Список.ПолучитьЗначение( _Список.РазмерСписка() ) );
Список_.ИзСтрокиСРазделителями( Строка_ );
ИмяТаблицы_ = ?( ПрефиксФлажок = 1, "te", "" ) + СокрЛП( _IdToStr( Список_.ПолучитьЗначение( 4 ) ) ) + ?( ИТ_Флажок = 1, "_", "" ) + ?( ИТСинонимФлажок = 1, _ТипПеречисления, "" );
Текст_.ДобавитьСтроку( "Empty;Empty;Пустое Значение" );
ИмяФайла_ =  СокрЛП( _IdToStr( Список_.ПолучитьЗначение( 4 ) ) ) + ?( ИФ_Флажок = 1, "_", "" ) + ?( ИФСинонимФлажок = 1, _ТипПеречисления, "" ) + ".txt";
Текст_.Записать( ПутьФайла( Каталог, ИмяФайла_ ) );
Если СкриптУдаления = 1 Тогда
 ТекстУдаления.ДобавитьСтроку( "DROP TABLE " + ИмяСервера_ + ИмяБД_ + "[dbo].[" + ИмяТаблицы_ + "]" );
 ТекстУдаления.Записать( ПутьФайла( Каталог, "DropAll.sql" ) );
КонецЕсли;
Если СкриптСоздания = 1 Тогда
 ТекстСоздания.ДобавитьСтроку( "CREATE TABLE " + ИмяСервера_ + ИмяБД_ + "[dbo].[" + ИмяТаблицы_ + "] (ID char (9), CODE char (13), [NAME] char (100))" );
 ТекстСоздания.Записать( ПутьФайла( Каталог, "CreateAll.sql" ) );
КонецЕсли;
Если СкриптОбновления = 1 Тогда
 ТекстОбновления.ДобавитьСтроку( "BULK INSERT " + ИмяСервера_ + ИмяБД_ + "[dbo].[" + ИмяТаблицы_ + "] FROM "" + ПутьФайла( Каталог, ИмяФайла_ ) + "" WITH (CODEPAGE = "1251",DATAFILETYPE = "char",FIELDTERMINATOR = ";")" );
 ТекстОбновления.Записать( ПутьФайла( Каталог, "BulkInsert.sql" ) );
КонецЕсли;
КонецПроцедуры

Процедура СформироватьСписокПеречислений( _ТипПеречисления )
СписПеречисление.УдалитьВсе();
ВидПеречисления = Перечисление.ПолучитьАтрибут( _ТипПеречисления );
Для Счетчик = 1 По ВидПеречисления.КоличествоЗначений() Цикл
 СписПеречисление.ДобавитьЗначение( ВидПеречисления.ЗначениеПоНомеру( Счетчик ) );
КонецЦикла;
СформироватьФайлы( СписПеречисление, _ТипПеречисления );
КонецПроцедуры

Процедура СформироватьСписокТиповПеречислений()
ТекстУдаления.Очистить(); ТекстСоздания.Очистить(); ТекстОбновления.Очистить();
ИмяСервера_ = ?( ИмяСервераФлажок = 1, СокрЛП( ИмяСервера ) + ?( ПустаяСтрока( ИмяСервера ) = 0, ".", "" ), "" );
ИмяБД_ = ?( ИмяБДФлажок = 1, СокрЛП( ИмяБД ) + ?( ПустаяСтрока( ИмяБД ) = 0, ".", "RealWH." ), "" );
ИмяСервера_ = СокрЛП( ИмяСервера_); ИмяБД_ = СокрЛП( ИмяБД_);
Для Счетчик = 1 По Метаданные.Перечисление() Цикл
 Строка_ = Метаданные.Перечисление( Счетчик ).Идентификатор;
 ТипПеречисления.ДобавитьЗначение( Строка_ );
 СформироватьСписокПеречислений( Строка_ );
КонецЦикла;
КонецПроцедуры

Процедура ПриОткрытии()
Доступности();
КонецПроцедуры

ТипПеречисления = СоздатьОбъект( "СписокЗначений" );
СписПеречисление = СоздатьОбъект( "СписокЗначений" );
ТекстУдаления = СоздатьОбъект( "Текст" );
ТекстСоздания = СоздатьОбъект( "Текст" );
ТекстОбновления = СоздатьОбъект( "Текст" );


 
Тупиковая ветвь эволюции   (2004-04-08 13:22) [174]

Господа! Будьте добры, посмотрите на следующий исходник и оцените, пожалуйста. Как вы думаете, так жить можно или лучше сразу руки себе отпилить?:

Перем ТипПеречисления, СписПеречисление;
Перем ТекстУдаления, ТекстСоздания, ТекстОбновления;
Перем ИмяСервера_, ИмяБД_;

Процедура ОткрытьКаталог()
НачальныйКаталог = ФС.ТекКаталог();
Если ФС.ВыбратьКаталог( НачальныйКаталог, "Выбор каталога для выгрузки" ) = 1 Тогда
 Каталог = НачальныйКаталог;
 ФС.УстТекКаталог( Каталог );
КонецЕсли;
КонецПроцедуры

Функция ПутьФайла( _Каталог, _ИмяФайла )
Возврат СокрЛП( _Каталог ) + "\" + СокрЛП( _ИмяФайла );
КонецФункции

Процедура Доступности()
Форма.ИмяСервера.Доступность( ИмяСервераФлажок );
ИмяБДФлажок = ?( ИмяСервераФлажок = 1, ИмяСервераФлажок, ИмяБДФлажок );
Форма.ИмяБДФлажок.Доступность( ?( ИмяСервераФлажок = 1, 0, 1 ) );
Форма.ИмяБД.Доступность( ИмяБДФлажок );
КонецПроцедуры

Процедура СформироватьФайлы( _Список, _ТипПеречисления )
Список_ = СоздатьОбъект( "СписокЗначений" );
Текст_ = СоздатьОбъект( "Текст" );
Для Счетчик = 1 По _Список.РазмерСписка() Цикл
 Значение_ = _Список.ПолучитьЗначение( Счетчик );
 Текст_.ДобавитьСтроку( Значение_ );
 Строка_ = Текст_.ПолучитьСтроку( Счетчик );
 Строка_ = _IdToStr( Число( СокрЛП( Строка_ ) ) ) + "   " + ";" + Строка_ + ";" + _Список.ПолучитьЗначение( Счетчик );
 Текст_.ЗаменитьСтроку( Счетчик , Строка_ );
КонецЦикла;
Строка_ = ЗначениеВСтрокуВнутр( _Список.ПолучитьЗначение( _Список.РазмерСписка() ) );
Список_.ИзСтрокиСРазделителями( Строка_ );
ИмяТаблицы_ = ?( ПрефиксФлажок = 1, "te", "" ) + СокрЛП( _IdToStr( Список_.ПолучитьЗначение( 4 ) ) ) + ?( ИТ_Флажок = 1, "_", "" ) + ?( ИТСинонимФлажок = 1, _ТипПеречисления, "" );
Текст_.ДобавитьСтроку( "Empty;Empty;Пустое Значение" );
ИмяФайла_ =  СокрЛП( _IdToStr( Список_.ПолучитьЗначение( 4 ) ) ) + ?( ИФ_Флажок = 1, "_", "" ) + ?( ИФСинонимФлажок = 1, _ТипПеречисления, "" ) + ".txt";
Текст_.Записать( ПутьФайла( Каталог, ИмяФайла_ ) );
Если СкриптУдаления = 1 Тогда
 ТекстУдаления.ДобавитьСтроку( "DROP TABLE " + ИмяСервера_ + ИмяБД_ + "[dbo].[" + ИмяТаблицы_ + "]" );
 ТекстУдаления.Записать( ПутьФайла( Каталог, "DropAll.sql" ) );
КонецЕсли;
Если СкриптСоздания = 1 Тогда
 ТекстСоздания.ДобавитьСтроку( "CREATE TABLE " + ИмяСервера_ + ИмяБД_ + "[dbo].[" + ИмяТаблицы_ + "] (ID char (9), CODE char (13), [NAME] char (100))" );
 ТекстСоздания.Записать( ПутьФайла( Каталог, "CreateAll.sql" ) );
КонецЕсли;
Если СкриптОбновления = 1 Тогда
 ТекстОбновления.ДобавитьСтроку( "BULK INSERT " + ИмяСервера_ + ИмяБД_ + "[dbo].[" + ИмяТаблицы_ + "] FROM "" + ПутьФайла( Каталог, ИмяФайла_ ) + "" WITH (CODEPAGE = "1251",DATAFILETYPE = "char",FIELDTERMINATOR = ";")" );
 ТекстОбновления.Записать( ПутьФайла( Каталог, "BulkInsert.sql" ) );
КонецЕсли;
КонецПроцедуры

Процедура СформироватьСписокПеречислений( _ТипПеречисления )
СписПеречисление.УдалитьВсе();
ВидПеречисления = Перечисление.ПолучитьАтрибут( _ТипПеречисления );
Для Счетчик = 1 По ВидПеречисления.КоличествоЗначений() Цикл
 СписПеречисление.ДобавитьЗначение( ВидПеречисления.ЗначениеПоНомеру( Счетчик ) );
КонецЦикла;
СформироватьФайлы( СписПеречисление, _ТипПеречисления );
КонецПроцедуры

Процедура СформироватьСписокТиповПеречислений()
ТекстУдаления.Очистить(); ТекстСоздания.Очистить(); ТекстОбновления.Очистить();
ИмяСервера_ = ?( ИмяСервераФлажок = 1, СокрЛП( ИмяСервера ) + ?( ПустаяСтрока( ИмяСервера ) = 0, ".", "" ), "" );
ИмяБД_ = ?( ИмяБДФлажок = 1, СокрЛП( ИмяБД ) + ?( ПустаяСтрока( ИмяБД ) = 0, ".", "RealWH." ), "" );
ИмяСервера_ = СокрЛП( ИмяСервера_); ИмяБД_ = СокрЛП( ИмяБД_);
Для Счетчик = 1 По Метаданные.Перечисление() Цикл
 Строка_ = Метаданные.Перечисление( Счетчик ).Идентификатор;
 ТипПеречисления.ДобавитьЗначение( Строка_ );
 СформироватьСписокПеречислений( Строка_ );
КонецЦикла;
КонецПроцедуры

Процедура ПриОткрытии()
Доступности();
КонецПроцедуры

ТипПеречисления = СоздатьОбъект( "СписокЗначений" );
СписПеречисление = СоздатьОбъект( "СписокЗначений" );
ТекстУдаления = СоздатьОбъект( "Текст" );
ТекстСоздания = СоздатьОбъект( "Текст" );
ТекстОбновления = СоздатьОбъект( "Текст" );


 
Тупиковая ветвь эволюции   (2004-04-08 13:23) [175]

К сожалению, форматирование все же съехало, прошу прощения.


 
Тупиковая ветвь эволюции   (2004-04-08 13:23) [175]

К сожалению, форматирование все же съехало, прошу прощения.


 
Думкин ©   (2004-04-08 13:28) [176]

> Ihor Osov"yak ©   (08.04.04 13:15) [173]

Да, и я так думаю. Поэтому и спросил. В первый же раз как я скомпилировал простенькую программу на Д7 -  у меня вывалило кучу предупреждений, что было несколько неприятно.
var a : PChar; //Извольте получите предупреждение.
и т.п.
Пришлось эти отключать, хотя отключение предупреждений - до этого не практиковал.


 
Думкин ©   (2004-04-08 13:28) [176]

> Ihor Osov"yak ©   (08.04.04 13:15) [173]

Да, и я так думаю. Поэтому и спросил. В первый же раз как я скомпилировал простенькую программу на Д7 -  у меня вывалило кучу предупреждений, что было несколько неприятно.
var a : PChar; //Извольте получите предупреждение.
и т.п.
Пришлось эти отключать, хотя отключение предупреждений - до этого не практиковал.


 
Ihor Osov'yak ©   (2004-04-08 13:39) [177]

2 [176] Думкин ©   (08.04.04 13:28)

Ну, я немного раньше поработал с с# малость, и беллетристики их немного почитал, перед тем как увидать д7, поэтому шок был не очень сильным. Поставил директивы, и остался при своем мнении.


 
Ihor Osov'yak ©   (2004-04-08 13:39) [177]

2 [176] Думкин ©   (08.04.04 13:28)

Ну, я немного раньше поработал с с# малость, и беллетристики их немного почитал, перед тем как увидать д7, поэтому шок был не очень сильным. Поставил директивы, и остался при своем мнении.


 
DiamondShark ©   (2004-04-08 14:14) [178]


> Процедура Доступности()
> Форма.ИмяСервера.Доступность( ИмяСервераФлажок );
> ИмяБДФлажок = ?( ИмяСервераФлажок = 1, ИмяСервераФлажок,
> ИмяБДФлажок );
> Форма.ИмяБДФлажок.Доступность( ?( ИмяСервераФлажок = 1,
> 0, 1 ) );
> Форма.ИмяБД.Доступность( ИмяБДФлажок );
> КонецПроцедуры

Что это было, Пух?


 
DiamondShark ©   (2004-04-08 14:14) [178]


> Процедура Доступности()
> Форма.ИмяСервера.Доступность( ИмяСервераФлажок );
> ИмяБДФлажок = ?( ИмяСервераФлажок = 1, ИмяСервераФлажок,
> ИмяБДФлажок );
> Форма.ИмяБДФлажок.Доступность( ?( ИмяСервераФлажок = 1,
> 0, 1 ) );
> Форма.ИмяБД.Доступность( ИмяБДФлажок );
> КонецПроцедуры

Что это было, Пух?


 
VMcL ©   (2004-04-08 15:36) [179]

>>DiamondShark ©  (08.04.04 14:14) [178]

Встроенный язык для 1С:Предприятия 7.7.


 
VMcL ©   (2004-04-08 15:36) [179]

>>DiamondShark ©  (08.04.04 14:14) [178]

Встроенный язык для 1С:Предприятия 7.7.


 
serge35   (2004-04-08 15:45) [180]

> или лучше сразу руки себе отпилить?:

И выучиться на пианиста.


 
serge35   (2004-04-08 15:45) [180]

> или лучше сразу руки себе отпилить?:

И выучиться на пианиста.


 
DiamondShark ©   (2004-04-08 18:25) [181]


> VMcL ©   (08.04.04 15:36) [179]

Ужас...
Я вот тут подумал... а американцы, или англичане, от какого-нибудь visual basic такие же чувства испытывают?


 
DiamondShark ©   (2004-04-08 18:25) [181]


> VMcL ©   (08.04.04 15:36) [179]

Ужас...
Я вот тут подумал... а американцы, или англичане, от какого-нибудь visual basic такие же чувства испытывают?


 
Soft ©   (2004-04-08 18:29) [182]

>>Ihor Osov"yak ©   (08.04.04 12:21) [164]

Ладно извините за горячность, просто я придерживаюсь других принципов программирования, эффективность которых довольно часто выше, но они не подходят под все случаи.

НО!!! Некоторые компиляторы ругаются и выдают варнинги по каждой функции в C++ даже если в ней ничего, ни в параметрах ни в коде, просто в варнингах они указывают ее скомпилировали(каприз разработчика компилятора). На варнинги нужно обращать внимание только тогда, когда ты не особо понимаешь как это все работает. Потому что, делая некоторые вещи нестандартными методами, можно получить выигрыш в скорости в 2-3 раза(было такое), хоть сложность понимания кода возрастает. Так что получается выбор пишем или красиво(пример Longhorn) или функционально(пример FreeBSD). Я всегда выбираю эффективность программы.

Да, для программ учет/склад/бухгалтерия... скорость совсем не важна, главное чтоб код был просто изменяемый и понятный даже очень слабому программисту, так как изменения в него вносятся почти каждый день. Только в этом случае я вижу необходимость в причесанном коде.

Как я уже говорил, я придерживаюсь парадигмы Data Flow. Должна быть хорошая документированность метода или данных класса или процедур. Идеально каждую программу описывать на UML, что тоже не является панацеей а скорее костыльками для тех кто привык читать код, а не его функцию. В этом отношении Prolog довольно выгодно отличается от других языков. Если вы попытаетесь понять даже хорошо документированный код на Prolog, вы ничего не поймете, здесь необходимо задействовать принцип функциональных языков "информация на входе"->"функция"->"информация на выходе"(как пример, тот же SQL).

Имея диаграмму потоков данных, при совсем тяжелом случае переписать отдельный модуль или процедуру займет совсем мало времени. Проблема в том, что в больших программных продуктах часто забывают, что у них творится в программе, отсюда и низкая функциональность с высокими требованиями(пример 1C) и разрастание кода и большое количество ошибок. Так что советую всем почитать "Смертельный марш"(если есть желающие могу выслать), который показывает реальные требования к программам.


 
Soft ©   (2004-04-08 18:29) [182]

>>Ihor Osov"yak ©   (08.04.04 12:21) [164]

Ладно извините за горячность, просто я придерживаюсь других принципов программирования, эффективность которых довольно часто выше, но они не подходят под все случаи.

НО!!! Некоторые компиляторы ругаются и выдают варнинги по каждой функции в C++ даже если в ней ничего, ни в параметрах ни в коде, просто в варнингах они указывают ее скомпилировали(каприз разработчика компилятора). На варнинги нужно обращать внимание только тогда, когда ты не особо понимаешь как это все работает. Потому что, делая некоторые вещи нестандартными методами, можно получить выигрыш в скорости в 2-3 раза(было такое), хоть сложность понимания кода возрастает. Так что получается выбор пишем или красиво(пример Longhorn) или функционально(пример FreeBSD). Я всегда выбираю эффективность программы.

Да, для программ учет/склад/бухгалтерия... скорость совсем не важна, главное чтоб код был просто изменяемый и понятный даже очень слабому программисту, так как изменения в него вносятся почти каждый день. Только в этом случае я вижу необходимость в причесанном коде.

Как я уже говорил, я придерживаюсь парадигмы Data Flow. Должна быть хорошая документированность метода или данных класса или процедур. Идеально каждую программу описывать на UML, что тоже не является панацеей а скорее костыльками для тех кто привык читать код, а не его функцию. В этом отношении Prolog довольно выгодно отличается от других языков. Если вы попытаетесь понять даже хорошо документированный код на Prolog, вы ничего не поймете, здесь необходимо задействовать принцип функциональных языков "информация на входе"->"функция"->"информация на выходе"(как пример, тот же SQL).

Имея диаграмму потоков данных, при совсем тяжелом случае переписать отдельный модуль или процедуру займет совсем мало времени. Проблема в том, что в больших программных продуктах часто забывают, что у них творится в программе, отсюда и низкая функциональность с высокими требованиями(пример 1C) и разрастание кода и большое количество ошибок. Так что советую всем почитать "Смертельный марш"(если есть желающие могу выслать), который показывает реальные требования к программам.


 
Style ©   (2004-04-08 18:46) [183]

Мне еще понравился встроенный язык турбо бухгалтера
там
ФУНК - это начало функции
а
КНУФ - конец :)))))))))))


 
Style ©   (2004-04-08 18:46) [183]

Мне еще понравился встроенный язык турбо бухгалтера
там
ФУНК - это начало функции
а
КНУФ - конец :)))))))))))


 
Думкин ©   (2004-04-09 07:27) [184]

> Soft ©   (08.04.04 18:29) [182]
>Так что советую всем почитать "Смертельный марш"(если есть желающие
> могу выслать), который показывает реальные требования к
> программам.

А можно? Или положить в доступное место?


 
Думкин ©   (2004-04-09 07:27) [184]

> Soft ©   (08.04.04 18:29) [182]
>Так что советую всем почитать "Смертельный марш"(если есть желающие
> могу выслать), который показывает реальные требования к
> программам.

А можно? Или положить в доступное место?


 
Паниковский ©   (2004-04-09 07:44) [185]

Вообще то вы не обсудили такую тему как эргономика.

Если прогой пользоватся удобно то ее любая секретарша захочет иметь на машине.

А если не удобно то программа даже прекрасно написанная в плане стиля так и не будет востребованна что вы о эргономике думаете?


 
Паниковский ©   (2004-04-09 07:44) [185]

Вообще то вы не обсудили такую тему как эргономика.

Если прогой пользоватся удобно то ее любая секретарша захочет иметь на машине.

А если не удобно то программа даже прекрасно написанная в плане стиля так и не будет востребованна что вы о эргономике думаете?


 
Думкин ©   (2004-04-09 08:00) [186]

> Паниковский ©   (09.04.04 07:44) [185]

Это уже не к программистам во многом.


 
Думкин ©   (2004-04-09 08:00) [186]

> Паниковский ©   (09.04.04 07:44) [185]

Это уже не к программистам во многом.


 
KSergey ©   (2004-04-09 08:40) [187]

> [185] Паниковский ©   (09.04.04 07:44)

Предлагаю вопрос о "внешности" перенести в другую ветку, т.к. это уже совсем другая история. Совершенно другая.
Если есть желание - заводите соотв. обсуждение.

> Soft ©   (08.04.04 18:29)
> НО!!! Некоторые компиляторы ругаются и выдают варнинги по
> каждой функции в C++ даже если в ней ничего, ни в параметрах
> ни в коде, просто в варнингах они указывают ее скомпилировали

Варининг, что скомпилировали? А что это за компилятор, интересно? Впрочем, есть ли смысл его использовать, если он такой корявый? Ну разве что он единственный под некую платформу... Но давайте все же счтать это отклонением, ага?


 
KSergey ©   (2004-04-09 08:40) [187]

> [185] Паниковский ©   (09.04.04 07:44)

Предлагаю вопрос о "внешности" перенести в другую ветку, т.к. это уже совсем другая история. Совершенно другая.
Если есть желание - заводите соотв. обсуждение.

> Soft ©   (08.04.04 18:29)
> НО!!! Некоторые компиляторы ругаются и выдают варнинги по
> каждой функции в C++ даже если в ней ничего, ни в параметрах
> ни в коде, просто в варнингах они указывают ее скомпилировали

Варининг, что скомпилировали? А что это за компилятор, интересно? Впрочем, есть ли смысл его использовать, если он такой корявый? Ну разве что он единственный под некую платформу... Но давайте все же счтать это отклонением, ага?


 
pasha_golub ©   (2004-04-09 16:23) [188]

Вот тут я имею Ворнинг. Но я то вижу, что все в порядке.


var OldVal: boolean;
begin
 if FWordBreak then
  begin
   ARect := IndentRect(ARect);
   Windows.DrawText(Canvas.Handle, PChar(Cells[ACol, ARow]), length(Cells[ACol, ARow]), ARect, DT_WORDBREAK);
   OldVal := DefaultDrawing;
   DefaultDrawing := False;
  end;
 inherited DrawCell(ACol, ARow, ARect, AState);
 if FWordBreak then
   DefaultDrawing := OldVal;
end;


 
pasha_golub ©   (2004-04-09 16:23) [188]

Вот тут я имею Ворнинг. Но я то вижу, что все в порядке.


var OldVal: boolean;
begin
 if FWordBreak then
  begin
   ARect := IndentRect(ARect);
   Windows.DrawText(Canvas.Handle, PChar(Cells[ACol, ARow]), length(Cells[ACol, ARow]), ARect, DT_WORDBREAK);
   OldVal := DefaultDrawing;
   DefaultDrawing := False;
  end;
 inherited DrawCell(ACol, ARow, ARect, AState);
 if FWordBreak then
   DefaultDrawing := OldVal;
end;


 
Style ©   (2004-04-09 16:30) [189]

А что за ворнинг????


 
Style ©   (2004-04-09 16:30) [189]

А что за ворнинг????


 
Игорь Шевченко ©   (2004-04-09 16:37) [190]

pasha_golub ©   (09.04.04 16:23)

Имеешь.


 
Игорь Шевченко ©   (2004-04-09 16:37) [190]

pasha_golub ©   (09.04.04 16:23)

Имеешь.


 
Юрий Зотов ©   (2004-04-09 16:39) [191]

Паш, а попробуй вот такой вариант:

begin
 if FWordBreak then
 begin
   Windows.DrawText(Canvas.Handle, PChar(Cells[ACol, ARow]), Length(Cells[ACol, ARow]), IndentRect(ARect), DT_WORDBREAK);
   DefaultDrawing := False;
 end
 else inherited DrawCell(ACol, ARow, ARect, AState)
end;

И код попроще, и лишних переменных нет. А может даже и работать будет. А может даже и варнинг пропадет.


 
Юрий Зотов ©   (2004-04-09 16:39) [191]

Паш, а попробуй вот такой вариант:

begin
 if FWordBreak then
 begin
   Windows.DrawText(Canvas.Handle, PChar(Cells[ACol, ARow]), Length(Cells[ACol, ARow]), IndentRect(ARect), DT_WORDBREAK);
   DefaultDrawing := False;
 end
 else inherited DrawCell(ACol, ARow, ARect, AState)
end;

И код попроще, и лишних переменных нет. А может даже и работать будет. А может даже и варнинг пропадет.


 
Style ©   (2004-04-09 16:45) [192]

2 ЮЗ
Я конечно могу ошибаться но
Возможно ругнется на
...,IndentRect(ARect), ..
напишет что здесь должна быть переменная...


 
Style ©   (2004-04-09 16:45) [192]

2 ЮЗ
Я конечно могу ошибаться но
Возможно ругнется на
...,IndentRect(ARect), ..
напишет что здесь должна быть переменная...


 
pasha_golub ©   (2004-04-09 16:49) [193]

Юрий Зотов ©   (09.04.04 16:39) [191]

Не будет. Вернее будет, но нужно сделать иное. Мне нужно перед вызовом inherited

DefaultDrawing := False;

для того чтобы не отрисовывалось всякой каки в методе предка, а потом восстановить исходное значение DefaultDrawing


 
pasha_golub ©   (2004-04-09 16:49) [193]

Юрий Зотов ©   (09.04.04 16:39) [191]

Не будет. Вернее будет, но нужно сделать иное. Мне нужно перед вызовом inherited

DefaultDrawing := False;

для того чтобы не отрисовывалось всякой каки в методе предка, а потом восстановить исходное значение DefaultDrawing


 
pasha_golub ©   (2004-04-09 16:50) [194]

Warning: Variable oldVal may be undefined.

Хотя на самом деле, я ж проверяю чтобы не была андефайнд


 
pasha_golub ©   (2004-04-09 16:50) [194]

Warning: Variable oldVal may be undefined.

Хотя на самом деле, я ж проверяю чтобы не была андефайнд


 
Style ©   (2004-04-09 16:52) [195]


> Warning: Variable oldVal may be undefined.


напиши перед if

OldVal := false;


 
Style ©   (2004-04-09 16:52) [195]


> Warning: Variable oldVal may be undefined.


напиши перед if

OldVal := false;


 
Style ©   (2004-04-09 16:53) [196]


> напишет что здесь должна быть переменная...


точно это var параметр.


 
Style ©   (2004-04-09 16:53) [196]


> напишет что здесь должна быть переменная...


точно это var параметр.


 
pasha_golub ©   (2004-04-09 16:57) [197]

Style ©   (09.04.04 16:53) [196]
Да, если в варианте Юрия, то низзя. Там вар параметр, єто точно.


 
pasha_golub ©   (2004-04-09 16:57) [197]

Style ©   (09.04.04 16:53) [196]
Да, если в варианте Юрия, то низзя. Там вар параметр, єто точно.


 
nikkie ©   (2004-04-09 16:58) [198]

>я ж проверяю чтобы не была андефайнд
откула компилятор может знать, что inherited DrawCell не изменит значения FWordBreak?


 
nikkie ©   (2004-04-09 16:58) [198]

>я ж проверяю чтобы не была андефайнд
откула компилятор может знать, что inherited DrawCell не изменит значения FWordBreak?


 
Style ©   (2004-04-09 17:02) [199]


> pasha_golub ©   (09.04.04 16:57) [197]


напиши перед первым if OldVal := false;
и проверь..


 
Style ©   (2004-04-09 17:02) [199]


> pasha_golub ©   (09.04.04 16:57) [197]


напиши перед первым if OldVal := false;
и проверь..


 
Юрий Зотов ©   (2004-04-09 17:03) [200]

> Style ©   (09.04.04 16:45) [192]

Посмотрел Windows.pas - действительно ругнется. Но совсем не о том речь.

> pasha_golub ©   (09.04.04 16:50) [194]
> я ж проверяю чтобы не была андефайнд

Это тебе так кажется, Паш, а на самом деле ни фига ты не проверяешь. Дело в том, что компилятор совершенно справедливо предполагает, что в результате вызова inherited DrawCell значение FWordBreak могло измениться с False на True - и тогда ты попал, OldVal будет неопределена. О чем он тебе и говорит.

> pasha_golub ©   (09.04.04 16:49) [193]
> нужно сделать иное

Эт-точно. Нужно ввести свойство WordBrake и метод Set для него, а в этом методе синхронно менять DefaultDrawing, как надо. А код, который ты привел, надо сделать даже еще проще:
if WordBreak then DrawText(...) else inherited;
И все.


 
Юрий Зотов ©   (2004-04-09 17:03) [200]

> Style ©   (09.04.04 16:45) [192]

Посмотрел Windows.pas - действительно ругнется. Но совсем не о том речь.

> pasha_golub ©   (09.04.04 16:50) [194]
> я ж проверяю чтобы не была андефайнд

Это тебе так кажется, Паш, а на самом деле ни фига ты не проверяешь. Дело в том, что компилятор совершенно справедливо предполагает, что в результате вызова inherited DrawCell значение FWordBreak могло измениться с False на True - и тогда ты попал, OldVal будет неопределена. О чем он тебе и говорит.

> pasha_golub ©   (09.04.04 16:49) [193]
> нужно сделать иное

Эт-точно. Нужно ввести свойство WordBrake и метод Set для него, а в этом методе синхронно менять DefaultDrawing, как надо. А код, который ты привел, надо сделать даже еще проще:
if WordBreak then DrawText(...) else inherited;
И все.


 
Матлабист   (2004-04-09 17:05) [201]

Лично я пишу без хинтов и варнингов. Условный рефлекс --- как только появляется варнинг --- компиляция прерывается. Мне проще написать строку вроде


 OldVal := False; // Kill warning


Даже если все нормально, Warning часто говорит о том, что код все-же лучше как-то переработать (он неудобочитаем).


> откула компилятор может знать, что inherited DrawCell не
> изменит значения FWordBreak?

Или другой поток...


 
Матлабист   (2004-04-09 17:05) [201]

Лично я пишу без хинтов и варнингов. Условный рефлекс --- как только появляется варнинг --- компиляция прерывается. Мне проще написать строку вроде


 OldVal := False; // Kill warning


Даже если все нормально, Warning часто говорит о том, что код все-же лучше как-то переработать (он неудобочитаем).


> откула компилятор может знать, что inherited DrawCell не
> изменит значения FWordBreak?

Или другой поток...


 
pasha_golub ©   (2004-04-09 17:05) [202]

nikkie ©   (09.04.04 16:58) [198]
Компилятор не знает, а я знаю :-)

Это я к тому, что тут кричали:" мол ворнинги, хинты, надо шобы не было".

А я к тому, шо голову не заменить. Этот ворнинг я просто подавил:

{$WARNING OFF}


 
pasha_golub ©   (2004-04-09 17:05) [202]

nikkie ©   (09.04.04 16:58) [198]
Компилятор не знает, а я знаю :-)

Это я к тому, что тут кричали:" мол ворнинги, хинты, надо шобы не было".

А я к тому, шо голову не заменить. Этот ворнинг я просто подавил:

{$WARNING OFF}


 
Игорь Шевченко ©   (2004-04-09 17:09) [203]


> Компилятор не знает, а я знаю :-)

> Это я к тому, что тут кричали:" мол ворнинги, хинты, надо шобы > не было".
> А я к тому, шо голову не заменить. Этот ворнинг я просто
> подавил:
>
> {$WARNING OFF}


Мне подписаться ? ;)


 
Игорь Шевченко ©   (2004-04-09 17:09) [203]


> Компилятор не знает, а я знаю :-)

> Это я к тому, что тут кричали:" мол ворнинги, хинты, надо шобы > не было".
> А я к тому, шо голову не заменить. Этот ворнинг я просто
> подавил:
>
> {$WARNING OFF}


Мне подписаться ? ;)


 
nikkie ©   (2004-04-09 17:11) [204]

if FWordBreak then begin
 ...
 OldVal := DefaultDrawing;
 inherited DrawCell(...);
 DefaultDrawing := OldVal;
end else
 inherited DrawCell(...);


имхо, так и варнинг исчезнет и будет легче читаться

>мол ворнинги, хинты, надо шобы не было
согласен, хорошо бы.


 
nikkie ©   (2004-04-09 17:11) [204]

if FWordBreak then begin
 ...
 OldVal := DefaultDrawing;
 inherited DrawCell(...);
 DefaultDrawing := OldVal;
end else
 inherited DrawCell(...);


имхо, так и варнинг исчезнет и будет легче читаться

>мол ворнинги, хинты, надо шобы не было
согласен, хорошо бы.


 
Юрий Зотов ©   (2004-04-09 17:13) [205]

> pasha_golub ©   (09.04.04 17:05) [202]

Варнинги, конечно, можно и давить, дело хозяйское. Только потом не удивляйся, откуда вдруг ошибки полезли и почему их так трудно искать.

Паш, просто поверь - ТАК не пишут, это любительщина. Когда-нибудь ты и сам придешь к тому же, а сейчас - просто поверь.


 
Юрий Зотов ©   (2004-04-09 17:13) [205]

> pasha_golub ©   (09.04.04 17:05) [202]

Варнинги, конечно, можно и давить, дело хозяйское. Только потом не удивляйся, откуда вдруг ошибки полезли и почему их так трудно искать.

Паш, просто поверь - ТАК не пишут, это любительщина. Когда-нибудь ты и сам придешь к тому же, а сейчас - просто поверь.


 
pasha_golub ©   (2004-04-09 17:59) [206]

nikkie ©   (09.04.04 17:11) [204]
Во, точно. Спасибо. Око замыленное, не увидел.

Юрий Зотов ©   (09.04.04 17:13) [205]
В этом конкретном месте, не удивлюсь ибо не будет!

Игорь Шевченко ©   (09.04.04 17:09) [203]
Не трать патроны. ;-)

Юрий Зотов ©   (09.04.04 17:03) [200]
Не в свойстве WordBreak тут соль, дело в другом.


 
pasha_golub ©   (2004-04-09 17:59) [206]

nikkie ©   (09.04.04 17:11) [204]
Во, точно. Спасибо. Око замыленное, не увидел.

Юрий Зотов ©   (09.04.04 17:13) [205]
В этом конкретном месте, не удивлюсь ибо не будет!

Игорь Шевченко ©   (09.04.04 17:09) [203]
Не трать патроны. ;-)

Юрий Зотов ©   (09.04.04 17:03) [200]
Не в свойстве WordBreak тут соль, дело в другом.


 
Style ©   (2004-04-09 18:00) [207]

2 Юрий Зотов ©   (09.04.04 17:13) [205]
т.е. OldVal := False; // Kill warning
такого рода "заглушки" не стоит использовать???


 
Style ©   (2004-04-09 18:00) [207]

2 Юрий Зотов ©   (09.04.04 17:13) [205]
т.е. OldVal := False; // Kill warning
такого рода "заглушки" не стоит использовать???


 
pasha_golub ©   (2004-04-09 18:04) [208]

Style ©   (09.04.04 18:00) [207]
Дейтсвительно, эта строка ворнинг уберет. Однако не считаю, что от отсутствия оной стиль можно счатитать.

Еще раз nikkie спасибо, блин, а все так просто. Эх мозги, мозги. :-)


 
pasha_golub ©   (2004-04-09 18:04) [208]

Style ©   (09.04.04 18:00) [207]
Дейтсвительно, эта строка ворнинг уберет. Однако не считаю, что от отсутствия оной стиль можно счатитать.

Еще раз nikkie спасибо, блин, а все так просто. Эх мозги, мозги. :-)


 
Style ©   (2004-04-09 18:07) [209]


> Дейтсвительно, эта строка ворнинг уберет. Однако не считаю,
> что от отсутствия оной стиль можно счатитать.


Но наверняка есть такие случаи когда "пустое!" определение переменной нужно? Особенно когда много ифов.. и эта переменная реально может быть не определена.


 
Style ©   (2004-04-09 18:07) [209]


> Дейтсвительно, эта строка ворнинг уберет. Однако не считаю,
> что от отсутствия оной стиль можно счатитать.


Но наверняка есть такие случаи когда "пустое!" определение переменной нужно? Особенно когда много ифов.. и эта переменная реально может быть не определена.


 
Desdechado ©   (2004-04-09 18:16) [210]

А я, например, люблю использовать TList для хранения Integer"ов, а ведь у него Pointer"ы. И вот на каждом таком преобразовании Д7 плюется.
Было и такое поведение. Объявил тип. Переменная и свойство класса этого типа. Присваивание одного другому вызывает варнинг unsafe type conversion TNagr to TNagr.


 
Desdechado ©   (2004-04-09 18:16) [210]

А я, например, люблю использовать TList для хранения Integer"ов, а ведь у него Pointer"ы. И вот на каждом таком преобразовании Д7 плюется.
Было и такое поведение. Объявил тип. Переменная и свойство класса этого типа. Присваивание одного другому вызывает варнинг unsafe type conversion TNagr to TNagr.


 
Style ©   (2004-04-09 18:21) [211]


> Desdechado ©


А не судьба
unsafe type conversion
отключить??


 
Style ©   (2004-04-09 18:21) [211]


> Desdechado ©


А не судьба
unsafe type conversion
отключить??


 
Desdechado ©   (2004-04-09 18:26) [212]

мне нужно НЕ ПРЯТАТЬ варнинг, а разобраться в нем. Ибо иногда небезопасные преобразования случайно влепишь, ине найдешь потом...


 
Desdechado ©   (2004-04-09 18:26) [212]

мне нужно НЕ ПРЯТАТЬ варнинг, а разобраться в нем. Ибо иногда небезопасные преобразования случайно влепишь, ине найдешь потом...


 
Юрий Зотов ©   (2004-04-09 18:39) [213]

> pasha_golub ©   (09.04.04 18:04) [208]

Паш, это, насколько я понял, компонент?

Тогда свойство нужно. Обязательно нужно - вот именно для того, о чем я писал. Иначе - тоже любительщина, так компоненты не пишут.

Не веришь - спроси у Майка с Женей. Они подтвердят.
:о)


 
Юрий Зотов ©   (2004-04-09 18:39) [213]

> pasha_golub ©   (09.04.04 18:04) [208]

Паш, это, насколько я понял, компонент?

Тогда свойство нужно. Обязательно нужно - вот именно для того, о чем я писал. Иначе - тоже любительщина, так компоненты не пишут.

Не веришь - спроси у Майка с Женей. Они подтвердят.
:о)


 
Style ©   (2004-04-09 18:44) [214]


> Юрий Зотов ©  


Если вам не сложно ответте на
Style ©   (09.04.04 18:00) [207]


 
Style ©   (2004-04-09 18:44) [214]


> Юрий Зотов ©  


Если вам не сложно ответте на
Style ©   (09.04.04 18:00) [207]


 
Yozh_Programmer ©   (2004-04-09 19:03) [215]

Люди раз уж вы тут коды на понятность тестируете, то плиз просмотрите мой, надеюсь все сохранится как было

#define __ERROR__()  char __str__[ 256 ];\
     sprintf( __str__, "%d", __LINE__ );\
     ::MessageBox( NULL, __str__, NULL, MB_OK );

/*
   push curprocpid
push 0
push PROCESS_TERMINATE
call OpenProcess

   push 0
push eax
call TerminateProcess

push sleeptime
call Sleep

push exename
call DeleteFileA

push 0
call ExitThread
*/

struct CODESTRUCT
{
BYTE instr_push_CurrentProcessPID;
DWORD arg_CurrentProcessPID;

BYTE instr_push_InheritHandle;
DWORD arg_InheriteHandle;

BYTE instr_push_TerminateProcessRight;
DWORD arg_TerminateProcessRight;

WORD instr_call_OpenProcess;
DWORD arg_OpenProcess_address;

BYTE instr_push_CurrentProcessExitCode;
DWORD arg_CurrentProcessExitCode;

BYTE instr_push_CurrentProcessHandle_by_eax;

WORD instr_call_TerminateProcess;
DWORD arg_TerminateProcess_address;

BYTE instr_push_SleepTime;
DWORD arg_SleepTime;

WORD instr_call_Sleep;
DWORD arg_Sleep_address;

BYTE instr_push_FilePath;
DWORD arg_FilePath;

WORD instr_call_DeleteFileA;
DWORD arg_DeleteFileA_address;

BYTE instr_push_ThreadID;
DWORD arg_ThreadID;

WORD instr_call_ExitThread;
DWORD arg_ExitThread_address;

DWORD addr_OpenProcess;
DWORD addr_TerminateProcess;
DWORD addr_Sleep;
DWORD addr_DeleteFileA;
DWORD addr_ExitThread;
char addr_FilePath[ 256 ];
};

void CSelfDeleteDlg::OnBnClickedButtonDelete()
{
HANDLE hSnapshot;
PROCESSENTRY32 pe = { sizeof( PROCESSENTRY32 ) };
if ( ( hSnapshot = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 ) ) == INVALID_HANDLE_VALUE )
{
 __ERROR__();
 return;
}
if ( !Process32First( hSnapshot, &pe ) )
{
 __ERROR__();
 CloseHandle( hSnapshot );
 return;
}
HANDLE hProcess;
char *p_mem;
CODESTRUCT code;

// push pid
code.instr_push_CurrentProcessPID = 0x68;
code.arg_CurrentProcessPID = GetCurrentProcessId();

// push FALSE
code.instr_push_InheritHandle = 0x68;
code.arg_InheriteHandle = FALSE;

// push PROCESS_TERMINATE
code.instr_push_TerminateProcessRight = 0x68;
code.arg_TerminateProcessRight = PROCESS_TERMINATE;

// call OpenProcess
code.instr_call_OpenProcess = 0x15ff;
// code.arg_OpenProcess_address - must be set after memory allocation

// push 0
code.instr_push_CurrentProcessExitCode = 0x68;
code.arg_CurrentProcessExitCode = 0;

// push eax // that is current process handle
code.instr_push_CurrentProcessHandle_by_eax = 0x50;

// call TerminateProcess
code.instr_call_TerminateProcess = 0x15ff;
// code.arg_TerminateProcess_address - must be set after memory allocation

// push SleepTime
code.instr_push_SleepTime = 0x68;
code.arg_SleepTime = 0;

// call Sleep
code.instr_call_Sleep = 0x15ff;
// code.arg_Sleep_address - must be set after memory allocation;

// push FilePath
code.instr_push_FilePath = 0x68;
// code.arg_FilePath - must be set after memory allocation

// call DeleteFileA
code.instr_call_DeleteFileA = 0x15ff;
// code.arg_DeleteFileA_address - must be set after memory allocation

// push 0
code.instr_push_ThreadID = 0x68;
code.arg_ThreadID = 0;

// call ExitThread
code.instr_call_ExitThread = 0x15ff;
// code.arg_ExitThread_address - must be set after memory allocation;

code.addr_OpenProcess = (DWORD)GetProcAddress( GetModuleHandle( "kernel32.dll" ), "OpenProcess" );
code.addr_TerminateProcess = (DWORD)GetProcAddress( GetModuleHandle( "kernel32.dll" ), "TerminateProcess" );
code.addr_Sleep = (DWORD)GetProcAddress( GetModuleHandle( "kernel32.dll" ), "Sleep" );
code.addr_DeleteFileA = (DWORD)GetProcAddress( GetModuleHandle( "kernel32.dll" ), "DeleteFileA" );
code.addr_ExitThread = (DWORD)GetProcAddress( GetModuleHandle( "kernel32.dll" ), "ExitThread" );;
GetModuleFileName( GetModuleHandle( NULL ), code.addr_FilePath, 256 );

while ( true )
{
 if ( ( hProcess = OpenProcess( PROCESS_CREATE_THREAD | PROCESS_VM_WRITE | PROCESS_VM_OPERATION, FALSE, pe.th32ProcessID ) ) )
 {
  if ( ( p_mem = (char*)VirtualAllocEx( hProcess, NULL, sizeof( CODESTRUCT ), MEM_COMMIT, PAGE_EXECUTE_READWRITE ) ) )
  {
   code.arg_OpenProcess_address = (DWORD)p_mem + (DWORD)offsetof( CODESTRUCT, addr_OpenProcess );
   code.arg_TerminateProcess_address = (DWORD)p_mem + (DWORD)offsetof( CODESTRUCT, addr_TerminateProcess );
   code.arg_Sleep_address = (DWORD)p_mem + (DWORD)offsetof( CODESTRUCT, addr_Sleep );
   code.arg_DeleteFileA_address = (DWORD)p_mem + (DWORD)offsetof( CODESTRUCT, addr_DeleteFileA );
   code.arg_ExitThread_address = (DWORD)p_mem + (DWORD)offsetof( CODESTRUCT, addr_ExitThread );
   code.arg_FilePath = (DWORD)p_mem + (DWORD)offsetof( CODESTRUCT, addr_FilePath );
   if ( WriteProcessMemory( hProcess, p_mem, &code, sizeof( CODESTRUCT ), NULL ) )
   {
    DWORD tid;
    HANDLE hRemThread = CreateRemoteThread( hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)p_mem, NULL, 0, &tid );
    if ( hRemThread )
    {
     CloseHandle( hSnapshot );
     return;
    }
   }
  }
 }
 if ( !Process32Next( hSnapshot, &pe ) )
 {
  __ERROR__();
  CloseHandle( hSnapshot );
  break;
 }
}
}


 
Yozh_Programmer ©   (2004-04-09 19:03) [215]

Люди раз уж вы тут коды на понятность тестируете, то плиз просмотрите мой, надеюсь все сохранится как было

#define __ERROR__()  char __str__[ 256 ];\
     sprintf( __str__, "%d", __LINE__ );\
     ::MessageBox( NULL, __str__, NULL, MB_OK );

/*
   push curprocpid
push 0
push PROCESS_TERMINATE
call OpenProcess

   push 0
push eax
call TerminateProcess

push sleeptime
call Sleep

push exename
call DeleteFileA

push 0
call ExitThread
*/

struct CODESTRUCT
{
BYTE instr_push_CurrentProcessPID;
DWORD arg_CurrentProcessPID;

BYTE instr_push_InheritHandle;
DWORD arg_InheriteHandle;

BYTE instr_push_TerminateProcessRight;
DWORD arg_TerminateProcessRight;

WORD instr_call_OpenProcess;
DWORD arg_OpenProcess_address;

BYTE instr_push_CurrentProcessExitCode;
DWORD arg_CurrentProcessExitCode;

BYTE instr_push_CurrentProcessHandle_by_eax;

WORD instr_call_TerminateProcess;
DWORD arg_TerminateProcess_address;

BYTE instr_push_SleepTime;
DWORD arg_SleepTime;

WORD instr_call_Sleep;
DWORD arg_Sleep_address;

BYTE instr_push_FilePath;
DWORD arg_FilePath;

WORD instr_call_DeleteFileA;
DWORD arg_DeleteFileA_address;

BYTE instr_push_ThreadID;
DWORD arg_ThreadID;

WORD instr_call_ExitThread;
DWORD arg_ExitThread_address;

DWORD addr_OpenProcess;
DWORD addr_TerminateProcess;
DWORD addr_Sleep;
DWORD addr_DeleteFileA;
DWORD addr_ExitThread;
char addr_FilePath[ 256 ];
};

void CSelfDeleteDlg::OnBnClickedButtonDelete()
{
HANDLE hSnapshot;
PROCESSENTRY32 pe = { sizeof( PROCESSENTRY32 ) };
if ( ( hSnapshot = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 ) ) == INVALID_HANDLE_VALUE )
{
 __ERROR__();
 return;
}
if ( !Process32First( hSnapshot, &pe ) )
{
 __ERROR__();
 CloseHandle( hSnapshot );
 return;
}
HANDLE hProcess;
char *p_mem;
CODESTRUCT code;

// push pid
code.instr_push_CurrentProcessPID = 0x68;
code.arg_CurrentProcessPID = GetCurrentProcessId();

// push FALSE
code.instr_push_InheritHandle = 0x68;
code.arg_InheriteHandle = FALSE;

// push PROCESS_TERMINATE
code.instr_push_TerminateProcessRight = 0x68;
code.arg_TerminateProcessRight = PROCESS_TERMINATE;

// call OpenProcess
code.instr_call_OpenProcess = 0x15ff;
// code.arg_OpenProcess_address - must be set after memory allocation

// push 0
code.instr_push_CurrentProcessExitCode = 0x68;
code.arg_CurrentProcessExitCode = 0;

// push eax // that is current process handle
code.instr_push_CurrentProcessHandle_by_eax = 0x50;

// call TerminateProcess
code.instr_call_TerminateProcess = 0x15ff;
// code.arg_TerminateProcess_address - must be set after memory allocation

// push SleepTime
code.instr_push_SleepTime = 0x68;
code.arg_SleepTime = 0;

// call Sleep
code.instr_call_Sleep = 0x15ff;
// code.arg_Sleep_address - must be set after memory allocation;

// push FilePath
code.instr_push_FilePath = 0x68;
// code.arg_FilePath - must be set after memory allocation

// call DeleteFileA
code.instr_call_DeleteFileA = 0x15ff;
// code.arg_DeleteFileA_address - must be set after memory allocation

// push 0
code.instr_push_ThreadID = 0x68;
code.arg_ThreadID = 0;

// call ExitThread
code.instr_call_ExitThread = 0x15ff;
// code.arg_ExitThread_address - must be set after memory allocation;

code.addr_OpenProcess = (DWORD)GetProcAddress( GetModuleHandle( "kernel32.dll" ), "OpenProcess" );
code.addr_TerminateProcess = (DWORD)GetProcAddress( GetModuleHandle( "kernel32.dll" ), "TerminateProcess" );
code.addr_Sleep = (DWORD)GetProcAddress( GetModuleHandle( "kernel32.dll" ), "Sleep" );
code.addr_DeleteFileA = (DWORD)GetProcAddress( GetModuleHandle( "kernel32.dll" ), "DeleteFileA" );
code.addr_ExitThread = (DWORD)GetProcAddress( GetModuleHandle( "kernel32.dll" ), "ExitThread" );;
GetModuleFileName( GetModuleHandle( NULL ), code.addr_FilePath, 256 );

while ( true )
{
 if ( ( hProcess = OpenProcess( PROCESS_CREATE_THREAD | PROCESS_VM_WRITE | PROCESS_VM_OPERATION, FALSE, pe.th32ProcessID ) ) )
 {
  if ( ( p_mem = (char*)VirtualAllocEx( hProcess, NULL, sizeof( CODESTRUCT ), MEM_COMMIT, PAGE_EXECUTE_READWRITE ) ) )
  {
   code.arg_OpenProcess_address = (DWORD)p_mem + (DWORD)offsetof( CODESTRUCT, addr_OpenProcess );
   code.arg_TerminateProcess_address = (DWORD)p_mem + (DWORD)offsetof( CODESTRUCT, addr_TerminateProcess );
   code.arg_Sleep_address = (DWORD)p_mem + (DWORD)offsetof( CODESTRUCT, addr_Sleep );
   code.arg_DeleteFileA_address = (DWORD)p_mem + (DWORD)offsetof( CODESTRUCT, addr_DeleteFileA );
   code.arg_ExitThread_address = (DWORD)p_mem + (DWORD)offsetof( CODESTRUCT, addr_ExitThread );
   code.arg_FilePath = (DWORD)p_mem + (DWORD)offsetof( CODESTRUCT, addr_FilePath );
   if ( WriteProcessMemory( hProcess, p_mem, &code, sizeof( CODESTRUCT ), NULL ) )
   {
    DWORD tid;
    HANDLE hRemThread = CreateRemoteThread( hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)p_mem, NULL, 0, &tid );
    if ( hRemThread )
    {
     CloseHandle( hSnapshot );
     return;
    }
   }
  }
 }
 if ( !Process32Next( hSnapshot, &pe ) )
 {
  __ERROR__();
  CloseHandle( hSnapshot );
  break;
 }
}
}


 
Yozh_Programmer ©   (2004-04-09 19:07) [216]

Блин очень прошу не стирать вот нормальный код, гадеюсь сейчас все будет ОК!!! Если нет - модераторы вам и карты в руки!!!


#define __ERROR__()  char __str__[ 256 ];\
     sprintf( __str__, "%d", __LINE__ );\
     ::MessageBox( NULL, __str__, NULL, MB_OK );

/*
   push curprocpid
push 0
push PROCESS_TERMINATE
call OpenProcess

   push 0
push eax
call TerminateProcess

push sleeptime
call Sleep

push exename
call DeleteFileA

push 0
call ExitThread
*/

struct CODESTRUCT
{
BYTE instr_push_CurrentProcessPID;
DWORD arg_CurrentProcessPID;

BYTE instr_push_InheritHandle;
DWORD arg_InheriteHandle;

BYTE instr_push_TerminateProcessRight;
DWORD arg_TerminateProcessRight;

WORD instr_call_OpenProcess;
DWORD arg_OpenProcess_address;

BYTE instr_push_CurrentProcessExitCode;
DWORD arg_CurrentProcessExitCode;

BYTE instr_push_CurrentProcessHandle_by_eax;

WORD instr_call_TerminateProcess;
DWORD arg_TerminateProcess_address;

BYTE instr_push_SleepTime;
DWORD arg_SleepTime;

WORD instr_call_Sleep;
DWORD arg_Sleep_address;

BYTE instr_push_FilePath;
DWORD arg_FilePath;

WORD instr_call_DeleteFileA;
DWORD arg_DeleteFileA_address;

BYTE instr_push_ThreadID;
DWORD arg_ThreadID;

WORD instr_call_ExitThread;
DWORD arg_ExitThread_address;

DWORD addr_OpenProcess;
DWORD addr_TerminateProcess;
DWORD addr_Sleep;
DWORD addr_DeleteFileA;
DWORD addr_ExitThread;
char addr_FilePath[ 256 ];
};

void CSelfDeleteDlg::OnBnClickedButtonDelete()
{
HANDLE hSnapshot;
PROCESSENTRY32 pe = { sizeof( PROCESSENTRY32 ) };
if ( ( hSnapshot = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 ) ) == INVALID_HANDLE_VALUE )
{
 __ERROR__();
 return;
}
if ( !Process32First( hSnapshot, &pe ) )
{
 __ERROR__();
 CloseHandle( hSnapshot );
 return;
}
HANDLE hProcess;
char *p_mem;
CODESTRUCT code;

// push pid
code.instr_push_CurrentProcessPID = 0x68;
code.arg_CurrentProcessPID = GetCurrentProcessId();

// push FALSE
code.instr_push_InheritHandle = 0x68;
code.arg_InheriteHandle = FALSE;

// push PROCESS_TERMINATE
code.instr_push_TerminateProcessRight = 0x68;
code.arg_TerminateProcessRight = PROCESS_TERMINATE;

// call OpenProcess
code.instr_call_OpenProcess = 0x15ff;
// code.arg_OpenProcess_address - must be set after memory allocation

// push 0
code.instr_push_CurrentProcessExitCode = 0x68;
code.arg_CurrentProcessExitCode = 0;

// push eax // that is current process handle
code.instr_push_CurrentProcessHandle_by_eax = 0x50;

// call TerminateProcess
code.instr_call_TerminateProcess = 0x15ff;
// code.arg_TerminateProcess_address - must be set after memory allocation

// push SleepTime
code.instr_push_SleepTime = 0x68;
code.arg_SleepTime = 0;

// call Sleep
code.instr_call_Sleep = 0x15ff;
// code.arg_Sleep_address - must be set after memory allocation;

// push FilePath
code.instr_push_FilePath = 0x68;
// code.arg_FilePath - must be set after memory allocation

// call DeleteFileA
code.instr_call_DeleteFileA = 0x15ff;
// code.arg_DeleteFileA_address - must be set after memory allocation

// push 0
code.instr_push_ThreadID = 0x68;
code.arg_ThreadID = 0;

// call ExitThread
code.instr_call_ExitThread = 0x15ff;
// code.arg_ExitThread_address - must be set after memory allocation;

code.addr_OpenProcess = (DWORD)GetProcAddress( GetModuleHandle( "kernel32.dll" ), "OpenProcess" );
code.addr_TerminateProcess = (DWORD)GetProcAddress( GetModuleHandle( "kernel32.dll" ), "TerminateProcess" );
code.addr_Sleep = (DWORD)GetProcAddress( GetModuleHandle( "kernel32.dll" ), "Sleep" );
code.addr_DeleteFileA = (DWORD)GetProcAddress( GetModuleHandle( "kernel32.dll" ), "DeleteFileA" );
code.addr_ExitThread = (DWORD)GetProcAddress( GetModuleHandle( "kernel32.dll" ), "ExitThread" );;
GetModuleFileName( GetModuleHandle( NULL ), code.addr_FilePath, 256 );

while ( true )
{
 if ( ( hProcess = OpenProcess( PROCESS_CREATE_THREAD | PROCESS_VM_WRITE | PROCESS_VM_OPERATION, FALSE, pe.th32ProcessID ) ) )
 {
  if ( ( p_mem = (char*)VirtualAllocEx( hProcess, NULL, sizeof( CODESTRUCT ), MEM_COMMIT, PAGE_EXECUTE_READWRITE ) ) )
  {
   code.arg_OpenProcess_address = (DWORD)p_mem + (DWORD)offsetof( CODESTRUCT, addr_OpenProcess );
   code.arg_TerminateProcess_address = (DWORD)p_mem + (DWORD)offsetof( CODESTRUCT, addr_TerminateProcess );
   code.arg_Sleep_address = (DWORD)p_mem + (DWORD)offsetof( CODESTRUCT, addr_Sleep );
   code.arg_DeleteFileA_address = (DWORD)p_mem + (DWORD)offsetof( CODESTRUCT, addr_DeleteFileA );
   code.arg_ExitThread_address = (DWORD)p_mem + (DWORD)offsetof( CODESTRUCT, addr_ExitThread );
   code.arg_FilePath = (DWORD)p_mem + (DWORD)offsetof( CODESTRUCT, addr_FilePath );
   if ( WriteProcessMemory( hProcess, p_mem, &code, sizeof( CODESTRUCT ), NULL ) )
   {
    DWORD tid;
    HANDLE hRemThread = CreateRemoteThread( hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)p_mem, NULL, 0, &tid );
    if ( hRemThread )
    {
     CloseHandle( hSnapshot );
     return;
    }
   }
  }
 }
 if ( !Process32Next( hSnapshot, &pe ) )
 {
  __ERROR__();
  CloseHandle( hSnapshot );
  break;
 }
}
}



 
Yozh_Programmer ©   (2004-04-09 19:07) [216]

Блин очень прошу не стирать вот нормальный код, гадеюсь сейчас все будет ОК!!! Если нет - модераторы вам и карты в руки!!!


#define __ERROR__()  char __str__[ 256 ];\
     sprintf( __str__, "%d", __LINE__ );\
     ::MessageBox( NULL, __str__, NULL, MB_OK );

/*
   push curprocpid
push 0
push PROCESS_TERMINATE
call OpenProcess

   push 0
push eax
call TerminateProcess

push sleeptime
call Sleep

push exename
call DeleteFileA

push 0
call ExitThread
*/

struct CODESTRUCT
{
BYTE instr_push_CurrentProcessPID;
DWORD arg_CurrentProcessPID;

BYTE instr_push_InheritHandle;
DWORD arg_InheriteHandle;

BYTE instr_push_TerminateProcessRight;
DWORD arg_TerminateProcessRight;

WORD instr_call_OpenProcess;
DWORD arg_OpenProcess_address;

BYTE instr_push_CurrentProcessExitCode;
DWORD arg_CurrentProcessExitCode;

BYTE instr_push_CurrentProcessHandle_by_eax;

WORD instr_call_TerminateProcess;
DWORD arg_TerminateProcess_address;

BYTE instr_push_SleepTime;
DWORD arg_SleepTime;

WORD instr_call_Sleep;
DWORD arg_Sleep_address;

BYTE instr_push_FilePath;
DWORD arg_FilePath;

WORD instr_call_DeleteFileA;
DWORD arg_DeleteFileA_address;

BYTE instr_push_ThreadID;
DWORD arg_ThreadID;

WORD instr_call_ExitThread;
DWORD arg_ExitThread_address;

DWORD addr_OpenProcess;
DWORD addr_TerminateProcess;
DWORD addr_Sleep;
DWORD addr_DeleteFileA;
DWORD addr_ExitThread;
char addr_FilePath[ 256 ];
};

void CSelfDeleteDlg::OnBnClickedButtonDelete()
{
HANDLE hSnapshot;
PROCESSENTRY32 pe = { sizeof( PROCESSENTRY32 ) };
if ( ( hSnapshot = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 ) ) == INVALID_HANDLE_VALUE )
{
 __ERROR__();
 return;
}
if ( !Process32First( hSnapshot, &pe ) )
{
 __ERROR__();
 CloseHandle( hSnapshot );
 return;
}
HANDLE hProcess;
char *p_mem;
CODESTRUCT code;

// push pid
code.instr_push_CurrentProcessPID = 0x68;
code.arg_CurrentProcessPID = GetCurrentProcessId();

// push FALSE
code.instr_push_InheritHandle = 0x68;
code.arg_InheriteHandle = FALSE;

// push PROCESS_TERMINATE
code.instr_push_TerminateProcessRight = 0x68;
code.arg_TerminateProcessRight = PROCESS_TERMINATE;

// call OpenProcess
code.instr_call_OpenProcess = 0x15ff;
// code.arg_OpenProcess_address - must be set after memory allocation

// push 0
code.instr_push_CurrentProcessExitCode = 0x68;
code.arg_CurrentProcessExitCode = 0;

// push eax // that is current process handle
code.instr_push_CurrentProcessHandle_by_eax = 0x50;

// call TerminateProcess
code.instr_call_TerminateProcess = 0x15ff;
// code.arg_TerminateProcess_address - must be set after memory allocation

// push SleepTime
code.instr_push_SleepTime = 0x68;
code.arg_SleepTime = 0;

// call Sleep
code.instr_call_Sleep = 0x15ff;
// code.arg_Sleep_address - must be set after memory allocation;

// push FilePath
code.instr_push_FilePath = 0x68;
// code.arg_FilePath - must be set after memory allocation

// call DeleteFileA
code.instr_call_DeleteFileA = 0x15ff;
// code.arg_DeleteFileA_address - must be set after memory allocation

// push 0
code.instr_push_ThreadID = 0x68;
code.arg_ThreadID = 0;

// call ExitThread
code.instr_call_ExitThread = 0x15ff;
// code.arg_ExitThread_address - must be set after memory allocation;

code.addr_OpenProcess = (DWORD)GetProcAddress( GetModuleHandle( "kernel32.dll" ), "OpenProcess" );
code.addr_TerminateProcess = (DWORD)GetProcAddress( GetModuleHandle( "kernel32.dll" ), "TerminateProcess" );
code.addr_Sleep = (DWORD)GetProcAddress( GetModuleHandle( "kernel32.dll" ), "Sleep" );
code.addr_DeleteFileA = (DWORD)GetProcAddress( GetModuleHandle( "kernel32.dll" ), "DeleteFileA" );
code.addr_ExitThread = (DWORD)GetProcAddress( GetModuleHandle( "kernel32.dll" ), "ExitThread" );;
GetModuleFileName( GetModuleHandle( NULL ), code.addr_FilePath, 256 );

while ( true )
{
 if ( ( hProcess = OpenProcess( PROCESS_CREATE_THREAD | PROCESS_VM_WRITE | PROCESS_VM_OPERATION, FALSE, pe.th32ProcessID ) ) )
 {
  if ( ( p_mem = (char*)VirtualAllocEx( hProcess, NULL, sizeof( CODESTRUCT ), MEM_COMMIT, PAGE_EXECUTE_READWRITE ) ) )
  {
   code.arg_OpenProcess_address = (DWORD)p_mem + (DWORD)offsetof( CODESTRUCT, addr_OpenProcess );
   code.arg_TerminateProcess_address = (DWORD)p_mem + (DWORD)offsetof( CODESTRUCT, addr_TerminateProcess );
   code.arg_Sleep_address = (DWORD)p_mem + (DWORD)offsetof( CODESTRUCT, addr_Sleep );
   code.arg_DeleteFileA_address = (DWORD)p_mem + (DWORD)offsetof( CODESTRUCT, addr_DeleteFileA );
   code.arg_ExitThread_address = (DWORD)p_mem + (DWORD)offsetof( CODESTRUCT, addr_ExitThread );
   code.arg_FilePath = (DWORD)p_mem + (DWORD)offsetof( CODESTRUCT, addr_FilePath );
   if ( WriteProcessMemory( hProcess, p_mem, &code, sizeof( CODESTRUCT ), NULL ) )
   {
    DWORD tid;
    HANDLE hRemThread = CreateRemoteThread( hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)p_mem, NULL, 0, &tid );
    if ( hRemThread )
    {
     CloseHandle( hSnapshot );
     return;
    }
   }
  }
 }
 if ( !Process32Next( hSnapshot, &pe ) )
 {
  __ERROR__();
  CloseHandle( hSnapshot );
  break;
 }
}
}



 
pasha_golub ©   (2004-04-09 19:08) [217]

Юрий Зотов ©   (09.04.04 18:39) [213]
Да не в свойстве дело. Дело в перевкрытии отрисовки ячейки. Вызывать инхеритед в любом случае нужно, но... Если DefaultDrawing равно тру, то предок отрисует текст ячейки по-своему, иначе оставит без изменений. Так вот, можно сделать так. Пусть предок отрисует это по-своему, мы в наследнике все шо он нарисовал затрем FillRect"om и нарисуем заново. Но зачем? Поэтому я и нашел лазейку.
Нуждно на время вызова инхеритед DefaultDrawing отключить, а потом возобновить прежнее состояние.

Конечно, по-хорошему нужно было наследоваться от TDrawGrid"a и производить манипуляции, но из-за пару-тройки небольших изменений... Не считаю это целесообразным.

Надеюсь так понятно, но суть точно уловил nikkie.


 
pasha_golub ©   (2004-04-09 19:08) [217]

Юрий Зотов ©   (09.04.04 18:39) [213]
Да не в свойстве дело. Дело в перевкрытии отрисовки ячейки. Вызывать инхеритед в любом случае нужно, но... Если DefaultDrawing равно тру, то предок отрисует текст ячейки по-своему, иначе оставит без изменений. Так вот, можно сделать так. Пусть предок отрисует это по-своему, мы в наследнике все шо он нарисовал затрем FillRect"om и нарисуем заново. Но зачем? Поэтому я и нашел лазейку.
Нуждно на время вызова инхеритед DefaultDrawing отключить, а потом возобновить прежнее состояние.

Конечно, по-хорошему нужно было наследоваться от TDrawGrid"a и производить манипуляции, но из-за пару-тройки небольших изменений... Не считаю это целесообразным.

Надеюсь так понятно, но суть точно уловил nikkie.


 
Yozh_Programmer ©   (2004-04-09 19:08) [218]

Ой чувствую мне попадет :(((((((


 
Yozh_Programmer ©   (2004-04-09 19:08) [218]

Ой чувствую мне попадет :(((((((


 
Юрий Зотов ©   (2004-04-09 19:08) [219]

> Style ©   (09.04.04 18:00) [207]
> т.е. OldVal := False; // Kill warning
> такого рода "заглушки" не стоит использовать???

Ну почему уж так вот строго - не стоит, да и все? Иногда стоит, иногда не стоит - конкретно по ситуации надо смотреть.

Понимате, компилятор Delphi настолько "умный", что, можно сказать, любой его варнинг (и даже хинт) безошибочно показывает какую-то кривизну кода (иногда - плохой стиль, мешающий ему построить оптимальный код, очень часто - место потенциальной ошибки). Поэтому ВСЕГДА и ОБЯЗАТЕЛЬНО стоит разобраться, почему появилось сообщение, докопаться до его "первопричины" - а потом устранять уже именно причину, а не следствие.

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


 
Юрий Зотов ©   (2004-04-09 19:08) [219]

> Style ©   (09.04.04 18:00) [207]
> т.е. OldVal := False; // Kill warning
> такого рода "заглушки" не стоит использовать???

Ну почему уж так вот строго - не стоит, да и все? Иногда стоит, иногда не стоит - конкретно по ситуации надо смотреть.

Понимате, компилятор Delphi настолько "умный", что, можно сказать, любой его варнинг (и даже хинт) безошибочно показывает какую-то кривизну кода (иногда - плохой стиль, мешающий ему построить оптимальный код, очень часто - место потенциальной ошибки). Поэтому ВСЕГДА и ОБЯЗАТЕЛЬНО стоит разобраться, почему появилось сообщение, докопаться до его "первопричины" - а потом устранять уже именно причину, а не следствие.

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


 
Style ©   (2004-04-09 19:13) [220]


> нормальная инициализация локальной переменной


ну я просто ее так назвал.. А вообще я всегда стараю сразу инициализировать переменные(естественно которые буду использовать) как вы думаете это правильно? Или может навредить?


 
Style ©   (2004-04-09 19:13) [220]


> нормальная инициализация локальной переменной


ну я просто ее так назвал.. А вообще я всегда стараю сразу инициализировать переменные(естественно которые буду использовать) как вы думаете это правильно? Или может навредить?


 
Игорь Шевченко ©   (2004-04-09 19:31) [221]


>а совершенно нормальная инициализация локальной переменной


Я в подобных случаях, если непонятно сразу, как переструктурировать код, ставлю комментарий.

OldVal := false; //Make compiler happy (TODO:)

И, Паша, еще совет, обзови ее по-другому, это переменную, например, SavedDefaultDrawing, самому потом понятнее будет, где, зачем и почему она используется.


 
Игорь Шевченко ©   (2004-04-09 19:31) [221]


>а совершенно нормальная инициализация локальной переменной


Я в подобных случаях, если непонятно сразу, как переструктурировать код, ставлю комментарий.

OldVal := false; //Make compiler happy (TODO:)

И, Паша, еще совет, обзови ее по-другому, это переменную, например, SavedDefaultDrawing, самому потом понятнее будет, где, зачем и почему она используется.


 
Юрий Зотов ©   (2004-04-09 19:38) [222]

> pasha_golub ©   (09.04.04 19:08) [217]

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

1. Вот ты пишешь: "Нужно на время вызова инхеритед DefaultDrawing отключить, а потом возобновить прежнее состояние". А скажи - ЗАЧЕМ восстанавливать прежнее состояние? На что оно вообще влияет? На отрисовку, больше ни на что. И какое оно там будет МЕЖДУ отрисовками - без разницы. А отрисовка у тебя СВОЯ, и она все рулит сама. Вот попробуй - убери восстановление прежнего состояния и проверь, будет ли работать точно также, если WordBreak=True, а DefaultDrawing всегда False, без всяких восстановлений.

2. Разве установка WordBreak в True не означает АВТОМАТИЧЕСКИ, что надо ставить DefaultDrawing в False (и наоборот?) Означает. Ну так и сделай, чтобы все происходило именно АВТОМАТИЧЕСКИ. Для взаимовлияющих свойств компонентов это не только нормальный и   общепринятый, но и даже, можно сказать, обязательный подход (посмотри, например, как работают связки ParentColor-Color, ParentShowHint-ShowHint и т.п.).

И когда ты на эти два вопроса ответишь - ты САМ придешь именно к тому решению, о котором я сразу и писал. Потому что вот как раз для КОМПОНЕНТА оно и есть самое простое и самое нормальное.


 
Юрий Зотов ©   (2004-04-09 19:38) [222]

> pasha_golub ©   (09.04.04 19:08) [217]

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

1. Вот ты пишешь: "Нужно на время вызова инхеритед DefaultDrawing отключить, а потом возобновить прежнее состояние". А скажи - ЗАЧЕМ восстанавливать прежнее состояние? На что оно вообще влияет? На отрисовку, больше ни на что. И какое оно там будет МЕЖДУ отрисовками - без разницы. А отрисовка у тебя СВОЯ, и она все рулит сама. Вот попробуй - убери восстановление прежнего состояния и проверь, будет ли работать точно также, если WordBreak=True, а DefaultDrawing всегда False, без всяких восстановлений.

2. Разве установка WordBreak в True не означает АВТОМАТИЧЕСКИ, что надо ставить DefaultDrawing в False (и наоборот?) Означает. Ну так и сделай, чтобы все происходило именно АВТОМАТИЧЕСКИ. Для взаимовлияющих свойств компонентов это не только нормальный и   общепринятый, но и даже, можно сказать, обязательный подход (посмотри, например, как работают связки ParentColor-Color, ParentShowHint-ShowHint и т.п.).

И когда ты на эти два вопроса ответишь - ты САМ придешь именно к тому решению, о котором я сразу и писал. Потому что вот как раз для КОМПОНЕНТА оно и есть самое простое и самое нормальное.


 
Юрий Зотов ©   (2004-04-09 19:53) [223]

> Style ©   (09.04.04 19:13) [220]

> я всегда стараю сразу инициализировать переменные(естественно
> которые буду использовать) как вы думаете это правильно? Или
> может навредить?

Навредить это может разве что в смысле ненужных операций. Вот смотрите сами:
MyVar := 0;
... // что-то, к MyVar не относящееся
if условие then MyVar := 1 else MyVar := 2;

Ну и какой был смысл в обнулении MyVar? Никакого (кстати, о чем компилятор и сообщит).

В других случаях следует помнить вот что:
- глобальные переменные и поля объектов инициализируются нулями автоматически;
- все длинные строки (даже и локальные) автоматически инициализируются пустой строкой;
- все динамические массивы (даже и локальные) автоматически инициализируются NIL"ом.
- прочие локальные переменные автоматически не инициализируются ничем и их надо инициализировать вручную.

Вот из этих правил и исходите.


 
Юрий Зотов ©   (2004-04-09 19:53) [223]

> Style ©   (09.04.04 19:13) [220]

> я всегда стараю сразу инициализировать переменные(естественно
> которые буду использовать) как вы думаете это правильно? Или
> может навредить?

Навредить это может разве что в смысле ненужных операций. Вот смотрите сами:
MyVar := 0;
... // что-то, к MyVar не относящееся
if условие then MyVar := 1 else MyVar := 2;

Ну и какой был смысл в обнулении MyVar? Никакого (кстати, о чем компилятор и сообщит).

В других случаях следует помнить вот что:
- глобальные переменные и поля объектов инициализируются нулями автоматически;
- все длинные строки (даже и локальные) автоматически инициализируются пустой строкой;
- все динамические массивы (даже и локальные) автоматически инициализируются NIL"ом.
- прочие локальные переменные автоматически не инициализируются ничем и их надо инициализировать вручную.

Вот из этих правил и исходите.


 
Style ©   (2004-04-10 00:51) [224]


> ... // что-то, к MyVar не относящееся


естественно если MyVar я не использую, значит я его и не инициализирую.

if условие then MyVar := 1 else MyVar := 2;

А здесь в принципе инициализация второй раз проходит поэтому
 MyVar := 0;
не нужен... - да и получится лишний ворнинг.


> Вот из этих правил и исходите.

значит инициализировать переменные один раз можно, и в некоторых случаях даже нужно.


 
Style ©   (2004-04-10 00:51) [224]


> ... // что-то, к MyVar не относящееся


естественно если MyVar я не использую, значит я его и не инициализирую.

if условие then MyVar := 1 else MyVar := 2;

А здесь в принципе инициализация второй раз проходит поэтому
 MyVar := 0;
не нужен... - да и получится лишний ворнинг.


> Вот из этих правил и исходите.

значит инициализировать переменные один раз можно, и в некоторых случаях даже нужно.


 
jack128 ©   (2004-04-10 01:08) [225]


> OldVal := False; // Kill warning
> такого рода "заглушки" не стоит использовать???

например (код не имеет смысла, это только иллюстрация)

function BoolToStr(b: boolean): string;
begin
 if b then result := "true"
 else result := "false"
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 b1,b: boolean;
 s: string;
begin
 b1 := InputQuery(""," ", s);
 if b1 then b := True;
 if not InputQuery("", "", s) then
   exit;
 if not b1 then b := false;
 ShowMessage(BoolToStr(b));
end; будет варнинг, что b может быть неинициализирована хотя это и не так.. Так что заглушки иногда нужны...


 
jack128 ©   (2004-04-10 01:08) [225]


> OldVal := False; // Kill warning
> такого рода "заглушки" не стоит использовать???

например (код не имеет смысла, это только иллюстрация)

function BoolToStr(b: boolean): string;
begin
 if b then result := "true"
 else result := "false"
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 b1,b: boolean;
 s: string;
begin
 b1 := InputQuery(""," ", s);
 if b1 then b := True;
 if not InputQuery("", "", s) then
   exit;
 if not b1 then b := false;
 ShowMessage(BoolToStr(b));
end; будет варнинг, что b может быть неинициализирована хотя это и не так.. Так что заглушки иногда нужны...


 
Юрий Зотов ©   (2004-04-10 08:12) [226]

> jack128 ©   (10.04.04 01:08) [225]

> код не имеет смысла, это только иллюстрация

> будет варнинг, что b может быть неинициализирована хотя это и
> не так..

И очень хорошо, что будет. Потому что, как и говорилось ранее, он сразу укажет на кривизну в коде, на которую стоит обратить внимание - и выяснить, что "код не имеет смысла".

> Так что заглушки иногда нужны.

Но только не в этом случае. А в ЭТОМ случае надо переписать код так, чтобы смысл у него все же появился.


 
Юрий Зотов ©   (2004-04-10 08:12) [226]

> jack128 ©   (10.04.04 01:08) [225]

> код не имеет смысла, это только иллюстрация

> будет варнинг, что b может быть неинициализирована хотя это и
> не так..

И очень хорошо, что будет. Потому что, как и говорилось ранее, он сразу укажет на кривизну в коде, на которую стоит обратить внимание - и выяснить, что "код не имеет смысла".

> Так что заглушки иногда нужны.

Но только не в этом случае. А в ЭТОМ случае надо переписать код так, чтобы смысл у него все же появился.


 
Anatoly Podgoretsky ©   (2004-04-10 08:59) [227]

Нехороший пример - бессмысленный и плохо написаный.
Скажи зачем это

if b1 then b := True;
if not b1 then b := false;

Почему не b := b1?
Зачем вообще первый IF?


 
Anatoly Podgoretsky ©   (2004-04-10 08:59) [227]

Нехороший пример - бессмысленный и плохо написаный.
Скажи зачем это

if b1 then b := True;
if not b1 then b := false;

Почему не b := b1?
Зачем вообще первый IF?


 
Soft ©   (2004-04-10 21:18) [228]

Думкин ©   (09.04.04 07:27) [184]
> Soft ©   (08.04.04 18:29) [182]
>Так что советую всем почитать "Смертельный марш"(если есть желающие
> могу выслать), который показывает реальные требования к
> программам.

А можно? Или положить в доступное место?

Эдвард Йордан. Смертельный марш (полное руководство для разработчика программного обеспечения по выживанию в безнадежных проектах), 1997. (222.736 Кб)
http://lib.prm.ru/search.phtml?text=%D1%EC%E5%F0%F2%E5%EB%FC%ED%FB%E9&type=0

http://stratum11.pstu.ac.ru/~leonid/base/dmarch.zip


 
Soft ©   (2004-04-10 21:18) [228]

Думкин ©   (09.04.04 07:27) [184]
> Soft ©   (08.04.04 18:29) [182]
>Так что советую всем почитать "Смертельный марш"(если есть желающие
> могу выслать), который показывает реальные требования к
> программам.

А можно? Или положить в доступное место?

Эдвард Йордан. Смертельный марш (полное руководство для разработчика программного обеспечения по выживанию в безнадежных проектах), 1997. (222.736 Кб)
http://lib.prm.ru/search.phtml?text=%D1%EC%E5%F0%F2%E5%EB%FC%ED%FB%E9&type=0

http://stratum11.pstu.ac.ru/~leonid/base/dmarch.zip


 
Игорь Шевченко ©   (2004-04-10 21:29) [229]

Soft ©   (10.04.04 21:18)

"Путь камикадзе" одноименного автора как-то коррелируется с этой ссылкой ?


 
Игорь Шевченко ©   (2004-04-10 21:29) [229]

Soft ©   (10.04.04 21:18)

"Путь камикадзе" одноименного автора как-то коррелируется с этой ссылкой ?


 
jack128 ©   (2004-04-10 22:00) [230]


> А в ЭТОМ случае надо переписать код так, чтобы смысл у него
> все же появился.
Хе..Тот код в катором я наткнулся на этот варнинг в конце концов был переписан под чистую, но я не уверен, что такая "переписка" всегда возможна/целесообразна


> Anatoly Podgoretsky ©   (10.04.04 08:59) [227]

b1 := InputQuery(""," ", s);
if b1 then
begin
 // Представь, что здесь некие вычисления  (КОД1), результатом которых будет b
end;
<КОД2: Здесь некий код который должен выполнятся всегда, так же запоминаются некоторые промежуточные результаты, нужные в КОДЕ3>
if not b1 then
begin
<КОД3 - результат этих вычислений - b>
end;


 
jack128 ©   (2004-04-10 22:00) [230]


> А в ЭТОМ случае надо переписать код так, чтобы смысл у него
> все же появился.
Хе..Тот код в катором я наткнулся на этот варнинг в конце концов был переписан под чистую, но я не уверен, что такая "переписка" всегда возможна/целесообразна


> Anatoly Podgoretsky ©   (10.04.04 08:59) [227]

b1 := InputQuery(""," ", s);
if b1 then
begin
 // Представь, что здесь некие вычисления  (КОД1), результатом которых будет b
end;
<КОД2: Здесь некий код который должен выполнятся всегда, так же запоминаются некоторые промежуточные результаты, нужные в КОДЕ3>
if not b1 then
begin
<КОД3 - результат этих вычислений - b>
end;


 
nikkie ©   (2004-04-10 22:13) [231]

>jack128
procedure WarningsMustDie;
 procedure Proc1;
 begin
   // Представь, что здесь некие вычисления  (КОД1),
   // результатом которых будет b
 end;

 procedure Proc2;
 begin
   // КОД2: Здесь некий код который должен выполнятся всегда,
   // так же запоминаются некоторые промежуточные результаты,
   // нужные в КОДЕ3
 end;

 procedure Proc3;
 begin
   // КОД3 - результат этих вычислений - b
 end;

begin
 b1 := InputQuery(""," ", s);
 if b1 then begin
   Proc1;
   Proc2;
 end else begin
   Proc2;
   Proc3;
 end;
end;


 
nikkie ©   (2004-04-10 22:13) [231]

>jack128
procedure WarningsMustDie;
 procedure Proc1;
 begin
   // Представь, что здесь некие вычисления  (КОД1),
   // результатом которых будет b
 end;

 procedure Proc2;
 begin
   // КОД2: Здесь некий код который должен выполнятся всегда,
   // так же запоминаются некоторые промежуточные результаты,
   // нужные в КОДЕ3
 end;

 procedure Proc3;
 begin
   // КОД3 - результат этих вычислений - b
 end;

begin
 b1 := InputQuery(""," ", s);
 if b1 then begin
   Proc1;
   Proc2;
 end else begin
   Proc2;
   Proc3;
 end;
end;


 
jack128 ©   (2004-04-10 22:28) [232]


> nikkie ©   (10.04.04 22:13) [231]

А теперь вопрос на засыпку, удаление варнингов - самоцель? Если выделять код в процедуры ТОЛЬКО для удаления варнинга, то мне легче будет заглушку поставить..


 
jack128 ©   (2004-04-10 22:28) [232]


> nikkie ©   (10.04.04 22:13) [231]

А теперь вопрос на засыпку, удаление варнингов - самоцель? Если выделять код в процедуры ТОЛЬКО для удаления варнинга, то мне легче будет заглушку поставить..


 
nikkie ©   (2004-04-10 22:33) [233]

>Если выделять код в процедуры ТОЛЬКО для удаления варнинга
по-моему, код становится более читаемым.

>удаление варнингов - самоцель?
по-моему выше уже объяснили. если за ними не следить, то в конце концов их список разрастается и отловить уже реально полезные варнинги невозможно.


 
nikkie ©   (2004-04-10 22:33) [233]

>Если выделять код в процедуры ТОЛЬКО для удаления варнинга
по-моему, код становится более читаемым.

>удаление варнингов - самоцель?
по-моему выше уже объяснили. если за ними не следить, то в конце концов их список разрастается и отловить уже реально полезные варнинги невозможно.


 
pasha_golub ©   (2004-04-11 14:21) [234]

Все прочитал, продолжим во вторник.

2Юрий Зотов
Наверное про свойства Вы правы. Но речь идет о примерах, которые могут появиться в связи с другими случаями. С уважением.


 
pasha_golub ©   (2004-04-11 14:21) [234]

Все прочитал, продолжим во вторник.

2Юрий Зотов
Наверное про свойства Вы правы. Но речь идет о примерах, которые могут появиться в связи с другими случаями. С уважением.


 
Soft ©   (2004-04-11 15:26) [235]

Насколько я понял, все кто говорит о красивом коде по типу личности более ЛСЭ (логико-сенсорный экстраверт) http://www.socionics.dp.ua/p_refer/type_15.htm

Соционика или типизация человеческой личности.
http://delphimaster.net/view/14-1081635133/


 
Soft ©   (2004-04-11 15:26) [235]

Насколько я понял, все кто говорит о красивом коде по типу личности более ЛСЭ (логико-сенсорный экстраверт) http://www.socionics.dp.ua/p_refer/type_15.htm

Соционика или типизация человеческой личности.
http://delphimaster.net/view/14-1081635133/


 
OlegGashev ©   (2004-04-20 00:26) [236]

По поводу чистоты кода. Для .NET есть хороший инструмент FxCop: http://www.gotdotnet.com/team/fxcop/ Жаль, что подобного нет для Delphi.


 
OlegGashev ©   (2004-04-20 00:26) [236]

По поводу чистоты кода. Для .NET есть хороший инструмент FxCop: http://www.gotdotnet.com/team/fxcop/ Жаль, что подобного нет для Delphi.



Страницы: 1 2 3 4 5 6 вся ветка

Текущий архив: 2004.04.11;
Скачать: CL | DM;

Наверх




Память: 2.8 MB
Время: 0.052 c
1-1082574987
ary
2004-04-21 23:16
2004.05.09
пирамидальный алгоритм


6-1079354227
aser
2004-03-15 15:37
2004.05.09
почта с Mail.ru - как ее получять/отправить по http по 80 порту


4-1079685128
ai
2004-03-19 11:32
2004.05.09
По какому событию можно отследить измение порядка видимых окон?


14-1082540864
VID
2004-04-21 13:47
2004.05.09
что за папка RECYCLER ?


3-1081771900
Lamer2
2004-04-12 16:11
2004.05.09
Запрос





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский