Главная страница
    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.007 c
6-51864
Chlavik
2002-10-22 01:21
2002.12.16
Сетевые диски.....


3-51580
hostage2002
2002-11-26 15:54
2002.12.16
Записать OLE в поле SQL Server а


14-51911
SPeller
2002-11-24 13:06
2002.12.16
Избавиться от пункта меню в IE


1-51781
LazorenkoX
2002-12-05 00:21
2002.12.16
F1


4-51990
kosdem
2002-11-01 05:06
2002.12.16
реестр





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