Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.12.16;
Скачать: CL | DM;

Вниз

И вновь о связи между двумя компонентами   Найти похожие ветки 

 
Zergling   (2002-12-05 08:41) [0]

Здраствуйте!
Я уже задавал подобный вопрос на эту тему.
http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1038805576&n=0
В качестве вопроса я задал простые классы, надеясь по полученному примеру вставить все это в свой более сложный компонент. Но чего то, связать два компонента не получается. Третий день бьюсь. Проблема такая: Возмем к примеру TStatusBar StatusBar1.Panels[3].Text (это поле выступает в роли передатчика, допустим мне нужно отловить изменение .Text). В компоненте приемнике я выбираю нужный мне в работе TStatusBar, индекс нужной мне панельки из списка Panels. Вобщем как я сделал по примеру, который мне дали (конечно мой компонент передатчик вглядит по другому, но я его полностью делал по принципу TStatusBar):

То, что по примеру относится к TClassA (смотрите ссылочку) я приделал к классу TStatusPanel который обладает полем Text.
a для компонента приемника код ниже:

procedure TMyComponent.ComingText(Sender: TObject);
begin
// Сюда программа у меня даже не заходит
if Sender is TStatusBar then
with TStatusBar(Sender) do
Begin
if FStatusBar.Panels[FIndexPanels].Text<>"Да" then ... // Действия моего компонента
End;
Invalidate;
end;

procedure TMyComponent.SetStatusBar(const Value: TStatusBar);
begin
if Value<>FStatusBar then
Begin
if FStatusBar<>Nil then
Begin
FStatusBar.Panels[FIndexPanels].PanelsEvent:=nil;
RemoveFreeNotification(FStatusBar);
End;
FStatusBar:=Value;
if FStatusBar<>nil then
Begin
FreeNotification(FStatusBar);
FStatusBar.Panels[FIndexPanels].PanelsEvent:=ComingText;
End;
End;
Invalidate;
end;

Помогите кто может! Заранее благодарен за любую помощь!


 
Юрий Зотов ©   (2002-12-05 09:16) [1]

Как сделано и как возбуждается PanelsEvent? Похоже, причина там, а не здесь.


 
Zergling   (2002-12-05 09:37) [2]

>> Юрий Зотов © (05.12.02 09:16)

Вот код моего компонента FImpulsEvent - это как PanelsEvent
Выше я пример привел с TStatusBsr, что бы вопрос более понятен был.

TTVImpulsing=class;
TImpulses=class;
TImpulsClass = class of TImpuls;

TImpuls = class(TCollectionItem)
Private
FDivisionFactor:Integer;
FEnabled:Boolean;
FClocEdge:Boolean; // Его я и пытаюсь поймать
{ Добавлено по вашему примеру }
FImpulsEvent:TNotifyEvent;
Procedure SetClocEdge(const Value:Boolean);
Procedure SetDivisionFactor(Value:Integer);
Procedure SetEnabled(Value:Boolean);
Protected
CountImpuls:Integer;
{ Добавлено по вашему примеру }
Procedure DoImpulsEvent;dynamic;
Public
Property ClocEdge:Boolean read FClocEdge write SetClocEdge;
{ Добавлено по вашему примеру }
property ImpulsEvent:TNotifyEvent read FImpulsEvent write FImpulsEvent;
constructor Create(Collection: TCollection); override;
procedure Assign(Source: TPersistent); override;
Published
Property DivisionFactor:Integer read FDivisionFactor write SetDivisionFactor;
Property Enabled:Boolean read FEnabled write SetEnabled;
End;

{ *** Этот класс хранит список TImpuls (как панельки TStatusBar) добавленных пользователем *** }
{ Данный класс я сделал по примеру компонента TStatusBar
TImpulses - это как Panels у TStatusBar}

TImpulses = class(TCollection)
Private
FImpulsing:TTVImpulsing;
function GetItem(Index: Integer): TImpuls;
procedure SetItem(Index: Integer; Value: TImpuls);
Protected
function GetOwner: TPersistent; override;
Public
constructor Create(Impulsing: TTVImpulsing);
function Add: TImpuls;
function AddItem(Item: TImpuls; Index: Integer): TImpuls;
function Insert(Index: Integer): TImpuls;
property Items[Index: Integer]: TImpuls read GetItem write SetItem; default;
End;
{ По примеру TStatusBar }
procedure TImpuls.Assign(Source: TPersistent);
begin
if Source is TImpuls then
begin
FDivisionFactor:=TImpuls(Source).DivisionFactor;
FImpulsEvent:=TImpuls(Source).ImpulsEvent;
FClocEdge:=TImpuls(Source).ClocEdge;
FEnabled:=TImpuls(Source).Enabled;
end
else inherited Assign(Source);
end;

{ Добавлено по вашему примеру }
procedure TImpuls.DoImpulsEvent;
begin
if Assigned(FImpulsEvent) then FImpulsEvent(Self);
end;

procedure TImpuls.SetClocEdge(const Value: Boolean);
begin
if Value<>FClocEdge then
Begin
FClocEdge:=Value;
{ Добавлено по вашему примеру }
DoImpulsEvent;
End;
end;


 
Zergling   (2002-12-05 12:00) [3]

Юрий Зотов подскажите пожалуйста где и что я сделал не так.



Страницы: 1 вся ветка

Текущий архив: 2002.12.16;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.014 c
1-51833
JKL
2002-12-05 15:34
2002.12.16
Размер файла


1-51661
nikolo
2002-12-04 13:57
2002.12.16
Компонент TDBComboBox ?


14-51949
Карлсон
2002-11-22 22:58
2002.12.16
вот он, наш мучитель :)


1-51784
Chlavik
2002-11-30 04:03
2002.12.16
ПРокрутка ListBox ...


3-51588
User_OKA
2002-11-27 13:00
2002.12.16
Запрос