Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.74/74: Рейтинг темы: голосов - 74, средняя оценка - 4.74
0 / 0 / 0
Регистрация: 29.08.2011
Сообщений: 10
1

Программно\динамически созданные Edit\Label

29.08.2011, 23:19. Показов 13550. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Привет. Написал программу, в которой динамически создаётся n-ое кол-во Edit и Label. На лейблах название - в едитах вписывается информаци.
В коде программы я указал что они есть, если канечно это так:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
type
  TForm2 = class(TForm)
    Label10: TLabel;
    Label20: TLabel;
    Label30: TLabel;
    Label40: TLabel;
    Label50: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    Edit6: TEdit;
Дальше по программе я ссылаюсь к ним, они уже созданы программно - из едитов беру данные и записываю в txt,затем удаляю и лабел и едит. Затем снова вызываю... и т.д.
Всё работает хорошо (по крайне мере так считаю ).
Вопрос - при компиляции постоянно ошибка что типа эти компоненты (Label и Edit) не созданны или нет на форме их
Field Form2.Label50 does not have a corresponding components. Remove the declaration?

Можно ли это как то убрать\обойти\может быть программа не правильно работает даже?) - надоедает тыкать каждый раз - что не надо удалить их =).
вот так создаю едит, кусок кода

Delphi
1
2
3
4
5
6
7
8
9
10
Sch_E:=Sch_E+1;              //Счетчик для имени Едита
Sch_r_E:=Sch_r_E+21;      //Счетчик для смены растояния след-его Едита
edt:=TEdit.Create(Form2);
edt.parent:=Form2;
edt.Top:=8+Sch_r_E;
edt.Left:=390;
edt.Name:='Edit'+IntToStr(Sch_E);
edt.OnKeyPress:=form2.MyEditKeyPress;  //Это обьявляю процедуру в которой запрещаю водить только формат даты типа 00.00.0000
edt.Visible:=true;
edt.Text:='';


За оформление темы и косяки предоставления вопроса не судите строга - первый раз =).
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.08.2011, 23:19
Ответы с готовыми решениями:

Edit Label (линейный) Panel, Edit Label (строки), Memo (одномер-ный),ComboBox ListBox , RadioButton (RadioGroup) CheckBox ,StringGrid (ввод пароля)
1)Edit Label (линейный) Panel Проверить истинность высказывания: "Цифры данного трехзначного...

Динамически созданные TLabel's и onClick
Здравствуйте, помогите пожалуйста с решением задачи. Есть дочерняя TForm2, на ней одна кнопка. При...

Как удалить динамически созданные компоненты?
Пробовал удалить так for i:= Form12.ComponentCount-1 downto 0 do begin ...

Как удалить динамически созданные объекты??
Проблема такова: требуется удалить динамически созданные компоненты label и image вот кусок их...

9
5705 / 2296 / 466
Регистрация: 20.11.2009
Сообщений: 7,720
Записей в блоге: 1
29.08.2011, 23:38 2
Лучший ответ Сообщение было отмечено как решение

Решение

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
procedure TForm1.FormCreate(Sender: TObject);
var Lab: Array of TLabel;
    Ed: Array of TEdit;
    n,i: Integer;
begin
  n := 10;
  SetLength(Lab, n+1);
  SetLength(Ed, n+1);
  for i := 0 to n-1 do
    begin
      Lab[i] := TLabel.Create(Self);
      Lab[i].Parent := Self;
      Lab[i].Left := 10;
      Lab[i].Top := i*30+20;
      Lab[i].Caption := 'Этикетка'+IntToStr(i+1);
      Ed[i] := TEdit.Create(Self);
      Ed[i].Parent := Self;
      Ed[i].Left := 150;
      Ed[i].Top := i*30+20;
      Ed[i].Text := 'Поле ввода'+IntToStr(i+1);
    end;
end;
создавай лучше массив, как к примеру выше написал примерчик

Добавлено через 3 минуты
Цитата Сообщение от Gudini Посмотреть сообщение
Вопрос - при компиляции постоянно ошибка что типа эти компоненты (Label и Edit) не созданны или нет на форме их
Field Form2.Label50 does not have a corresponding components. Remove the declaration?
ошибка возникает потому что ты объявил их в классе формы, а на форме на самом деле ничего не лежит, если даже и так хочешь делать, напиши например в классе в разделе private эти объявления

Добавлено через 4 минуты
вот тут
Delphi
1
2
3
4
5
6
7
8
9
type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    // тут и можно объявить что-то, поля(переменные) или методы(процедуры и функции) 
    // для класса формы
  public
    { Public-Deklarationen }
  end;
3
0 / 0 / 0
Регистрация: 29.08.2011
Сообщений: 10
30.08.2011, 15:49  [ТС] 3
Спасибо за быстрый ответ, очень рад Delphi7 ))))) спасибо форуму в целом!
0
1 / 1 / 0
Регистрация: 03.04.2012
Сообщений: 13
03.04.2012, 17:13 4
Код Delphi
procedure TForm1.FormCreate(Sender: TObject);
var Lab: Array of TLabel;
Ed: Array of TEdit;
n,i: Integer;
begin
n := 10;
SetLength(Lab, n+1);
SetLength(Ed, n+1);
for i := 0 to n-1 do
begin
Lab[i] := TLabel.Create(Self);
Lab[i].Parent := Self;
Lab[i].Left := 10;
Lab[i].Top := i*30+20;
Lab[i].Caption := 'Этикетка'+IntToStr(i+1);
Ed[i] := TEdit.Create(Self);
Ed[i].Parent := Self;
Ed[i].Left := 150;
Ed[i].Top := i*30+20;
Ed[i].Text := 'Поле ввода'+IntToStr(i+1);
end;
end;
создавай лучше массив, как к примеру выше написал примерчик
А как для данного примерчика сделать кнопку для "сброса", т.е. для удаления всех созданных Эдитов и Лабелов?

Добавлено через 33 минуты
УЖЕ ВСЕ РАЗОБРАЛСЯ))
0
5705 / 2296 / 466
Регистрация: 20.11.2009
Сообщений: 7,720
Записей в блоге: 1
03.04.2012, 21:13 5
Delphi
1
2
Ed[i].Free;
Lab[i].Free
1
1 / 1 / 0
Регистрация: 03.04.2012
Сообщений: 13
05.04.2012, 21:15 6
Arcor, я дополнил твой пример для динамического создания с помощью массива. Но у меня выскакивают следующие ошибки в некоторых случаях:
Миниатюры
Программно\динамически созданные Edit\Label   Программно\динамически созданные Edit\Label   Программно\динамически созданные Edit\Label  

0
1 / 1 / 0
Регистрация: 03.04.2012
Сообщений: 13
05.04.2012, 21:34 7
Код программы:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
unit Unit5;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, sLabel, StdCtrls, sEdit, sSpinEdit, sButton, Mask, sMaskEdit,
  sCustomComboEdit, sCurrEdit, sCurrencyEdit, Buttons, sBitBtn;
type
  TForm5 = class(TForm)
    sLabel1: TsLabel;
    sWebLabel1: TsWebLabel;
    sLabel2: TsLabel;
    sBitBtn1: TsBitBtn;
    sBitBtn2: TsBitBtn;
    sSpinEdit1: TsSpinEdit;
    sBitBtn3: TsBitBtn;
    procedure FormCreate(Sender: TObject);
    procedure sBitBtn1Click(Sender: TObject);
    procedure sBitBtn3Click(Sender: TObject);
    procedure sBitBtn2Click(Sender: TObject);
    procedure sSpinEdit1Change(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form5: TForm5;
    edit:Tedit;
    Lab1: Array of TLabel;
    Ed1: Array of TEdit;
    Lab2:Array of TLabel;
    Ed2: Array of TEdit;
    Ed3: Array of TEdit;
    Lab3:Array of TLabel;
    n,i,m,j: Integer;
implementation
uses Unit4, Unit1;
{$R *.dfm}
 
procedure TForm5.sBitBtn1Click(Sender: TObject);
begin
  sbitbtn2.Click;
  n := StrToInt(sspinEdit1.Text);
  SetLength(Lab1, n+1);
  SetLength(Ed1, n+1);
  SetLength(Lab2, n+1);
  SetLength(Ed2, n+1);
  for i := 0 to n-1 do
    begin
       Lab1[i] := TLabel.Create(Self);
       Lab1[i].Parent := Self;
       Lab1[i].Left := slabel2.Left ;
       Lab1[i].Top := slabel2.Top+60 +i*30;
       Lab1[i].Caption := 'Äèàïàçîí èçìåðåíèÿ '+IntToStr(i+1);
 
      Ed1[i] := TEdit.Create(Self);
      Ed1[i].Parent := Self;
      Ed1[i].Left := slabel2.Left + 200;
      Ed1[i].Top := slabel2.Top+60 +i*30;
      Ed1[i].Height:=25;
      Ed1[i].Width :=30;
      Ed1[i].Text :='0';
 
       Lab2[i] := TLabel.Create(Self);
       Lab2[i].Parent := Self;
       Lab2[i].Left := Ed1[i].Left+40;
       Lab2[i].Top := slabel2.Top+60 +i*30;
       Lab2[i].Caption :='Êîëëè÷åñòâî ÷èñëîâûõ îòìåòîê:';
 
      Ed2[i] := TEdit.Create(Self);
      Ed2[i].Parent := Self;
      Ed2[i].Left :=  Lab2[i].Left + 270;
      Ed2[i].Top :=  slabel2.Top+60 +i*30;
      Ed2[i].Height:=25;
      Ed2[i].Width :=30;
      Ed2[i].Text :='0';
    end;
end;
 
procedure TForm5.sBitBtn2Click(Sender: TObject);
begin
  for i := 0 to n-1 do
  begin
      Lab1[i].Destroy;
      Ed1[i].Destroy;
      Lab2[i].Destroy;
      Ed2[i].Destroy;
     end;
end;
 
procedure TForm5.sBitBtn3Click(Sender: TObject);
var m:integer;
begin
  n:=StrToint(sspinEdit1.Text);
  SetLength(Ed3, n+1);
  SetLength(Lab3, n+1);
  for i:=0 to n-1 do
    for j := 0 to StrToInt(Ed2[i].Text)-1 do
    begin
       Lab3[j] := TLabel.Create(Self);
       Lab3[j].Parent := Self;
       Lab3[j].Left :=ed2[i].Left+50+j*100;
       Lab3[j].Top := Ed2[i].Top;
       Lab3[j].Caption := '×.Î. '+IntToStr(j+1)+':';
 
      Ed3[j] := TEdit.Create(Self);
      Ed3[j].Parent := Self;
      Ed3[j].Left := Lab3[j].Left+60;
      Ed3[j].Top :=  Lab3[j].Top;
      Ed3[j].Height:=25;
      Ed3[j].Width :=30;
      Ed3[j].Text :='0';
    end;
end;
end.
Ошибки возникают при нажатии кнокпи sBitBtn3. При ошибке курсор останавливается перед созданием Ed3[j]. Мои догадки: ошибка в цикле или же в свойствах Parent , owner. Но два дня поиска решения не увенчались успехом, потому прошу помощи. Заранее огромное спасибо!
Пример работы программы представлен.
Миниатюры
Программно\динамически созданные Edit\Label   Программно\динамически созданные Edit\Label  
0
5705 / 2296 / 466
Регистрация: 20.11.2009
Сообщений: 7,720
Записей в блоге: 1
06.04.2012, 09:14 8
я бы не использовал бы переменные цикла глобальные
1
1 / 1 / 0
Регистрация: 03.04.2012
Сообщений: 13
06.04.2012, 09:43 9
я бы не использовал бы переменные цикла глобальные
Действительно, убрал j из глобальной переменной и вроде ошибки прекратились. Спасибо!
0
1 / 1 / 0
Регистрация: 03.04.2012
Сообщений: 13
11.04.2012, 17:57 10
Здравствуйте тем кто читает данный текст!=)
Продолжая тему динамического создания создаю вот таким образом массив Эдитов (подобие таблицы):
procedure TForm5.sBitBtn8Click(Sender: TObject);
var A,B,j,i:Integer;
begin
A:=8;
B:=StrToInt(sLabel3.Caption);
SetLength(Ed3, n+1);
for i:= 0 to A-1 do
for j:= 0 to B-1 do
begin
Ed3[i] := TEdit.Create(Self);
Ed3[i].Parent := Self;
Ed3[i].Left := 200+30*i ;
Ed3[i].Top :=800+30*j;
Ed3[i].Height:=25;
Ed3[i].Width :=30;
Ed3[i].Text :=IntToStr('0');
end;
end;
Но теперь мне необходимо выполнить арифметические действия. К примеру сложить значения в первом столбце со значениями во втором и занести результат в третий столбец. И тут у меня проблема, не пойму как правильно обратиться к Эдитам ибо мои попытки складывают либо не то что надо, либо не все что надо. Вот как я пытался:
procedure TForm5.sBitBtn6Click(Sender: TObject);
var A,B,j,i:Integer;
begin
A:=8;
B:=StrToInt(sLabel3.Caption);
SetLength(Ed3, n+1);
for j:= 0 to B-1 do
begin
Ed3[j].Text:=IntToStr(StrToInt(Ed3[0].Text)+StrToInt(Ed3[1].Text));
end;
end;
0
11.04.2012, 17:57
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.04.2012, 17:57
Помогаю со студенческими работами здесь

Изменения шрифта label или Edit, часы в Label
Доброе утро хотелось бы узнать , можно ли засунуть в label или edit часы так же можно ли изменять...

Как удалить динамически созданные объекты для повторного их создания
Значит так, в combobox выбираю количество предложим edit объекты, создаем их и при повторном выборе...

Сохранить программно созданные Image, чтобы при следующем запуске програмы они были на своем месте
Все привет. Помогите советом. Создаю в Run-Time N-ное количество TImage, вот код: procedure...

Не могу создать динамически label
Впрочем создать то я могу, только не могу создать label в указанном месте, т.е в определенных...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru