Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Задание имени объекта с помощью переменной


Автор: pankerstein 23.12.2006, 17:47
Доброго времени суток!

У меня такой вопрос:
Допустим у меня на форме 10... и т.д. объектов одного типа (допустим TEdit). Так вот текст из них у меня помещается в структуру, и иногда надоедает писать для 10-ти полей, N строк кода:

Код

begin
form2.rep.Fields[1].text:= edit1.Text;
form2.rep.Fields[2].text:= edit2.Text;
form2.rep.Fields[3].text:= edit3.Text;
form2.rep.Fields[4].text:= edit4.Text;
// и так далее

Конечно хотелось бы сделать это в цикле, но для этого вместо 1,2,3,4 и т.д. должно быть i(что очевидно smile).. с массивом то порядок, а вот как перебрать при помощи изменяющегося i, поля Edit???
Т.е. задать имя Tedit, как edit+i.

В скриптовом языке AS2.0,3.0 было так ["строка"+i].метод/свойство, помоему даже гдето ещё видел, а вот в делфи, сколько ни бился ничего не нашёл smile

Помогите кто чем может! зараннее спосибо...

п.с. Прошу не винить меня в том, что я линивый, ("подумаешь 10 строк кода вместо цыкла"- скажите вы), но программа которую я пишу работает с документами,которые собственно различаются колличеством этих самых полей вода. В одном 5 в другом 15... Видов документов у меня около 20, а теперь представьте, в каждом вот так писать, кучу строк. А то задал в документе i, в каждом своё, и общую процедуру для всех с параметром i. омоему оправданно 

Автор: anwe 23.12.2006, 18:57
Так что ли:
Код

form2.rep.Fields[i].text:=TEdit(FindComponent('Edit'+IntToStr(i))).Text

Автор: Beltar 23.12.2006, 19:35
Компоненты лежат на чем-нибудь вроде панели или формы, и можно перебрать их используя ее свойство Controls, оно у любого наследника TWinControl есть.
Код

for i:=0 to Form.ControlsCount do
  begin
  if Controls[i].Name=...
  end

Автор: pankerstein 23.12.2006, 20:27
Спасибо !!! разобрался !: )))))))))))

Автор: pankerstein 23.12.2006, 21:11
Цитата(Beltar @ 23.12.2006,  19:35)
Компоненты лежат на чем-нибудь вроде панели или формы, и можно перебрать их используя ее свойство Controls, оно у любого наследника TWinControl есть.
Код

for i:=0 to Form.ControlsCount do
  begin
  if Controls[i].Name=...
  end

Думал по началу то что надо.. однако всё равно грамостко получается.. мне нужна анология как если бы на месте controls[i].name стояло controls[i].text, однако понятное дело делфи пишет, что такого свойства ему не объявили... 

to *anwe... не получается у меня так как ты подсказал.. может потому, что компоненты у меня на дочерней форме, а вызов идет с главной...ошибку не выдаёт, но когда хочу посмотреть что там записалось из edit в record то там пустоsmile



Автор: Beltar 23.12.2006, 22:48
Тут по-любому громоздко получится. Но если у тебя компоненты лежат на панели, или в GroupBox'е, (что еще и красиво), и все одинаковые, то код упрощается, т. к. можно сразу без проверки класса делать им, например.
Name:=(WinContol.Controls[i] as TEdit).Name; если нужно получить имя. Дальше можешь над ним всяко изгаляться.

Автор: pankerstein 23.12.2006, 23:54
Цитата(Beltar @  23.12.2006,  22:48 Найти цитируемый пост)
Name:=(WinContol.Controls[i] as TEdit).Name


beltar! rulez!!
То что нужно! работает! и как надо!!!! smile 

Тема закрыта!

Автор: Beltar 24.12.2006, 15:12
Добавлю, что можно и не совокупляться с именами, выдирая из них номер, а раздать эдитам теги и получать их. smile Собственно, когда мне надо различить несколько одинаковых контролов, я так и делаю и уверен, что 99% программеров поступает также. smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)