уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

Да, господа, я снова сегодня буду говорить про Lazarus :) Вообще к этой IDE отношение, как у меня самого, так и у всех, кто хоть раз его попробовал использовать в работе самое неоднозначное. Начиная от выкриков типа “Его (Lazarus) надо было убить в зародыше”, до хвалебных “На Lazarus можно писать эффективные коммерческие приложения! Всё есть!”. Как водится – истина где-то рядом. Я, конечно, не на столько хорошо знаком с Lazarus как те люди, которые разрабатывает на нем коммерческие продукты, но пока могу сказать, что в плане создания нормальных расчётных программ Lazarus вполне годится. Под “нормальной” я подразумеваю программу, которая используется повседневно, не глючит, не выдает “косяки”, обладает дружественным интерфейсом и т.д. и т.п. Как обстоят дела на более глубоком уровне типа создания программ для работы с графикой, звуком и пр. сказать пока не могу так как работать в этой области довелось очень мало даже в Delphi.

Одной из проблем, которая встает перед человеком, решившим, что Delphi ему не по карману, становится проблема отладки приложения. И, что тут говорить, если по кросскомпиляции Lazarus пока ещё впереди Delphi, то в плане отладки он далеко-далеко позади и приходится подчас при отладке приложения Lazarus выписывать такие фокусы, что самому становится жутковато от того, что написано в Watch-листе. Рассмотрим пару небольших примеров отладки в Lazarus.

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

mass_delphi

Хочешь – массив вдоль, хочешь – поперек. Как говорится, все 33 удовольствия. А, что мы имеем в Lazarus? Тот же массив, но в Лазаре:

mass_lazarus_1

mass_lazarus_2

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

Ставим breakpoint в подходящем месте. Например, на рисунке я поставил точку останова на end процедуры по той причине, что мне необходимо узнать значение последнего элемента массива (с индексом 3). Далее заходим в:

Вид – Окна отладки – Окно наблюдений

mass_lazarus_3

Жмем правую кнопку мыши и добавляем следующее наблюдение:

Mass^[3]

И получаем аккурат, то, что и хотелось – значение четвертого элемента массива:

mass_lazarus_4

Если надо по ходу отладки поменять значение в массиве, то необходимо воспользоваться

окном “Вычислить/изменить”, которое вызывается нажатием Ctrl+F7 и выглядит следующим образом:

mass_lazarus_5

Согласен, этот способ далеко не так удобен, как в Delphi, но другого судя по всему в Lazarus и нет. И здесь видимо стоит отметить момент почему все так “плохо”. Дело в том, что в Lazarus используются отладчик под названием GDB. GDB – это не разработка команды Лазаруса, это даже не специализированны отладчик для Pascal – это совершенно другой проект, который изначально разрабатывался Столманом и был нацелен, как впрочем и сейчас, далеко не на Lazarus и Pascal. Отсюда и вытекают большинство проблем отладки – GDB просто не понимает (и не стремится понять в обозримом будущем) многих Pascal-подобных свойств. Вроде бы в версии Lazarus 0.9.28 доработали отладку вложенных процедур (не проверял), но остались весьма неприятные моменты с классами.

Рассмотрим простой пример. Есть следующий класс:

type
  TSuperClass = class
  private
    FField1: string;
    FField2: integer;
  public
    property Field1: string read FField1 write FField1;
    property Field2: integer read FField2 write FField2;
end;

Как известно, посмотреть значение любого из двух свойств класса в Delphi не составит никакого труда. В Lazarus+GDB опять всё не так гладко. Попробуем посмотреть значение свойства Field1:

mass_lazarus_6

Опять ошибка в синтаксисе. Воспользуемся снова окном “Вычислить/изменить” или окном наблюдений (как угодно). Попробуем по примеру с массивом записать:

SuperClass^.Field1

И…ни-фи-га. А вот, если обратиться не к свойству, а к полю получим результат, как показано на рисунке:

mass_lazarus_7

Из этого примера следует, что если свойство не имеет своего поля, например, вычисляется на основании значений других полей, то его значения вам никак не “выудить” и работать придётся практически вслемую или использовать что-то типа ShowMessage() для вывода значений.

Вот пожалуй, два наиболее показательных примера работы с отладчиком в Lazarus, с которыми может столкнуться большинство. Что тут сказать? “Бесплатный сыр” он только в мышеловках бывает и за всё приходится платить. Хотите удобства – Delphi, хотите “бесплатности”, открытости – Lazarus, но приготовьтесь платить за это потраченными нервными клетками или дописывайте GDB, что, в принципе одно-на-одно и выйдет :).

4.5 2 голоса
Рейтинг статьи
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
Подписаться
Уведомить о
2 Комментарий
Межтекстовые Отзывы
Посмотреть все комментарии
Lampogolovii
09/11/2010 11:37

спасибо за «SuperClass^.FField1»! а то я все мучался, делая так: TSuperClass(SuperClass).FField1…
 
вообще, если изначально знать, что программа будет перекомпилироваться (для легальности) под Лазарусом, то можно так построить программу, чтобы спокойно все время разрабатывать под Делфи и только в последний момент, когда все отлажено и работает, «пересесть» на Лазарус… хотя, думаю, америку не открыл, и многие так и делают))