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

Вниз

Как подавить реакцию TTreeView на двойной клик?   Найти похожие ветки 

 
Инс ©   (2007-07-05 23:04) [40]


> Плагины - пример неприменимости твоих подходов


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


 
GeoJ   (2007-07-06 12:50) [41]

> <...> восторги Geo, которому понравилось решение <...>
Господа! Мир -- вообще тесен. А интернет -- особенно. Так что лучше все же быть поаккуратнее с высказываниями относитель но конкретных людей: они могут это увидеть. Это я к тому, что хоть убей, не помню своих сообщений с восторгами, так как эйфория прошла достаточно давно, когда этот способ только был придуман.

Было всего лишь конструктивное обсуждение возможностей еприменения данного способа. Именно поэтому Инс привел ссылки. Чтобы народ не повторялся в обсуждении.

>>> Из противников - Антоха Григорьев
Если Вы читали внимательно, то должны были заметить, что неприятие у Антона всего лишь на эстетическом уровне (ну, не нравится). То есть, если понимаешь что, как, зачем и почему, то использование данного метода вполне допустимо и влечет за собой не больше опасностей, чем цикло for-to-do.

>>> TTreeView - это TTreeView и никак иначе
Вообще-то, по ООП TTreeView так и останется TTreeView. Только отдельные строчки будут красного цвета ;-)

И еще... Система разработки состоит не только из среды визуального проектирования, но и и из кода на языке программирования. Я Вам навскидку могу привести несколько устоявшихся общепризнанных приемов программирования, которые грешат тем же самым: трудностью понимания того, о чем именно идет речь. Но все пользуются и не жужжат.


 
_MaSteR_NN_   (2007-07-06 13:27) [42]

Да уж, мир тесен :)


 
MetalFan ©   (2007-07-06 14:53) [43]

я тоже считаю, что так объявлять не совсем корректно
TTreeView = class(ComCtrls.TTreeView)
лучше, имхо, хотябы так:
{THack|TMy|TSpec|etc}TreeView = class(ComCtrls.TTreeView)
а если другой человек будет читать код, и случайно не заметит описание одноименного со стандартным класса?
и уж тем более не стоит рекомендовать писать так новичку. дурной тон.
жаль тут нельзя голосование устроить))))


 
Инс ©   (2007-07-06 15:19) [44]


> лучше, имхо, хотябы так:

Вы не просекли фишки. Так как Вы предлагаете написать - безусловно правильно, но фишки не будет. Тут же прикол в чем? В том, что среда "думает", что используется класс с палитры, а мы его подменяем своим, и в рантайм именно наш и будет создан. Если написать другое имя, отличное от имени предка, то придется либо регистрировать его в палитре, либо создавать в рантайм.


 
MetalFan ©   (2007-07-09 00:27) [45]


> Вы не просекли фишки

точно, не просек)
но все равно интуитивно мне такой подход не нравится)))


 
Ega23 ©   (2007-07-09 11:49) [46]

Да делайте так, как считаете нужным. Хоть goto используйте (сам часто использую, правда в TSQL).
Только метод-то всё равно варварский.


 
GeoJ   (2007-07-09 18:29) [47]

Профессионально занеимаюсь программированием с 1991 года. И на всех ОС на всех языках программирования всегда присутствовали приемы, которые всеми расценивались как "плохие", но, тем не менее, использовались. С кучей оговорок, требований к аккуратности использования и рекомендациями не трогать без необходимости. Потому что давали определенные преимущества, которых нельзя было достичь законными средствами.

Если мне в рамках данного конкретного проекта требуется создать модифицированный ListBox, я сдлеаю производный класс, а не буду обвешивать многочисленными обработчиками событий стандартный TListBox. Только для того, чтобы отделить поведение списка от логики самой программы. И я не буду создавать этот ListBox в run-time, если на форме много компонент и их взаимное расположение, возможно, будет изменяться в процессе работы над проектом. И уж наверняка не буду регистрировать чуть-чуть модифицированный компонент в VCL (там и так куча лишнего), если он не потребуется для других проектов.

Впрочем, если CodeGear добавит в IDE новую возможность (что-то типа дополнительной панели для классов, определенных в текущем проекте), то безо всякого огорчения откажусь от использования данного приема.


 
Ega23 ©   (2007-07-09 18:57) [48]


> И я не буду создавать этот ListBox в run-time, если на форме
> много компонент и их взаимное расположение, возможно, будет
> изменяться в процессе работы над проектом.


Parent := ListBoxPanel;
Align := alClient;

