Форум программистов
 
Регистрация на форуме тут, о проблемах пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль

Купить рекламу на форуме 15-35 тыс рублей в месяц

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail


Оплата за обучение в Kata Academy только после твоего трудоустройства в IT, начни карьеру Middle Java-разработчика


Ответ
 
Опции темы Поиск в этой теме
Старый 03.05.2012, 09:55   #1
xabik
Пользователь
 
Регистрация: 03.06.2009
Сообщений: 22
По умолчанию Извещение компонента типа TImage

В написании компонентов пока полный ноль, поэтому отнеситесь пожалуйста с пониманием.
Вообщем пишу два компонента один на основе TXMLDocument, а второй на основе TImage. Первый я закончил (все изменения заключались в перекрытии процедуры Active и дополнении её своим кодом парсинга). А вот второй у меня застопорился. Смысл такой - я добавил в него поле типа первого компонента и мне необходимо что бы при изменении первого компонента а именно свойства Active, второй на это реагировал, т.е. чего нибудь рисовал на Canvas или же наоборот стирал. И это у меня не выходит

P.S. Это типа как TDBGrid узнает о том что TTable активен или нет...
xabik вне форума Ответить с цитированием
Старый 03.05.2012, 10:11   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,003
По умолчанию

там идет взаимосвязь.
то есть типа ImgParent у вашего TXMLDocument типа TMyImage.
и при изменении состояния он извещает родителя.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 03.05.2012, 10:19   #3
xabik
Пользователь
 
Регистрация: 03.06.2009
Сообщений: 22
По умолчанию

ОК.

Как всё это записать?

Вот коды:
1 Компонент на основе TXMLDocument

Код:
unit OSM_XMLDocument;

interface

uses
  System.SysUtils, System.Classes, Xml.XMLDoc;

type
  TNodeOSM = record
    Latitude,Longitude,X,Y:real;
    ID:String;
  end;
  TArrNodeOSM = array of TNodeOSM;
  TArrWayOSM = array of array of Integer;
  TOSM_XMLDocument = class(TXMLDocument)
  private
    { Private declarations }
  protected
    { Protected declarations }
  public
    { Public declarations }
    ArrNodeOSM:TArrNodeOSM;
    ArrHouseOSM,ArrStreetOSM:TArrWayOSM;
    MinPoint, MaxPoint:TNodeOSM;
//    procedure Parse;
    procedure SetActive(const Value: Boolean); override;
  published
    { Published declarations }
  end;

procedure Register;

implementation

procedure TOSM_XMLDocument.SetActive(const Value: Boolean);
var i,j,y,sch1,sch2,sch3,sch4:integer;
    log:byte;
begin
  inherited SetActive(Value);

 //мой код

end;

procedure Register;
begin
  RegisterComponents('OSM', [TOSM_XMLDocument]);
end;

end.
2 Компонент на основе TImage

Код:
unit OSM_Image;

interface

uses
  System.SysUtils, System.Classes, Vcl.Controls, Vcl.ExtCtrls, Vcl.Graphics, OSM_XMLDocument;

type
  TOSMImage = class(TImage)
  private
    { Private declarations }
    FRoadColor:TColor;
    FHouseColor:TColor;
    FLandColor:TColor;
    FOSM_XMLDocument:TOSM_XMLDocument;
  protected
    { Protected declarations }
  public
    { Public declarations }
  published
    { Published declarations }
    property RoadColor: TColor read FRoadColor write FRoadColor;
    property HouseColor: TColor read FHouseColor write FHouseColor;
    property LandColor: TColor read FLandColor write FLandColor;
    property XML_Map: TOSM_XMLDocument read FOSM_XMLDocument write FOSM_XMLDocument;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('OSM', [TOSMImage]);
end;

end.
Что мне дописать во 2 компонент что бы он реагировал или какое событие отслеживать?
xabik вне форума Ответить с цитированием
Старый 03.05.2012, 10:42   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,337
По умолчанию

