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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.02.2011, 04:37   #1
ArtGrek
DelphiProger
Участник клуба
 
Аватар для ArtGrek
 
Регистрация: 14.11.2010
Сообщений: 1,023
Стрелка Несколько компонент в 1 + новые своиства

Всем здравствуите!
Для моеи программы надо динамически создавать неопределеное количество
Код:
  Panels: TPanel; // компоненты ниже должны лежать на нем
    Images: TImage;
    Effects: TComboBox;
    EffectsL: TLabel;
    Intervals: TDecimalEdit;
    IntervalsL: TLabel;
    Checks: TCheckBox;
+ ко всему создаю много списков(TObjectList, TStringList) для хранения различных своиств каждого компонента
теперь решил, по совету умных людеи, попробывать написать свои компонент

1) подскажите где можно почитат об етом, полезную инфу
ато просто создание кнопки(скачал Dfaq с форума) со своиством Count и встроеным Timer, не очен мне раскрыло смыс создания компонент
2) как мне выберая родителя учест все компоненты
думаю, можно взять за основу TPanel, и его изменять
Код:
unit sArtPanel;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, sMemo, sPanel, sLabel, sEdit, sSpinEdit, ExtCtrls, sCheckBox,
  sSkinProvider, sSkinManager;  //нужны будут в дальнеишем, буду работать со Skins
type
  TsArtPanel = class(TsPanel)
  private
    { Private declarations }
    FArtLines: TStrings;
  protected
    { Protected declarations }
  public
    { Public declarations }
  published
    { Published declarations }
    property ArtLines: TStrings read FArtLines write FArtLines;
    constructor Create(AOwner: TComponent); override;
  end;
procedure Register;
implementation
procedure Register;
begin
  RegisterComponents('NewPage', [TsArtPanel]);
end;
{ TsArtPanel }
constructor TsArtPanel.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
end;
end.
не густо конешно, но начало есть)
но вопросов теперь еше больше
например, как зделать, что б появившееся своиство ArtLines, заработало как своиство Lines у Memo
var
ArtMemo: TMemo;

а дальше...?

P.S. уже не говорю о том что одни ставят constructor в public, а другие в published, читал, но еше не разобрался, видимо на практике разбеусь
VirusN13
ArtGrek вне форума Ответить с цитированием
Старый 02.02.2011, 04:52   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> динамически создавать неопределеное количество

> написать свои компонент

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

> 1) подскажите где можно почитат об етом, полезную инфу

в хелпе.

> 2) как мне выберая родителя учест все компоненты

Набор слов с ошибками. Прочтите "Как нам реорганизовать рабкин". К Дельфи это отношения не имеет, зато название тоже красивое.

> FArtLines: TStrings;

неплохо бы в конструкторе это создать, раз уж вынесли в published.

> ArtMemo: TMemo;

мемо тут каким боком?

> одни ставят constructor в public

и это правильно.

> а другие в published

так делают только очень одарённые личности.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 02.02.2011, 05:19   #3
ArtGrek
DelphiProger
Участник клуба
 
Аватар для ArtGrek
 
Регистрация: 14.11.2010
Сообщений: 1,023
По умолчанию

Цитата:
> динамически создавать неопределеное количество

> написать свои компонент

Одно с другим слабо вяжется.
раньше создавал 50 TPanel, а на них: TImage; TComboBox; TLabel; TDecimalEdit; TLabel; TCheckBox;
сеичас хочу ето все объединить
Цитата:
Набор слов с ошибками.
я живу не в русско говорящеи стране и пишу по русски только здесь, нет практики, извените если что не так
Цитата:
неплохо бы в конструкторе это создать, раз уж вынесли в published.
kak?
Цитата:
> ArtMemo: TMemo;

мемо тут каким боком?
если без Memo откуда тогда брать своиство Lines?

Код:
...
inherited Create(AOwner);
  FArtLines := TStrings.Create;
