Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.79/48: Рейтинг темы: голосов - 48, средняя оценка - 4.79
2 / 2 / 2
Регистрация: 02.07.2012
Сообщений: 53
1

Как узнать имя объекта?

10.07.2012, 20:45. Показов 9583. Ответов 23
Метки нет (Все метки)

Сабж. у меня динамические едиты и событие к ним OnChange одно хочу сделать, но без имени объекта никак
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.07.2012, 20:45
Ответы с готовыми решениями:

Как узнать имя объекта, на котором произошло последнее событие?
к примеру Button1Click произошел когда нажали на кнопочку, а в лейбл вывести имя объекта - Button1...

Как, зная Хендл объекта чужого приложения, узнать поля этого объекта?
Как зная Хендл объекта чужого приложения, узнать поля этого объекта?

Как узнать имя файла !?
Не все так просто как вы подумали мне нужно узнать имя "левого" ( разумеется "левый" запушен) ...

Как внутри события получить имя объекта
Доброго времени суток, всем. Все наверное в курсе - когда интерфейс к программе пишешь,...

23
3941 / 1866 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
10.07.2012, 21:02 2
На форуме предлагали использовать такой код:
Delphi
1
2
3
4
5
6
7
If Sender=Edit1 Then
....
Else
If Sender=Edit2 Then
....
Else
.....
Я бы предпочёл загонять при создании в свойство Tag какие-то значения, а в OnChange проверять:
Delphi
1
2
3
4
5
6
7
8
If (Sender is TEdit) Then
With (Sender As TEdit) Do
If Tag=1 Then
.......
Else
If Tag=2 Then
.......
Else
Второй код отработает гарантировано. За первый не могу сказать. Попробуй.
0
73 / 73 / 12
Регистрация: 27.03.2012
Сообщений: 249
10.07.2012, 21:03 3
дать фокус на Edit и получить его имя?
0
2 / 2 / 2
Регистрация: 02.07.2012
Сообщений: 53
10.07.2012, 21:27  [ТС] 4
Цитата Сообщение от Nakama Посмотреть сообщение
дать фокус на Edit и получить его имя?
у меня 18 edit`ов и 9 label`ов, каждый label`a берет свой Caption из 2 edit`ов. Я хотел в событии OnChange узнавать имя edit`ов и соответственно менять содержимое label`a. Если дашь пример как это красиво сделать через фокус, скажу спасибо =)

ЗЫ Одиночка, я думал через тег, но это же сколько копипаста =\ сейчас попробую
0
3941 / 1866 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
10.07.2012, 21:42 5
Вот твоё событие:
Delphi
1
2
3
4
5
6
7
8
9
10
11
Var
  i : Integer;
Begin
  If Not (Sender is TEdit) Then Exit;
  i:=(Sender As TEdit).Tag; //В Tag номера Label-ов
  (FindComponent('Label'+IntToStr(i)) As TLabel).Caption:=
  (FindComponent('Edit'+IntToStr(i*2)) As TEdit).Text+(FindComponent('Edit'+IntToStr(i*2-1)) As TEdit).Text;
  //Для каждого Label  Edit-ы:
  //1 - 2,1
  //2 - 4,3 и так далее...
End;

Не по теме:

И ещё. Ты новичок на форуме, поэтому ставлю в известность, что если не перемещаешься по форуму - нужно, периодически, обновлять страницу. Иначе не увидишь, когда выложат ответ.

1
1299 / 705 / 107
Регистрация: 25.05.2011
Сообщений: 2,158
Записей в блоге: 51
10.07.2012, 22:02 6
Лучший ответ Сообщение было отмечено как решение

Решение

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
procedure TForm1.Edit1Change(Sender: TObject);
begin
  with TLabel(TComponent(sender).Owner) do
    Caption:=Tedit(Components[0]).text+' '+Tedit(Components[1]).text;
end;
 
procedure TForm1.FormCreate(Sender: TObject);
const wx = 50; tx = 30;
var l: TLabel; e1,e2: TEdit; i,rx:integer;
begin
  for i := 0 to 10 do begin
    l:=TLabel.Create(self);
    l.left:=10;
    l.top:=tx+i*tx;
    l.AutoSize:=true;
    l.Parent:=self;
    e1:=TEdit.Create(l);
    e2:=TEdit.Create(l);
    e1.Left:=10*2+wx*2;
    e1.Width:=wx*2;
    e1.Top:=l.Top;
    e2.Left:=e1.Left+10+wx*2;
    e2.Width:=wx*2;
    e2.Top:=l.Top;
    e1.text:='start'+inttostr(i);
    e2.text:='end'+inttostr(i);
    e1.OnChange:=self.Edit1Change;
    e2.OnChange:=self.Edit1Change;
    e1.Parent:=self;
    e2.Parent:=self;
    self.Edit1Change(e2);
  end;
end;
Миниатюры
Как узнать имя объекта?  
Вложения
Тип файла: zip hhh.zip (215.5 Кб, 27 просмотров)
1
2 / 2 / 2
Регистрация: 02.07.2012
Сообщений: 53
10.07.2012, 23:17  [ТС] 7
я в шоке, но оно работает, хотя пока не допер как О_о
спасибо, Alex_pac и можете разобрать код плз? почему не используется массив? да и как так вообще о_о
0
1299 / 705 / 107
Регистрация: 25.05.2011
Сообщений: 2,158
Записей в блоге: 51
10.07.2012, 23:43 8
просто все наследники TComponent могут иметь владельца (родителя)

В данном случае. Создаем динамический TLabel. И делаем его родителем(владельцем) 2 компонентов TEdit

конструкция

Delphi
1
TEdit.Create(l); // где l это TLabel в качестве владельца.
обращение к родителю обеспечивает свойтсво TComponent.Owner

Delphi
1
2
3
4
with TLabel(TComponent(sender).Owner) do 
// получаем через TComponent(sender).Owner родителя копонента
Caption:=Tedit(Components[0]).text+' '+Tedit(Components[1]).text;
// Caption и Components являются свойствами TLabel, полученными через TComponent(sender).Owner после типизации
2
2 / 2 / 2
Регистрация: 02.07.2012
Сообщений: 53
11.07.2012, 00:06  [ТС] 9
Спасибо, разобрался. Я как-то проболел этот момент в технаре)
0
2 / 2 / 2
Регистрация: 02.07.2012
Сообщений: 53
11.07.2012, 00:31  [ТС] 10
Еще вопрос по этой теме. У меня количество строк(лейблов) считывается с *.ini как же мне обратиться и записать значение в нужные едиты?
добавил кнопку для добавления новых строк, ставится криво =\
Delphi
1
  for i := max_str+1 to max_str+2 do
еще хотел сделать через нажатие кнопки enter, но добавляет чуть лучше, но все равно не так
было 3 строки, в первый раз стало 3, потом 5 потом 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
procedure TDiscounts.EditKeyPress(Sender: TObject; var Key: Char);
const tx = 25;
var
 l: TLabel;
 e1,e2: TEdit;
 i:integer;
begin
if ord(key) = 13 then
  begin
  for i := max_str+1 to max_str+2 do
  begin
    l:=TLabel.Create(self);
    l.left:=270;
    l.top:=tx*(i+j);
    l.Height:=25;
    l.AutoSize:=true;
    l.Parent:=self;
    inc(j);
    e1:=TEdit.Create(l);
    e2:=TEdit.Create(l);
    e1.Left:=10;
    e1.Height:=25;
    e1.Width:=120;
    e1.Top:=l.Top;
    e2.Left:=e1.Left+e1.Width;
    e2.Width:=120;
    e2.Top:=l.Top;
    e1.text:='price'+inttostr(i);
    e2.text:='month'+inttostr(i);
    e1.OnChange:=self.EditChange;
    e2.OnChange:=self.EditChange;
    e2.OnKeyPress:=self.EditKeyPress;
    e1.Parent:=self;
    e2.Parent:=self;
    self.EditChange(e2);
    inc(max_str);
  end;
  end;
end;
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
procedure TDiscounts.Button1Click(Sender: TObject);
const tx = 25;
var
 l: TLabel;
 e1,e2: TEdit;
 i:integer;
begin
  begin
  for i := max_str+1 to max_str+2 do
  begin
    l:=TLabel.Create(self);
    l.left:=270;
    l.top:=tx*(i+j);
    l.Height:=25;
    l.AutoSize:=true;
    l.Parent:=self;
    inc(j);
    e1:=TEdit.Create(l);
    e2:=TEdit.Create(l);
    e1.Left:=10;
    e1.Height:=25;
    e1.Width:=120;
    e1.Top:=l.Top;
    e2.Left:=e1.Left+e1.Width;
    e2.Width:=120;
    e2.Top:=l.Top;
    e1.text:='price'+inttostr(i);
    e2.text:='month'+inttostr(i);
    e1.OnChange:=self.EditChange;
    e2.OnChange:=self.EditChange;
    e1.Parent:=self;
    e2.Parent:=self;
    self.EditChange(e2);
  end;
end;
end;
Миниатюры
Как узнать имя объекта?  
0
3941 / 1866 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
11.07.2012, 05:59 11
Если тебе по нажатии Enter или кнопки нужно добавить одну строку, то не нужно тебе писать For. Тем более, что по твоему циклу ты добавляешь 2 строки: max_str+1 и max_str+2.
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
procedure TDiscounts.EditKeyPress(Sender: TObject; var Key: Char);
const tx = 25;
var
 l: TLabel;
 e1,e2: TEdit;
begin
 if ord(key) = 13 then
 begin
    inc(max_str);
    l:=TLabel.Create(self);
    l.left:=270;
    l.top:=tx*(max_str);
    l.Height:=25;
    l.AutoSize:=true;
    l.Parent:=self;
    e1:=TEdit.Create(l);
    e2:=TEdit.Create(l);
    e1.Left:=10;
    e1.Height:=25;
    e1.Width:=120;
    e1.Top:=l.Top;
    e2.Left:=e1.Left+e1.Width;
    e2.Width:=120;
    e2.Top:=l.Top;
    e1.text:='price'+inttostr(max_str);
    e2.text:='month'+inttostr(max_str);
    e1.OnChange:=self.EditChange;
    e2.OnChange:=self.EditChange;
    e2.OnKeyPress:=self.EditKeyPress;
    e1.Parent:=self;
    e2.Parent:=self;
    self.EditChange(e2);
 end;
end;
И как могло стать "чуть лучше", если должно было работать одинаково?
Если тебе нужно было количество строк брать из ini-файла, тогда это нужно было писать так:
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
procedure TForm1.FormCreate(Sender: TObject);
const wx = 50; tx = 30;
var 
  l: TLabel; e1,e2: TEdit; i,rx:integer;
  ini : TIniFile;
begin
  ini:=TIniFile.Create(ExtractFilePath(Application.ExeName)+'param.ini'); //Имя файла param.ini
  max_str:=ini.ReadInteger('PAR','CountStr',0); //Секция "PAR", ключ "CountStr"
  ini.Free;
 
  If max_str<>0 Then
  for i := 1 to max_str do 
  begin
    l:=TLabel.Create(self);
    l.left:=10;
    l.top:=tx+(i-1)*tx;
    l.AutoSize:=true;
    l.Parent:=self;
    e1:=TEdit.Create(l);
    e2:=TEdit.Create(l);
    e1.Left:=10*2+wx*2;
    e1.Width:=wx*2;
    e1.Top:=l.Top;
    e2.Left:=e1.Left+10+wx*2;
    e2.Width:=wx*2;
    e2.Top:=l.Top;
    e1.text:='start'+inttostr(i);
    e2.text:='end'+inttostr(i);
    e1.OnChange:=self.Edit1Change;
    e2.OnChange:=self.Edit1Change;
    e1.Parent:=self;
    e2.Parent:=self;
    self.Edit1Change(e2);
  end;
end;
Или я не правильно понял вопрос? Если нужно из ini брать сами значения, тогда немного по другому. Но нужно писать и вопрос по другому.

Не по теме:

Слово "абонемент" пишется с буквой "е".

1
2 / 2 / 2
Регистрация: 02.07.2012
Сообщений: 53
11.07.2012, 20:15  [ТС] 12
количество строк я брал вот так
Delphi
1
2
3
4
5
6
7
8
9
10
var i:integer;
begin
for i:= 1 to 9 do
  begin
    if (ini.ReadString('Discounts','price'+inttostr(i),'0') <> '0') or (ini.ReadString('Discounts','month'+inttostr(i),'0') <> '0')  then
        error:=1
    else exit;
    inc(max_STR);
  end;
end;
я не могу поместить значение в ключах в соответствующие эдиты, вернее, не знаю как =\
0
3941 / 1866 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
11.07.2012, 20:45 13
Покажи, какой там ini и я напишу как его обработать.
0
2 / 2 / 2
Регистрация: 02.07.2012
Сообщений: 53
11.07.2012, 21:14  [ТС] 14
когда я говорил строка, я имел ввиду не строки в ini-файле, а "строка" компонентов у меня на форме
например
в edit1 попадет значение price1, в edit 2 month1 и соответственно от них генерируется лейбл
PS ini отказался заливать
Миниатюры
Как узнать имя объекта?  
Вложения
Тип файла: txt settings.txt (201 байт, 7 просмотров)
0
1299 / 705 / 107
Регистрация: 25.05.2011
Сообщений: 2,158
Записей в блоге: 51
11.07.2012, 22:19 15
зачем ваще это все? почему нельзя сразу сказать программе сколько полей , в каком промежутке будут эти "скидки". Тогда не нужны будут эти обработки событий нажатия Enter.

Можно просто сверху поставить Combobox в котором выбрать сколько строк нужно.

Или еще вариант Кнопка "Добавить" внизу/вверху, на которую будем нажимать, и перелетать по TabOrder. То есть на последнем поле нажимаем Tab и автоматически перелетаем на кнопку "добавить" и Enter и новое поле создано.

PS судя по задаче которую решает ТС, можно просто в Excel формулу написать и "растянуть вниз"

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
procedure TForm1.Button1Click(Sender: TObject);
const wx = 50; tx = 30; taborderstart = 1;
var lb1: TLabel; e1,e2: TEdit; i,k,z:integer;
begin
  k:=10; z:=0;
  for i := Panel1.ComponentCount-1 downto 0 do
    if (Panel1.Components[i] is TLabel) and
      (TLabel(Panel1.Components[i]).HelpContext>0) then begin
        k:=TLabel(Panel1.Components[i]).top;
        z:=TLabel(Panel1.Components[i]).HelpContext;
        break;
    end;
  inc(z);
  lb1:=TLabel.Create(Panel1);
  lb1.left:=10;
  lb1.top:=k+tx;
  lb1.AutoSize:=true;
  lb1.Parent:=Panel1;
  lb1.HelpContext:=z;
  dec(z);
  e1:=TEdit.Create(lb1);
  e2:=TEdit.Create(lb1);
  e1.Left:=10*2+wx*2;
  e1.Width:=wx*2;
  e1.Top:=lb1.Top;
  e2.Left:=e1.Left+10+wx*2;
  e2.Width:=wx*2;
  e2.Top:=lb1.Top;
  e1.text:='start'+inttostr(z);
  e2.text:='end'+inttostr(z);
  e1.OnChange:=self.Edit1Change;
  e2.OnChange:=self.Edit1Change;
  e1.Parent:=Panel1;
  e2.Parent:=Panel1;
  e1.TabOrder:=taborderstart+z*2;
  e2.TabOrder:=taborderstart+z*2+1;
  self.Edit1Change(e2);
  if self.Active then e1.SetFocus;
end;
 
procedure TForm1.Edit1Change(Sender: TObject);
begin
  with TLabel(TComponent(sender).Owner) do
    Caption:=Tedit(Components[0]).text+' '+Tedit(Components[1]).text;
end;
 
procedure TForm1.FormCreate(Sender: TObject);
var i:integer;
begin
  for i := 0 to 4 do begin
    self.Button1Click(self);
  end;
end;
Вложения
Тип файла: rar hhh2.rar (182.8 Кб, 11 просмотров)
0
3941 / 1866 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
11.07.2012, 22:39 16
По поводу ini.
Там где динамически создаёшь Label-ы и Edit-ы можешь читать и записывать сразу данные из Ini-файла:
Delphi
1
2
3
    e1.text:=ini.ReadString('Discounts','price'+inttostr(max_str),'price'+inttostr(max_str));
    e2.text:=ini.ReadString('Discounts','month'+inttostr(max_str),'month'+inttostr(max_str));
   //Если ключ  не будет найден - запишутся твои значения
