CBuilder

отредактировано 21:31 Раздел: FastReport 3.0
Поставил 3.01. Начал на С++ делать свои компоненты доступа к данным. Все как описано в мануале, только с переложением на С. Попытка запуска - свал. Нашел интереснейший код:

constructor TfrxCustomQuery.Create(AOwner: TComponent);
begin
inherited;
FParams := TfrxParams.Create;
// Вот это:
DataSet.BeforeOpen := OnBeforeOpen;

FSaveOnChange := TStringList(SQL).OnChange;
TStringList(SQL).OnChange := OnChangeSQL;
end;

я создаю потомка TfrxCustomQuery. В своем конструкторе, я вызываю базовый. Поскольку это все-таки С, то естественно, до входа в мой конструктор, исполняется базовый. DataSet еще не определен, т.к. мой конструктор не исполнялся. В итоге - свал. Дальше - больше:
constructor TfrxCustomDataset.Create(AOwner: TComponent);
begin
Component := Dataset;
inherited;
FDataSource := TDataSource.Create(nil);
// Вот это:
SetMaster(FDataSource);
end;

Вызов виртуальной функции в моем объекте до выполнения его конструктора ;) .

Полез за решением:
constructor TfrxADOQuery.Create(AOwner: TComponent);
begin
FQuery := TADOQuery.Create(nil);
Dataset := FQuery;
SetDatabase(nil);
// Вот это:
inherited;

FImageIndex := 39;
end;

Так в С не пишут.

Вывод: покупай Делфи? Бросай С? А если весь проект на С, включать туда модуль на паскале?

Комментарии

  • отредактировано 21:31
    > Так в С не пишут.

    А в Делфи - вполне нормально. Все-таки FR3 написан на Делфи, и переделывать его под С нет возможности. Выход у Вас только один - писать подключаемый модуль на Паскале.
  • отредактировано 21:31
    > Вас только один - писать подключаемый модуль на Паскале
    ;)

Оставить комментарий