...
[Warning] sArtPanel.pas(44): Constructing instance of 'TStrings' containing abstract method 'TStrings.Clear'
[Warning] sArtPanel.pas(44): Constructing instance of 'TStrings' containing abstract method 'TStrings.Delete'
[Warning] sArtPanel.pas(44): Constructing instance of 'TStrings' containing abstract method 'TStrings.Insert'
видимо надо создат метод удаления и вставки
abstract error во время сохранения проекта с моеи компонентаи
VirusN13

Последний раз редактировалось ArtGrek; 02.02.2011 в 06:02.
ArtGrek вне форума Ответить с цитированием
Старый 02.02.2011, 11:28   #4
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> раньше создавал 50 TPanel ... сеичас хочу ето все объединить

это понятно, просто не обязательно всё это оформлять именно в виде комопненты. Возможно, будет достаточно просто создать свой класс.

> я живу не в русско говорящеи стране

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

> kak?

FArtLines := TStringList.create();

> если без Memo откуда тогда брать своиство Lines?

FArtLines и будет вместо него.

> abstract error во время сохранения проекта с моеи компонентаи[/QUOTE]

Да, TStrings слишком абстрактен, нужно создавать одно из наследников, типа TStringList как выше.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 02.02.2011, 15:35   #5
ArtGrek
DelphiProger
Участник клуба
 
Аватар для ArtGrek
 
Регистрация: 14.11.2010
Сообщений: 1,023
По умолчанию

Код:
...
  private
    { Private declarations }
    FArtLines: TStrings;
...
constructor TsArtPanel.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FArtLines := TStringList.Create;
end;
появился редактор для строк, но как только заполнил его, сново началась серия ошибок типа
Цитата:
Access violation at address 40005A0C in module 'rtl70.bpl'. Read of address FFFFFFDD
подскажите пожалуста кто нибудь, что мне далше делать???
VirusN13

Последний раз редактировалось ArtGrek; 03.02.2011 в 00:22.
ArtGrek вне форума Ответить с цитированием
Старый 18.02.2011, 02:47   #6
ArtGrek
DelphiProger
Участник клуба
 
Аватар для ArtGrek
 
Регистрация: 14.11.2010
Сообщений: 1,023
По умолчанию

добавил на Panel Image как своиство, а строки не получилось
вот хотел посмотреть как создаеца StringList наследник Strings, но вот беда
uses System
Код:
constructor TObject.Create;
begin
end;
вот полазил в модуле Classes и выдернул ето
но и там нет самого создания, все его функции и своиства, даже Destroy, но Create нет, подскажите как быть?
как добавить моему Panel такое своиство как Строки?
Вложения
Тип файла: txt myStringList.txt (9.2 Кб, 145 просмотров)
VirusN13
ArtGrek вне форума Ответить с цитированием
Старый 18.02.2011, 11:04   #7
xexxex
Пользователь
 
Регистрация: 31.07.2010
Сообщений: 52
По умолчанию

Цитата:
как добавить моему Panel такое своиство как Строки?
Глянь например, как это делается в модуле ExtCtrls у класса TCustomRadioGroup.
Код:
....
property Items: TStrings read FItems write SetItems;
....
А может проще вместо панели\своего компонента заюзать TFrame? Навалить на него чего угодно, а потом создавать десятками и Parent := ...
Да и дизайн будет удобен, как будто на форме...
xexxex вне форума Ответить с цитированием
Старый 19.02.2011, 18:56   #8
ArtGrek
DelphiProger
Участник клуба
 
Аватар для ArtGrek
 
Регистрация: 14.11.2010
Сообщений: 1,023
По умолчанию

Цитата:
SetItems;
спасибо разобрался
----------------------------------------------------------------------
но теперь есть другая проблемка
у меня на Panel есть ComboBox и я хочу изменить ему рамер,
если програмно меня на форуме научили как ето делать,
но что б сохранить по умолчанию, чет не выходит
я уже чуть лучше ариентируюсь в модулях, но всетаки не нашел
подскажите как делаеца такое

