Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 1 059

/ вопрос решён /

Доброго времени суток, уважаемые эксперты!
Как вместо приведенного текста сделать цикл (for i:=0 to 40 do)?

Приложение:
  1. SpinEdit1.Value := B[0];
  2. SpinEdit2.Value := B[1];
  3. SpinEdit3.Value := B[2];
  4. SpinEdit4.Value := B[3];
  5. SpinEdit5.Value := B[4];
  6.  
  7.  


Наташа Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задала: Наташа (статус: Посетитель)
Вопрос отправлен: 31 октября 2007, 08:02
Состояние вопроса: решён, ответов: 2.

Ответ #1. Отвечает эксперт: min@y™

Если все TSpinEdit'ы размещены на форме ещё в Run-time, то примерно так:

procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
  SpinEdit: TSpinEdit;
  Component: TComponent;
begin
  for i:= 0 to 40 do // Не ошибись с индексом (массив B индексирован с 0)
    begin
      Component:= FindComponent('SpinEdit' + IntToStr(i + 1));
      if Assigned(Component)
        then TSpinEdit(Component).Value:= B[i]
        else begin
               ShowMessage('SpinEdit' + IntToStr(i + 1) + ' не найден.');
               Break;
             end;
    end;
end;

Однако, имхо, проще их создавать динамически, присваивая им нужные свойства и события. Причём, создавать в цикле. Завести поле у класса формы:
type
  TSpinArray = array[1..41] of TSpinEdit;
 
  TForm1 = class(TForm)
    ...
  public // или private
    FSpinEdits: TSpinArray;
    constructor Create(AOwner: TComponent); override;
  end;
 
implementation
 
 ...
 
constructor TForm1.Create(AOwner: TComponent);
var
  i: Integer;
begin
  inherited;
 
  for i:= 1 to 41 do
    begin
      FSpinEdits[i]:= TSpinEdit.Create(Self);
      with FSpinEdits[i] do
        begin
          Name:= 'SpinEdit' + IntToStr(i); // Если доступ будет только из массива, то это не нужно
          Top:= <Верхний край>;
          Left:= <Левый край>;
          OnChange:= <Обработчик, если нужен>;
        end;
    end;
end;

Ну, а заполнение значениями можно прописать в том же конструкторе или в любом другом месте:
for i:= 0 to 40 do
  FSpinEdits[i + 1].Value:= B[i];

Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 31 октября 2007, 08:35
Оценка за ответ: 5

Ответ #2. Отвечает эксперт: ANBsoft

Здравствуйте, Наташа!
Предыдущий эксперт все хорошо описал, поэтому добавлю свои уточнения:
1)код можно упростить
for i:= 0 to 40 do
TSpinEdit(FindComponent('SpinEdit' + IntToStr(i + 1))).Value:= B[i];
В принципе этого достаточно, так как если форма разработана еще в среде программирования и на форме не будет хватать какого-то элемента, то ошибка выскочит при первом же запуске этого кода, более того, это даже лучше что ошибку будет видно сразу. Поэтому проверку (if Assigned(Component) ) делать не обязательно.
2)Динамически создавать объекты возможно и часто это полезно, однако накладывает на программиста дополнительную работу по начальной инициализации свойств объекта, а также, возможно, ручную обработку его удаления. (В моей практике был случай, когда один и тот же код размещенный в форме работал, а при помещении его в отдельную DLL ничего не работало, после полудня разбирательств выяснилось что один из компонентов не выполняет начальную инициализацию свойств при создании его динамически). Так что при создании объекта динамически нужно быть более внимательным.

Успехов.

Ответ отправил: ANBsoft (статус: Студент)
Время отправки: 31 октября 2007, 09:47
Оценка за ответ: 5


Мини-форум вопроса

Всего сообщений: 0.

31 января 2011, 19:30: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): Автоматическая обработка (2 и более ответов с оценкой 5)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:43
Выполнено за 0.03 сек.