Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.02.2011, 20:45   #1
voverrr
Пользователь
 
Регистрация: 25.08.2010
Сообщений: 62
По умолчанию Как в цикле последоватеотно пербитать Edit-ы?

Пытаюсь организовать цикл
на форме четыре Edit-a и комбобокс.
При выборе комбобокса эти едиты последовательно опрашиваются, и если значение в очередном едите=0, то переменная "а" увеличивается на единицу.

Буксует на строчке, где упоминается очередной едит[i].Подскажите, пожалуйста, как пишется команда для перебора этих окошек?

Код:
procedure TForm1.cbb1Change(Sender: TObject);
var i, j, a, summa :Integer;

     begin
        j:= cbb1.ItemIndex;
        for i:=1 to j do
        if edt[i].Text :=0   ///// вот тут ошибка
         then....

     end;
вот беда, объяснить-то толком не могу...
voverrr вне форума Ответить с цитированием
Старый 13.02.2011, 21:04   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

1) абсолютно непонятно, что такое edt[i] ?!
У Вас есть массив, куда Вы заносите все нужные Edit'ы ?
Или что?

2) абсолютно непонятно, что Вы вкладываете в понятие "очередной едит" ? Очередной, это тот, на который переходит фокус с текущего эдита(по табуляции?

3) нельзя сравнивать переменную Text с нулём - обычно эта переменная типа String;

4) есть несколько подходов.
a) завести массив объектов и перебирать их по массиву
b) находить их по именам (если имена эдитов подчиняются какому-то регулярному закону.)
например,
Код:
var
  MyComponent: TComponent;
begin
 for d:=2 to 10 do
  begin
   MyComponent := Form2.FindComponent('Edit'+IntToStr(d));
   if MyComponent <> nil then
     if TEdit(MyComponent).Text = '0' then ....;
end;
c) перебрать все имеющиеся на форме Edit'ы
Код:
  for k:=0 to Form1.ComponentCount-1 do
     if Form1.Components[k] is TEdit then begin
        if TEdit(Form1.Components[k]).Text = '0' 
          then ...в очередном Edit - ноль...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 13.02.2011, 21:19   #3
voverrr
Пользователь
 
Регистрация: 25.08.2010
Сообщений: 62
По умолчанию

1. Edt[i] - это Edit1 при первом витке цикла(i=1), Edit2 - при втором, когда i=2 и т.д.
просто у меня оно пишется почему-то не Edit, а Edt. То ли настройки какие-то, то ли ещё что...

3. а если переменную в едите перевести в ноль?:
edt1.Text:=IntToStr(0);

тут вот в чём проблема. После then он буксует.
как видите познания мои в дельфи на уровне.... (в каком там классе начинают программирование изучать?)-1 класса.
Код:
procedure TForm1.cbb1Change(Sender: TObject);
var i, j, a, summa :Integer;

begin
j:= cbb1.ItemIndex;
for i:=1 to j do

    If TEdit(FindComponent('edt'+inttostr(i))).text := 0
     then
      a := a+1;
      lbl2.Caption := IntToStr(a);

end;
voverrr вне форума Ответить с цитированием
Старый 13.02.2011, 22:23   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

1) как сравнивали text с нулём, так и сравниваете

2) зачем выкинули из моего примера проверку на то, что компонент через FindComponent успешно найден ?

3) примерно так:
Код:
procedure TForm1.cbb1Change(Sender: TObject);
var i, j, a, summa :Integer;

begin
j:= cbb1.ItemIndex;
a := 0;
for i:=1 to j do

    If FindComponent('edt'+inttostr(i))<>nil then
        if TEdit(FindComponent('edt'+inttostr(i))).text = '0'
        then
           a := a+1;

      lbl2.Caption := IntToStr(a);

end;
p.s. Вы проверку на то, что найденный компонент с именем edtX является TEdit тоже убрали.
Поэтому, если назовёте какой-нибудь компонент (например, кнопку, именем edt1) получите Access Vioaltion...

Последний раз редактировалось Serge_Bliznykov; 13.02.2011 в 23:46.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 13.02.2011, 22:23   #5
ArtGrek
DelphiProger
Участник клуба
 
Аватар для ArtGrek
 
Регистрация: 14.11.2010
Сообщений: 1,023
По умолчанию

Цитата:
If TEdit(FindComponent('edt'+inttostr( i))).text := 0
Код:
 If TEdit(FindComponent('edt'+inttostr(i))).text = 0
