Форум: "Основная";
Текущий архив: 2002.12.12;
Скачать: [xml.tar.bz2];
ВнизРазработка компонентов (связь между компонетами) Найти похожие ветки
← →
Zergling (2002-12-02 08:06) [0]День добрый уважаемые! У меня два вопроса по разработке компонетов:
Есть класс
Type
TClassA=Class(TGraphicControl)
Private
FMyBool:Boolean;
SetMyBool(Value:Boolean);
Published
Property MyBool:Boolean read FMyBool write SetMyBool;
End;
И есть класс такого типа
Type
TClassB=Class(TGraphicControl)
Private
FClassA:TClassA;
SetClassA(Value:TClassA);
Published
Property ClassA:TClassA read FClassA write SetClassA;
End;
И так, вопрос первый:
TClassB связывается по своему внутреннему полю с классом TClassA. Как мне реализовать событие, что при изменении значения поля FMyBool у класса TClassA, класс TClassB реагировал на это изменение т.е. связать поле FMyBool у класса TClassA с классом TClassB?
Ворос второй:
Когда TClassB по своему полю FClassA связан с TClassA, при удолении TClassA поле FClassA класса TClassB не очищается, при этом все время выпадают ошибки. Что мне необходимо сделать, чтобы при удолении класса TClassA поле FClassA класса TClassB сразу очищалось.
Поробовал по этим вопросам разобраться с компонетом TDataSource, но он слишком сложный. Мне еще не позубам. Если ответы на данные вопросы слишком емкие, то киньте ссылочку где можно начитаться на эту тему. Заранее всем СПАСИБО!
← →
Calm (2002-12-02 09:25) [1]1. Ввести в класс TClassA поле RefClassB:TClassB.
В TClassB.SetClassA делать Value.RefClassB:=self;
В TClassA.SetMyBool делать
RefClassB.{То, что нужно}
2. Если осовободил память под FClassA, то нельзя обращаться к его свойствам и методам. Тогда ошибок не будет.
> Поробовал по этим вопросам разобраться с компонетом TDataSource,
>
IMHO, TDataSource здесь ни при чем...
← →
icWasya (2002-12-02 09:51) [2]по поводу второго вопроса
в каждую компоненту добавить процедуру Notification
например
type TClassA= ...
procedure Notification(AComponent: TComponent;
Operation: TOperation);override;
.............
procedure TClassA.Notification(AComponent: TComponent;
Operation: TOperation);
begin
inherited Notification(AComponent, Operation);
if (Operation = opRemove) and
(AComponent = RefClassB) then RefClassB := nil;
end;
procedure TClassB.Notification(AComponent: TComponent;
Operation: TOperation);
begin
inherited Notification(AComponent, Operation);
if (Operation = opRemove) and
(AComponent = RefClassB) then RefClassB := nil;
end;
........
procedure TClassB.SetClassA(Value:TClassA);
begin
FClassA:=Value;
FreeNotification(FClassA)
end;
procedure TClassB.Notification(AComponent: TComponent;
Operation: TOperation);
begin
inherited Notification(AComponent, Operation);
if (Operation = opRemove) and
(AComponent = FClassA) then FClassA := nil;
end;
← →
Юрий Зотов (2002-12-02 10:12) [3]> Calm
Sorry, так компоненты не пишут. Мягко говоря.
> Zergling
type
TClassA = class(TGraphicControl)
private
FMyBool: Boolean;
FMyEvent: TNotifyEvent;
procedure SetMyBool(const Value: Boolean);
protected
procedure DoMyEvent; dynamic;
public
property MyEvent: TNotifyEvent read FMyEvent write FMyEvent;
published
property MyBool: Boolean read FMyBool write SetMyBool;
end;
TClassB = class(TGraphicControl)
private
FClassA: TClassA;
procedure SetClassA(const Value: TClassA);
procedure BoolChange(Sender: TObject);
protected
procedure Notification
(AComponent: TComponent; Operation: TOperation); override;
published
property ClassA: TClassA read FClassA write SetClassA;
end;
procedure TClassA.SetMyBool(const Value: Boolean);
begin
if Value <> FMyBool then
begin
FMyBool := Value;
DoMyEvent
end
end;
procedure TClassA.DoMyEvent;
begin
if Assigned(FMyEvent) then FMyEvent(Self)
end;
procedure TClassB.SetClassA(const Value: TClassA);
begin
if Value <> FClassA then
begin
if FClassA <> nil then
begin
FClassA.MyEvent := nil;
RemoveFreeNotification(FClassA)
end;
FClassA := Value;
if FClassA <> nil then
begin
FreeNotification(FClassA);
FClassA.MyEvent := BoolChange
end
end
end;
procedure TClassB.BoolChange(Sender: TObject);
begin
if Sender is TClassA then
with TClassA(Sender) do
begin
... // Ваша обработка
end
end;
procedure TClassB.Notification
(AComponent: TComponent; Operation: TOperation);
begin
inherited;
if (Operation = opRemove) and (AComponent = FClassA) then
ClassA := nil
end;
← →
Calm (2002-12-02 10:20) [4]2 Юрий Зотов © (02.12.02 10:12)
> Sorry, так компоненты не пишут. Мягко говоря.
Не спорю
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.12.12;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.005 c