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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.01.2014, 03:44   #1
ardor
Пользователь
 
Регистрация: 16.11.2009
Сообщений: 51
По умолчанию Создание компонент: Свойства-объекты

Здрасте.
По заданию нужно создать компонент часы. в нем свойство Time - объект созданного класса.

Код:
TTime = class(TPersistent)
  private
    FHour:Integer;
    FMinute:Integer;
  public
       procedure SetHour(Value: Integer);
       procedure SetMinute(Value: Integer);
  published
    property Hour:Integer read FHour write SetHour;
    property Minute:Integer read FMinute write SetMinute;
  end;
  TClock3 = class(TCustomPanel)
Написать не проблема. Свойство появилось.
Но как заставить компонент реагировать на изменение этого свойства?

Вот это не срабатывает, при изменении поля FHour or FMinute...
Код:
property Time: TTime read FTime write SetTime;
Код:
procedure TClock3.SetTime(Value: TTime);
begin
  FTime := Value;
  ShowMessage('AAA');
  if(FHalf = AM) then Caption := IntToStr(FTime.FHour) + ':' + IntToStr(FTime.FMinute) + ' AM';
  if(FHalf = PM) then Caption := IntToStr(FTime.FHour) + ':' + IntToStr(FTime.FMinute) + ' PM';
end;
P.S. На всякий случай привожу весь код:
Код:
unit Clock3;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls;

type
  THalf = (AM, PM);
  TTime = class(TPersistent)
  private
    FHour:Integer;
    FMinute:Integer;
  public
       procedure SetHour(Value: Integer);
       procedure SetMinute(Value: Integer);
  published
    property Hour:Integer read FHour write SetHour;
    property Minute:Integer read FMinute write SetMinute;
  end;
  TClock3 = class(TCustomPanel)

  private
    { Private declarations }
    FTime: TTime;
    FHalf:THalf;
  protected
    { Protected declarations }
  public
    { Public declarations }

       procedure SetTime(Value: TTime);
       procedure SetHalf(Value: THalf);
  published
    { Published declarations }
    constructor Create(aowner:Tcomponent);override;
    property Height default 30;
    property Width default 45;
    property Half: THalf read FHalf write SetHalf;
    property Time: TTime read FTime write SetTime;
  end;

procedure Register;

implementation

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

constructor TClock3.Create(aowner:Tcomponent);
begin
  inherited create(Aowner);
  FTime:= TTime.Create;
  FTime.FHour := StrToInt(FormatDateTime('hh', SysUtils.Time));
  FTime.FMinute := StrToInt(FormatDateTime('nn', SysUtils.Time));
  Caption := IntToStr(FTime.FHour) + ':' + IntToStr(FTime.FMinute) + ' AM';
  Width := 75;
end;

procedure TClock3.SetHalf(Value: THalf);
begin
  FHalf := Value;
  if(FHalf = AM) then Caption := IntToStr(FTime.FHour) + ':' + IntToStr(FTime.FMinute) + ' AM';
  if(FHalf = PM) then Caption := IntToStr(FTime.FHour) + ':' + IntToStr(FTime.FMinute) + ' PM';
end;

procedure TTime.SetHour(Value: Integer);
begin
  FHour := Value;
end;

procedure TTime.SetMinute(Value: Integer);
begin
  FMinute := Value;
end;

procedure TClock3.SetTime(Value: TTime);
begin
  FTime := Value;
  ShowMessage('AAA');
  if(FHalf = AM) then Caption := IntToStr(FTime.FHour) + ':' + IntToStr(FTime.FMinute) + ' AM';
  if(FHalf = PM) then Caption := IntToStr(FTime.FHour) + ':' + IntToStr(FTime.FMinute) + ' PM';
end;

end.
ardor вне форума Ответить с цитированием
Старый 30.01.2014, 03:58   #2
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

Тут ошибок больше чем букв. Как так умудрились?
eval вне форума Ответить с цитированием
Старый 30.01.2014, 04:23   #3
Streletz
Старожил
 
Регистрация: 03.01.2014
Сообщений: 2,870
По умолчанию

Цитата:
Но как заставить компонент реагировать на изменение этого свойства?

Вот это не срабатывает, при изменении поля FHour or FMinute...
Ничего удивительного. Потому, что в процедуре SetTime, которая в задаёт значение поля FTime, они не изменяются. Посмотрите внимательнее на её код. В ней Вы читаете поле, а не записываете.То есть, делаете всё наоборот.
Для изменения поля FTime, согласно представленному коду, необходимо использовать методы SetHour и SetMinute класса TTime.
Можно попробовать переименовать исходный вариант SetTime в ReadTime и заново написать метод SetTime уже как положено. Тогда свойство примет вид:
Код:
property Time: TTime read ReadTime write SetTime;
Streletz вне форума Ответить с цитированием
Старый 30.01.2014, 10:19   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Я бы посоветовал использовать RTTI в связке с TVirtualStringTree.RTTI обеспечивает доступ ко всем свойствам класса/объекта, а VST легко даёт возможнсть разместить не стандартный редактор ячейки.

/* Пост не в тему */
Человек_Борща вне форума Ответить с цитированием
Старый 30.01.2014, 14:24   #5
ardor
Пользователь
 
Регистрация: 16.11.2009
Сообщений: 51
По умолчанию

Цитата:
Сообщение от eval Посмотреть сообщение
Тут ошибок больше чем букв. Как так умудрились?
Где вы тут ошибки нашли? Все компилируется и работает, за исключением отсутствия реакции на изменение свойства.

Цитата:
property Time: TTime read ReadTime write SetTime;
Тут как-раз таки правильно у меня. Дело в том, что это свойство вообще никак не срабатывает. Т.к. меняется значение в объекте класса, а не в самой ячейке...

Цитата:
Я бы посоветовал использовать RTTI в связке с TVirtualStringTree.RTTI обеспечивает доступ ко всем свойствам класса/объекта, а VST легко даёт возможнсть разместить не стандартный редактор ячейки.
Я бы с радостью, но тут нужно разобраться стандартными и наиболее простыми методами, т.к. это пример задачи для Гос.экзамена. И излишнее усложнение ни к чему хорошему не приведет. + не факт что на универских компах будут необходимые классы.
ardor вне форума Ответить с цитированием
Старый 30.01.2014, 15:05   #6
Streletz
Старожил
 
Регистрация: 03.01.2014
Сообщений: 2,870
По умолчанию

Простите, но Вы не внимательно прочитали мой пост и , следовательно, не правильно его поняли.
Это
Код:
property Time: TTime read ReadTime write SetTime;
я посоветовал просто как вариант.
Цитата:
Дело в том, что это свойство вообще никак не срабатывает. Т.к. меняется значение в объекте класса, а не в самой ячейке...
Вы внимательно посмотрели Ваш код метода SetTime? Значение параметра в него вообще попадает? Вы гоняли метод SetTime по точкам останова? Что выдаёт отладчик Delphi?
Streletz вне форума Ответить с цитированием
Старый 30.01.2014, 15:14   #7
ardor
Пользователь
 
Регистрация: 16.11.2009
Сообщений: 51
По умолчанию

Цитата:
Сообщение от Streletz Посмотреть сообщение
Вы внимательно посмотрели Ваш код метода SetTime? Значение параметра в него вообще попадает? Вы гоняли метод SetTime по точкам останова? Что выдаёт отладчик Delphi?
Извиняюсь за возможно глупый вопрос, но как отлаживать код компонента? Его же запустить невозможно...
ardor вне форума Ответить с цитированием
Старый 30.01.2014, 15:16   #8
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

то что оно компилируеться еще не значит что правильно, кривое не может стать прямым
eval вне форума Ответить с цитированием
Старый 30.01.2014, 15:17   #9
doktor255
Заблокирован
 
Регистрация: 31.03.2011
Сообщений: 976
По умолчанию

Цитата:
Сообщение от eval Посмотреть сообщение
кривое не может стать прямым
А если попробовать выпрямить, сможет?
doktor255 вне форума Ответить с цитированием
Старый 30.01.2014, 15:31   #10
Streletz
Старожил
 
Регистрация: 03.01.2014
Сообщений: 2,870
Вопрос

Цитата:
Сообщение от ardor Посмотреть сообщение
Извиняюсь за возможно глупый вопрос, но как отлаживать код компонента? Его же запустить невозможно...
Простите за встречный вопрос, а программу с формой, на которой этот компонент, запустить возможно? Пишите тестовое приложение...
Streletz вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
В окне перемещаются объекты, отталкиваясь от стенок окна. Каждый объект имеет свой поток, перемещающий его. Встретившись, объекты ИльназВ C# (си шарп) 13 22.11.2012 19:00
Объекты создание, уничтожение, действие gromdel Общие вопросы Delphi 9 25.04.2012 13:20
Динамическое создание и удаление компонент ArtGrek Общие вопросы Delphi 23 13.05.2011 10:29
[Проблема с работой BalmSoftPolyglot 1.7] В lng файл пишет свойства компонент! Ранее работало нормально! Человек_Борща Компоненты Delphi 0 08.02.2011 10:20
Создание собственных компонент shepelin Компоненты Delphi 5 22.12.2007 22:14