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

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

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


Ответ
 
Опции темы
Старый 22.04.2009, 16:23   #1
Neobrat
Форумчанин
 
Регистрация: 10.12.2007
Сообщений: 124
По умолчанию Создание компонента

Доброго времени суток...

решил вот для своего удобства создать свой компонент.
Порылся по инету почитал, создать сам компонент да и свой пакет не такая уж и сложная задача.

Но тут наткнулься на стену)
Мне необходимо чтоб в компоненте можно было добавить колекцию.
Т.е. чтоб в во время дизайна можно было добавлять элементы колекции со своими параметрами..

Решил для примера решить такую вот задачу.

Создать компонент на основе TButton.
В нем реализовать счетчик нажатий.
На каждое нажатие чтоб выводилось в Caption кнопки количество нажатий и в добавок определеную строчку.

Вот эти самые определенные строчки и надо добавить-редактировать в disign-time

вот сам код компонента и колекции
Код:
unit IncButtonCollection;

interface
uses   SysUtils, Classes, Controls, StdCtrls;
type

 TIncButtonCollection = class;
 TTestCollection = class(TButton)
 private
  Fix:integer;
  FCollection:TIncButtonCollection;
  procedure SetCollection(Value: TIncButtonCollection);
 protected
   { Protected declarations }
 public
  procedure Click; override;
  constructor Create(AOwner: TComponent); override;
  property Ix:integer read Fix write Fix;
 published
  property Collection:TIncButtonCollection read FCollection write SetCollection;
 end;

 {TIncButtonItem}

 TIncButtonItem=class(TCollectionItem)
 private
  FOwner:TIncButtonCollection;
  FCaption:string;
  FIndex:Integer;
 protected
 public
  property Index:integer read FIndex;
  property Caption:string read FCaption write FCaption;
  constructor Create(AOwner: TCollection); override;
 end;
 {TIncButtonCollection}

 TIncButtonCollection=class(TCollection)
 FOwner:TTestCollection;
 private
 FCount:integer;
  function GetItem(Index: Integer): TIncButtonItem;
  procedure SetItem(Index: Integer; Value: TIncButtonItem);
 protected
  function GetOwner: TPersistent; override;
  procedure Added(var Item:TCollectionItem); override;
 public
  constructor Create(AOwner: TTestCollection);
  function Add:TIncButtonItem;
  function Owner: TTestCollection;
  property Items[Index: Integer]:TIncButtonItem read GetItem write SetItem; default;
end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('MyPalette', [TTestCollection]);
end;


{ TIncButtonCollection }

function TIncButtonCollection.Add: TIncButtonItem;
begin
result:=TIncButtonItem(inherited Add);
end;

function TIncButtonCollection.GetItem(Index: Integer): TIncButtonItem;
begin
Result := TIncButtonItem(inherited GetItem(Index))
end;

procedure TIncButtonCollection.SetItem(Index:Integer; Value:TIncButtonItem);
begin
inherited SetItem(Index,Value);
end;

function TIncButtonCollection.GetOwner: TPersistent;
begin result:=FOwner; end;

constructor TIncButtonCollection.Create(AOwner: TTestCollection);
begin
 inherited Create(TIncButtonItem);
  FOwner := AOwner;
  FCount:=0;
end;

function TIncButtonCollection.Owner: TTestCollection;
begin Result:=FOwner; end;


procedure TIncButtonCollection.Added(var Item: TCollectionItem);
begin
  inherited;
Inc(FCount);
end;

{ TIncButtonItem }

constructor TIncButtonItem.Create(AOwner: TCollection);
begin
  inherited Create(AOwner);
  FOwner := TIncButtonCollection(AOwner);
  Caption:='NewCaption';
  FIndex:=TIncButtonCollection(AOwner).Count+1;
end;

{ TTestCollection }

procedure TTestCollection.Click;
var ix:integer;
begin
  inherited Click;
Inc(FIx);
Caption:=IntToStr(ix);
{
что то в этом роде
if ix<FCollection.Count then
Caption:=Caption+' '+FCollection.Items[ix].Caption;
}
end;

constructor TTestCollection.Create(AOwner: TComponent);
begin
  inherited;
Fix:=0;
end;



procedure TTestCollection.SetCollection(Value: TIncButtonCollection);
begin
 FCollection.Assign(Value);
end;


end.
думаю что что то нехватает, но чего именно не пойму..



буду благадарен за любую подсказку.

p.s. не предлагать заменить колекцию на скажем TStringList понятно что можно и при помоши него это сделать..
это тестовый пример, в реале у элемента колекции много параметров
Русский язык не мой конёк

Последний раз редактировалось Neobrat; 22.04.2009 в 16:29.
Neobrat вне форума Ответить с цитированием
Старый 22.04.2009, 16:58   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,003
По умолчанию

скачай и почитай книгу исскуство создания компонентов, там описанно как делать свои редакторы свойств для дизайн-тайма
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 26.04.2009, 11:17   #3
cdef962
Заблокирован
 
Регистрация: 26.04.2009
Сообщений: 1
Смущение Re to

So nice analysis. Good point.I think you could try runescapeand Maple Story Mesos.
cdef962 вне форума Ответить с цитированием
Старый 01.05.2009, 09:52   #4
Oburec
Пользователь
 
Регистрация: 21.03.2009
Сообщений: 33
По умолчанию

Читай раздел главы 22 в приведенной книге и будет тебе счастье...
http://slil.ru/27499934

Стив Тейксейра, Ксавье Пачеко.
Delphi 5. Руководство разработчика

Также книгу можно найти на ftp podgoretsky.com
Oburec вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание OCX kiloz Общие вопросы Delphi 3 16.03.2009 23:02
Создание мастера Bayazet Общие вопросы Delphi 1 03.03.2009 14:21
Создание архива Aндрей Помощь студентам 1 28.02.2009 03:35
создание форума Typoy Свободное общение 5 09.06.2008 12:01