Отладчик инспектора объектов?

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Отладчик инспектора объектов?

Сообщение Bezlikiy » 02.07.2013 09:04:05

Как в Lazarus (версии 0.9.30.2 и выше) использовать отладчик в при установке свойств компонента в инспекторе объектов? С использованием отладчика времени выполнения проблем пока не возникало, как то-же самое можно сделать (точки останова, просмотр переменных и т.п.) во время тестирования интерфейса времени проектирования компонента?

Для примера есть компонент сохраняющий историю изменения свойства в инспекторе объектов, работает как задумывалось, но непонятно как попасть отладчиком например на метод "procedure WriteTextHistory(Writer: TWriter);" или на "procedure SetText(const Value: String);" во время их использования через инспектор объектов.

Код: Выделить всё
uses
  Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs;

type

  { TTmmTextLogger }

  TTmmTextLogger = class(TComponent)
  strict private
    { Private declarations }
    FText: String;
    FTextHistory: TStrings;
    FSaveTextHistory: Boolean;
    procedure SetText(const Value: String);

    // Метод загрузки истории
    procedure ReadTextHistory(Reader: TReader);

    // Метод сохранения истории
    procedure WriteTextHistory(Writer: TWriter);
  protected
    { Protected declarations }
    // Переопределенный метод для сохранения с-ва TextHistory
    procedure DefineProperties(Filer: TFiler); override;
  public
    { Public declarations }
    property TextHistory: TStrings read FTextHistory;
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    { Published declarations }
    // Свойство TextHistory, хранящее историю изменения св-ва Text
    property Test: String read FText write SetText;
    property SaveTextHistory: Boolean read FSaveTextHistory write FSaveTextHistory default false;
  end;

procedure Register;

implementation

procedure Register;
begin
  {$I tmmtextlogger_icon.lrs}
  RegisterComponents('MyTestCmpts',[TTmmTextLogger]);
end;

{ TTmmTextLogger }

procedure TTmmTextLogger.SetText(const Value: String);
begin
  if Value <> FText then
  begin
    if FText <> '' then
      FTextHistory.Add(FText);
    FText := Value;
  end;
end;

procedure TTmmTextLogger.ReadTextHistory(Reader: TReader);
begin
  try
    Reader.ReadListBegin;
    try
      while not Reader.EndOfList do // Загрузить элемнты списка истории
        FTextHistory.Add(Reader.ReadString);
    finally
      Reader.ReadListEnd;
    end;
  except
    FTextHistory.Clear;
    raise;
  end;
end;

procedure TTmmTextLogger.WriteTextHistory(Writer: TWriter);
var
  i: Integer;
begin
  Writer.WriteListBegin;
  try
    if FSaveTextHistory then // записать историю изменений
      for i := 0 to FTextHistory.Count - 1 do
        Writer.WriteString(FTextHistory[i]);
  finally
    Writer.WriteListEnd;
  end;
end;

procedure TTmmTextLogger.DefineProperties(Filer: TFiler);
begin
  inherited DefineProperties(Filer);

  // Определить методы сохранения свойства TextHistory в файл формы
  Filer.DefineProperty('TextHistory', @ReadTextHistory, @WriteTextHistory, true);
end;

constructor TTmmTextLogger.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FText := '';
  FSaveTextHistory := false;
  FTextHistory := TStringList.Create;
  // ..
end;

destructor TTmmTextLogger.Destroy;
begin
  // ..
  FreeAndNil(FTextHistory);
  inherited Destroy;
end;

end.

Вобщем хотелось бы узнать как попасть отладчиком на этот участок кода, который IDE использует, но точек останова в нём не видит:
Код: Выделить всё
procedure TTmmTextLogger.WriteTextHistory(Writer: TWriter);
var
  i: Integer;
begin
  Writer.WriteListBegin;
  try
    if FSaveTextHistory then // записать историю изменений
      for i := 0 to FTextHistory.Count - 1 do
        Writer.WriteString(FTextHistory[i]);
  finally
    Writer.WriteListEnd;
  end;
end;


сам тестовый компонент:
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Bezlikiy
незнакомец
 
Сообщения: 2
Зарегистрирован: 02.07.2013 08:08:49

Re: Отладчик инспектора объектов?

Сообщение SeZuka » 02.07.2013 12:39:29

По всей видимости надо скомпилировать IDE с отладочной информацией и запустить ее под отладчиком.
Только зачем? У вас работа метода отличается во время исполнения и во время проектирования?
SeZuka
постоялец
 
Сообщения: 209
Зарегистрирован: 05.09.2012 14:58:05

Re: Отладчик инспектора объектов?

Сообщение Bezlikiy » 02.07.2013 13:23:37

SeZuka писал(а):У вас работа метода отличается во время исполнения и во время проектирования?
Выполнение некоторых методов происходит только на этапе проектирования, на этапе исполения не проверить.

SeZuka писал(а):По всей видимости надо скомпилировать IDE с отладочной информацией и запустить ее под отладчиком.
А вот бы поподробнее как запустить под отладчиком, чтобы в момент изменения свойств в инспекторе объектов, а также сохранении изменений в проекте (при этом компонент записывает в .lfm файл своё состояние), можно было в дебаггере проследить задействующийся инспектором объектов исполняемый код компонента, аналогично тому как во время исполнения.
Например при сохранении изменений в проекте при разработке вызывается метод TTmmTextLogger.WriteTextHistory, как в этот момент по нему отладчиком пройтись?
Bezlikiy
незнакомец
 
Сообщения: 2
Зарегистрирован: 02.07.2013 08:08:49

Re: Отладчик инспектора объектов?

Сообщение SeZuka » 02.07.2013 16:40:11

Почитайте по отладчику http://www.freepascal.ru/article/raznoe/20050419115531/ если разберетесь.
Ну или попробовать запустить лазарус под лазарусом, может получится.
SeZuka
постоялец
 
Сообщения: 209
Зарегистрирован: 05.09.2012 14:58:05


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 225

Рейтинг@Mail.ru