Форум: "Основная";
Текущий архив: 2002.12.16;
Скачать: [xml.tar.bz2];
ВнизИ вновь о связи между двумя компонентами Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.011 c