Должен ли я писать компоненты в Delphi вместо C ++ Builder? Как добавить события в компонент?

Я использую C ++ Builder (XE2), и мне нужно будет разработать некоторые компоненты VCL, которые также будут использоваться в Delphi. Как я понимаю, C ++ Builder поддерживает код Delphi и компоненты Delphi, но не наоборот? Если так, то лучше было бы начать писать в Delphi, чтобы я не выполнял двойную работу?

Вторая часть моего вопроса более техническая; Я знаю, как добавить свойство в компонент VCL, но не знаю, как добавлять события. Может ли кто-нибудь дать мне пример, пожалуйста (независимо от Delphi или C ++ Builder).

Благодарю.

1

Решение

Как я понимаю, C ++ Builder поддерживает код Delphi и компоненты Delphi, но не наоборот?

На уровне источника — да.
Но если вы решите распространять вашу библиотеку без исходного кода — BPL + DCP + DCU — тогда это не будет иметь значения, за исключением некоторых мелких несовместимостей, таких как Delphi без оператора [] и C ++ без виртуальных перегруженных конструкторов.

Оказывается, эта оценка была неправильной. Прочитайте комментарий Реми ниже


Самый близкий к вам пример событий ov — это сам VCL, источники обычно поставляются с Delphi. Если у вас есть Delphi Starter / Trial без источников VCL — получите любую библиотеку VCL с открытым исходным кодом или компонент. Такие, как JediVCL или в основном почти ЛЮБОЙ компонент VCL с источниками. Например любой «FWS» (бесплатно с источниками) компонент 99% использует события.

Самый основной и широко используемый тип уведомлений о событиях, такой как TButton.OnClick, TForm.OnCreate и многие другие, — это TNotifyEvent

открыто Delphi Help для этого типа. Перейдите к разделу «Смотрите также» и увидите две ссылки.

4

Другие решения

Такие как:
(заимствованный код из about.delphi.com)

type
TState = (stStarted, stStopped);
TStateChangeEvent = procedure
(Sender : TObject; State : TState) of object;

TThirdComponent = class(TSecondComponent) // or whatever
private
{ Private declarations }
FState  : TState;
FOnStart,
FOnStop  : TNotifyEvent;
FOnStateChange  : TStateChangeEvent;
protected
{ Protected declarations }
public
{ Public declarations }
constructor Create(AOwner : TComponent); override;
destructor Destroy; override;
procedure Start; override;
procedure Stop; override;
property State : TState
read FState;
published
{ Published declarations }
property OnStart : TNotifyEvent
read FOnStart
write FOnStart;
property OnStateChange : TStateChangeEvent
read FOnStateChange
write FOnStateChange;
property OnStop : TNotifyEvent
read FOnStop
write FOnStop;
end

Тогда вы можете сделать

procedure TThirdComponent.Start;
begin
inherited;
FState := stStarted;
if Assigned(OnStart) then OnStart(Self);
if Assigned(OnStateChange) then
OnStateChange(Self, State);
end;
2

По вопросам рекламы [email protected]