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

Delphi Sources



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

Закрытая тема
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 03.06.2010, 18:55
sheffdop sheffdop вне форума
Прохожий
 
Регистрация: 30.05.2010
Сообщения: 10
Репутация: 10
По умолчанию код ведет себя интересно

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  i: integer;                   //Переменная для цикла i
  ArPanel: array of TControl;   //Динамический массив TControl
  Vis: boolean;                 //Переменная, показывающая скрытость или видимость
  r: integer;                   //Переменная, содержащая рандомное значение
begin

  //Цикл для нахождения и помещения в дин. массив TControl-ов
  for i := 0 to Form1.ControlCount -1 do
  if Form1.Controls[i] is TPanel then
    begin
      SetLength(ArPanel, High(ArPanel) + 2);      //Установка размера массива большего на 1
      ArPanel[High(ArPanel)] := Form1.Controls[i];
    end;

  Randomize;

  //Фрагмент нужен для того, чтобы не показывать панел второй раз
  Repeat
    r := Random(High(ArPanel) - Low(ArPanel) +1);
    Vis := ArPanel[r].Visible;
    ArPanel[r].Show;
  Until not Vis ;

end;
этот код перебирает в произвольном порядке все панели. и все замечательно, если панели раскиданы по форме. а вот если панели накладывать одну на другую, то почему-то работает не корректно... с чем может быть это связано?
  #2  
Старый 03.06.2010, 19:35
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Как некорректно работает-то?
А связанно это, видимо, с тем, что панель это тоже контейнер и может содержать другие панели и надо бы учитывать этот момент.
  #3  
Старый 03.06.2010, 20:09
sheffdop sheffdop вне форума
Прохожий
 
Регистрация: 30.05.2010
Сообщения: 10
Репутация: 10
По умолчанию

lmikle, ну может показывать одну панель подряд несколько раз, в общем непонятно.
  #4  
Старый 04.06.2010, 09:22
Black Raider Black Raider вне форума
Местный
 
Регистрация: 31.05.2010
Адрес: Москва
Сообщения: 466
Версия Delphi: 7
Репутация: 40
По умолчанию

Попробуй так
Код:
for i := 0 to Form1.ComponentCount - 1 do
  if Form1.Component[i] is TPanel then
    begin
      SetLength(ArPanel, High(ArPanel) + 2);      //Установка размера массива большего на 1
      ArPanel[High(ArPanel)] := Form1.Controls[i];
    end;
  #5  
Старый 07.06.2010, 06:15
sheffdop sheffdop вне форума
Прохожий
 
Регистрация: 30.05.2010
Сообщения: 10
Репутация: 10
По умолчанию

Black Raider, не помогло...
  #6  
Старый 07.06.2010, 10:14
Black Raider Black Raider вне форума
Местный
 
Регистрация: 31.05.2010
Адрес: Москва
Сообщения: 466
Версия Delphi: 7
Репутация: 40
По умолчанию

Цитата:
Сообщение от sheffdop
Black Raider, не помогло...
А как панели создаются? Код создания в студию.
  #7  
Старый 07.06.2010, 10:19
sheffdop sheffdop вне форума
Прохожий
 
Регистрация: 30.05.2010
Сообщения: 10
Репутация: 10
По умолчанию

да панели не в коде создаются, а ручками) видимо я изначально не верно сформулировал вопрос
  #8  
Старый 07.06.2010, 10:43
Black Raider Black Raider вне форума
Местный
 
Регистрация: 31.05.2010
Адрес: Москва
Сообщения: 466
Версия Delphi: 7
Репутация: 40
По умолчанию

попробуй так:
Код:
procedure TForm1.vPanel(comp:Tcomponent);
begin
  if (comp is TPanel) then begin
   (comp as TPanel).Visible:=true;
   if (comp as Tpanel).Parent is Tpanel then vPanel((comp as Tpanel).Parent);
   end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  i,k: integer;                   //Переменная для цикла i
  ArPanel: array of TControl;   //Динамический массив TControl
  Vis: boolean;                 //Переменная, показывающая скрытость или видимость
  r: integer;                   //Переменная, содержащая рандомное значение
begin

  //Цикл для нахождения и помещения в дин. массив TControl-ов
  for i := 0 to Form1.ComponentCount -1 do
  if Form1.components[i] is TPanel then
    begin
      SetLength(ArPanel, High(ArPanel) + 2);      //Установка размера массива большего на 1
      ArPanel[High(ArPanel)] := (Form1.components[i] as Tcontrol);
    end;

  Randomize;

  //Фрагмент нужен для того, чтобы не показывать панел второй раз
  k:=0;
  Repeat
    r := Random(High(ArPanel) - Low(ArPanel) +1);
    Vis := ArPanel[r].Visible;
    vpanel(ArPanel[r]);//.Show;
  k:=k+1;
  Until (not Vis )or (k=100);

end;
  #9  
Старый 07.06.2010, 20:07
sheffdop sheffdop вне форума
Прохожий
 
Регистрация: 30.05.2010
Сообщения: 10
Репутация: 10
По умолчанию

вообще понять не могу, почему код работает так же как и изначально...
  #10  
Старый 07.06.2010, 21:52
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Значится так.
Выбрасывай свой код нафиг, т.к. у тебя там несколько проблем, которые так просто не решишь. Тебе надо показать ВСЕ панели случайным образом. Так?

Код:
procedure TForm1.ShowPanels(APanels : Array Of TPanel);
var
  I, Idx : Integer;
begin
  For I := Low(APanels) To High(APanels) Do
    Begin
       Idx := Random(Length(APanels));
       While APanels[Idx].Visible Do
           Begin
              Inc(AIdx);
              If Idx = High(APanels)+1 Then AIdx := Low(APanels);
           End;
       APanels[Idx].Visible := True;
    End;
end;

Что делает код.
Он выполняет цикл столько раз, скольно у тебя панелей.
Внутри каждой итерации он генерит случайный индекс панели в их, панелей, массиве. Далее, если панель уже видима, то он циклически сдвигает этот индекс на 1, пока не найдет первую невидимую панель. Тогда он делает ее видимой и переходит к следующей итерации внешнего цикла.

Ну а массив панелей ты и так умеешь собирать. Не вставлял этот код для простоты понимания.
  #11  
Старый 08.06.2010, 19:15
sheffdop sheffdop вне форума
Прохожий
 
Регистрация: 30.05.2010
Сообщения: 10
Репутация: 10
По умолчанию

lmikle, спасибо, разобрался
Тема закрыта!
Закрытая тема


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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