вот сам компонент
Код:
unit sArtPanel;

interface

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

type
  TsArtPanel = class(TPanel)
  private
    { Private declarations } // Внутрение своиства. Для компонента
    FArtLines: TStrings;
    FArtImage: TImage;
    FArtCheckBox: TCheckBox;
    FArtComboBox: TComboBox;
    FArtComboBoxItemHeight: Integer;
    procedure SetArtLines(const Value: TStrings);
    procedure SetArtComboBoxItemHeight(const Value: Integer);
  protected
    { Protected declarations } // Внешние своиства. Для наследников
  public
    { Public declarations } // Не видно своиство в инспекторе объектов
  published
    { Published declarations } // Видно своиство в инспекторе оъектов
    property ArtLines: TStrings read FArtLines write SetArtLines;
    property ArtImage: TImage read FArtImage write FArtImage;
    property ArtCheckBox: TCheckBox read FArtCheckBox write FArtCheckBox;
    property ArtComboBox: TComboBox read FArtComboBox write FArtComboBox;
    property ArtComboBoxItemHeight: Integer read FArtComboBoxItemHeight write SetArtComboBoxItemHeight;
    constructor Create(AOwner: TComponent); override;

  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('NewPage', [TsArtPanel]);
end;

{ TsArtPanel }

constructor TsArtPanel.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  with TsArtPanel(Self) do
  begin
    Parent := TForm(AOwner);
    Constraints.MinHeight := 150;
    Constraints.MinWidth := 270;
    Height := 150;
    Width := 270;
  end;

  FArtLines := TStringList.Create;

  ArtImage := TImage.Create(Self);
  with ArtImage do
  begin
    Parent := TsArtPanel(Self);
    Height := TsArtPanel(Self).Height - 20;
    Width := TsArtPanel(Self).Width - 90;
    Top := 10;
    Left := 10;
    Anchors := [akLeft,akTop,akRight,akBottom];
    Caption := '';
  end;

  ArtCheckBox := TCheckBox.Create(Self);
  with ArtCheckBox do
  begin
    Parent := TsArtPanel(Self);
    Top := 5;
    Left := 245;
    Anchors := [akTop,akRight];
  end;

  ArtComboBox := TComboBox.Create(Self);
  with ArtComboBox do
  begin
    Parent := TsArtPanel(Self);
    Height := TsArtPanel(Self).Height - 20;
    Width := TsArtPanel(Self).Width - 90;
    Top := 10;
    Left := 10;
    Anchors := [akRight,akBottom];
  end;

end;

procedure TsArtPanel.SetArtComboBoxItemHeight(const Value: Integer);
begin
  if Value > 0 then
  begin
    FArtComboBoxItemHeight := Value;
    RecreateWnd;
  end;
end;

procedure TsArtPanel.SetArtLines(const Value: TStrings);
var
  i: integer;
begin
  if Value <> FArtLines then
  begin
    FArtLines.Clear;
    for i :=0 to Value.Count do
      if not (Value[i] = '') then FArtLines.Add(Value[i]);
  end;
end;

end.
P.S. я не просто жду ответа, а читаю паралельно Dfaq, Фаронов Искусство создания компонентов Delphi.djvu, и в инете ишу, так к свединию )))
VirusN13

Последний раз редактировалось ArtGrek; 20.02.2011 в 13:40.
ArtGrek вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Delphi. Компонент-предок, компонент-родитель amico Помощь студентам 1 23.09.2015 21:20
Своиства кнопки rainbow Общие вопросы Delphi 4 31.03.2009 17:01
Новые разделы Sanek777 О форуме и сайтах клуба 1 05.12.2008 19:31
новые компоненты blackstersl Свободное общение 2 01.09.2008 08:12
своиства TDBComboBox bmb_66 Компоненты Delphi 1 16.03.2008 11:42