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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.09.2009, 15:14   #1
Impuls1989
Форумчанин
 
Аватар для Impuls1989
 
Регистрация: 16.08.2008
Сообщений: 276
По умолчанию Компонент со свойством TStrings.

Добрый день уважаемые эксперты! Пишу компонент и наткнулся на две стенки
1. Как создать свойство компонента, такое же как, допустим, в TMemo свойство Lines. Тобиш нажал на кнопочку "..." и пошел задавать строки. Знаю что это свойство должно быть типа TStrings, но ничего не получается(((
1.jpg
2. Мой компонент должен связывать вместе еще 5 компонентов (в них прописывать мало чего надо). Возможно ли сделать так чтобы эти компоненты были как переменные моего класса и не существовали как отдельные компоненты? Вот примерно так:
Код:
private
    FpFIBDatabase:TpFIBDatabase;
    FpFIBTransaction:TpFIBTransaction;
    FpFIBDataSet:TpFIBDataSet;
    FDataSource:TDataSource;
Пробовал в конструкторе вызывать Create данных компонентов, но приложение ругается(((. 2.jpg
Заранее благодарен за ваши ответы.

Вот примерно так это будет выглядеть:
Код:
TDBBunch = class(TComponent)
  private
    FpFIBDatabase:TpFIBDatabase;
    FpFIBTransaction:TpFIBTransaction;
    FpFIBDataSet:TpFIBDataSet;
    FDataSource:TDataSource;
    FDBGrid:TDBGrid;

    FUserName:string;
    FPassword:string;

    FDBName:string;
    FBunch:boolean;
    FStart:boolean;

    FHZ:TStrings;

    procedure SetDBGrid(DBGrid:TDBGrid);                                  
    function GetDBGrid:TDBGrid;                                          
    procedure SetUserName(UserName:string);
    function GetUserName:string;
    procedure SetPassword(Password:string);
    function GetPassword:string;
    Procedure SetBunch(Bunch:boolean);
    Procedure SetStart(Start:boolean);
  protected
   { Protected declarations }
  public
    { Public declarations }
  published
    constructor Create(AOwner:TComponent);override;
   
    property DBGrid:TDBGrid read GetDBGrid write SetDBGrid;          
    property UserName:string read GetUserName write SetUserName;           
    property Password:string read GetPassword write SetPassword;         
    property DBName:string read FDBName write FDBName;      
    property Bunch:boolean read FBunch write SetBunch;               
    property Start:boolean read FStart write SetStart;
    property HZ:TStrings read FHZ write FHZ;
  end;
Искусственный интеллект - фигня по сравнению с естественной глупостью
Impuls1989 вне форума Ответить с цитированием
Старый 15.09.2009, 16:41   #2
АНК
Пользователь
 
Регистрация: 01.09.2009
Сообщений: 30
По умолчанию

TStrings это же абстрактный класс. Надо использовать TStringList
АНК вне форума Ответить с цитированием
Старый 15.09.2009, 18:04   #3
Impuls1989
Форумчанин
 
Аватар для Impuls1989
 
Регистрация: 16.08.2008
Сообщений: 276
По умолчанию

Цитата:
Сообщение от АНК Посмотреть сообщение
TStrings это же абстрактный класс. Надо использовать TStringList
Таже самая ошибка. Может надо процедуры для read write какие-то прописывать?
Искусственный интеллект - фигня по сравнению с естественной глупостью
Impuls1989 вне форума Ответить с цитированием
Старый 15.09.2009, 19:32   #4
Impuls1989
Форумчанин
 
Аватар для Impuls1989
 
Регистрация: 16.08.2008
Сообщений: 276
По умолчанию

Все! С первым вопросом почти разобрался. На половину это были глюки Delphi.
Перегрузил комп и все заработало. Делал так:
Код:
 private
            FHZ:TStringList;
            property HZ:TStringList read FHZ write FHZ;
.................
constructor TDBBunch.Create;
begin
  FHZ:=TStringList.Create;
Но теперь при удалении компонента или при закртытии проекта получаю следующие сообщения:
2.jpg

1.jpg
___________________________________ ___________________________________ ______________

Все разобрался!!! Все дело в том, что я явно вызывал деструктор TStringList в деструкторе объекта.
Теперь осталось только разобраться со вторым вопросом.
-----------
Получается какой-то монолог))))
Искусственный интеллект - фигня по сравнению с естественной глупостью

Последний раз редактировалось Impuls1989; 15.09.2009 в 20:46.
Impuls1989 вне форума Ответить с цитированием
Старый 16.09.2009, 01:04   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

сначало
надо самого себя создать(память выделить)
inherited Create;
потом уже дейсвия оперирующие с полями класса
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 16.09.2009, 01:16   #6
Impuls1989
Форумчанин
 
Аватар для Impuls1989
 
Регистрация: 16.08.2008
Сообщений: 276
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
сначало
надо самого себя создать(память выделить)
inherited Create;
потом уже дейсвия оперирующие с полями класса
Я так и делаю. Тут вопрос в другом. Нужно ли мне вызывать конструкторы всех моих компонентов:
Код:
constructor TDBBunch.Create;
begin
  inherited Create(AOwner);
  FDBGrid:=nil;
  FpFIBDatabase:=TpFIBDatabase.Create(self);
  FpFIBTransaction:=TpFIBTransaction.Create(self);
  FpFIBDataSet:=TpFIBDataSet.Create(self);
  FDataSource:=TDataSource.Create(self); 
end;
Или можно обойтись просто объявлением переменных:
Код:
 private
    FpFIBDatabase:TpFIBDatabase;
    FpFIBTransaction:TpFIBTransaction;
    FpFIBDataSet:TpFIBDataSet;
    FDataSource:TDataSource;
.......................
И если нужно вызывать конструкторы, то деструкторы вызовуться автоматом, или их тоже надо явно вызывать?
Искусственный интеллект - фигня по сравнению с естественной глупостью
Impuls1989 вне форума Ответить с цитированием
Старый 16.09.2009, 01:19   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

и конструкторы нужно и деструкторы...
так как переменная класса это указатель...но он должен указывать куда то...и освобождать надо.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 16.09.2009, 01:45   #8
Impuls1989
Форумчанин
 
Аватар для Impuls1989
 
Регистрация: 16.08.2008
Сообщений: 276
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
и конструкторы нужно и деструкторы...
так как переменная класса это указатель...но он должен указывать куда то...и освобождать надо.
Так, ну с эти разобрался! Но снова наткнулся на подводный камень.

Свой первый вопрос я реализовывал для того, чтобы во время редактирования и выполнения программы, можно было легко поменять названия столбцов в таблице DBGrid. Во время редактирования подписи полей меняются (что есть очень здорово), но во время выполнения программы названия меняются на стандартные. Собственно вопрос, в какой части компонента можно прописать данное присваивание, чтобы не вызывать по 100 раз процедуру?
Искусственный интеллект - фигня по сравнению с естественной глупостью
Impuls1989 вне форума Ответить с цитированием
Старый 16.09.2009, 01:56   #9
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

так...в дизайн тайме меняются, а в рантайме стандарт?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 16.09.2009, 02:14   #10
Impuls1989
Форумчанин
 
Аватар для Impuls1989
 
Регистрация: 16.08.2008
Сообщений: 276
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
так...в дизайн тайме меняются, а в рантайме стандарт?
Именно так
Искусственный интеллект - фигня по сравнению с естественной глупостью
Impuls1989 вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как компоненту со свойством Tpicture передать handle *.ico файла? iiunbreakableii Мультимедиа в Delphi 4 30.08.2009 22:57
Играемся со свойством Align Polotenchik Общие вопросы Delphi 3 13.08.2009 21:18
Помогите со свойством Flat SpeedButton'a Rebel123 Общие вопросы Delphi 1 11.08.2009 16:12
Length и TStrings k1r1ch Общие вопросы Delphi 5 24.06.2009 14:52
Проблема с TStrings Никки Общие вопросы Delphi 11 16.02.2008 20:42