Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как создать массив визуальных компонентов? [D7, Win95/98, Win2k]


Святослав ©   (2005-11-16 19:15:00) 

Необходимо создать массив tcombobox, в зависимости от  sql-запроса. Помогите выбрать правильного предка и избавиться от глюков!!! Глюк 1: невозможно добраться до подкомпонентов и редактировать их!!! При закрытии формы система ругается, при открытии формы подкомпоненты копируются!!!


Dico   (2005-11-23 11:33:00) [1]

Попробуй использовать класс TList

добавление
FList.Add(TComboBox.Create(self));

обращение
TComboBox(FList[i])

при Flist.Delete(I) класс сам корректно уничтодает все.


gdaujk   (2005-11-20 18:02:00) [2]

>Святослав ©   (19.11.05 22:29) [6]

>Еще пробовал так:
>     Kl[i]:=TComboBox.Create(self);
>      kl[i].Parent:=Parent;
>в током случае видно на форме но нельзя редактировать!


Self ссылается на объект, в методе которого он (Self) он был вызван. В вышеприведённой цитате это TKluchi.

>Попробовал, от перемены мест слагаемых сума не изменилась
Published - секция, где объявляются толькосвойства, должные быть видимыми в Object Inspector'е. Там никогда не объявляются конструкторы/деструкторы.

>Вот тут если можно по подробней, в виде кода!

Поподробней можно,в виде кода - нет. Если не понятно, что такое In-Place - так это элемент управления (TComboBox в твоём случае), появляющийся в редактируемой пользователем ячёйке таблицы. Т. е. в сначала он не виден/создан, но как только пользователь выбирает ячейку для редактирования, In-Place редактор становится видимым/создаётся и встраивается в неё. Примерно так реализованно редактирование ячеек в StringGrid, где в качестве In-Place выступает TInplaceEdit - потомок TCustomEdit'а, родной брат TMaskEdit :-).

PS: ещё одна идея - создать невизуальный компонент, управляющий ComboBox'ами, не являющимися его потомками. Сам такого никогда не далал, считаю, что самый оптимальный вариант - In-Place.


Святослав   (2005-11-19 22:29:00) [3]


> gdaujk


> >Kl[i].Name:=name+sql.Fields[0].FieldName+inttostr(i);
> А может этого не надо?

В принципе не надо, можно обращаться как с массивом по индексам

> published
>     destructor  Destroy;override;
> Перенеси в public.

Попробовал, от перемены мест слагаемых сума не изменилась

> создать потомок StrindGrid или ListView , к которому нужно
> приделать один TComboBox в качестве In-Place

Вот тут если можно по подробней, в виде кода!

Еще пробовал так:
      Kl[i]:=TComboBox.Create(self);
      kl[i].Parent:=Parent;
в током случае видно на форме но нельзя редактировать!
если так:
      Kl[i]:=TComboBox.Create(owner);
      kl[i].Parent:=Parent;
Все видно и можно редактировать, но компоненты клонируются при открытии формы, как понимаю сначала они создаются на форме потом их создает компонент


gdaujk   (2005-11-19 07:05:00) [4]

>Kl[i].Name:=name+sql.Fields[0].FieldName+inttostr(i);

А может этого не надо?

У каждого TComboBox в списке одно значение?

 published
    destructor  Destroy;override;


Перенеси в public.

Проблема дальнейшей работы в дизайн-тайме!!!

Конечно, не одного свойства для инспектора нет, кроме destructor  Destroy...

>Необходимо создать массив tcombobox...

Я бы посоветовал создать потомок StrindGrid или ListView , к которому нужно приделать один TComboBox в качестве In-Place (он бы появлялся в редактируемых ящейках).


Святослав   (2005-11-18 19:18:00) [5]


> Domkrat

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


Domkrat   (2005-11-18 17:30:00) [6]

Если формы однотипные, то может сделать некую парент форму и от нее наследоваться?


Святослав   (2005-11-17 12:35:00) [7]


> Igorek

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

TMy= class(TControl)
 private
 { Private declarations }
 protected
   procedure SetParent(AParent: TWinControl);override;
   { Protected declarations }
 public
   Kl:array of TComboBox;
   Kod:array of array of string[4];
    { Public declarations }
 published
     destructor  Destroy;override;
  { Published declarations }
 end;

procedure Register;

implementation

procedure Register;
begin
 RegisterComponents('standard', [TMy]);
end;

destructor  TKluchi.Destroy;
var i:shortint;
begin
 for i:=0 to length(Kod)-1 do
 begin setlength(Kod[i],0);
         kl[i].Free;
 end;

   setlength(Kod,0);
    setlength(Kl,0);
   inherited Destroy;
 end;                  

procedure TKluchi.SetParent;
var i:integer;
   sql:TQuery;
   put:string;
begin
inherited;
ControlStyle:=ControlStyle+[csAcceptsControls];
 GetDir(0,put);
 sql:=TQuery.Create(nil);
 sql.DatabaseName:=put+'\data\init';
 sql.SQL.Clear;
 sql.SQL.Add(Zapros);
 sql.Open;
 setlength(kl,sql.RecordCount);
 setlength(kod,sql.RecordCount);
 for i:=0 to sql.RecordCount-1 do
 begin
       Kl[i]:=TComboBox.Create(self);
       kl[i].Parent:=Parent;
       Kl[i].Name:=name+sql.Fields[0].FieldName+inttostr(i);
       Kl[i].Text:=sql.Fields[1].AsString;
       Kod[i]:=sql.Fields[2].AsString;
 end;
 sql.Close;
 sql.Free;
end;

Проблема дальнейшей работы в дизайн-тайме!!!

Спасибо!


Igorek   (2005-11-17 11:05:00) [8]

Опишите полнее проблему. Какая именно зависимость между запросом и массивом комбобоксов? Что вообще этот массив должен потом делать?


Наверх

Титульная страница Поиск, карта сайта Написать письмо