не вижу у voverrr строки типа а := 0;
может где то в создании формы есть?

Цитата:
эти едиты последовательно опрашиваются
зачем вот ето?
j:= cbb1.ItemIndex;
разве цикл не должен происходить столько раз сколько на нем едитов? или я что то не так понял?
VirusN13

Последний раз редактировалось ArtGrek; 13.02.2011 в 22:34.
ArtGrek вне форума Ответить с цитированием
Старый 13.02.2011, 23:46   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ArtGrek
спасибо. вот что значит копировать не свой текст, а чужой.
Просмотрел этот баг! (сейчас исправлю в примере...)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 15.02.2011, 18:33   #7
voverrr
Пользователь
 
Регистрация: 25.08.2010
Сообщений: 62
По умолчанию

спасибо за советы, закрутился на несколько дней, сейчас буду пробовать.
в общих чертах суть задачи такова:

это калькулятор для просчёта дверей в шкафу-купе.
дверь может быть полноформатная, 2х-фрагментная, 3х-фрагментная, и 4х-фрагментная, за это отвечает За это отвечает ItemIndex (j) у Cbb1. Соответственно этому итеминдексу и выставляется счётчик циклов.

Затем в цикле опрашивается содержимое Едита, и если оно равно нулю - переменная а увеличивается на единицу.

В процессе пользования этой программой предполагается, что если в поле Едит-а стоит ноль(не указана), то высота этой вставки зависит от высоты соседних, которые указаны.
Не знаю, насколько полезные эти мои подробности, ну да ладно, напишу.

а:=0 - у меня действитна, нигде не прописано.

Serge_Bliznykov
2)это мне тут насоветовали попутно

вот картинка того, что у меня есть:


цикл не должен происходить столько раз сколько на нем едитов?
неа. Едитов на форме больше, чем фрагментов на двери.
voverrr вне форума Ответить с цитированием
Старый 15.02.2011, 18:57   #8
ArtGrek
DelphiProger
Участник клуба
 
Аватар для ArtGrek
 
Регистрация: 14.11.2010
Сообщений: 1,023
По умолчанию

последнии вариант от Serge_Bliznykov разве не подошел?
только, думаю ItemIndex('4-х фрагментная') = 3
................................... .3...........................2
................................... .2...........................1
................................... .1...........................0
j:= cbb1.ItemIndex + 1;
VirusN13

Последний раз редактировалось ArtGrek; 15.02.2011 в 19:36.
ArtGrek вне форума Ответить с цитированием
Старый 15.02.2011, 21:56   #9
voverrr
Пользователь
 
Регистрация: 25.08.2010
Сообщений: 62
По умолчанию

ArtGrek
да, с j+1 я понял, что надо подгонять значения.
Serge_Bliznykov
спасибо, Ваш вариант как раз подошёл. Потихоньку разбираюсь как это всё работает.

Соответственно, ещё один вопрос, уже не по теме:
как организовать подпрограмму(если в дельфи вообще есть такое понятие, как подпрограмма)?
В бейсике помнится было достаточно просто - GoSub(номер строки), В дельфи же что-то я не могу найти никакого описания. У меня тут кусок кода есть, который повторяется много раз, ведь как-то можно организовать обращение к нему?
voverrr вне форума Ответить с цитированием
Старый 15.02.2011, 22:18   #10
ArtGrek
DelphiProger
Участник клуба
 
Аватар для ArtGrek
 
Регистрация: 14.11.2010
Сообщений: 1,023
По умолчанию

Код:
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Podprograma(Sender: TObject; NewCaption: string);
    procedure FormClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Podprograma(Sender: TObject; NewCaption: string);
begin
  TButton(Sender).Caption := NewCaption;
end;

procedure TForm1.FormClick(Sender: TObject);
var
  Str: string;
begin
  Str := IntToStr(Left + Top);
  Podprograma(Button1, Str);
end;

end.
но думаю после практики лучше создать новую тему, потому что она объемная
VirusN13
ArtGrek вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как понизить число в цикле For? Wild_klas Помощь студентам 6 21.10.2010 12:39
как работает счетчик в цикле for? Kushtemo Общие вопросы C/C++ 7 28.08.2010 14:35
UpdateData(false) в цикле? вывод числа в Edit box Иван36 Помощь студентам 5 31.03.2008 18:33
Как вывести в цикле for ... do строки? ViTYAi2007 Помощь студентам 14 27.03.2008 05:47
как выбрать значения в цикле в паскале Melok Помощь студентам 5 14.12.2007 10:46