![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как динамически добавить в форму GroupBox [D6, WinXP]
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.