Да, господа, я снова сегодня буду говорить про Lazarus :) Вообще к этой IDE отношение, как у меня самого, так и у всех, кто хоть раз его попробовал использовать в работе самое неоднозначное. Начиная от выкриков типа “Его (Lazarus) надо было убить в зародыше”, до хвалебных “На Lazarus можно писать эффективные коммерческие приложения! Всё есть!”. Как водится – истина где-то рядом. Я, конечно, не на столько хорошо знаком с Lazarus как те люди, которые разрабатывает на нем коммерческие продукты, но пока могу сказать, что в плане создания нормальных расчётных программ Lazarus вполне годится. Под “нормальной” я подразумеваю программу, которая используется повседневно, не глючит, не выдает “косяки”, обладает дружественным интерфейсом и т.д. и т.п. Как обстоят дела на более глубоком уровне типа создания программ для работы с графикой, звуком и пр. сказать пока не могу так как работать в этой области довелось очень мало даже в Delphi.
Одной из проблем, которая встает перед человеком, решившим, что Delphi ему не по карману, становится проблема отладки приложения. И, что тут говорить, если по кросскомпиляции Lazarus пока ещё впереди Delphi, то в плане отладки он далеко-далеко позади и приходится подчас при отладке приложения Lazarus выписывать такие фокусы, что самому становится жутковато от того, что написано в Watch-листе. Рассмотрим пару небольших примеров отладки в Lazarus.
Все мы (кто большую часть времени работает с Delphi) привыкли к этим красивым подсказкам отладчика. Создал массив, присвоил в программе значения элементам массива, запустил под отладчиком, навел курсор мышки на переменную и вот оно:
Хочешь – массив вдоль, хочешь – поперек. Как говорится, все 33 удовольствия. А, что мы имеем в Lazarus? Тот же массив, но в Лазаре:
Как видите, и ни вдоль и не поперёк. Вообще никак. И неподготовленный к такому повороту событий человек может даже впасть в ступор :). Но, если уж очень надо посмотреть на значения элементов массива, а то и изменить по ходу отладки какое-либо значение, то можно воспользоваться следующим вариантом:
Ставим breakpoint в подходящем месте. Например, на рисунке я поставил точку останова на end процедуры по той причине, что мне необходимо узнать значение последнего элемента массива (с индексом 3). Далее заходим в:
Вид – Окна отладки – Окно наблюдений
Жмем правую кнопку мыши и добавляем следующее наблюдение:
Mass^[3]
И получаем аккурат, то, что и хотелось – значение четвертого элемента массива:
Если надо по ходу отладки поменять значение в массиве, то необходимо воспользоваться
окном “Вычислить/изменить”, которое вызывается нажатием Ctrl+F7 и выглядит следующим образом:
Согласен, этот способ далеко не так удобен, как в 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:
Опять ошибка в синтаксисе. Воспользуемся снова окном “Вычислить/изменить” или окном наблюдений (как угодно). Попробуем по примеру с массивом записать:
SuperClass^.Field1
И…ни-фи-га. А вот, если обратиться не к свойству, а к полю получим результат, как показано на рисунке:
Из этого примера следует, что если свойство не имеет своего поля, например, вычисляется на основании значений других полей, то его значения вам никак не “выудить” и работать придётся практически вслемую или использовать что-то типа ShowMessage() для вывода значений.
Вот пожалуй, два наиболее показательных примера работы с отладчиком в Lazarus, с которыми может столкнуться большинство. Что тут сказать? “Бесплатный сыр” он только в мышеловках бывает и за всё приходится платить. Хотите удобства – Delphi, хотите “бесплатности”, открытости – Lazarus, но приготовьтесь платить за это потраченными нервными клетками или дописывайте GDB, что, в принципе одно-на-одно и выйдет :).
спасибо за «SuperClass^.FField1»! а то я все мучался, делая так: TSuperClass(SuperClass).FField1…
вообще, если изначально знать, что программа будет перекомпилироваться (для легальности) под Лазарусом, то можно так построить программу, чтобы спокойно все время разрабатывать под Делфи и только в последний момент, когда все отлажено и работает, «пересесть» на Лазарус… хотя, думаю, америку не открыл, и многие так и делают))
В принципе и ваш вариант просмотра свойств тоже применим. GDB сам, кстати, частенько предлагает сделать привести переменную к типу.
Ну, а по поводу того, чтоб быстро соскочить с Delphi на Lazarus…небольшие проекты да можно легко перебросить под Лазаря, а вот с крупными может сразу и не получиться.