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

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

Как динамически добавить в форму GroupBox [D6, WinXP]


Страницы:   1 2

FANAT ©   (2005-05-19 14:26:00) 

Как динамически добавить в форму GroupBox с динамическими объектами внутри (например LabeledEdit)...
я написал такой код, но что то у меня не получается:

procedure TForm1.N1Click(Sender: TObject);
begin
with TGroupBox.Create(self) do begin
       Parent:=Form1;
       Name:='GroupBox1';
       Caption:='Авторизация';
       Left:=256;
       Top:=104;
       Height:=177;
       Width:=153;

with TLabeledEdit.Create(self) do begin
       Parent:=GroupBox;
       Name:='LabeledEdit1';
       LabeledEdit.EditLabel.Caption:='Логин';
       Left:=16;
       Top:=32;
       Height:=21;
       Width:=121;

end;
end;
end;
end.

Подскажите пожалуйста где я ошибся?!
Спасибо!


Anatoly Podgoretsky   (2005-05-23 09:02:00) [1]

Бабушка дай воды напиться ...


FANAT   (2005-05-23 08:36:00) [2]

Это я со своим головником....
вот написан код....
в нем создается массив комбиков....
но вот не задача, ни как не соображу что бы они выходили 3х4 , а то максимум тут 12 должно быть, и если они выходят то за пределы экрана....
и еще наверное самое сложное...
как каждому комбику дать ссылку на одну и туже таблицу?
у меня получилось только в первом комбике, не знаю почему....

procedure TForm1.Button2Click(Sender: TObject);
var frm: TForm;
   lbl: TLabel;
   Agrbclr: Array[1..12] of TGroupBox ;
   cboxclr: TComboBox;
   lbclr: TLabel;
   clrbtn:TButton;
   TopMax:Integer;
   grbclr:TGroupBox;
begin
m:=StrToInt(Edit2.Text);
frm:=TForm.Create(Application);
frm.Hide;
frm.BoundsRect:=Rect(300,200,200,200);
frm.Name:='frmCLR';
pnlclr:=TPanel.Create(self);
pnlclr.Parent:=frm;
pnlclr.Name:='pnlclr';
pnlclr.Top:=1;
pnlclr.Left:=1;
pnlclr.AutoSize:=True;
TopMax:=0;
for i:=1 to m do

       begin
               Agrbclr[i]:=TGroupBox.Create(pnlclr);
               Agrbclr[i].Parent:=pnlclr;
               Agrbclr[i].Name:='Agrbclr_'+IntToStr(i);
               Agrbclr[i].Top:=5+45*(i-1);
               Agrbclr[i].Left:=5;
               Agrbclr[i].Width:=110;
               Agrbclr[i].Height:=45;
               Agrbclr[i].Caption:='  Цвет '+IntToStr(i)+' волокна';

               TopMax:=Agrbclr[i].Top+40;

               cboxclr:=TComboBox.Create(self);
               cboxclr.Parent:=Agrbclr[i];
               cboxclr.Name:='cboxclr_'+IntToStr(i);        //
               cboxclr.Top:=16;
               cboxclr.Left:=4;
               cboxclr.Width:=100;
               cboxclr.Height:=21;
               cboxclr.Text:='';

               with table2 do begin
               open;
               while not EOF do
               begin
               cboxclr.items.add(FieldByName('Цвет').AsString);
               next;


FANAT   (2005-05-20 21:16:00) [3]

И если можно подскажите как заполнить все ComboBox данными из таблицы?

вот мой код

cbox:=TComboBox.Create(self);
               cbox.Parent:=Agrb[i];
               cbox.Name:='cbox_'+IntToStr(i);
               cbox.Top:=32;
               cbox.Left:=96;
               cbox.Width:=73;
               cbox.Height:=21;

               with table1 do begin
               open;
               while not EOF do
               begin
               cbox.items.add(FieldByName('ТипОВ').AsString);
               next;
               end;

у меня заполняется только первый комбик а последующие не заполняются...


FANAT   (2005-05-20 19:01:00) [4]

А я все усложняю до неузноваемости....
вот теперь запутался в массивах...
вот код:

procedure TForm1.Button1Click(Sender: TObject);

begin
n:=StrToInt(Edit1.Text);
for i:=1 to n do
       begin
               Agrb[i]:=TGroupBox.Create(Form1);
               Agrb[i].Parent:=Form1;
               Agrb[i].Name:='Agrb'+IntToStr(i);
               Agrb[i].Top:=50+68*(i-1);
               Agrb[i].Left:=5;
               Agrb[i].Width:=500;
               Agrb[i].Height:=65;
               Agrb[i].Caption:='Длина №'+IntToStr(i);

.....
Здесь создается всякого барахла в GroupBox .... потом
.....

 btn:=TButton.Create(self);
               btn.Parent:=Agrb[i];
               btn.Name:='btn_'+IntToStr(i);
               btn.Top:=14;
               btn.Left:=416;
               btn.Width:=76;
               btn.Height:=41;
               btn.Action:=Form1.Action1;
               btn.Caption:='Внести';

.....

А вот в Action  я вставил такой код:

procedure TForm1.Action1Execute(Sender: TObject);
var
i:integer;
begin
       for i:=0 to ComponentCount-1 do
               if (Components[i] is TButton) then
               if TButton(Components[i]).Name=('btn_'+IntToStr(i)) then

.... А вот здесь собственно и вся загвоздка...
не знаю как при нажатии кнопки принадлежащей GroupBox сделать эту самую GroupBox.Visible:=False;
             
хотя я думаю что if TButton(Components[i]).Name=('btn_'+IntToStr(i)) - тоже не правильно...


Ega23   (2005-05-20 13:33:00) [5]

if ANSIUpperCase(TGroupBox(Components[i]).Name)=ANSIUpperCase('GroupBox1') then

Конечно не работает. Это в контексте цикла:

for i:=0 to ComponentCount-1 do
if (Components[i] is TGroupBox) then
 if ANSIUpperCase(TGroupBox(Components[i]).Name)=ANSIUpperCase('GroupBox1') then
begin
 TGroupBox(Components[i]).Free;
 Form1.N3.visible:=True;
 Form1.N7.visible:=True;
  Break;// Это чтобы дальше по циклу не бегать. Да и ComponentCount уменшится...

end;


А ANSIUpperCase() - это потому, что строки 'GroupBox1' и 'groupbox1' - разные. А так ты их к верхнему регистру приведёшь.


FANAT   (2005-05-20 12:56:00) [6]

А научи меня как уничтожить этот GroupBox.

я написал как ты учил :-)

procedure TForm1.Action1Execute(Sender: TObject);
var
user,login:string;
i:Integer;
begin
for i:=0 to ComponentCount-1 do
if (Components[i] is TLabeledEdit) then
 if TLabeledEdit(Components[i]).Name='LabeledEdit1' then
   user:=TLabeledEdit(Components[i]).Text;
for i:=0 to ComponentCount-1 do
if (Components[i] is TLabeledEdit) then
 if TLabeledEdit(Components[i]).Name='LabeledEdit2' then
   login:=TLabeledEdit(Components[i]).Text;

if Form1.Table1.Locate('ПользовательЛогин',user,[])and
(Form1.Table1.FieldByName('ПользовательПароль').AsString=login) then
begin
if ANSIUpperCase(TGroupBox(Components[i]).Name)=ANSIUpperCase('GroupBox1') then
begin
GroupBox.Free;
Form1.N3.visible:=True;
Form1.N7.visible:=True;
end;

но почему то это FREE не работает.
пробывал и grb.free - тажа анамалия


Ega23   (2005-05-20 10:54:00) [7]

Вы волшебник!

Нет, я лишь учусь...   :о)


FANAT   (2005-05-20 10:49:00) [8]

Вы волшебник!


Ega23   (2005-05-20 10:37:00) [9]

if ANSIUpperCase(TLabeledEdit(Components[i]).Name)=ANSIUpperCase('LabeledEdit1') then


Ega23   (2005-05-20 10:36:00) [10]

А... вот в чём дело...
LabeledEdit1 у тебя НИГДЕ не описана.

var
LabeledEdit1:TLabeledEdit;
в этом случае LabeledEdit1 - УКАЗАТЕЛЬ НА КЛАСС

with TLabeledEdit.Create(self) do begin
   Parent:=grb;
   Name:='LabeledEdit1';  
В этом случае LabeledEdit1 - всего лишь 12 символов в поле объекта.

Чуешь разницу?

А надо тогда так:

procedure TForm1.Action1Execute(Sender: TObject);
var
text:string;
i:Integer;
begin
for i:0 to ComponentCount-1 do
if (Components[i] is TLabeledEdit) then
  if TLabeledEdit(Components[i]).Name='LabeledEdit1' then
    text:=TLabeledEdit(Components[i]).Text;
MessageDlg(text,
  mtConfirmation,
  [mbOK],
  0);

end;


FANAT   (2005-05-20 10:09:00) [11]

