|
Вопрос # 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. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|