| 
| 
 | Вопрос # 5 694/ вопрос открыт / | 
 |  Приветствую, уважаемые эксперты!Например:
 есть цикл for i:=1 to 3 do
 if listbox1.itemindex>=0
 ....
 Всего на форме три компонента listbox отсюда -> мне надо по-очереди проверить каждый из трёх. Подстановку хочу выполнить в виде цикла for. Если я напишу:
 listbox+i+.itemindex - то это воспринимается как текст, а мне нужно вставить значение данной переменной. Спасибо.
 
|  |   Вопрос задал: Arttla (статус: Посетитель)Вопрос отправлен: 26 октября 2011, 00:43
 Состояние вопроса: открыт, ответов: 2.
 |  Ответ #1. Отвечает эксперт: min@y™ Можно перебором компонентов, лежащих на форме (не зависит от имён компонентов):
 var
  Index: Integer;
begin
  for Index:= 0 to ComponentCount - 1 do
    if (Components[Index] is TListBox) and (TListBox(Components[Index]).ItemIndex >= 0)
      then ... ;
end;Можно воспользоваться методом FindComponent:
 var
  Index: Integer;
  LB: TListBox;
begin
  for Index:= 1 to 3 do
    begin
      LB:= TListBox(FindComponent(Format('ListBox%d', [Index])));
      if Assigned(LB) and (LB.ItemIndex >= 0)
        then ... ;
    end;
end;
|  | Ответ отправил: min@y™ (статус: Доктор наук)Время отправки: 26 октября 2011, 08:29
 
 |  Ответ #2. Отвечает эксперт: Вадим К Здравствуйте, Arttla!А можно сделать оригинальнее.
 В private части формы пишем такое
 
 private
  lb:array[1..3] of TListBox;А в OnCreate формы - такое 
   lb[1] := ListBox1;
  lb[2] := ListBox2;
  lb[3] := ListBox3;конечно, можно воспользоваться кодом выше и переписать так 
   for i:= 1 to 3 do
      lb[i]:= TListBox(FindComponent(Format('ListBox%d', [i])));Но если ListBox'ов не более 5, то первый метод более приемлемый, более того, он позволяет давать произвольные имена ListBox'ам или нумеровать их в произвольном порядке. Но никто не мешает комбинировать способы, особенно, если списков много.Теперь легко можно будет писать код вида:
 
 for i:=1 to 3 do
 if lb[i].itemindex>=0 then begin
 
 end;Так как lb[i] является только ссылкой, то не нужно потом удалять ее (то есть, вызывать код вида lb[i].free - это будет грубой ошибкой). 
|  | Ответ отправил: Вадим К (статус: Академик)Время отправки: 26 октября 2011, 10:44
 
 |  
 Мини-форум вопросаВсего сообщений: 3; последнее сообщение — 26 октября 2011, 12:48; участников в обсуждении: 2. 
|   | min@y™ (статус: Доктор наук), 26 октября 2011, 11:24 [#1]: Цитата (Вадим К): А можно сделать оригинальнее. Ээээээээээээээх, гулять, так гулять!
 
 type
  TMainForm = class(TForm)
    ListBox1: TListBox;
    ListBox2: TListBox;
    ListBox3: TListBox;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    FListBoxes: TList;
    function GetListBoxCount: Integer;
    function GetListBox(const Index: Integer): TListBox;
    function GetListBoxByName(const AName: TComponentName): TListBox;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    property ListBoxCount: Integer read GetListBoxCount;
    property ListBox[const Index: Integer]: TListBox read GetListBox; default;
    property ListBoxByName[const AName: TComponentName]: TListBox read GetListBoxByName;
  end;
 
implementation
 
constructor TMainForm.Create(AOwner: TComponent); override;
var
  Index: Integer;
begin
  inherited;
  FlistBoxes:= TList.Create();
 
  // находишь ВСЕ листбоксы и пихаешь их в список
  Index:= 1;
  repeat
    begin
      LB:= TListBox(FindComponent(Format('ListBox%d', [Index])));
      if Assigned(LB)
        then FlistBoxes.Add(LB)
        else Break;
    Inc(Index);
  until False;
end;
 
destructor TMainForm.Destroy; override;
begin
  FlistBoxes.Free();
  inherited;
end;
 
function TMainForm.GetListBoxCount: Integer;
begin
  // количество листбоксов на форме
  Result:= FListBoxes.Count;
end;
 
function TMainForm.GetListBox(const Index: Integer): TListBox;
begin
  // доступ по индексу в списке
  if (Index > -1) and (Index < ListBoxCount)
    then Result:= TListBox(FListBoxes[Index])
    else Result:= nil; // или raise какой-нить exception
end;
 
function TMainForm.GetListBoxByName(const AName: TComponentName): TListBox;
var
  Index: Integer;
begin
  // доступ по имени компонента
  Result:= nil;
 
  for Index:= 0 to ListBoxCount - 1 do
    if Self[Index].Name = AName
      then begin
             Result:= Self[Index];
             Break;
           end;
end;
 
procedure TMainForm.Button1Click(Sender: TObject);
var
  Index: Integer;
begin
  // вот теперь по-настоящему ОРИГИНАЛЬНО!!! :)))
  for Index:= 0 to ListBoxCount - 1 do
    if Self[Index].ItemIndex >= 0
      then ... ;
end;
 
procedure TMainForm.Button2Click(Sender: TObject);
var
  Index: Integer;
begin
  // как хотел автор в тексте вопроса:
  for Index:= 1 to 3 do
    if Self.ListBoxByName['ListBox' + IntToStr(Index)].ItemIndex >= 0
      then ... ;
end;
   Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Вадим К (статус: Академик), 26 октября 2011, 12:10 [#2]:Это называется - заставь программиста helloworld написать, так он винды напишет  Ну все ListBox код не найдет. Если к примеру у меня будет
 Listbox1 Listbox3 Listbox4, то найдет только первый.  Поэтому лучше уже писать что то-то вида
 
 for Index:= 0 to ComponentCount - 1 do
    if (Components[Index] is TListBox)Галочка "подтверждения прочтения" - вселенское зло. |  
|   | min@y™ (статус: Доктор наук), 26 октября 2011, 12:48 [#3]: Цитата (Вадим К): Это называется - заставь программиста helloworld написать, так он винды напишет Ну ладно тебе! Я ж пошутил.
  
 Цитата (Вадим К): Ну все ListBox код не найдет. Если к примеру у меня будет Listbox1 Listbox3 Listbox4, то найдет только первый. Поэтому лучше уже писать что то-то вида Ну ошибся я немного, на коленке ж писал, не отлаживал. Хотя указал явно в классе формы, какие там листбоксы.
 Тогда так:
 
 constructor TMainForm.Create(AOwner: TComponent); override;
var
  Index: Integer;
begin
  inherited;
  FlistBoxes:= TList.Create();
 
  // находишь ВСЕ листбоксы и пихаешь их в список
  for Index:= 0 to ComponentCount - 1 do
    if Components[Index] is TListBox
      then FlistBoxes.Add(Components[Index]);
end;Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |