Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 5 694

Раздел: Delphi » Прочее
/ вопрос открыт /

Приветствую, уважаемые эксперты!
Например:
есть цикл for i:=1 to 3 do
if listbox1.itemindex>=0
....
Всего на форме три компонента listbox отсюда -> мне надо по-очереди проверить каждый из трёх. Подстановку хочу выполнить в виде цикла for. Если я напишу:
listbox+i+.itemindex - то это воспринимается как текст, а мне нужно вставить значение данной переменной. Спасибо.

Arttla Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: 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™

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™

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. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:44
Выполнено за 0.04 сек.