Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Круглый стол
  
Правила КС
>> Настройки

Фильтр вопросов
>> Новые вопросы
отслеживать по
>> Новые ответы

Избранное

Страница вопросов
Поиск по КС


Специальные проекты:
>> К л ю к в а
>> Г о л о в о л о м к и

Вопрос №

Задать вопрос
Off-topic вопросы

Помощь

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  16:56[Войти] | [Зарегистрироваться]
Ответ на вопрос № 62148

14-05-2008 00:58
Подскажите в каком порядке будет обходить контролы такой цикл
for i:=0 to Self.ControlCount-1 do

Каким образом можно контролировать порядок перебора?

[+] Добавить в избранные вопросы

Отслеживать ответы на этот вопрос по RSS

Ответы:


Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице.
Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.

14-05-2008 06:34
Geo:
Цитирую себя, любимого:
"Зависит от компилятора и кода внутри цикла" :D


Протест принимается... :)

Sega-Zero:
У копмонентов есть свойство ComponentIndex, определяющее его индекс в массиве компонентов. Обход идет тупо по массиву в соответствии с ComponentIndex


Да, вы правы... Достаточно было заглянуть в help:

TComponent.ComponentIndex
Use ComponentIndex when iterating through the Components list of the component’s owner to perform some action on owned components. It can be used in conjunction with ComponentCount. ComponentIndex is used internally for iterative assignment procedures.

Geo:
>>> Если мне не изменяет память, их порядок совпадает с порядком обхода по Tab, т.е задаётся по TabOrder
Изменяет. Sega-Zero прав. Вспоминте, что при визуальном проектировании форм мы можем выполнять для контролов BringToFront (или что-то в этом роде). При этом TabOrder не изменяется.


Так и есть...

Для того, чтобы всё это продемонстрировать наглядно, сделаем тестовый пример:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Button1: TButton;
    Label1: TLabel;
    Edit4: TEdit;
    SpeedButton1: TSpeedButton;
    Edit5: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure ShowControls(AParent: TWinControl);
var
  i: Integer;
  S: String;
begin
  for i := 0 to AParent.ControlCount-1 do
    if AParent.Controls[i] is TWinControl then
      with AParent.Controls[i] as TWinControl do
        S := S + Format('[%d] %d  %s'#13#10, [i, TabOrder, Name])
    else
      with AParent.Controls[i] do
        S := S + Format('[%d] -  %s'#13#10, [i, Name]);
  ShowMessage(S);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowControls(Self);
end;

end.

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

Исходное положение после создания

[0] -  Label1
[1] -  SpeedButton1
[2] 0  Edit1
[3] 1  Edit2
[4] 2  Edit3
[5] 3  Button1
[6] 4  Edit4
[7] 5  Edit5

Edit1 - последним по TabOrder

[0] -  Label1
[1] -  SpeedButton1
[2] 5  Edit1
[3] 0  Edit2
[4] 1  Edit3
[5] 2  Button1
[6] 3  Edit4
[7] 4  Edit5

Edit1 - Bring to front

[0] -  Label1
[1] -  SpeedButton1
[2] 0  Edit2
[3] 1  Edit3
[4] 2  Button1
[5] 3  Edit4
[6] 4  Edit5
[7] 5  Edit1

Edit5 - Send to back

[0] -  Label1
[1] -  SpeedButton1
[2] 4  Edit5
[3] 0  Edit2
[4] 1  Edit3
[5] 2  Button1
[6] 3  Edit4
[7] 5  Edit1

Таким образом видим, что:
1. Неоконные контролы группируются в начале.
2. Изменение TabOrder не влияет на положение контрола в списке Controls (т.е. на ComponentIndex)
3. Bring to front перемещает контрол в конец списка Controls
4. Send to back перемещает контрол в начало списка Controls, но после неоконных контролов.

14-05-2008 04:45 | Комментарий к предыдущим ответам
>>> Ну, я бы не согласился. Порядок не гарантируется тогда, когда пользователю, по мнеию компилятора это по барабану, т.е если внутни цикла переменная цикла не используется
Цитирую себя, любимого:
"Зависит от компилятора и кода внутри цикла" :D

>>> Если мне не изменяет память, их порядок совпадает с порядком обхода по Tab, т.е задаётся по TabOrder
Изменяет. Sega-Zero прав. Вспоминте, что при визуальном проектировании форм мы можем выполнять для контролов BringToFront (или что-то в этом роде). При этом TabOrder не изменяется.

14-05-2008 04:17
У копмонентов есть свойство ComponentIndex, определяющее его индекс в массиве компонентов. Обход идет тупо по массиву в соответствии с ComponentIndex

14-05-2008 03:56
Я тоже надеялся на TabOrder... Но не тут то было...
Потестировав получается обход по порядку добавления на форму...

14-05-2008 02:44 | Комментарий к предыдущим ответам
>>> В общем случае цикл FOR не гарантирует тот или иной порядок выполнения.

Ну, я бы не согласился. Порядок не гарантируется тогда, когда пользователю, по мнеию компилятора это по барабану, т.е если внутни цикла переменная цикла не используется, например, просто выдаётся 10 "бипов", а for используется только для отсчёта их количества. Если же используется, то порядок определяется вполне однозначно. Думаю, одной из причин жёсткого требования, что переменная цикла должна быть именно локальной переменной, является необходимость отслеживания её использования внутри цикла. И как следствие "иногда неопределённого порядка" - неопределённость значения вне цикла.
Но вопрос был не об этом... Он был о порядке расположения контролов в списке Controls... Если мне не изменяет память, их порядок совпадает с порядком обхода по Tab, т.е задаётся по TabOrder, который первоначально совпадает с порядком создания контролов.

14-05-2008 01:17
Зависит от компилятора и кода внутри цикла. В общем случае цикл FOR не гарантирует тот или иной порядок выполнения. А пользоваться эмпирически полученным опытом -- не самый лучший вариант. Так что если для Вас порядок жизненно важен, то лучше все же поступать так

var
  i : Integer;
begin
  i:=0;
  while i < ControlCount do
    begin
    // обрабатываем Controls[i]
    Inc(i);
  end;
end;


14-05-2008 01:14
В порядке их создания

Добавьте свое cообщение

Вашe имя:  [Войти]
Ваш адрес (e-mail):На Королевстве все адреса защищаются от спам-роботов
контрольный вопрос:
Жили у бабуси два веселых гуся. Один белый, другой КАКОЙ?
в качестве ответа на вопрос или загадку следует давать только одно слово в именительном падеже и именно в такой форме, как оно используется в оригинале.
Надоело отвечать на странные вопросы? Зарегистрируйтесь на сайте.
Тип сообщения:
Текст:
Жирный шрифт  Наклонный шрифт  Подчеркнутый шрифт  Выравнивание по центру  Список  Заголовок  Разделительная линия  Код  Маленький шрифт  Крупный шрифт  Цитирование блока текста  Строчное цитирование
  • вопрос Круглого стола № XXX

  • вопрос № YYY в тесте № XXX Рыцарской Квинтаны

  • сообщение № YYY в теме № XXX Базарной площади
  • обсуждение темы № YYY Базарной площади
  •  
     Правила оформления сообщений на Королевстве

    Страница избранных вопросов Круглого стола.
      
    Время на сайте: GMT минус 5 часов

    Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
    Функция может не работать в некоторых версиях броузеров.

    Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
    Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

     
    © При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
    Все используемые на сайте торговые марки являются собственностью их производителей.

    Яндекс цитирования