Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-51704
chubr
2002-12-05 21:48
2002.12.16
Буфер обмена.


3-51652
nick-from
2002-11-28 23:31
2002.12.16
Коды ошибок Interbase


14-51963
Zhirnov Maxim
2002-11-24 13:09
2002.12.16
SMS & PC


3-51599
TohaNik
2002-11-23 18:08
2002.12.16
Структура базы


3-51616
Анатолий
2002-11-28 00:43
2002.12.16
тип boolean в IB





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский