![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Код:
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
|
|||
|
|||
|
Как некорректно работает-то?
А связанно это, видимо, с тем, что панель это тоже контейнер и может содержать другие панели и надо бы учитывать этот момент. |
|
#3
|
|||
|
|||
|
lmikle, ну может показывать одну панель подряд несколько раз, в общем непонятно.
|
|
#4
|
|||
|
|||
|
Попробуй так
Код:
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
|
|||
|
|||
|
Black Raider, не помогло...
|
|
#6
|
|||
|
|||
|
Цитата:
|
|
#7
|
|||
|
|||
|
да панели не в коде создаются, а ручками) видимо я изначально не верно сформулировал вопрос
|
|
#8
|
|||
|
|||
|
попробуй так:
Код:
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
|
|||
|
|||
|
вообще понять не могу, почему код работает так же как и изначально...
|
|
#10
|
|||
|
|||
|
Значится так.
Выбрасывай свой код нафиг, т.к. у тебя там несколько проблем, которые так просто не решишь. Тебе надо показать ВСЕ панели случайным образом. Так? Код:
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
|
|||
|
|||
|
lmikle, спасибо, разобрался
![]() Тема закрыта! |