При желании можно проверить, существует ли ключ:
Delphi
1
If ValueExists('Discounts','price'+inttostr(max_str)) Then //Если ключ существует
и если нет - можно выходить из цикла. Если, конечно, не будет разрывов в перечислении. Т.е. номера будут идти подряд.
0
429 / 337 / 36
Регистрация: 31.05.2011
Сообщений: 1,156
12.07.2012, 14:15 17
Всем привет! Вопросец в тему. На форме PageControl, на PageControl находится TabSheet, на TabSheet лежит Panel, на Panel располагается Label, всё это создаётся динамически с присвоением каждому контролу Name.
Обращаюсь к Label так:
Delphi
1
2
3
4
procedure TForm1.Button1Click(Sender: TObject);
begin
  (((PageControl.FindComponent('TabSheet1') as TTabSheet).FindComponent('Panel1') as TPanel).FindComponent('Label1') as TLabel).Caption := '!!!!!';
end;
Есть ли иные, более адекватные способы обращения к Label?
0
2 / 2 / 2
Регистрация: 02.07.2012
Сообщений: 53
12.07.2012, 14:38  [ТС] 18
очень странно, ругается на это =\
Цитата Сообщение от Одиночка Посмотреть сообщение
Код Delphi
If ValueExists('Discounts','price'+inttostr(max_str)) Then //Если ключ существует
И все же мне так и не ответили на главнейший вопрос, как ручками считать значения из нужных ключей? если покажите как обратится, я и записать смогу сам(наверно) мне к этим значения еще на другой форме нужно обращаться, заранее спс
0
3941 / 1866 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
12.07.2012, 18:03 19
hauk70: Забыл ini впереди поставить.
Delphi
1
If ini.ValueExists('Discounts','price'+inttostr(max_str)) Then //Если ключ существует
Ты же читаешь значения String. Чтобы считать другого типа значения:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Var
Price : Integer;
PrR : Real;
PB : Boolean;
 
//Значения Integer
Price:=ini.ReadInteger('Discounts','price'+inttostr(max_str),0); //Читаем...
ini.WriteInteger('Discounts','price'+inttostr(max_str),Price); //Пишем в ini
 
//Значения Real/Float
PrR:=ini.ReadFloat('Discounts','price'+inttostr(max_str),0); //Читаем...
ini.WriteFloat('Discounts','price'+inttostr(max_str),PrR); //Пишем в ini
 
//Значения Boolean
PB:=ini.ReadBool('Discounts','price'+inttostr(max_str),False); //Читаем...
ini.WriteBool('Discounts','price'+inttostr(max_str),PB); //Пишем в ini
Добавлено через 32 минуты
БогДелфей: Может ты пример другой выберешь. Или уточнишь задачу. В данном случае можно просто обратиться к Label напрямую через 1 FindComponent. При создании указывается Parent - TabSheet, а Owner - Form1. И все эти лейблы принадлежат форме.
А вообще я бы создал массив и указатели на эти Label-ы поместил в него.
Delphi
1
2
3
4
5
6
7
8
9
10
11
Var
  ArrLabel : Array[1..10] Of TLabel = (Nil,Nil,Nil,Nil,Nil,Nil,Nil,Nil,Nil,Nil);
 
//При создании...
Var Tl : TLabel;
  Tl:=TLabel.Create(Form1);
  Tl.Name:='L'+IntToStr(i);
  ArrLabel[i]:=Tl;
 
//При обращении...
  ArrLabel[i].Caption:='!!!!!!!';
Примерно так. Но не проверял. Может выдаст ошибки.
1
429 / 337 / 36
Регистрация: 31.05.2011
Сообщений: 1,156
12.07.2012, 19:44 20
Одиночка, Ну ты же знаешь что я PageControl мучал, вот представь на нём 100 динамически созданных вкладок в которых ещё куча динамически созданных контролов и к ним надо обращатся)))
Вот я сейчас и думаю как бы это всё реализовать наиболее проще
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.07.2012, 19:44

Как узнать имя файла из маршрута
допустим я загружаю файл с помощью опендиалог. вот свойство файлнейм - полный путь к файлу,...

Как узнать имя нового созданого компонента
Как узнать имя нового созданого компонента? Вот в етой процедуре при нажатии кнопи я создаю...

Как узнать имя операционной системы и разрядность?
Искал много, нашел много хлама. Толком не разобрался, как узнать Windows 7 x64 или Windows 7 x86...

Как узнать имя компонента по его тегу?
У меня есть тег компонента, но нет его имени. Как его узнать по тегу?


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru