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

Вниз

Как динамически добавить в форму GroupBox   Найти похожие ветки 

 
FANAT ©   (2005-05-19 14:26) [0]

Как динамически добавить в форму 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.

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


 
Ega23 ©   (2005-05-19 14:30) [1]

Удалено модератором


 
Ega23 ©   (2005-05-19 14:31) [2]

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

procedure TForm1.N1Click(Sender: TObject);

var
grb:TGroupBox

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";
     LabeledEdit.EditLabel.Caption:="Логин";
     Left:=16;
     Top:=32;
     Height:=21;
     Width:=121;

end;
end;
end;
end.


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

FANAT ©   (19.05.05 14:26)

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


 
Ega23 ©   (2005-05-19 14:34) [4]

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


 
FANAT ©   (2005-05-19 14:35) [5]

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


 
FANAT ©   (2005-05-19 14:50) [6]

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


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

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

Вот, буквально полчаса назад было:
http://delphimaster.net/view/1-1116316393/

ки кнопку в 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;


 
HSolo ©   (2005-05-19 15:09) [8]

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


 
FANAT ©   (2005-05-20 09:59) [9]

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

ни как я не нажму кнопку!
как при нажатии на 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;

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


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

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


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

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


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

А... вот в чём дело...
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;


 
Ega23 ©   (2005-05-20 10:37) [13]

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


 
FANAT ©   (2005-05-20 10:49) [14]

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


 
Ega23 ©   (2005-05-20 10:54) [15]

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

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


 
FANAT ©   (2005-05-20 12:56) [16]

А научи меня как уничтожить этот 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 13:33) [17]

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 19:01) [18]

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

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)) - тоже не правильно...


 
FANAT ©   (2005-05-20 21:16) [19]

И если можно подскажите как заполнить все 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-23 08:36) [20]

Это я со своим головником....
вот написан код....
в нем создается массив комбиков....
но вот не задача, ни как не соображу что бы они выходили 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;


 
Anatoly Podgoretsky ©   (2005-05-23 09:02) [21]

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



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

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

Наверх




Память: 0.54 MB
Время: 0.043 c
1-1116495478
Delphi_is_cool
2005-05-19 13:37
2005.06.06
Как убрать иконку с формы ?


1-1116423009
lehich
2005-05-18 17:30
2005.06.06
разбить содержимое StringList на строки


4-1113511197
elf_123
2005-04-15 00:39
2005.06.06
Dll howto


1-1116905491
Viktop
2005-05-24 07:31
2005.06.06
Поиск в файле


6-1111128147
leonidus
2005-03-18 09:42
2005.06.06
Копирование файлов по локальной сети