Цитата:
и мне необходимо что бы при изменении первого компонента а именно свойства Active
чтобы кого-то (TmyImage) известь о чем-либо, надо об этом ком-то(TmyImage) знать. Т.е. ваш компонент ДОЛЖЕН ЗНАТЬ о связаноом с ним Image. и также знать как с ним связаться (знать имя метода/ функции/ процедуры для связи).

Цитата:
то есть типа ImgParent у вашего TXMLDocument типа TMyImage.
и при изменении состояния он извещает родителя.
прямая связь 1:1(т.е. один XMLdocumnt знает ровно об одном MyImage.

Это
Цитата:
ImgParent у вашего TXMLDocument типа TMyImage.
заполняется при присоединении XMLDocumnt к МyImage.
Код:
TMyImage = class
procedure SetXMLDocumnat(xml: .....);

property xml: TMyXMLDocument write SetXMLdocument;
end;
Код:
procedure TMyImage.SetXMLDocumnat(xml: .....);
begin
  FXML:=xml; // Image знаком с XML
  xml.ImgParent:=self; //  и обратно XML знает о своем Image
end;
Код:
procedure TOSM_XMLDocument.SetActive(const Value: Boolean);
var i,j,y,sch1,sch2,sch3,sch4:integer;
    log:byte;
begin
  inherited SetActive(Value);

  //мой код
  ///   и также знать как с ним связаться (знать имя метода/ функции/ процедуры для связи).
  ImgParent.XMLActived(true); // к примеру

end;
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 03.05.2012 в 10:47.
evg_m вне форума Ответить с цитированием
Старый 03.05.2012, 10:51   #5
xabik
Пользователь
 
Регистрация: 03.06.2009
Сообщений: 22
По умолчанию

Т.е. записывать значение свойства не напрямую а через метод и в методе прописывать извещения об изменениях компонента? Так?

Это будет работать на этапе конструирования формы?

И ещё... в процедуре Вы прописали запись в поля компонентов ссылок на друг друга - это понятно. Как теперь MyImage будет что то рисовать если по сути изменился другой компонент. Наверное это решается событиями? Как написать событие для отрисовки данных, которые можно взять из активного XMLDocument

Последний раз редактировалось xabik; 03.05.2012 в 11:14.
xabik вне форума Ответить с цитированием
Старый 03.05.2012, 18:23   #6
xabik
Пользователь
 
Регистрация: 03.06.2009
Сообщений: 22
По умолчанию

Ещё проблема появилась.

Когда вписываю новое поле для TXMLDocument типа TMyImage появляется ошибка так как такого типа нет в этом модуле. Прописываю в uses модуль и вся среда наглухо виснет!!! Там вроде как получается закольцованность т.к. в модуле с компонентом TMyImage также есть ссылка на TXMLDocument модуль...
xabik вне форума Ответить с цитированием
Старый 05.05.2012, 08:36   #7
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,337
По умолчанию

XMLDocument ничего не знающий по MyImage, но могущий с ним общаться путем процедур Event_X_XML
Код:
TMyXMLDocumet =class;

TXMLLink =class(TObject)
private
  FXML: TMyXMLDocument;
public
  property XML: TMyXMLdocument;
protected
// процедуры и функции посредством который XMLdocument 
 может сообщить/узнать необходимую информацию
  procedyre Event_1_XML(); virtual;
  function Event_2_XML: TDate; virtual;
end;

TMyXMLdocument =class(TXMLDocumnt)
private
  FXMLLink: TXMLLink;
public
  property XMLLink: TXMLLink;
end;
теперь MyImage
Код:
TImageXMLLink =class;

TMyImage =class(TImage)
private
  FXMLLink: TImageXMLLink;
  procedure SetXML(val: TMyXMLDocument);
  function GetXML: TXMLdocument;
public
  XML: TXMLDocument read GetXML write SetXML;
end;

наследник класса общения, который раньше знал только по MyXMLDocument теперь знает и проMyImage
TImageXMLLink =class(TXMLLink)
private
  FImage: TMyImage;
proyected
  property MyImage: TMyImage;
// переписываем процедуры  общения
  procedyre Event_1_XML(); override;
  function Event_2_XML: TDate; override;
end;

procedure TMyImage.SetXML(val: TMyXMLdocumant);
begin
  fxMLLink.XML:=val;
end;

function TMyImage.GetXML: TMyXMLDocument;
begin
  result:=FxmlLink.XML;
end;
Код:
/////////////////////////////
// конечно же где-то ОДИН РАЗ должно быть (лучше в конструкторе)
  fXMLLink:=TImageXMLLink.Create;
  fXMLLink.MyImage:=self;

// и где-то (дестррукторе)
  FXMLLink.Free;
///////////////////////////////////////////
как проходит общение
Код:
procedure TMyXMLdocument.Active;
begin
  ........
  XMLLink.Event_1_XML; // "сообщаем" о событии
end;
Код:
procedure TImageXMLLink.Event_1_XML;
begin
 // "реагируем" на событие
   XML  / наш документ
  ImageXML  // наша картина 
end;
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 05.05.2012 в 08:47.
evg_m вне форума Ответить с цитированием
Старый 05.05.2012, 10:26   #8
=master=
Форумчанин
 
Регистрация: 26.03.2012
Сообщений: 665
По умолчанию

Может воспользоватся механизмом нотификации (Notification), который уже есть в TComponent ?
=master= вне форума Ответить с цитированием
Старый 07.05.2012, 00:06   #9
xabik
Пользователь
 
Регистрация: 03.06.2009
Сообщений: 22
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
XMLDocument ничего не знающий по MyImage, но могущий с ним общаться путем процедур Event_X_XML
Код:
TMyXMLDocumet =class;

TXMLLink =class(TObject)
private
  FXML: TMyXMLDocument;
public
  property XML: TMyXMLdocument;
protected
// процедуры и функции посредством который XMLdocument 
 может сообщить/узнать необходимую информацию
  procedyre Event_1_XML(); virtual;
  function Event_2_XML: TDate; virtual;
end;

TMyXMLdocument =class(TXMLDocumnt)
private
  FXMLLink: TXMLLink;
public
  property XMLLink: TXMLLink;
end;
Как можно написать такой код? Если в одном классе идет ссылка на второй описанный ниже, а во втором на первый. Как класс который описан выше будет знать о том что ниже?
xabik вне форума Ответить с цитированием
Старый 07.05.2012, 00:09   #10
xabik
Пользователь
 
Регистрация: 03.06.2009
Сообщений: 22
По умолчанию

Цитата:
Сообщение от xabik Посмотреть сообщение
Как можно написать такой код? Если в одном классе идет ссылка на второй описанный ниже, а во втором на первый. Как класс который описан выше будет знать о том что ниже?
Виноват. Вроде получилось. С таким я не встречался - это упреждающее описание класса? Да?
Код:
  TMyXMLDocument = class;

Круть!!! Даже скомпилилось... Завтра посмотрю с утречка. СПАСИБО ОГРОМНОЕ!

Последний раз редактировалось xabik; 07.05.2012 в 00:36.
xabik вне форума Ответить с цитированием
Ответ
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
TImage определения типа изображения Anubys C++ Builder 2 06.04.2012 22:02
Движение компонента TImage. Averon C++ Builder 4 04.11.2011 19:57
Движение компонента TImage. Averon C++ Builder 0 04.11.2011 18:35
Синхронизация визуального компонента (label) поверх TImage с возможностью прокрутки/маштабир. последнего Hmmmm Мультимедиа в Delphi 1 20.05.2011 14:34
Почему у компонента TImage не работает метод Perform? devi409 Win Api 7 22.12.2008 17:51

Реклама для незарегистрированных, регистрация на форуме