CBuilder
Поставил 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;
Так в С не пишут.
Вывод: покупай Делфи? Бросай С? А если весь проект на С, включать туда модуль на паскале?
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;
Так в С не пишут.
Вывод: покупай Делфи? Бросай С? А если весь проект на С, включать туда модуль на паскале?
Комментарии
А в Делфи - вполне нормально. Все-таки FR3 написан на Делфи, и переделывать его под С нет возможности. Выход у Вас только один - писать подключаемый модуль на Паскале.