Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> компонент светофор на основе PaintBox 
:(
    Опции темы
cmygeHm
Дата 25.12.2009, 08:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 3.12.2008

Репутация: нет
Всего: -2



ребят пишу светофор. впринципе все работает. есть небольшие тонкости, которые я все еще не знаю. Помогите пожалуйста.
Вот код компонента:

Код:

Код

unit UnitLightSwitcher;

interface

uses
  SysUtils, Classes, Controls, ExtCtrls, Graphics, Windows, Dialogs;

type
  TMyPaintBox = class(TPaintBox)
  private
      MySpeed: integer;
      MyBgColor, MyGreenColor, MyYellowColor, MyRedColor: TColor;
      GreenYellow, YellowRed, RedYellow, YellowGreen: boolean;
      Timer1: TTimer;
      FOnRed: TNotifyEvent;
  protected
    { Protected declarations }
  public
    constructor Create(AOwner: TComponent);
    procedure Paint; override;
    procedure SwitchYellow();
    procedure SwitchRed();
    procedure SwitchGreen();
    procedure MyTimerEventHandler(Sender: TObject);
    procedure SetMySpeed(arg: integer);
  published
    property Speed: integer write SetMySpeed default 1000;
    property OnRed: TNotifyEvent read FOnRed write FOnRed;
    property Height default 300;
    property Width default 100;

  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Standard', [TMyPaintBox]);
end;

constructor TMyPaintBox.Create(AOwner: TComponent);
begin
    inherited Create(AOwner);
    MyBgColor:=clBlack;
    MyGreenColor:=RGB(0, 255, 0);//clGreen;
    MyYellowColor:=RGB(190, 150, 0);
    MyRedColor:=RGB(190, 43, 43);
    MySpeed:=100;
    Timer1:=TTimer.Create(Self);
    Timer1.Interval:=MySpeed;
    Timer1.Enabled := true;
    Timer1.OnTimer := MyTimerEventHandler;
    YellowGreen:=true;    // ecia?aeuii ai?eo caeaiiue, oi anou yeiau i?iecioei ia?aee??aiea n ?aeoiai ia caeaiue


end;

procedure TMyPaintBox.Paint;
begin
  inherited;

  Canvas.Brush.Color:=MyBgColor;
  Canvas.FillRect(Rect(0,0,100,300));

  Canvas.Brush.Color:=MyRedColor;
  Canvas.Ellipse(Rect(0, 0, 100, 100));

  Canvas.Brush.Color:=MyYellowColor;
  Canvas.Ellipse(Rect(0, 100, 100, 200));

  Canvas.Brush.Color:=MyGreenColor;
  Canvas.Ellipse(Rect(0, 200, 100, 300));

end;
procedure TMyPaintBox.SwitchYellow();
begin
        MyGreenColor:=clGreen;
        MyYellowColor:=clYellow;
        MyRedColor:=RGB(190, 43, 43);
        Paint;
end;

procedure TMyPaintBox.SwitchRed();
begin
        if Assigned(OnRed) then OnRed(Self);
        MyGreenColor:=clGreen;
        MyYellowColor:=RGB(190, 150, 0);
        MyRedColor:=clRed;
        Paint;
end;
procedure TMyPaintBox.SwitchGreen();
begin

    MyGreenColor:=RGB(0, 255, 0);//clGreen;
    MyYellowColor:=RGB(190, 150, 0);
    MyRedColor:=RGB(190, 43, 43);
    Paint;
end;

procedure TMyPaintBox.MyTimerEventHandler(Sender: TObject);
begin
     if (YellowGreen=true) then                    // anee iineaaiee ?ac aue ia?aoia n ?aeoiai ia caeaiue,
    begin                                         // oi iaai naaeaou ia?aoia n caeaiiai ia ?aeoue
        YellowGreen:=false; // noe?aai eioi?iaoe? i oii, ?oi iineaaiee ?ac ia?aoia aue n ?aeoiai ia caeaiue
        GreenYellow:=true;  // iiia?aai ?oi nae?an i?iecaaaai ia?aoia n caeaiiai ia ?aeoue
        SwitchYellow();
    end
  else if(YellowRed=true) then                  // anee ?a iineaaiee ia?aoia i?iecaiaeeny n ?aeoiai ia e?aniue,
    begin                                         // oi aaeaai ia?aoia n e?aniiai ia ?aeoue
        YellowRed:=false;
        RedYellow:=true;   // iiia?aai ?oi nae?an i?iecieaao ia?aoia n e?aniiai ia ?aeoue
        SwitchYellow();
    end
  else if (GreenYellow=true) then       // anee iineaaiee ia?aoia aue n caeaiiai ia ?aeoue, oi eiaai i?aai ca?a?u e?aniue, eia?a ie?aai ia aaeaai
    begin
        GreenYellow:=False;       // noe?aai eioi?iaoe? i iineaaiai ia?aoiaa
        YellowRed:=true;          // iiia?aai ?oi nae?an naaeaai ia?aoia n ?aeoiai ia e?aniue
        SwitchRed();
    end
  else if (RedYellow=true) then
    begin
    RedYellow:=false;
    YellowGreen:=true;
    SwitchGreen();
    end;
end;
procedure TMyPaintBox.SetMySpeed(arg: integer);
begin
    MySpeed:=arg;
    Timer1.Interval:=arg;
end;

end.
Если вы заметили. то я свойству Width И Heigth задал дефолт-значение 100 и 300. Но когда я помещаю пэйнтбокс на форму, ее размеры по прежнему 105 на 105, как у "папы"-пэйнтбокса.
И событие OnRed не срабатывает. Не знаю почему... Спасибо. 
PM MAIL   Вверх
sCreator
Дата 25.12.2009, 09:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 20.8.2009
Где: Московская област ь

Репутация: нет
Всего: 5



То, что Ты написал
Код

property Height default 300;
Это Ты только сообщил дизайнеру, что такое значение сохранять в dfm ненадо.
Чтобы задать значение по умолчанию, надо в конструкторе прописать
Код

constructor TMyPaintBox.Create(AOwner: TComponent);
begin
    inherited Create(AOwner);
    Height := 300;
//.....


( по идее, если Ты сейчас ничего не правя в дизайнере задашь Height = 300 то оно не сохранится и при запуске будет высота предка, а 301 сохранится - если попробуешь до правки скажи что получилось ).
PM   Вверх
bems
Дата 25.12.2009, 09:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



Не задал ты значения по умолчанию. Слово default означает что при данном значении свйства его не нужно сохранять в dfm-файл, т.к. это значение по умолчанию, но не избавляет от необходимости присваивания дефолтных значений в конструкторе.

Добавлено через 37 секунд
sCreator, быстро, да smile


--------------------
Обижено школьников: 8
PM MAIL   Вверх
cmygeHm
Дата 25.12.2009, 09:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 3.12.2008

Репутация: нет
Всего: -2



спасибо. сейчас попробую, но я так вродебы пробывал. хотя... а про событие??? почему оно не срабатывает???

а inherited надо писать??? 
Код

constructor TMyPaintBox.Create(AOwner: TComponent);
begin
    inherited Create(AOwner);
    inherited  Height := 300;



Попробывал так:
Код

    inherited   Height := 300;
     inherited  Width:=100;


И так:
Код

    Height := 300;
    Width:=100;

Не работает!
Ложу компонент на форму и он такойже 105 на 105 :(

Это сообщение отредактировал(а) cmygeHm - 25.12.2009, 10:37
PM MAIL   Вверх
cmygeHm
Дата 25.12.2009, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 3.12.2008

Репутация: нет
Всего: -2



Код

 public
    constructor Create(AOwner: TComponent); override;


Вот так работает!

Теперь не могу событие заставить сработать :(

Добавлено через 12 минут и 33 секунды
все работает smile спасибо smile пообщался сам с собой smile

Это сообщение отредактировал(а) cmygeHm - 25.12.2009, 10:58
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0683 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.