Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.004 c
1-36279
Melnyk
2002-12-02 14:50
2002.12.12
Вопрос по GroupProject


14-36336
Ketmar
2002-11-20 10:12
2002.12.12
и снова WindowBlinds.


1-36114
SVIN
2002-12-01 02:54
2002.12.12
Деревья и списки


14-36374
singledai
2002-11-20 17:11
2002.12.12
Клавиатура!!!


1-36087
idz
2002-12-02 21:59
2002.12.12
Подпись оси Y в графике (компонент TChart)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский