Лучшие публикации - популярное

  1. Установка Delphi 7 в Windows 7. Эта статья рассказывает как устанавливать Delphi 7 на Windows 7. В принципе, эта же информация должна быть применима для всех Delphi версий с 4 до 7 (включительно). Я устанавливал Delphi 7.1 (7.0 с SP 1) Enterprise на русскоязычную 64-х битную Windows 7.
  2. Access Violation в деталях. Исключение класса EAccessViolation - это самое частое исключение в Delphi-программах. Я хотел бы рассмотреть, что это такое, когда возникает, и как с ним бороться. Этот пост скорее для начинающих, поэтому данные могут излагаться с упрощением.
  3. Работа с указателями. Указатели, вероятно, являются самыми плохо понимаемыми и страшными типами данных. Поэтому много программистов пытаются их избегать. Но указатели очень важны. Даже в языках, которые явно не поддерживают указатели, или в которых использование указателей затруднено, указатели являются важными факторами "под капотом" языка. Я считаю, что для программиста понимание указателей является весьма важной вещью. Существует несколько подходов к пониманию указателей. Эта статья была написана для тех, у кого есть проблемы с пониманием или использованием указателей. Она демонстрирует мою точку зрения на указатели в Delphi для Win32. Может быть, это не будет абсолютно точно во всех аспектах (например, память программы не является одним большим монолитным блоком), но этого более чем достаточно для практических целей. По-моему, таким образом указатели будет проще понять.
  4. Как стать (Delphi) программистом. Ещё один пост по мотивам задаваемых мне вопросов. Я не знаю, почему об этом спрашивают меня, но раз уж спрашивают - проще написать один раз пост и тыркать в него ссылкой.
  5. Ищем утечки памяти. Прежде чем приступить к продолжению описания других способов ловли "плохих" указателей, я хотел бы поговорить об утечках памяти и о механизмах их диагностики. Как мы увидим в дальнейшем, эта тема будет очень близко связана с нашим предыдущим разговором.
  6. Как настроить Delphi 2010, чтобы она выглядела как Delphi 7. Я не собираюсь обсуждать, какой интерфейс лучше - умалчиваемый в Delphi 2010 или old-school Delphi 7 (лично я предпочитаю новый), но я хочу показать, как вы можете настроить Delphi 2010 так, чтобы она выглядела и "чувствовалась" как Delphi 7.
  7. Как использовать справку в программах Delphi. В этом посте я попробую в подробностях разобрать подключение справки к вашим Delphi программам. Здесь не будет рассматриваться, как создаются сами файлы справки (тем не менее, в конце я дам ссылки на программы и описание).
  8. Настройки проектов в Delphi с точки зрения поиска ошибок. Сегодня я хочу рассмотреть различные настройки проектов Delphi, которые могут влиять на отладку приложений.
  9. PChars: сами строки не включены. В общедоступных newsgroup-ах на сервере Embarcadero я часто вижу, что по-прежнему есть много проблем с пониманием как типа PChar, так и типа String. В этой статье я хотел бы обсудить общие моменты и различия между обоими типами, а также вещи, которые вы можете и которые вы не должны делать с ними.
  10. Установка Delphi 7/2006 на Windows Vista. UAC усиливает защиту против вирусов и spyware, но иногда надоедает, когда дело касается приложений, которым можно доверять. Например, запись в папку Program Files по-умолчанию запрещена - мы увидим это, когда будем запускать Delphi на Vista.
  11. Эволюция Delphi: современные возможности. Среда Delphi не стоит на месте. Каждый год выходит новая версия Delphi с новыми возможностями. Компании Borland (Inprise) и Embarcadero всегда стремились сохранять в своих продуктах высокий уровень обратной совместимости, поэтому каждая новая версия Delphi способна почти без проблем компилировать старый код. Тем не менее, некоторые существующие возможности могут не существовать в новом мире и окружении или вести себя иначе. В этой статье я попробую сделать небольшой обзор современных тенденций развития языка Delphi и изменений в нём. В целом, статья будет сконцентрирована на новейших измененияx в архитектуре Delphi, доступные в XE4.
  12. Архитектура памяти в Windows: мифы и легенды (spin-off). Этот пост - несколько необычное ответвление (spin-off) предыдущего. Слова "звучит как сюжет для разрушителей легенд" из него, сказанные случайно, красного словца ради, сильно запали мне в голову, и я решил, что было бы неплохо самому "разрушить" несколько таких мифов. И вот появился этот пост - возможно, недостаточно точный технически, но рассказывающий различные факты о памяти в, как я надеюсь, занимательной форме.
  13. Работа с текстовыми файлами в любой кодировке из Delphi до 2009. Как должно быть известно любому программисту, не существует такой вещи как "просто текстовый файл". Если вы не знаете, в какой кодировке хранится строка, вы не только не сможете её показать, но даже определить, где она заканчивается. Мир вокруг нас уже давно не ограничивается ANSI, а уж тем более ASCII. На фоне этого ваши древние ANSI-программы выглядят не очень-то хорошо. Потому что они молчаливо игнорируют существование альтернативных кодировок вообще. Для них существует только текущая кодовая страница ANSI, не больше и не меньше.
  14. Локализация проектов Delphi - родной способ (ITE - Integrated Translation Environment). Как ни странно, в интернете полно рассказов про сторонние приложения для локализации ваших проектов, есть сравнительные обзоры разных утилит, но нет практически ничего про родной механизм Delphi для локализации. Более того, когда на форумах кто-то спрашивает, как ему лучше добавить в программу поддержку нескольких языков, ему советуют что угодно, но только не родной механизм Delphi. Видимо, второе является следствием из первого. Хотя ITE был в Delphi... аж с Delphi 5. Ещё один пример проблемы Copy&Paste? Когда решение из лохматых середины 90-х кочует аж до 2010-го? Кто знает.
  15. DLL, DLL Hell, перенаправление DLL, Side-by-Side сборки и манифесты... Наверняка почти все из читателей когда-нибудь создавали в Delphi DLL. И если вы делали это достаточно много и регулярно, то наверняка знакомы с понятием DLL Hell. Первоначально предполагалось, что введение DLL позволит эффективно организовать память и дисковое пространство, используя только один экземпляр библиотечного модуля для различных приложений. Это было особенно важно для ранних версий Microsoft Windows с жёсткими ограничениями по памяти. Далее, предполагалось улучшить эффективность разработок и использования системных средств за счёт модульности. Замена DLL-программ с одной версии на другую должна была позволить независимо наращивать систему, не затрагивая приложений. Кроме того, библиотеки DLL могли использоваться разнотипными приложениями — например, Microsoft Office, Microsoft Visual Studio и т.п. В дальнейшем идея модульности выросла в концепцию COM. Фактически, полных преимуществ от внедрения DLL получить не удалось именно по причине DLL Hell.
  16. Разработка системы плагинов в Delphi. Эта статья - продолжение старой серии. Напомню, что те статьи, несмотря на некоторый практический выхлоп в конце, всё же не очень-то освещали тему плагинов, а представляли собой копание во внутренностях работы DLL и пакетов Delphi. Было решено эту серию закончить - именно как серию о плагинах.
  17. Что плохого в глобальных переменных? Переменные в программе бывают локальными (это когда они объявлены в "чём-то": процедура, метод, объект и т.п.) и глобальными (это когда они объявлены в самой программе, модуле - на самом верхнем уровне без вложения во "что-то"). Параметры процедур, функций и методов также относятся к локальным переменным. Что лучше использовать? Стандартный совет при использовании глобальных переменных: держитесь от них подальше, используя их только тогда, когда без них не обойтись.
  18. Сериализация - потоки данных. Это второй пост в серии постов про сериализацию. В этой части мы рассмотрим потоки данных.
  19. Адресное пространство под микроскопом. Продолжаем тему про память в программах Delphi.
  20. Почему вам (никогда) не следует использовать ShellExecute и WinExec. В Интернете полно примеров кода, которые используют функцию ShellExecute (реже - функцию WinExec). Однако, суровая правда состоит в том, что вам никогда не нужно использовать эти функции.
  21. Преодолевая пределы Windows: физическая память. Это первый пост в блоге из серии "Pushing the Limits of Windows", которую я буду писать ближайшие месяцы и в которой буду описывать как Windows и приложения используют конкретный ресурс, лицензионные и реализационные ограничения ресурса, как измерить использование ресурса и как диагностировать его утечки. Чтобы эффективно управлять своими Windows системами вам нужно понимать как Windows управляет физическими ресурсами, такими как процессоры (CPUs) и память (memory), а также логическими ресурсами, такими как виртуальная память (virtual memory), дескрипторы (handles) и объекты оконного менеджера (window manager objects). Знание пределов и ограничений этих ресурсов и методы слежения за ними позволит вам соотносить использование ресурсов с приложениями, которые их используют, эффективно изменять систему для определённой нагрузки и идентифицировать приложения с утечкой ресурсов.
  22. 97 вещей, которые должен знать каждый программист. Добро пожаловать на главную страницу проекта 97 вещей, которые должен знать каждый программист, жемчужины мудрости для программистов, собранные от ведущих практиков.
  23. Как писать понятный код - руководство для учащихся. Когда в школе или университете вам преподают язык программирования, вам рассказывают об инструментах ("сегодня мы проходим циклы и условные выражения", "завтра мы будем изучать функции", "текст между { и } называется комментарием и игнорируется компилятором"), но обычно ничего не говорят про то, как (и когда, и зачем) их использовать. В результате студент обычно берёт в руки отвёртку и начинает заворачивать ей шурупы, забивать гвозди и сверлить дырки (угх!). При этом получается программа, которая содержит весь свой код в одной процедуре. Иногда эта единственная процедура может занимать десятки страниц. Добавьте сюда отсутствие форматирования, комментариев и вразумительных имён - и вы получите рождение нового монстра. Этот пост - попытка рассказать, что можно сделать с такой ситуацией.
  24. Основы оптимизации прикладных программ на Delphi. Оптимизация программы - это один из этапов её разработки, заключающийся в модификации кода для улучшения его эффективности по какому-либо параметру или набору параметров (скорости выполнения, количеству потребляемых ресурсов и т.п.). Некоторые программисты обращаются к ней только при необходимости (например, медленная работа), другие проводят упреждающую оптимизацию. Эта статья служит введением в оптимизацию прикладных программ на Delphi.
  25. Virus.Win32.Induc.a: энцать дней спустя (FAQ). Итак, прошло почти две недели. Решил в один пост собрать резюме последних новостей.
  26. Ищем утечки памяти, redux. В этот пост я попытался собрать всё, что не было сказано в первой части.
  27. Создаём систему плагинов, часть 1. Эта серия не была закончена. То, что было написано, говорит скорее не про плагины вообще, а представляет собой глубокий "заныр" в детали DLL и BPL.
  28. Менеджеры памяти в программах. Почти в каждом языке используется свой менеджер памяти. Зачем он нужен и какие есть особенности, если модули программы написаны на разных языках?
  29. Новое ключевое слово static в Delphi. Недавно я переводил пост Реймонда Чена. Там я оставил весь код "как есть" - на C++. Здесь я рассмотрю этот вопрос с точки зрения Delphi.
  30. Создание приложений для Windows Vista в Delphi - часть 1. Хотя 99% всех хорошо написанных Delphi приложений будет работать под Vista без проблем (проблемы типа требования админских прав, элевации и UAC находятся за пределами этой статьи), они не имеют никаких бонусов с новых возможностей Windows Vista. Фактически, чем больше вы будете смотреть на новые возможности пользовательского интерфейса в Vista, тем больше ваши приложения будут смотреться как древние динозавры.
  31. В чём разница между PostMessage и SendNotifyMessage? Есть несколько тонких различий в способах, которыми вы можете отправлять сообщения в Windows®, но основным различием между PostMessage и SendNotifyMessage является то, что функции семейства SendMessage отправляют (send) сообщение в другое окно немедленно, с помощью прямого вызова их оконной процедуры и ожидания ответа, в то время как PostMessage заносит сообщение в очередь в виде записи TMessage и возвращает управление немедленно, без ожидания.
  32. Архитектура памяти в Windows. В прошлый раз мы рассмотрели вопросы использования глобальных переменных. Прежде, чем двинуться дальше, нужно дать небольшой вводный курс по памяти в Windows.
  33. Как узнать, почему зависла программа? Сегодняшняя статья будет посвящена нескольким подходам к отладке зависаний программы.
  34. "Дружественность" в Delphi. Небольшое введение в то, как обстоят дела с "дружественностью" в Delphi.
  35. Параметры типа открытый массив и "array of const". Эта статья описывает синтаксис и использование параметров функций типа открытый массив (open array parameters), и использование типа параметров "array of const". Она также описывает внутреннее устройство этих двух похожих типов, обсуждает время их жизни, приводит решение типичных проблем. Также тут есть краткое обсуждение часто возникающей путаницы между открытыми и динамическими массивами и между вариантными массивами (variant array) и открытыми массивами из вариантов.
  36. Не будьте беспомощны: скрытие/показ кнопок окон в панели задач. Этот пост - добавление к моему посту 90% кода в интернете - говно. На примере вопроса "Как скрыть окно из Панели задач" я покажу, как вы можете использовать свои голову и руки, чтобы успешно (и самостоятельно) решить эту проблему. Да это бредовый пост, но меня уже просто взбесило, что никто и не чешется что-то делать, когда им тыкаешь в подробное описание.
  37. Как читать лог-файлы. Ну, пока я работал в поддержке EurekaLog, туда приходило немало вопросов, ответ на которые сводился, по сути, к тому, как правильно трактовать баг-отчёты. Аналогичные вопросы я встречал и на DK и на других форумах. Оказывается, у людей часто бывают трудности с пониманием того, что же, собственно, написано в отчётах. Хоть лично мне это и кажется удивительным, но, видимо, проблема всё же есть и требует решения.
  38. Проблемы с памятью – заключительная статья. К настоящему моменту я опубликовал несколько статей, касающихся проблем с памятью в ваших приложениях.
  39. 98/97: Отделяйте интерфейс пользователя от кода. В блоге переводов у меня идёт перевод серии "97 вещей, которые должен знать каждый программист". В ней идёт речь о любых программистах, а не только программистах Delphi. "По мотивам" этой серии я хотел бы озвучить очередной факт из "98-ми вещей, которые должен знать каждый Delphi программист" (где остальные 97 вещей взяты из указанной выше серии ;) ). Это действительно must-know, но он не покрыт в указанной серии (видимо потому, что он достаточно специфичен?).
  40. Введение в 64 бита на Windows. 64-битные (или, что тоже самое: 64-разрядные) числа, адреса памяти или другие структуры данных - это данные, размер которых не более 64 бит. Соответственно, 64-разрядный процессор (CPU) - это процессор, который основан на/оперирует с данными (регистры, адреса) этого размера, позволяя производить прямые действия с числами этого размера (однако внешние шины данных и адресации могут иметь и иную размерность). 64-битные CPU существовали в суперкомпьютерах ещё в 70-х годах прошлого века. Но в сегменте персональных компьютеров (который до этого был 32-разрядным) они были представлены только в 2003-м году с появлением x86-64 (AMD64).
  41. Delphi-“вирус”: проверьте свою установленную Delphi!. Это первый вариант поста. Рекомендую вместо него читать "Virus.Win32.Induc.a: энцать дней спустя (FAQ)" - содержит больше информации (с обновлениями), более упорядочен. Этот же пост представляет уже только исторический интерес.
  42. Возможности окон Windows. В этом обзоре рассматриваются особенности и возможности окон Windows - типы, состояния, размеры и положение.
  43. Об окнах Windows. Эта статья описывает программные элементы, которые приложения могут использовать для создания и управления окнами; управления отношениями между окнами; изменения размера, перемещения и отображения окон.
  44. Недокументированный CreateProcess. Этот мануал является частью новой серии, которая будет сосредоточена на некоторых не-GUI вопросах, связанных с программированием в Windows. Предметом этого мануала будет Win32 API функция CreateProcess. Эта статья разделена на несколько секций, каждая из которых описывает приятный факт о CreateProcess, который можно использовать в своих интересах. То, что я буду описывать, нельзя найти в документации Microsoft, но эти вещи были обнаружены многими людьми на протяжении многих лет путём множества экспериментов. Вся информация, собранная здесь, была найдена в различных источниках - особенно в старых публикациях таких изданий, как "Windows Developer Journal", начиная с середины 90-х годов, а также старых сообщениях USENET.
  45. Почему всегда нужно использовать FreeAndNil вместо Free. Это - собранные в кучу посты, которые потянулись за этим высказыванием.
  46. Сага о X, Y и Z... ...или о том, как же важно правильно формулировать, чего мы хотим.
  47. Советы и трюки в EurekaLog, часть 1. Многие наши клиенты часто спрашивают, как сделать различные вещи с EurekaLog. Ну, у нас есть документация (chm-файл, а также online), которая описывает опубликованный интерфейс (функции и т.п.), который вы можете использовать для смены поведения по-умолчанию. Это документация в "стиле словаря". Чтобы использовать её, вам нужно изучить все кусочки и придумать способ, как сложить их вместе, чтобы получить интересное/нужное поведение. Кажется, что это слишком много работы для типичного человека, потому что все продолжают задавать простейшие вопросы типа "Моё приложение работает в окружении без оператора. Как я могу отключить диалог об ошибке EurekaLog?".
  48. Программирование на WinAPI, часть 1 - где искать информацию. Часто можно услышать вопросы, происходящие от отсутствия навыков работы с WinAPI. К примеру, "этот код работал на Windows XP, но не работает в Windows 7. Что делать?" (приведён совершенно ужасный код, полученный народным методом copy&paste с жёстко зашитыми константами и отсутствием даже намёка на обработку ошибок), "вот код, который получает путь к папке Мои документы, а мне надо - к рабочему столу" (человек не знает, где посмотреть описание функции, чтобы поменять "Мои документы" на "Рабочий стол") и даже просто: "подскажите функцию, чтобы сделать XYZ" - и так далее. Не будьте беспомощными! Вы сами можете найти ответы на эти вопросы. А этот цикл постов поможет вам в этом.
  49. Этот проблемный CreateProcess... Вроде бы эта функция не слишком сложна для понимания, но слишком уж часто её используют неверно или не понимают.
  50. 90% кода в интернете - говно. Предварительное примечание: Моё определение "говна" может не совпадать с вашим. (С) Ларри Остерман. Пожалуйста, дочитайте до конца, чтобы увидеть, что я имею ввиду. Я не имел цели оскорблять кого-то или чью-то работу. Это просто рассуждения по поводу сложившейся ситуации и типичных практик.
  51. Шрифты в Windows XP и Windows Vista/7. Написал небольшую программку, показывающую настройки шрифтов - может кому пригодится.
  52. Сериализация - файлы в стиле Pascal. Это первый пост в серии постов про сериализацию. В этой части мы рассмотрим т.н. файлы в стиле Pascal.
  53. Новый класс Exception в Delphi 2009 и выше. Начиная с Delphi 2009, класс Exception, который был неизменным с самого первого выпуска Delphi, получил новые поля и свойства. А значит - и новые возможности. Поэтому, я хотел бы сделать обзор новых возможностей и показать, как их можно использовать.
  54. Танцы с Media Player Classic. Где-то полтора месяца назад у меня пропал звук в Media Player Classic.
  55. Windows 95 не загружается на машинах с памятью 1 Гб. Короткий ответ: Windows 95 откажется загружаться, если ваша машина имеет памяти больше, чем примерно 480 Мб. В те времена это считалось огромным количеством памяти. Вспомните: целевой машиной для Windows 95 был 386SX с 4 Мб памяти на борту. А мощная машина в те времена имела 16 Мб. Закон Мура давал как минимум 7 лет прежде, чем о таком ограничении можно было бы беспокоиться. Один из моих знакомых даже не поленился найти машину с 96 Мб памяти, чтобы проверить, что Windows 95 не упадёт при работе с "невероятно большим количеством памяти" (и она работала). Windows 98 подняла это ограничение до 1 Гб, потому что кое-кто (не будем его называть) был достаточно безрассуден, чтобы продавать машины с 1 Гб памяти и предустановленной Windows 98 вместо гораздо более подходящей Windows NT.
  56. 1.2: Типы файлов. Файлы с разделяемым общим расширением (.doc, .html и так далее) являются файлами одного типа. Когда вы распространяете приложение, которое использует файлы, вы можете использовать существующие, хорошо определённые типы файлов. Например, если вы создаёте текстовый редактор, то вы можете использовать существующий тип файла .txt. В других случаях вы можете захотеть создать новый тип файла.
  57. Актуальность Delphi программистов. Многие люди заметили, что у Delphi, похоже, есть проблемы с популярностью: мало возможностей устроиться на работу, небольшой выбор вакансий и т.п.
  58. Установка Delphi 1 на Windows 7 x64. Предупреждение: это несерьёзный пост с нулевой практической пользой. For fun only...
  59. Длинная и печальная история ключа Shell Folders. Когда вы создаёте архитектуру операционной системы, обратная совместимость - это одна из тех вещей, которые вам при этом нужно просто принять. Но когда новые программы начинают зависеть от хаков, созданных для старых программ, вам захочется рвать на себе волосы.
  60. Почему INI-файлы устарели и их заменил реестр? Потому что у INI-файлов было много проблем.
  61. Сериализация - налоги. Заголовок статьи использует понятие "налог на ПО" - это термин, обозначающий вещи, которые вы делаете не для пользователя или себя, а для поддержания здоровья общей экосистемы компьютера. Этот пост будет говорить об общих подходах к правильному дизайну работы с файлами и хранилищами данных. В т.н. "книжках по Delphi" об этом обычно не пишут, поскольку такие вещи не имеют отношения к Delphi, а описываются в "книгах по Windows". По какой-то не очень понятной мне причине, "книги по Windows" читаются не так уж многими людьми. Хотя, казалось бы, как можно писать программы под какую-то ОС, не владея знаниями по этой ОС.
  62. Почему вам не следует использовать ShellExecute(Ex). В прошлый раз мы узнали, почему вам никогда не следует использовать функцию ShellExecute. В этот раз я расскажу вам о том, почему вам не следует использовать функцию ShellExecuteEx.
  63. BOOL, Boolean и Integer. Кто-то может подумать, что типы BOOL и Boolean являются одним и тем же типом в Delphi, т.к. они могут содержать только true и false. Верно ведь? И да и нет. Они кажутся одинаковыми, но есть небольшая разница в трактовке этих типов при присваивании и сравнении. Чтобы увидеть разницу, нам нужно открыть окно CPU-отладчика и копнуть ассемблерный код. Не закрывайте страничку - это действительно не так сложно понять. Вы также можете упаковать boolean-значение в integer. Фактически, заголовочники Windows определяют булевский тип именно так - так что мы посмотрим и на этот способ тоже.
  64. В чём разница между папками Мои документы и Application Data? Самое важное отличие между папками Мои документы и Application Data в том, что в Моих документах хранят файлы пользователи, а в Application Data хранят данные программы.
  65. DllMain и жизнь до родов. Загрузчик ОС (OS loader) всегда интересовал меня - вероятно потому, что он работает за сценой. И обычно никто и не чешется понять, что же он делает в точности, до тех пор, пока не начинают происходить странные и забавные вещи. И они происходят. И тогда нам приходится читать документацию, и нас заставляют запоминать, что загрузка модуля - это нечто большее, чем просто маппинг его в адресное пространство процесса. Фактически, у нас есть замечательная статья Matt Pietrek, которая обсуждает все эти вещи. Я настоятельно рекомендую всем, кто имеет дело с нативным кодом, прочитать эту статью - она может сильно просветить вас - как это было для меня. Когда вы знаете, как работают эти вещи, то маловероятно, что вы забудете сменить базу своим модулям (re-base), учесть ранее связывание и т.п. Когда в очередной раз появляется ещё один кусок информации или же отличная статья по теме, то я снова и снова озадачиваюсь темой загрузчика. В этот раз это был длинный пост в блоге Chris Brumme. Как заметили многие, этот пост пересыщен технической информацией, но что же ещё вы ожидали от блога Криса? :) В любом случае, чтобы лучше осознать тему и заполнить белые пятна, я решил написать об этом сам.
  66. В чём разница между GetKeyState и GetAsyncKeyState? Я вижу, что, похоже, разница между функциями GetKeyState и GetAsyncKeyState слабо понимается людьми.
  67. Стиль оформления кода. Хотел немного поговорить по поводу стиля оформления кода и высказать одну мысль, которая, кажется, никем особо не озвучивается и не обсуждается. Видимо потому, что придумывать свой стандарт оформления кода - это же так весело!
  68. Разработка системы плагинов, часть 5: отладка и обработка ошибок. В прошлый раз я говорил про взаимодействие плагинов между собой и то, какие возможности дают эти техники для прочих сценариев, без общения плагинов. В этой части я хотел бы рассмотреть обработку ошибок и отладку в плагинах. Я выношу эту тему вперёд других частей, потому что наша система становится всё более сложной и вам лучше бы уметь решать в ней проблемы, прежде чем усложнять её далее.
  69. Получили Internal error в Delphi? Сообщение об ошибке Internal Error: X1234 указывает на то, что компилятор столкнулся с некоторой ситуацией, отличной от синтаксической ошибки, и он не может продолжить компиляцию.
  70. Что такое хак? (и почему его не стоит использовать). Стандартное правило для использования хаков: избегайте хаков в коде программы, поставляемой клиентам.
  71. Новая редакция Delphi XE и C++ Builder XE (Starter) - цены и FAQ. Сегодня Embarcadero представила новую редакцию Delphi и C++ Builder: Delphi XE Starter и C++ Builder XE Starter. Новые редакции предназначены для энтузиастов и некоммерческих организаций.
  72. Разработка системы плагинов в Delphi, часть 2: разработка API. В этой части мы рассмотрим реализацию функциональности плагинов.
  73. Pro/Engineer в Delphi aka компилируем DLL для Delphi из Сишных lib-ов. Решил записать одну свою историю - вдруг кому будет интересно/пригодится. Небольшое предупреждение: я ничего не понимаю в языке С, поэтому здесь могут быть весьма грубые ошибки в высказываниях про него. В общем, нужно было организовать взаимодействие с Pro/Engineer из своей программы. Поскольку пишу я на Delphi, то я (естественно) и решил использовать Delphi :)
  74. Тайная жизнь GetWindowText. Функция GetWindowText сложнее, чем может вам показаться на первый взгляд. Документация пытается объяснить её сложность простыми словами, которые прекрасно подойдут, если вы не понимаете сложных слов, но это также значит, что вам говорят не всё. Этот пост - попытка рассказать "всё".
  75. DllMain - страшилка на ночь. В последний раз я говорил о DllMain и всяческих нехороших вещах, которые могут произойти, если вы используете её не по назначению. Я также упомянул, что это не тот случай, когда вы можете сказать "я всегда осторожен и со мной такого никогда не случится" - всё может выйти из под контроля очень быстро. Имейте ввиду, что загрузчик ОС со временем эволюционирует. Создатели ОС в курсе, что далеко не все DLL ведут себя хорошо в этом смысле, и стараются минимизировать ущерб от плохих DllMain, насколько это возможно. Однако сейчас мы покажем, что выстрелить себе в ногу более чем возможно (и очень просто). Позвольте мне показать пример, как просто это может быть (поведение может отличаться в разных версиях ОС, я использую Windows XP SP2).
  76. Как найти исполняемый файл Internet Explorer. По какой-то причине, некоторые люди забираются в неимоверные дебри, чтобы найти исполняемый файл Internet Explorer для запуска его с некоторыми опциями. Чтобы сделать это - вам вовсе не нужно это делать.
  77. Опасайтесь ключа Image File Execution Options. Опасайтесь ключа реестра Image File Execution Options (ещё). Его силы могут быть использованы во зло так же хорошо, как и для добра. Его главная цель - гарантировать запуск программы под отладчиком, вне зависимости от того, как она запускается (и вторичная цель: изменить, как система работает с программой). Это очень удобно, если вам нужно отладить программу "на воле", а не в контролируемом окружении вашей любимой IDE. К примеру, вы можете использовать его, чтобы отладить программу, которая запускается другой программой, которую вы не контролируете.
  78. В чём разница между LocalAlloc и GlobalAlloc? Когда-то во времена 16-ти битных Windows разница была огромной.
  79. Виртуальные методы и inherited. Delphi имеет необычно богатую языковую поддержку полиморфного поведения. Самая простая и базовая, которую большинство программистов ассоциируют с полиморфизмом, - это виртуальные методы.
  80. Перенос паролей из Password Commander в KeePass. Как-то давно я упоминал, что я перешёл с Password Commander на KeePass. И даже написал для него (KeePass) плагин, делающий его похожим на Password Commander. Кажется, вопрос переноса базы паролей с Password Commander в KeePass волнует не только меня. Поэтому я решил выложить небольшое руководство и вспомогательную программку. Я просто опишу способ, которым я перетащил свою БД паролей. Делать я буду это на примере демонстрационной БД из поставки Password Commander. Это будет простой перенос через CSV-файл. Вероятно, это не самый лучший способ, так как теряется много информации. К примеру, не сохраняется иерархия. Тем не менее, это просто и основная информация передаётся (включая дополнительные поля).
  81. Создаём журнал Delphi на русском. Коллеги, приветствую всех - как постоянных читателей моего блога, так и гостей с других земель. Обсуждение создания "своего" журнала Delphi идёт уже довольно давно. Если вы не очень в курсе и у вас есть капелька свободного времени - можете просмотреть это, это и вот это. На днях дело сдвинулось с мёртвой точки в сторону реальных действий. Только-только мы собрались делать журнал сами, как...
  82. Разработка системы плагинов, часть 6: UI в плагинах. В прошлый раз я подробно рассказал про обработку ошибок в системе плагинов. Теперь, когда эта тема позади, настало время поговорить об организации визуального интерфейса из плагинов. Наиболее частое применение этого - диалог настроек плагинов, вызываемый прямо из программы, но это могут быть и диалоги параметров операции и многое другое.
  83. НЕ пишите комментарии! Заголовок этого поста может показаться странным. Разве нам не советуют книжки и учебники писать комментарии и документировать, что делает код? "Пишите комментарии, а то через месяц и сами не вспомните, что делает этот код" - звучит знакомо? Сегодня я хотел бы, по мотивам этого комментария, озвучить (в некотором смысле) противоположную точку зрения.
  84. Сериализация - общие сведения о файлах. Для начала вспомним, что такое файл. Файл - это устройство с последовательным доступом, к которому можно обратиться по имени. Самый типичный файл - это файл на диске. Но в более широком смысле файлом являются и файловые устройства - вроде сетевого соединения, потоков данных, каналов pipe и т.п. Соответственно, операцию записи или загрузки данных из файлов на диске можно рассматривать в более широком смысле, применительно к любым файлам.
  85. Раздутое ПО - моя версия. Этот пост написан как ответ любому программисту, говорящему слова вроде: "а теперь посмотрите, сколько всякого бреда несет с собой VCL\MFC приложение". (слова ниже не обращены ни к кому лично, это просто изливание моих мыслей. Пожалуй, стиль слишком вольный, да и вообще высказывания местами резковаты, но уж как получилось)
  86. Исправляем плохой дизайн API: функции обратного вызова без user-аргумента. Callback-функция (англ. call — вызов, англ. back — обратный) или функция обратного вызова в программировании — передача исполняемого кода в качестве одного из параметров другого кода.
  87. Документация в исходном коде - раунд 2. В прошлый раз я высказал мысль "в противовес" комментированию кода для уменьшения злоупотребления комментариями. В частности, там прозвучали довольно резкие слова против ведения документации в коде. Сегодня, я вернусь к этому вопросу с новой информацией.
  88. Сертификация Delphi. Теперь я "Embarcadero Certified Delphi Developer" ;)
  89. Если что-то работает - это ещё не значит, что это работает правильно. a.k.a. "Если что-то работает, это ещё не значит, что это вообще должно работать". Примеры из жизни.
  90. Не используйте относительные имена файлов. Доступ к файлу можно получить по абсолютному или относительному имени (пути). Здесь же, в этой статье, я хочу показать, что вам никогда не нужно использовать относительные имена файлов.
  91. Когда CreateProcess завершается с ошибкой ERROR_SUCCESS. Не в первый раз с этим сталкиваюсь и всё время чешу голову. Решил сделать заметку, чтобы не забыть.
  92. Как стать Программистом. Мимо этого я не мог пройти мимо.
  93. Разработка системы плагинов, часть 7: пакеты и оптимизация по размеру. В предыдущей части мы рассмотрели основы реализации UI в системе плагинов. В связи с этим возникает насущный вопрос: UI - это VCL или FMX. Если плагинов много и всем нужен UI - получается, что каждый плагин несёт в себе достаточно много дублирующегося кода. Это не имеет значения, если вы написали один или два плагина. Но что если вы такой плодовитый разработчик, что написали аж две дюжины плагинов? Особенно, если они устанавливаются скопом (в "сборке"). Тогда вы тратите достаточно много места на дублирование кода. Нельзя ли с этим что-нибудь сделать? Поэтому, я решил вставить ответвление от намеченного пути и рассказать про возможные приёмы оптимизации по размеру. В этой статье мы не будем добавлять новых возможностей и наш код будет функционально идентичен предыдущему варианту. В этой статье мы просто постараемся уменьшить суммарный размер плагинов. При этом, программа-ядро меняться не будет. Так что если вы разрабатываете только программу-ядро и/или хотите написать всего один-два плагина, то можете пропустить эту часть.
  94. WinSock и Delphi. Сегодня столкнулся со знатным подводным камнем, объяснить который я не в состоянии.
  95. Разработка системы плагинов, часть 4: взаимодействие плагинов. В прошлый раз я говорил про более сложные методы взаимодействия ядра и плагинов: создание активных плагинов. К этой теме я ещё вернусь несколько позже, но сначала я хотел бы поговорить про вопросы взаимодействия плагинов друг с другом. Хотя некоторые из читателей могут подумать, что в их программах им это не нужно (и закрыть эту статью), но, на самом деле, эта тема показывает некоторые техники, которые будут вам полезны, даже если вы не будете реализовывать взаимодействие плагинов между собой.
  96. Обзор возможностей Delphi 2010 - визуализаторы для отладчика (Debugger Visualizers). Эта статья описывает новую возможность Delphi 2010 - визуализаторы для отладчика (Debugger Visualizers), а также подробно описывает, как вам создать ваш собственный визуализатор.
  97. Task Dialogs от Vista/Windows 7 в Windows XP: читаем спецификацию с другой стороны. Начиная с Windows Vista у нас появились так называемые Task Dialogs - замена старичку MessageBox, предоставляющие гораздо больше возможностей по кастомизации. В Delphi 2010 (а может и раньше, я не помню) у нас появилась обёртка: новый компонент TTaskDialog. Было бы очень удобно использовать его в своих программах, но... этим вы убираете возможность работы на Windows XP и ниже. Что же делать?
  98. Чего не хватает в Delphi? Ну, этот пост, конечно же, будет говорить с точки зрения отладки/работы с исключениями.
  99. Программирование - это искусство. На этот пост меня подтолкнуло прочтение вот этой статьи. Хотя я давно собирался что-то такое написать, но эта статья стала катализатором, а изначальной причиной стали комментарии к некоторым моим предыдущим постам. Многие бросаются фразой, мол, "программирование - это искусство", не вполне осознавая её смысл, часто добавляя к ней подобные же штампы ("искусство требует жертв"). Иногда можно видеть и противоположную картину - программирование низводят до уровня "механического вырезания болтов на станке". Некоторые спорят, ремесло программирование или же искусство (а может и наука). Многим просто без разницы.
  100. Человек рациональный - это миф. Этот пост - не про Delphi и с Delphi не связан. Случайные мысли по теме принятия решений человеком. Не точно и грубо. Может для кого-то это является тривиальными вещами, ну а для кого-то это может стать открытием...