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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 02.07.2009, 12:17
Antik163rus Antik163rus вне форума
Прохожий
 
Регистрация: 11.09.2008
Сообщения: 33
Репутация: 10
По умолчанию Цикл

Имею на форме 25 лейблов. Надо, чтобы при загрузке их caption'ы были 0. Я так понимаю это надо реализовать с помощью цикла, как?
Ответить с цитированием
  #2  
Старый 02.07.2009, 14:52
Аватар для Winny
Winny Winny вне форума
Продвинутый
 
Регистрация: 26.05.2007
Адрес: Планета земля, Россия, Москва
Сообщения: 620
Репутация: 30
По умолчанию

Цитата:
Сообщение от Antik163rus
Имею на форме 25 лейблов. Надо, чтобы при загрузке их caption'ы были 0. Я так понимаю это надо реализовать с помощью цикла, как?
Можно реализовать вот так:
Код:
var
i:integer;
begin
for i:=0 to ComponentCount-1 do begin
if Components[i] is TLabel then begin
Components[i].Caption:='0';
end;
end;
При таком коде не имеет значение, сколько у тебя на форме Label'ов. Писать код надо на OnCreate формы.
__________________

Ответить с цитированием
  #3  
Старый 02.07.2009, 18:36
Аватар для TOJluK
TOJluK TOJluK вне форума
Местный
 
Регистрация: 25.02.2009
Адрес: Минск
Сообщения: 551
Версия Delphi: 2007
Репутация: 110
По умолчанию

Так он все Label изменит, лучше через FindComponent имхо.
Ответить с цитированием
  #4  
Старый 02.07.2009, 19:07
Ваводя Ваводя вне форума
Прохожий
 
Регистрация: 02.07.2009
Сообщения: 4
Репутация: 10
По умолчанию

подскажите и мне чтоли. Новую тему создавать не стал, потому что вопрос у мну почти тоот же самый.

Код:
procedure Tcalculator.ComboBox6Exit(Sender: TObject);
begin
GroupBox2.Visible:=false;     // здесь оно обнуляет видимость
GroupBox3.Visible:=false;      // всех девяти групбоксов.
GroupBox4.Visible:=false;   // Первый всегда видимый, поэтому он не упомянут
GroupBox5.Visible:=false;
GroupBox6.Visible:=false;
GroupBox7.Visible:=false;
GroupBox8.Visible:=false;
GroupBox9.Visible:=false;
GroupBox10.Visible:=false;

KolSek:= StrToInt(ComboBox6.Text);  //KolSek-это количество секций,
                                     //которое пользователь указывает
for i:=2 to KolSek do
 GroupBox[i].Visible:=true;  //в зависимости от того, что укажет пользователь нужно сделать видимыми
                             //определённое количество Групбоксов
end;


Вопрос в том, что он выдаёт ошибку в строке

GroupBox[i].Visible:=true;

нужно как-то массив объявить или что?

Сильно прошу не пинать, это мой первый код, и соответственно, первый вопрос на форуме.
Ответить с цитированием
  #5  
Старый 02.07.2009, 19:15
Nyctos Kasignete Nyctos Kasignete вне форума
Активный
 
Регистрация: 29.03.2009
Сообщения: 300
Репутация: 94
По умолчанию

Читайте, что написал TOJluK. Грубо говоря, так.
Код:
for i:=2 to KolSek do
 (FindComponent('GroupBox' + IntToStr(i)) as TGroupBox).Visible:=true;
Но лучше предварить проверкой, что метод FindComponent возвращает не nil.
Ответить с цитированием
  #6  
Старый 02.07.2009, 19:24
Ваводя Ваводя вне форума
Прохожий
 
Регистрация: 02.07.2009
Сообщения: 4
Репутация: 10
По умолчанию

Вот спасибо! Я с этим дня три плясал, всё никак не получалось. Теперь надо разобраться как здесь плюсы в репутацию ставить и что это за FindComponent такой.)))
Спасибо!
Ответить с цитированием
  #7  
Старый 02.07.2009, 20:09
Ваводя Ваводя вне форума
Прохожий
 
Регистрация: 02.07.2009
Сообщения: 4
Репутация: 10
По умолчанию

вот тогда ещё вопрос такой появился.

вот такой кусок

Код:
for i:=2 to 10 do
 (FindComponent('GroupBox' + IntToStr(i)) as TGroupBox).Visible:=false;
for i:=8 to 52 do
 (FindComponent('ComboBox' + IntToStr(i)) as TComboBox).Visible:=false;

работает нормально. А как сделать в одном цикле две операции? Чтобы он не крутил их последовательно, сначла один, потом другой.

То что длина их разная - не страшно, это я формулу запхну для определения второго индекса i (i+6 или какнить там соображу).

Вобщем нужно, чтобы обе операции выполнялись в одном цикле, одна за другой. Между ними нужно ставить не точку с запятой а что-то другое. Перепробовал уже всё: и запятую и and и в скобки брал - не помогает.

Это касается вобщем не только циклов с if-then-else такая же проблема.

Засада в том, что толком не знаю ещё терминов, приходится изъясняться сами видите как.
Ответить с цитированием
  #8  
Старый 02.07.2009, 20:28
Nyctos Kasignete Nyctos Kasignete вне форума
Активный
 
Регистрация: 29.03.2009
Сообщения: 300
Репутация: 94
По умолчанию

Цитата:
в скобки брал - не помогает
Не те скобки. =) Нужны операторные скобки beginend

Код:
for i:=2 to 10 do
begin
  (FindComponent('GroupBox' + IntToStr(i)) as TGroupBox).Visible:=false;
  (FindComponent('ComboBox' + IntToStr(???)) as TComboBox).Visible:=false;
end;
Но стоит ли в данном случае выдумывать формулу для расчета индекса? Чем вам не по душе два последовательных цикла? Крохотный выигрыш в быстродействии — здесь это не существенно, по-моему.

Последний раз редактировалось Nyctos Kasignete, 02.07.2009 в 20:32.
Ответить с цитированием
  #9  
Старый 02.07.2009, 21:14
Ваводя Ваводя вне форума
Прохожий
 
Регистрация: 02.07.2009
Сообщения: 4
Репутация: 10
По умолчанию

Формулу выдумывать именно в этом случае оказывается что и не стоит. Эт точно. Выигрыш по времени расчёта может и не значительный.
Просто преследовал две цели:
1. Увидят может моё творение программисты - обсмеют, скажут"шож ты тут понагородил-то"
2. В связке if-then, (ну я уже упоминал) до это приходилось городить невесть чо. А теперь перепишу как нужно.

Вот незадача - два раза подряд одному и тому же человеку плюс в репу не ставится. А больше тут и не отвечает никто.)))

спасибо!
Ответить с цитированием
  #10  
Старый 03.07.2009, 09:20
Antik163rus Antik163rus вне форума
Прохожий
 
Регистрация: 11.09.2008
Сообщения: 33
Репутация: 10
По умолчанию

Всем спасибо!

Цитата:
Сообщение от Winny
Можно реализовать вот так:
Код:
var
i:integer;
begin
for i:=0 to ComponentCount-1 do begin
if Components[i] is TLabel then begin
Components[i].Caption:='0';
end;
end;
При таком коде не имеет значение, сколько у тебя на форме Label'ов. Писать код надо на OnCreate формы.
Ошибка на строке: "Components[i].Caption := '0';" - говорит: "Undeclared identifier: 'Caption'".
Ответить с цитированием
  #11  
Старый 03.07.2009, 12:07
Nyctos Kasignete Nyctos Kasignete вне форума
Активный
 
Регистрация: 29.03.2009
Сообщения: 300
Репутация: 94
По умолчанию

А так попробуйте.
Код:
(Components[i] as TLabel).Caption:='0';
Ответить с цитированием
  #12  
Старый 03.07.2009, 12:53
Antik163rus Antik163rus вне форума
Прохожий
 
Регистрация: 11.09.2008
Сообщения: 33
Репутация: 10
По умолчанию

Цитата:
Сообщение от Nyctos Kasignete
А так попробуйте.
Код:
(Components[i] as TLabel).Caption:='0';

Ок. Работает. Спасиб )))
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter