Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 03.08.2010, 13:56
Аватар для kadnikov
kadnikov kadnikov вне форума
Прохожий
 
Регистрация: 26.07.2010
Сообщения: 20
Репутация: 10
По умолчанию перебор элементов на форме

Допустим на форме есть 100 элементов Edit.
Edit1-Edit100 соответственно.
Как в цикле For (или в другом) организовать последовательный перебор всех Edit'ов с присвоением какого-либо (одинакового!) значения???

Хотелось бы получить что-то похожее на:
Код:
For i:=1 to 100 do
Form1.Edit[i].color:=clRed;
Ответить с цитированием
  #2  
Старый 03.08.2010, 14:21
Drozh Drozh вне форума
Активный
 
Регистрация: 12.06.2008
Сообщения: 313
Репутация: 40
По умолчанию

Код:
 for i := 0 to ComponentCount-1 do
  if Components[i] is TEdit then
   (Components[i] as TEdit).Color := clRed;
Ответить с цитированием
  #3  
Старый 03.08.2010, 19:17
Аватар для kadnikov
kadnikov kadnikov вне форума
Прохожий
 
Регистрация: 26.07.2010
Сообщения: 20
Репутация: 10
По умолчанию

Не совсем подходит...
На форме стоит PageControl, а данная функция перебирает все элементы формы... А их там может быть....
Другого способа нет с обращением к конкретному типу элементов сразу?
Ответить с цитированием
  #4  
Старый 03.08.2010, 19:27
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

Сколько их там может быть? 1000? 10000? Не думаю, что больше... В любом случае, думаю, функция будет работать достаточно быстро.
Другой способ - заносить все необходимые экземпляры в массив при старте программы - и перебирать его...
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
  #5  
Старый 03.08.2010, 19:35
Аватар для kadnikov
kadnikov kadnikov вне форума
Прохожий
 
Регистрация: 26.07.2010
Сообщения: 20
Репутация: 10
По умолчанию

ок. Тогда ещё вопрос по данной функции, если перебираем не все элементы формы а все элементы находящиеся в TabSheet1(2,3,4,5...) и нужно не 100 из 100, а с Edit63 по Edit100?
Ответить с цитированием
  #6  
Старый 03.08.2010, 19:54
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

Так и напиши -
Код:
  for i := 0 to TabSheet1.ComponentCount-1 do
    if TabSheet1.Components[i] is TEdit then
      for j := 63 to 100 do
        if (TabSheet1.Components[i] as TEdit).Name = 'Edit' + IntToStr(j) then
          (TabSheet1.Components[i] as TEdit).Color := clRed;
Или как-то таким же раком... не помню точно...
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
  #7  
Старый 03.08.2010, 20:16
Аватар для dr. F.I.N.
dr. F.I.N. dr. F.I.N. вне форума
I Like it!
 
Регистрация: 12.12.2009
Адрес: Россия, г. Новосибирск
Сообщения: 660
Версия Delphi: D6/D7
Репутация: 26643
По умолчанию

Код:
procedure SetTextToEditByName(EditName, NewText: String);
var
  e: TEdit;
begin
  e := FindComponent(EditName);
  if e <> nil then e.Text := NewText;
end;

Примерно так (по имени).
Доработать для твоей заачи - 2 минуты (добавить цикл и что там еще).
Ответить с цитированием
  #8  
Старый 03.08.2010, 22:09
Аватар для kadnikov
kadnikov kadnikov вне форума
Прохожий
 
Регистрация: 26.07.2010
Сообщения: 20
Репутация: 10
По умолчанию

Цитата:
Сообщение от DJ PhoeniX
Так и напиши -
Код:
  for i := 0 to TabSheet1.ComponentCount-1 do
    if TabSheet1.Components[i] is TEdit then
      for j := 63 to 100 do
        if (TabSheet1.Components[i] as TEdit).Name = 'Edit' + IntToStr(j) then
          (TabSheet1.Components[i] as TEdit).Color := clRed;
Или как-то таким же раком... не помню точно...

Если я правильно понял то вместо:
Код:
Form1.Edit63.color:=clRed;
...
Form1.Edit100.color:=clRed;
т.е. если всё писать вручную получается 37 действий, а если задавать таким поиском компонентов то он будет перебирать все компоненты (не только edit), сравнивать их с Edit, если его найдёт делать в цикле for 37 прогонов, чтобы присвоить нужному Edit значение, причём если найденный Edit не входит в диапазон 63-100, то получиться 63*37 прогонов со сравнением впустую... хм.. плюс 37*36 прогонов в пустую, если edit входит в диапазон 63-100, и того 3663 лишних действия + проверка НеEdit. хм...
Видимо лучше всё таки прописывать каждый элемент вручную...(((

Если я всё правильно понимаю, то по сути задача присвоения значений в цикле группе одинаковых элементов должна сводится к значительному уменьшению объёма кода, а не к увеличению количества действий...

Цитата:
Сообщение от dr. F.I.N.
Код:
procedure SetTextToEditByName(EditName, NewText: String);
var
  e: TEdit;
begin
  e := FindComponent(EditName);
  if e <> nil then e.Text := NewText;
end;

Примерно так (по имени).
Доработать для твоей заачи - 2 минуты (добавить цикл и что там еще).

Здесь можно по подробнее?
я понял что должно быть примерно так:
Код:
var
  e: TEdit;

begin
  For i:=63 to 100 do
  begin
  e := FindComponent(Edit+i); 
  if e <> nil then e.Text := NewText;
  end;
end;
Делфи при таком варианте пишет "несовместимые типы TEdit и TComponent (или Tstring)" забыл уже точно

Последний раз редактировалось kadnikov, 03.08.2010 в 22:16.
Ответить с цитированием
  #9  
Старый 03.08.2010, 22:16
Drozh Drozh вне форума
Активный
 
Регистрация: 12.06.2008
Сообщения: 313
Репутация: 40
По умолчанию

Можно так, но без проверки выхода за пределы массива
Код:
var
 i: Integer;
begin
 for i := 63 to 100 do
  (FindComponent('Edit'+IntToStr(i)) as TEdit).Color := clRed;
end;
Ответить с цитированием
  #10  
Старый 03.08.2010, 23:00
Аватар для kadnikov
kadnikov kadnikov вне форума
Прохожий
 
Регистрация: 26.07.2010
Сообщения: 20
Репутация: 10
По умолчанию

Цитата:
Сообщение от Drozh
Можно так, но без проверки выхода за пределы массива
Код:
var
 i: Integer;
begin
 for i := 63 to 100 do
  (FindComponent('Edit'+IntToStr(i)) as TEdit).Color := clRed;
end;

этот вариант подходит, но есть два вопроса:
1. В каком случае может произойти выход за пределы массива?
2. В случае когда элементу присваивается несколько значений, или проверяются условия на ввод данных в группе, логично сделать так:
Код:
procedure TForm1.Button4Click(Sender: TObject);
begin
For x:=2 to 26 do
begin
e:=(FindComponent('Edit'+IntToStr(x)) as TEdit);
e.Color := clRed;
...
end;
end;
Делфи не даёт написать например
Код:
Form1.e.Color:=clRed
Отсюда вопрос, FindComponent ищет только по той форме в Unit которой прописан? (уточнение на всякий случай)...
Ответить с цитированием
  #11  
Старый 03.08.2010, 23:21
Drozh Drozh вне форума
Активный
 
Регистрация: 12.06.2008
Сообщения: 313
Репутация: 40
По умолчанию

1) За пределы массива имелось ввиду то, что цикл бежит от, например, Edit3 до Edit34, на у вас на форме нету компонента с именем, допустим, Edit16 - следовательно программа, пытаясь изменить к/л свойство этого элемента вылетит с ошибкой.
2) Да когда требуется изменять несколько свойств рациональнее делать и так.
3) В вашем случае переменная E принадлежит вызываемой процедуре, а вот функция FindComponent принадлежит форме, тобишь: Form1.FindComponent.
Ответить с цитированием
  #12  
Старый 03.08.2010, 23:28
Аватар для kadnikov
kadnikov kadnikov вне форума
Прохожий
 
Регистрация: 26.07.2010
Сообщения: 20
Репутация: 10
По умолчанию

Цитата:
Сообщение от Drozh
1) За пределы массива имелось ввиду то, что цикл бежит от, например, Edit3 до Edit34, на у вас на форме нету компонента с именем, допустим, Edit16 - следовательно программа, пытаясь изменить к/л свойство этого элемента вылетит с ошибкой.
2) Да когда требуется изменять несколько свойств рациональнее делать и так.
3) В вашем случае переменная E принадлежит вызываемой процедуре, а вот функция FindComponent принадлежит форме, тобишь: Form1.FindComponent.
Всё, большое спасибо, именно это мне и требовалось)
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 11:19.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter