Если PHP не будет иметь встроенное для этого, Вы не будете в состоянии сделать это в меньше, чем O (n) - перечисляющий по всем ключам и проверяющий на целый тип. На самом деле Вы также хотите удостовериться, что нет никаких дыр, таким образом, Ваш алгоритм мог бы быть похожим:
for i in 0 to len(your_array):
if not defined(your-array[i]):
# this is not an array array, it's an associative array :)
, Но почему беспокойство? Просто предположите, что массив имеет тип, который Вы ожидаете. Если это не будет, это просто аварийно завершится в Вашей поверхности - это - динамическое программирование для Вас! Протестируйте свой код, и все будут хорошо...
Вы можете легко переместить панель с выравниванием по верхнему краю наверх, установив для ее свойства Верх значение 0 . Сделайте это в обратном порядке (сначала нижняя панель), и все готово.
Переместите их так же, как вы перемещали бы их во время разработки с помощью мыши: установите для свойства Top
текущей панели значение на единицу меньше, чем для свойства Top
] свойства панели, которую вы хотите разместить под текущей панелью. Об остальном позаботится VCL.
Если вам нужно переместить несколько панелей, начните с BeginDeferWindowPos
. Настройте все панели на любые координаты с помощью DeferWindowPos
, а затем заставьте их все перемещаться одновременно с помощью EndDeferWindowPos
.
Как насчет попытки выравнивания по верхнему краю TGridPanel
с одним столбцом и n строк вместо этого --- переупорядочение панелей с выравниванием по верхнему краю, на самом деле, немного затруднительно.
(Примечание: TGridPanel
доступен в Delphi 2007 и выше, если я правильно помню).
Если вы измените верхнюю часть панели, то порядок визуального отображения панели изменится.
Попробуйте следующее (все панели выровнены по верху и с одинаковой высотой ):
PANEL0
ПАНЕЛЬ1
ПАНЕЛЬ2
ПАНЕЛЬ3
ПАНЕЛЬ4
В событии OnClick для все панели делают следующее:
TPanel(Sender).Top := TPanel(Sender).Top - TPanel(Sender).Height - 2;
Если вы щелкаете по панели, она перемещается на одну позицию вверх.
Это идея. Измените верхние X пикселей.
В то же время, если вы сделаете это:
TPanel(Sender).Top := TPanel(Sender).Top - (TPanel(Sender).Height * 2)- 2;
Панель вверх на 2 позиции.
ДОБАВЛЕНО: Если вы используете Drag & Drop, эти события возвращают позицию (X и Y); С исходным положением и конечным положением вы можете рассчитать верхнюю точку wew для назначения на панель.
Извините за мой плохой английский. с уважением
Я предлагаю создать структуру, в которой вы динамически удаляете / добавляете формы из / в их родительский элемент управления. В целом порядок создания / добавления - это визуальный порядок, но из вашего вопроса я понимаю, что вы хотите, чтобы порядок изменялся в течение срока службы приложения, поэтому простого изменения исходного порядка создания будет недостаточно.
измените порядок, попробуйте:
I know its an old post but basically helped me - the idea of setting the top property to zero. I cant use the idea of programatically set the position cause this is up to the app user - it can chose to display some charts on the app and then, all the panels (parent) of the the teecharts are align altop. I set their top property to 0 on the inverse order and then just set visible true or false according to user input...
Thanks.