неа...
ни как?
а что я правильно написал?
вообще она ругается на LabeledEdit1 ... не знаю почему... она же у меня описана :(


Ega23   (2005-05-20 10:03:00) [12]

А что, разве не работает?


FANAT   (2005-05-20 09:59:00) [13]

Ребята...
Извените... но что то у меня все равно не получается. Я вот первый раз с динамическими обьектами работаю...

ни как я не нажму кнопку!
как при нажатии на button1 (динамическая) считать данные из LabeledEdit1.Text ?

у меня вот такой код... где я ошибаюсь (заблуждаюсь, торожу)...

var
 Form1: TForm1;
 GroupBox:TGroupBox;
 LabeledEdit:TLabeledEdit;
 grb:TGroupBox ;
 Button1,Button2: TButton;
implementation

//uses Unit1;

{$R *.dfm}

procedure TForm1.N1Click(Sender: TObject);

var
grb:TGroupBox ;
Button1,Button2: TButton;

begin
grb:=TGroupBox.Create(Self);
with grb do begin
    Parent:=Form1;
    Name:='GroupBox1';
    Caption:='Àâòîðèçàöèÿ';
    Left:=256;
    Top:=104;
    Height:=177;
    Width:=153;

with TLabeledEdit.Create(self) do begin
    Parent:=grb;
    Name:='LabeledEdit1';
    EditLabel.Caption:='Ëîãèí';
    Text:='';
    Left:=16;
    Top:=32;
    Height:=21;
    Width:=121;

with TLabeledEdit.Create(self) do begin
    Parent:=grb;
    Name:='LabeledEdit2';
    EditLabel.Caption:='Ïàðîëü';
    Text:='';
    PasswordChar:='*';
    Left:=16;
    Top:=72;
    Height:=21;
    Width:=121;

with TButton.Create(self) do begin
    Parent:=grb;
    Name:='Button1';
    Action:=Action1;
    Caption:='Îê';
    Left:=16;
    Top:=104;
    Height:=25;
    Width:=121;

with TButton.Create(self) do begin
    Parent:=grb;
    Name:='Button2';
    Action:=Action2;
    Caption:='Îòìåíà';
    Left:=16;
    Top:=136;
    Height:=25;
    Width:=121;

end;
end;
end;
end;
end;
end;

procedure TForm1.N2Click(Sender: TObject);
begin
Application.Terminate;
end;

procedure TForm1.Action1Execute(Sender: TObject);
var
text:string;
begin
text:=LabeledEdit1.Text;
MessageDlg(text,
   mtConfirmation,
   [mbOK],
   0);

end;

Спасибо всем кто уделяет мне время!


HSolo   (2005-05-19 15:09:00) [14]

http://www.delphikingdom.com/asp/viewitem.asp?catalogid=342


Ega23   (2005-05-19 15:07:00) [15]

2 FANAT ©   (19.05.05 14:50) [6]
а как в нажать созданную динамически кнопку в GroupBox

Вот, буквально полчаса назад было:
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1116316393&n=0

ки кнопку в GroupBox
1. grb:=TGroupBox.Create(Self); Self (в данном случае Self=Form1) выступает в качестве владельца (Owner) данного контрола. При "убийстве" формы произойдёт каскадное удаление всех компонентов, ей принадлежащих. Т.е., если ты удаляешь этот групбокс вместе с формой, то можешь смело забыть.
2. Для того, чтобы его просто удалить, нужно знать указатель на него. Для этого можно поступить:
а) Вынести описание grb:TGroupBox в свойство формы, а не внутри метода. Тогда область видимости grb будет в пределах всей формы, а не одного метода N1Click.
б) При создании GroupBox задать ему имя. Ты его задаёшь как 'GroupBox1'; Теперь нужно его найти в списке компонентов формы:


for i:=0 to Form1.ComponentCount-1 do
 begin
  if (Components[i] is TGroupBox) then
   if ANSIUpperCase(Trim(TGroupBox(Components[i]).Name))='GROUPBOX1' then
  begin
   TGroupBox(Components[i]).Free;
   Break;
  end;
 end;


FANAT   (2005-05-19 14:50:00) [16]

Еще один вопрос (продолжение)
а как в нажать созданную динамически кнопку в GroupBox
и как потом уничтожить GroupBox


FANAT   (2005-05-19 14:35:00) [17]

Огромное спасибо!


Ega23   (2005-05-19 14:34:00) [18]

Удалено модератором
Примечание: ок


Alexander Panov   (2005-05-19 14:31:00) [19]

FANAT ©   (19.05.05 14:26)

Вот пример, почему не надо использовать где попало оператор with.


Ega23   (2005-05-19 14:31:00) [20]

тьфу, теги сбились.
Вот так:

procedure TForm1.N1Click(Sender: TObject);

var
grb:TGroupBox

begin
grb:=TGroupBox.Create(Self);
with grbdo begin
     Parent:=Form1;
     Name:='GroupBox1';
     Caption:='Авторизация';
     Left:=256;
     Top:=104;
     Height:=177;
     Width:=153;

with TLabeledEdit.Create(self) do begin
     Parent:= grb;
     Name:='LabeledEdit1';
     LabeledEdit.EditLabel.Caption:='Логин';
     Left:=16;
     Top:=32;
     Height:=21;
     Width:=121;

end;
end;
end;
end.


Страницы:   1 2

Наверх

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