?


 
{RASkov} ©   (2007-07-10 09:43) [49]

> [48] Ega23 ©   (09.07.07 18:57)
> Parent := ListBoxPanel;
> Align := alClient;

Ресурсоемко получается :) Два хэндла и оба получают сообщения.... только первому они практически не нужны...(
Олег, неужели ты всегда(во всех своих проектах) так(как советуешь) делаешь? И не разу не пользовал метод "подмены"... не верю :)
Хотя согласен - делать - это одно, а советовать такое - это другое.


> [47] GeoJ   (09.07.07 18:29)
> Впрочем, если CodeGear добавит в IDE новую возможность (что-
> то типа дополнительной панели для классов, определенных
> в текущем проекте)

Интересная идея... :)


 
MetalFan ©   (2007-07-10 09:52) [50]


> Ресурсоемко получается :) Два хэндла и оба получают сообщения.
> ...

прям таки ресурсоемко? одним хэндлом больше, одним меньше. зато не надо изврат с одноименными классами без нужды использовать


 
Ega23 ©   (2007-07-10 10:04) [51]


> Ресурсоемко получается :) Два хэндла и оба получают сообщения.
> ... только первому они практически не нужны...(
> Олег, неужели ты всегда(во всех своих проектах) так(как
> советуешь) делаешь? И не разу не пользовал метод "подмены".
> .. не верю :)


Если уж настолько сильно приспичивает до какого-нибудь Canvas достучаться, который в protected сидит, то либо нследуюсь от TCustom... либо от реального класса. Но это - крайне редко.

Если честно, то у меня редко какой грид (TreeView, Memo и пр.) не лежит на панели. Процентах в 70 - точно.
Подмену - нет, не делаю. Как правило, хватает стандартных компонентов с обработчиками.
Чатос приходится использовать TEdit, но такой, чтобы только цифры можно печатать было. Но даже для него просто пишу метод формы и назначаю сразу куче Edit"ов в качестве обработчика.

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


 
{RASkov} ©   (2007-07-10 10:07) [52]

> [50] MetalFan ©   (10.07.07 09:52)
> зато не надо изврат с одноименными классами без нужды использовать

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

Это я не про ресурсоемкость, а вобще по спору :)

> прям таки ресурсоемко? одним хэндлом больше, одним меньше

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


 
GeoJ   (2007-07-10 10:23) [53]


> Parent := ListBoxPanel;
> Align := alClient;
> ?

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

Ну и раздражает меня обработчикм FormCreate, в котором сплошные кпиейты и инициализация.


> Как правило, хватает стандартных компонентов с обработчиками.

Везет! Что я могу еще сказать ;-)

Реальный проект. В разных местах должны быть размещены дбгриды со специфическими запросами для представления древовидных структур (что-то типа панели Нортон Командера). Можно, конечно, в каждом модуле обвесить каждый дбгрид обработчикамивсяких событий. Но за всем этим хламом теряется основная логика модуля. Так почему не включить это все в компонент и не вынести в отдельный модуль? Мы же с ООП работаем, а не с Фортраном.


> Но начинающим я бы такое советовать не стал

Вот тут, наверное, почти согласен. Советовать то можно (новичкам тоже нужно расти), но не ограничиваться тупым приведением кода, а дать развернутый ответ с объяснением того, что это искусственный прием обусловенный тем-то и тем-то.


 
Ega23 ©   (2007-07-10 10:25) [54]


> В разных местах должны быть размещены дбгриды со специфическими
> запросами для представления древовидных структур (что-то
> типа панели Нортон Командера). Можно, конечно, в каждом
> модуле обвесить каждый дбгрид обработчикамивсяких событий.
>  Но за всем этим хламом теряется основная логика модуля.
>  Так почему не включить это все в компонент и не вынести
> в отдельный модуль?


Ну так и надо делать, кто спорит-то?
Но вот взять и стандартный DBGrid таким подменить - это ужасно.


 
Инс ©   (2007-07-10 10:37) [55]

Ладно, господа, может завязываем? ;-) А то повторяться уже начали. Обсуждение получилось, есть два взгляда, каждый - обоснован, споряшие стороны что-то из обсуждения вынесут, да и читателям есть пища для ума. Хотя, допускаю, что мой уважаемый тезка (GeoJ) включился в дискуссию чуть позже и ему еще есть что добавить...


 
GeoJ   (2007-07-10 11:25) [56]


> Но вот взять и стандартный DBGrid таким подменить - это ужасно.

Алтернативы? Лезть на Torry и искать компонент, в котором данная функциональность уже реализована? Либо писать компонент самому. И в том, и в другом случае потребуется добавлять новый компонент в палитру. Пардон, но у меня куча мелких проектов, и если я для каждого проекта буду необходимые компоненты регистрировать в палитре (хотя нужны они только на один раз), то будет вообще полная каша.

Там, где омсобо мудрить с дизайном не надо, я добавляю компоненты в run-time. но если дизайно формы сложный, то, извините, но я буду продолжать пользоваться этим приемом. Тем более, что особых проблем в будущем он вызвать не должен.


 
Инс ©   (2007-09-06 10:31) [57]

Кстати, нашелся еще один аргумент "за" ;-)

> Знаешь, если я вижу переменную btn : TButton, то я буду
> УВЕРЕН, что это именно стандартный TButton. Со всеми его
> методами, свойствами и событиями.

В последних версиях компилятора теперь этот обман можно делать вполне легально - class helper.


 
Ega23 ©   (2007-09-06 10:38) [58]


> В последних версиях компилятора теперь этот обман можно
> делать вполне легально - class helper.


У меня Delphi 7 и когда поменяется - только Ктулху знает...  :)))


 
Инс ©   (2007-09-06 10:46) [59]


> У меня Delphi 7 и когда поменяется - только Ктулху знает.
> ..  :)))

Дык у меня тоже ;)


 
Lacmus ©   (2007-09-06 11:55) [60]

> Противники использования Инс ©   (05.07.07 13:29) [3]

Как вы относитесь к использованию пакетов в своих приложениях ?


 
Инс ©   (2007-09-06 12:18) [61]


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

Это ко мне вопрос? Никак не отношусь, я их не использую, а что? :)


 
Инс ©   (2007-09-06 12:20) [62]


> Противники использования Инс ©

Это вы представились, или это к ним обращение? :)


 
Lacmus ©   (2007-09-06 12:30) [63]

Как все сложно :-)

Вопрос к противникам использования, публикации кода, описанного в Инс ©   (05.07.07 13:29) [3]


 
Shirson ©   (2007-09-06 22:53) [64]


> Ega23 ©   (05.07.07 16:29) [19]
> З.Ы. ВОГ-17 можно использовать как ручную гранату контактного действия. > Надо всего лишь перед броском об что-нибудь твёрдое её ударить, чтобы на боевой взвод встала.
> Прямых запретов нигде нет. Однако почему-то её таким образом крайне редко используют. Вот интересно, а почему?
>


Не флейма ради, а истины для.

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

Пример неудачен, потому что его применение заканчивается проблемами в десятки раз чаще, чем наоборот. А с предметом спора ситуация обратная - проблемы могут возникнуть лишь в некоторых, специфических условиях, да ещё и не у всех :)


 
Германн ©   (2007-09-07 01:12) [65]


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

Использовал один раз, очень давно. Флешек тогда не было, а программу доделанную, исправленную, измененную и т.п. приходилось возить с собой на объект. На 3.5" влазила. :-)

Но я не противник и не сторонник :-)


 
Германн ©   (2007-09-07 02:10) [66]


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

Совпадение или нет, вам судить. От нечего делать, чистил свои закладки, избранные и т.п.
Наткнулся на:
"О пакетах времени выполнения:

стр. 535:
   "Пакеты (packages) - это специальные динамически подсоединяемые биб- лиотеки, содержащие библиотеки визуальных компонентов и другие объекты, функции, процедуры и т.д. Эти DLL позволяют вам создавать очеь небольшие выполняемые мо- дули, обращающиеся за поддержкой к пакетам. Вы можете также скомпилировать в пакеты свои собственные компоненты и библиотеки. Файлы пакетов имеют расши- рение .dpl"
стр. 536:
   "Так что если вы надумали использовать поддержку пакетов времени вы- полнения, то вместе со своим приложением вы должны поставлять пользователю скомпилированные файлы эих пакетов - файлы .dcp"
стр. 538:
   "При разработке приложений с поддержкой пакетов надо иметь в виду, что пакеты используют API Windows, содержащийся в различных DLL. Если какая-то из этих DLL у потребителя вашего программного продукта ошибочна или не соответст- вует по дате(версии), у вас могут возникуть проблемы. Их можно избежать, если проверять свое приложение на той системе, для которой оно предназначено, или на чистых установках Windows; тогда сможете быть уверенными, что оно будет выполняться без ошибок, и будете знать, что требуется вашему приложению для нормальной работы. В результате вы сможете убедиться, что включаете в поставку все необходимые файлы, или можете потребовать от пользователя работать на определенной версии операционной системы с определенными установками путей и.т.д."
".
:)))


 
Инс ©   (2007-09-07 10:21) [67]


> Германн ©   (07.09.07 02:10) [66]

Это же из Архангельского? Точнее из статьи, про то, как его любят. Угадал?


 
GrayFace ©   (2007-09-07 14:15) [68]

Инс ©   (05.07.07 14:18) [5]
А здря. Иногда, если нужно лишь слегка изменить функциональность компонента, нет смысла регистрировать его в палитре (у меня практически в каждом проекте такое требуется) - иначе палитра превратиться в свалку компонентов, которые нужны только в одном проекте. Создавать в рантайм - неудобно. А такой "обман среды" - ИМХО изящен и безопасен, впрочем, каждый сам решает для себя.


Для этого достаточно сделать лишь один экземпляр каждого контрола со всеми нужными событиями: OnWndProc, OnCreateParams и т.п. (я как-раз так делаю, по мере надобности создавая свои наследники стандартных контролов)
В случае TTreeView=class(ComCtrls.TTreeView) можно было бы не обращать внимание на неочевидность, он еще и пораждает глюки. [u]У меня из-за него был AV.[/u] AV был в странном месте, но после замены извращений на компонент палитры все прекратилось. Это было в первой же программе, где я попытался такое использовать. Да и новосозданный TTreeView может повлиять на TTreeView в других формах, которые ожидают обычного TTreeView.

> И я не буду создавать этот ListBox в run-time, если на форме
> много компонент и их взаимное расположение, возможно, будет
> изменяться в процессе работы над проектом.


А и не надо:
with TMemoryStream.Create do
 try
   WriteComponent(TreeView1);
   TreeView1.Free;
   TreeView1:= TMyTreeView.Create(self);
   TreeView1.Parent:= self;
   ReadComponent(TreeView1);
 finally
   Free;
 end;

Писал на ходу, так что за работосособность не ручаюсь, но суть должна быть понятна.


 
Инс ©   (2007-09-07 14:35) [69]


> В случае TTreeView=class(ComCtrls.TTreeView) можно было
> бы не обращать внимание на неочевидность, он еще и пораждает
> глюки. [u]У меня из-за него был AV.[/u] AV был в странном
> месте, но после замены извращений на компонент палитры все
> прекратилось.

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

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

Если его объявить непосредственно в модуле с формой - то ну никак не может! :) Если объявить в другом модуле, то это зависит от того, в каком месте ссылка на этот модуль будет в списке uses. Опять таки, зная порядок, по которым IDE ищет юниты - допустить связанную с этим ошибку невозможно.

> А и не надо:

Ну вот. Опять пришли к тому, от чего хотели избавится: замусоривание кода фрагментами, не решающие задачу непосредственно, а занимающиеся управлением графическим интерфейсом.


 
Инс ©   (2007-09-07 14:38) [70]


> Если его объявить непосредственно в модуле с формой - то
> ну никак не может! :)

Разве что, если вы в интерфейсной части юнита с формой B сошлетесь на юнит, в котором находится форма A, что само по себе не рекомендуется.


 
GeoJ   (2007-09-07 15:17) [71]


> [u]У меня из-за него был AV.[/u] AV был в странном месте,
>  но после замены извращений на компонент палитры все прекратилось

А у меня есть куча примеров возникновения AV без этого приема, а также куча примеров использования этого приема без появления AV. И что?

А о том, что незнание и/или непонимание зачастую приводит к ошибкам, я и не спорил ;-)


 
Юрий Зотов ©   (2007-09-07 15:21) [72]

> Инс ©   (05.07.07 22:05) [35]

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


Ключевое слово - аккуратного. Это означает, что как только кто-либо из команды допустит неаккуратность (по незнанию данной фичи или забыв о ней) - программа запросто может рухнуть. Это раз.

В силу природы данной фичи найти ошибку может быть совсем непросто, поскольку отладчик всюду будет показывать верное имя класса и останется только гадать, какой же класс в данной точке кода реально используется. В частности, этот реально используемый класс будет зависеть от порядка следования имен модулей в uses (!!!) - и такую "ошибку" можно ловить очень и очень долго. Это два.

Наконец, найдя "ошибку", даже нельзя будет спросить с допустившего ее. Потому что он совершенно справедливо ответит, что никакой ошибки не делал, что если в программе написано TTreeView, то это должно быть  именно TTreeView, а не что-то там другое, и что спрашивать надо не с него, а с того, кто ВВЕЛ эту неоднозначность. Это три.

