Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Компоненты";
Текущий архив: 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.045 c
2-1147851226
Ironman83
2006-05-17 11:33
2006.06.04
DBNavigator


15-1147551749
alex-drob
2006-05-14 00:22
2006.06.04
Сохранить/загрузить динамический массив


2-1147717358
Mr tray
2006-05-15 22:22
2006.06.04
lower/uppercase с символами киррилицы


2-1147846635
novice
2006-05-17 10:17
2006.06.04
Как закрыть приложение на удаленном компьютере?


15-1146896035
igorserg
2006-05-06 10:13
2006.06.04
Как отловить, что комп уходит в спящий или ждущий режим?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский