![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как опросить не существующие контролы? [D7, XP]
vodvorezlaya © (2006-09-18 12:07:00)Доброго времени суток.
Создал я допустим несколько контролов во время работы программы,
TEdit'ы и TComboBox'ы как их опрашивать если они ещё не существуют?
vodvorezlaya (2006-09-18 16:22:00) [41]Вот конструктор:
constructor TObjectList.Create(AOwnsObjects: Boolean); overload;
begin
inherited Create;
FOwnsObjects := AOwnsObjects;
end;
constructor TObjectList.Create; overload;
begin
inherited Create;
FOwnsObjects := True;
end;
Хочешь nil, хочешь false а можешь и true;
Ega23 (2006-09-18 15:59:00) [42]
> хм, а что пока объект не существует указатель на него не
> может иметь какого-либо значения?
Может. Бесспорно. Вот только куда?
Barloggg (2006-09-18 15:52:00) [43]хм, а что пока объект не существует указатель на него не может иметь какого-либо значения?
обычно если я создаю массив объектов я сначала весь его заполняю значением nil а потом по мере создания объектов этих самых Nll становится все меньше...
вот и все.
если экземпляр данного объекта=nil то он еще определенно не существует... :)
Palladin (2006-09-18 15:36:00) [44]только вот после FreeAndNil элементы опять не будут существовать :)
Palladin (2006-09-18 15:35:00) [45]хм, вся ветка говорит, что сразу понял... значит действительно еще не все потеряно...
почти, правильно
MyList: TObjectList;
implementation
...............
MyList:=TObjectList.Create;
try
MyList.Add(TEdit.Create(nil));
MyList.Add(TComboBox.Create(nil));
finally
FreeAndNil(MyList);
End;
vodvorezlaya (2006-09-18 15:21:00) [46]
> Anatoly Podgoretsky ©
Понял, не дурак.
var
MyList: TObjectList;
implementation
...............
try
MyList:=TObjectList.Create;
MyList.Add(TEdit.Create(nil));
MyList.Add(TComboBox.Create(nil));
finally
FreeAndNil(MyList);
Исправьте если не правильно
Palladin (2006-09-18 15:00:00) [47]TObjectList.Add
Anatoly Podgoretsky (2006-09-18 14:54:00) [48]TObjectList
vodvorezlaya (2006-09-18 14:49:00) [49]
> Так и сделать. Что такое
> var
> edit:TEdit?
> Что такое в данном случае edit?
Ну ты обьявил edit как указатель на память для хранения данных класа TEdit.
А я не знаю сколько у меня будет Edit'ов.
Ega23 (2006-09-18 14:42:00) [50]
> Но как это сделать без описывания компонентов(без Var)?
Так и сделать. Что такое
var
edit:TEdit?
Что такое в данном случае edit?
vodvorezlaya (2006-09-18 14:37:00) [51]
> Ему неспонятно КАК обращаться к динамически созданным объектам,
> НЕ ЗНАЯ ИХ ИМЕНА.
Мда.
Нет, я понимаю что такое ObjectList и как.
Это всё хорошо и полезно.
Но как это сделать без описывания компонентов(без Var)?
Ega23 (2006-09-18 14:15:00) [52]
> Разве форма сама не уничтожает объекты?
А это смотря как ты их создаёшь. Если в конструкторе Owner укажешь - то уничтожит. А если от nil создашь - то нет.
Дело в том, что в ObjectList кроме контролов ты ещё какие-то свои классы хранить можешь. А вот их уже сам уничтожить должен.
Dmitrij_K (2006-09-18 14:04:00) [53]
> ИМХО, TObjectList предпочтительнее, чем TList. Он ещё и
> сам destructor объектов вызывать будет при очистке. А с
> Tlist тебе это самому делать придётся, там Clear только
> список указателей очистит, а destuctor объектов не вызовет.
> ..
Разве форма сама не уничтожает объекты?
Ega23 (2006-09-18 13:48:00) [54]
> MsGuns © (18.09.06 13:01) [10]
ИМХО, TObjectList предпочтительнее, чем TList. Он ещё и сам destructor объектов вызывать будет при очистке. А с Tlist тебе это самому делать придётся, там Clear только список указателей очистит, а destuctor объектов не вызовет...
MsGuns (2006-09-18 13:01:00) [55]Ему неспонятно КАК обращаться к динамически созданным объектам, НЕ ЗНАЯ ИХ ИМЕНА.
Очень просто.
type
TForm1 = Class(TForm)
...
Private
ControlList: TList;
...
procedure TForm1.Create(Sender: TObject);
begin
...
ControlList := TList.Create;
end;
procedure TForm1.Close(Sender: TObject);
begin
...
ControlList.Free;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
ed: TEdit;
cmb: TComboBox;
begin
// Создание контролов
ed := TEdit.Create(Self);
ed.Top := ..
ed: Left := ..
ed.Parent : = Self;
ControlList.Add(ed);
cmb := TComboBox.Create(Self);
cmb.Top := ..
cmb: Left := ..
cmb.Parent : = Self;
cmb.Items.AddItems(...);
ControlList.Add(cmb);
...
end;
procedure TForm1.Button2Click(Sender: TObject);
var
i: integer;
se,sb: string;
begin
// Опрос контролов
for i := ControlList.Count-1 do
begin
if TControl(ControlList[i]).ClassType=TEdit then
se := se+TEdit(ControlList[i]).Text+', ';
if TControl(ControlList[i]).ClassType=TComboBox then
sb := sb+TComboBox(ControlList[i]).Text+', ';
end;
end;
Palladin (2006-09-18 13:01:00) [56]var это для примера... способ хранения и обращения к ним сам должен придумать (в этом случае и вопрос твой должен был так и выглядеть, а не что то непонятное)
создавай и назначай имена, обращаясь потом через FindComponent для владельца, либо как в [8]...
Ega23 (2006-09-18 12:56:00) [57]
> Да я var сделать не могу, потому что я не знаю сколько компонентов
> понадобится 1 или 100.
А зачем тебе var?
Есть TObjectList, его и используй...
vodvorezlaya (2006-09-18 12:49:00) [58]
> чего еще непонятно?
Да я var сделать не могу, потому что я не знаю сколько компонентов понадобится 1 или 100.
А создавать их надо как рабочие копии, только не во время разработки а во время работы программы.
Palladin (2006-09-18 12:40:00) [59]Var
Edit:TEdit;
Edit:=TEdit.Create(Application);
Edit.Text:='опрос наоборот';
чего еще непонятно?
vodvorezlaya (2006-09-18 12:35:00) [60]
> Если ты их создал, значит они существуют.
> Если они не существуют, значит ты их не создал.
Существует, но не рабочий экземпляр, только описанный класс.
А нужно во время работы программы создать несколько рабочих копий экземпляров и опрашавать их в программулине.