Форум: "Компоненты";
Текущий архив: 2006.06.04;
Скачать: [xml.tar.bz2];
ВнизКак создать массив визуальных компонентов? Найти похожие ветки
← →
Святослав © (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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.039 c