==============

В "рамках аккуратного использования" можно курить, сидя на бочке с порохом и ничего не случится. Но стоит ли?

Если Вам это занятие нравится - дело Ваше. Но я бы не стал.


 
Инс ©   (2007-09-07 15:36) [73]

О! Противник пустил в ход тяжелую артиллерию! :)


> Юрий Зотов ©   (07.09.07 15:21) [72]


Все ваши "раз", "два" и "три" имеют место быть, однако они все построены на одном предположении: работа над большим проектом в команде. Это безусловно широкий круг, однако есть случаи, которые в него не включены. Можно привести ограничения, в рамках которых использование данного механизма безопасно - останется достаточно большой круг задач, не противоречащий этим ограничениям. В силу этого, прием имеет право на существование. Следовательно совет "я бы не стал" становится слишком категоричным, нужно смотреть на ситуацию.


 
Юрий Зотов ©   (2007-09-07 15:45) [74]

> Инс ©   (07.09.07 15:36) [73]

> они все построены на одном предположении: работа над большим
> проектом в команде.

Нет.

Один человек сделал маленький проект и сдал его заказчику. Через год заказчик попросил что-то изменить/добавить/убавить. Человек изменил/добавил/убавил - а программа вдруг перестала работать.

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


 
Инс ©   (2007-09-07 15:46) [75]

Плюс ко всему, повторюсь, что введение Borland-om механизма class helper, который позволяет вполне легально вносить изменения в документированные стандартные классы, рассматриваю как индульгенцию на использование данного механизма в старых версиях Delphi.


 
Инс ©   (2007-09-07 15:49) [76]


> Юрий Зотов ©   (07.09.07 15:45) [74]

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


 
Юрий Зотов ©   (2007-09-07 16:06) [77]

> Инс ©   (07.09.07 15:49) [76]

> Если человек не помнит логики работы своей программы, то он внесет
> ошибку и без использования сего трюка.

Может. Но зачем же увеличивать вероятность ошибки? Зачем заставлять самого себя помнить об этом трюке?

Такие трюки - это бомба замедленного действия, которую человек закладывает сам под себя. Зачем?

Только ради того, чтобы не регистрировать в палитре лишний компонент? А стоит ли овчинка выделки?

Человек переходит оживленную транспортную магистраль НАД подземным переходом. Ему просто лень сначала спускаться, а потом подниматься по лестнице.

Можно? Запросто. При "умелом и аккуратном использовании". Но существует немалая вероятность того, что рано или поздно такой человек свой КАМаз все же встретит.

Зачем?


 
GrayFace ©   (2007-09-07 16:15) [78]

Инс ©   (07.09.07 14:35) [69]
> А и не надо:
Ну вот. Опять пришли к тому, от чего хотели избавится: замусоривание кода фрагментами, не решающие задачу непосредственно, а занимающиеся управлением графическим интерфейсом.


Где замусоревание? Одна функция + несколько вызовов ее в FormCreate - замусоривание?

Инс ©   (07.09.07 14:35) [69]
> В случае TTreeView=class(ComCtrls.TTreeView) можно было
> бы не обращать внимание на неочевидность, он еще и пораждает
> глюки. [u]У меня из-за него был AV.[/u] AV был в странном
> месте, но после замены извращений на компонент палитры все
> прекратилось.

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


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

На остальное отвечу, когда потестирую дома.


 
Инс ©   (2007-09-07 16:20) [79]


> Только ради того, чтобы не регистрировать в палитре лишний
> компонент?

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


 
Инс ©   (2007-09-07 16:23) [80]


> Где замусоревание? Одна функция + несколько вызовов ее в
> FormCreate - замусоривание?

Конечно. А где одна - там и две. А где две - там и куча.


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

А я встречал. И даже не одного.



Страницы: 1 2 3 вся ветка

Текущий архив: 2007.12.02;
Скачать: CL | DM;

Наверх




Память: 0.68 MB
Время: 0.025 c
2-1194430383
allucard
2007-11-07 13:13
2007.12.02
Помогите по компоненту TComPort


3-1185611898
pohil
2007-07-28 12:38
2007.12.02
Формат даты


2-1194606611
DontFire
2007-11-09 14:10
2007.12.02
Как вставить сепаратор в mainmenu?


2-1194350776
Shade
2007-11-06 15:06
2007.12.02
record s...подкиньте умную мысль...


15-1193244749
vasIZmax
2007-10-24 20:52
2007.12.02
Что это было?