Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.08.2011, 02:47   #1
maxeebon
 
Регистрация: 09.08.2011
Сообщений: 8
По умолчанию как описать событие?

Создаю свой компонент на базе TPaintBox, подскажите как мне описать событие OnMouseDown. Событие должно работать также как в TPaintBox только дополнительно выполнять определенный код.
maxeebon вне форума Ответить с цитированием
Старый 09.08.2011, 09:59   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Обработчик OnMouseDown вызывается из метода MouseDown. Следовательно можно так попробовать
Код:
...

type
  TMyPaintBox = class(TPaintBox)
  protected
    procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
  end;

...

implementation

...

procedure TMyPaintBox.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
// здесь мой код или после inherited
  inherited;
end;

...
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 09.08.2011, 12:08   #3
maxeebon
 
Регистрация: 09.08.2011
Сообщений: 8
По умолчанию

Появилась еще 1на небольшая проблемка у меня есть такая структура
Код:
 
TCell = class
 private
   FValue: boolean;
   FRules: array [0..9] of string;
   FRulesCount: byte;
   function GetRules(index: integer): string;
   procedure SetRules(index: integer; value: string);
 public
  property Value: boolean read Fvalue write Fvalue;
  property RulesCount: byte read FRulesCount write Frulescount;
  property Rules[index: integer]: String read GetRules write SetRules;
 end;

TWebBox = class(TPaintBox)
 private
  ...
  FCells: array of array of TCell;
 public
   ...
   procedure Draw;
   property Cells[Row,Col: integer]: TCell read GetCells write SetCells;
 end;
Нужно чтобы при изменения поля value в TCell вызывался метод Draw. Как это реализовать?
maxeebon вне форума Ответить с цитированием
Старый 09.08.2011, 12:29   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,542
По умолчанию

Цитата:
Нужно чтобы при изменения поля value в TCell вызывался метод Draw. Как это реализовать?
чей метод? Tcell или другого класса?

для СВОЕГО(Tcell) метода.
Код:
  property Value: boolean read Fvalue write Setvalue;
private
  procedure SetValue(val: boolean);
.....
Код:
procedure TCell.SetValue(val: boolean);
begin
  Fvalue:=val;
  Draw();
end;
для ЧУЖОГО метода добавить к первому
Код:
TDrawEvnt =procedure <спсиок формальных параметров> of object;  

TCell
private
  FonDraw: TDrawEvent;
public
  property OnDraw: TDrawEvent read FonDraw write FonDraw;
Код:
r:=Tcell.Create;
r.onDraw:=xxx.Draw;
Код:
procedure Tcell.Draw;
begin
  if assigned(FonDraw) then Fondraw(....);
end;
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 09.08.2011 в 12:35.
evg_m вне форума Ответить с цитированием
Старый 09.08.2011, 12:37   #5
maxeebon
 
Регистрация: 09.08.2011
Сообщений: 8
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
чей метод? Tcell или другого класса?
Да это метод другово класса TWebBox, у него есть массив ячеек TCell
то есть если задать например вот так:
Код:

...
type
  WebBox1: TWebBox;
...

procedure TForm1.Button1Click(Sender: TObject);
begin
 Webbox1.Cells[0,0].Value := true;
end;
Нужно что бы вызывался метод Draw (Webbox1.Draw)

Последний раз редактировалось maxeebon; 09.08.2011 в 12:45.
maxeebon вне форума Ответить с цитированием
Старый 09.08.2011, 12:53   #6
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

через событие, как выше написали, или передавать в конструктор ссылку на TWebBox, и затем:

Код:
procedure TCell.SetValue(val: boolean);
begin
  if (Fvalue <> val) then begin
    //
    Fvalue := val;
    MasterPaintBox.Draw();
  end;
end;
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 09.08.2011, 13:32   #7
maxeebon
 
Регистрация: 09.08.2011
Сообщений: 8
По умолчанию

Цитата:
Сообщение от veniside Посмотреть сообщение
через событие, как выше написали, или передавать в конструктор ссылку на TWebBox, и затем:

Код:
procedure TCell.SetValue(val: boolean);
begin
  if (Fvalue <> val) then begin
    //
    Fvalue := val;
    MasterPaintBox.Draw();
  end;
end;
А как конструктору TCell понят полем какого обьекта он является?
maxeebon вне форума Ответить с цитированием
Старый 09.08.2011, 13:36   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

тяжелый случай...учите основы классов.
а именно Self(Я), причем он может быть опущен.

то есть
Код:
procedure TCell.SetValue(val: boolean);
begin
  Fvalue:=val;
  Draw();
end;
равносильно
Код:
procedure TCell.SetValue(val: boolean);
begin
  Self.Fvalue:=val;
  Draw();
end;
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 09.08.2011, 13:47   #9
maxeebon
 
Регистрация: 09.08.2011
Сообщений: 8
По умолчанию

Я наверно некорректно выразился, про Self я знаю. Я имелл ввиду что TCell является полем класса TWebBox и я никак немогу понять как передать ссылку этого класса TWebBox конструктору TCell как советовали выше.
maxeebon вне форума Ответить с цитированием
Старый 09.08.2011, 13:53   #10
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Код:
TWebBox = class; // forward reference

TCell = class
  MasterPaintBox: TWebBox;
  //
  constructor Create(Master: TWebBox);
end;

constructor TCell.Create(Master: TWebBox);
begin
  MasterPaintBox := Master;
  //
  inherited Create();
end;
Ну и при создании клетки:

Код:
procedure TWebBox.AddCell(row, col: Integer);
begin
  //
  // !resize FCells as needed here!
  //
  FCells[row, col] := TCell.Create(Self);
end;
типа того
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как описать класс на языке С# ? diliana Помощь студентам 8 20.04.2010 17:01
гиперссылки как описать нумерацию страниц sttasy HTML и CSS 1 01.04.2010 10:23
Не знаю как описАть вопрос ToBs Помощь студентам 2 17.12.2009 20:44
Как правильно описать функцию? аукшщ Общие вопросы C/C++ 2 19.01.2009 11:37