Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.06.04;
Скачать: CL | DM;

Вниз

Как создать массив визуальных компонентов?   Найти похожие ветки 

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

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


 
Igorek ©   (2005-11-17 11:05) [1]

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


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


> 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;

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

Спасибо!


 
Domkrat ©   (2005-11-18 17:30) [3]

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


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


> Domkrat

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


 
gdaujk ©   (2005-11-19 07:05) [5]

>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-19 22:29) [6]


> 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-20 18:02) [7]

>Святослав ©   (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.


 
Dico   (2005-11-23 11:33) [8]

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

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

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

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



Страницы: 1 вся ветка

Текущий архив: 2006.06.04;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.043 c
2-1147766116
roman_ln
2006-05-16 11:55
2006.06.04
Помогите начинающему составить программу!!!


6-1138812061
Volf_555
2006-02-01 19:41
2006.06.04
Как организовать чат через Интернет


15-1147356788
Петр
2006-05-11 18:13
2006.06.04
Delphi


2-1147761317
DimonS
2006-05-16 10:35
2006.06.04
SQL+Sum()


1-1146283663
IKV
2006-04-29 08:07
2006.06.04
CreateOleObject