Текущий архив: 2006.10.15;
Скачать: CL | DM;
ВнизКак опросить не существующие контролы? Найти похожие ветки
← →
vodvorezlaya (2006-09-18 12:07) [0]Доброго времени суток.
Создал я допустим несколько контролов во время работы программы,
TEdit"ы и TComboBox"ы как их опрашивать если они ещё не существуют?
← →
umbra © (2006-09-18 12:14) [1]если не существуют - никак
← →
Сергей М. © (2006-09-18 12:17) [2]Если ты их создал, значит они существуют.
Если они не существуют, значит ты их не создал.
← →
Palladin © (2006-09-18 12:17) [3]зачем тебе опрашивать то чего нет? создай и опрашивай...
ты же не сможешь есть хлеб за которым ты еще не сходил...
← →
Ega23 © (2006-09-18 12:18) [4]Никак.
var
Edit:TEdit;
Это ты всего лишь объявил указатель на объект класса TEdit. Если он (объект) ещё не существует, то как ты можешь его "опросить"? Сразу на Access Violation нарвёшься...
← →
vodvorezlaya (2006-09-18 12:35) [5]
> Если ты их создал, значит они существуют.
> Если они не существуют, значит ты их не создал.
Существует, но не рабочий экземпляр, только описанный класс.
А нужно во время работы программы создать несколько рабочих копий экземпляров и опрашавать их в программулине.
← →
Palladin © (2006-09-18 12:40) [6]Var
Edit:TEdit;
Edit:=TEdit.Create(Application);
Edit.Text:="опрос наоборот";
чего еще непонятно?
← →
vodvorezlaya (2006-09-18 12:49) [7]
> чего еще непонятно?
Да я var сделать не могу, потому что я не знаю сколько компонентов понадобится 1 или 100.
А создавать их надо как рабочие копии, только не во время разработки а во время работы программы.
← →
Ega23 © (2006-09-18 12:56) [8]
> Да я var сделать не могу, потому что я не знаю сколько компонентов
> понадобится 1 или 100.
А зачем тебе var?
Есть TObjectList, его и используй...
← →
Palladin © (2006-09-18 13:01) [9]var это для примера... способ хранения и обращения к ним сам должен придумать (в этом случае и вопрос твой должен был так и выглядеть, а не что то непонятное)
создавай и назначай имена, обращаясь потом через FindComponent для владельца, либо как в [8]...
← →
MsGuns © (2006-09-18 13:01) [10]Ему неспонятно КАК обращаться к динамически созданным объектам, НЕ ЗНАЯ ИХ ИМЕНА.
Очень просто.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;
← →
Ega23 © (2006-09-18 13:48) [11]
> MsGuns © (18.09.06 13:01) [10]
ИМХО, TObjectList предпочтительнее, чем TList. Он ещё и сам destructor объектов вызывать будет при очистке. А с Tlist тебе это самому делать придётся, там Clear только список указателей очистит, а destuctor объектов не вызовет...
← →
Dmitrij_K (2006-09-18 14:04) [12]
> ИМХО, TObjectList предпочтительнее, чем TList. Он ещё и
> сам destructor объектов вызывать будет при очистке. А с
> Tlist тебе это самому делать придётся, там Clear только
> список указателей очистит, а destuctor объектов не вызовет.
> ..
Разве форма сама не уничтожает объекты?
← →
Ega23 © (2006-09-18 14:15) [13]
> Разве форма сама не уничтожает объекты?
А это смотря как ты их создаёшь. Если в конструкторе Owner укажешь - то уничтожит. А если от nil создашь - то нет.
Дело в том, что в ObjectList кроме контролов ты ещё какие-то свои классы хранить можешь. А вот их уже сам уничтожить должен.
← →
vodvorezlaya (2006-09-18 14:37) [14]
> Ему неспонятно КАК обращаться к динамически созданным объектам,
> НЕ ЗНАЯ ИХ ИМЕНА.
Мда.
Нет, я понимаю что такое ObjectList и как.
Это всё хорошо и полезно.
Но как это сделать без описывания компонентов(без Var)?
← →
Ega23 © (2006-09-18 14:42) [15]
> Но как это сделать без описывания компонентов(без Var)?
Так и сделать. Что такое
var
edit:TEdit?
Что такое в данном случае edit?
← →
vodvorezlaya (2006-09-18 14:49) [16]
> Так и сделать. Что такое
> var
> edit:TEdit?
> Что такое в данном случае edit?
Ну ты обьявил edit как указатель на память для хранения данных класа TEdit.
А я не знаю сколько у меня будет Edit"ов.
← →
Anatoly Podgoretsky © (2006-09-18 14:54) [17]TObjectList
← →
Palladin © (2006-09-18 15:00) [18]TObjectList.Add
← →
vodvorezlaya (2006-09-18 15:21) [19]
> 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:35) [20]хм, вся ветка говорит, что сразу понял... значит действительно еще не все потеряно...
почти, правильно
MyList: TObjectList;
implementation
...............
MyList:=TObjectList.Create;
try
MyList.Add(TEdit.Create(nil));
MyList.Add(TComboBox.Create(nil));
finally
FreeAndNil(MyList);
End;
← →
Palladin © (2006-09-18 15:36) [21]только вот после FreeAndNil элементы опять не будут существовать :)
← →
Barloggg (2006-09-18 15:52) [22]хм, а что пока объект не существует указатель на него не может иметь какого-либо значения?
обычно если я создаю массив объектов я сначала весь его заполняю значением nil а потом по мере создания объектов этих самых Nll становится все меньше...
вот и все.
если экземпляр данного объекта=nil то он еще определенно не существует... :)
← →
Ega23 © (2006-09-18 15:59) [23]
> хм, а что пока объект не существует указатель на него не
> может иметь какого-либо значения?
Может. Бесспорно. Вот только куда?
← →
vodvorezlaya (2006-09-18 16:22) [24]Вот конструктор:
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 16:23) [25]
> Хочешь nil, хочешь false а можешь и true;
Это ты к чему написал?
← →
vodvorezlaya (2006-09-18 16:26) [26]
> Это ты к чему написал?
Я показаз на что влияет nil
← →
Palladin © (2006-09-18 16:28) [27]В какой строчке кода это ты показал?
← →
vodvorezlaya (2006-09-18 16:29) [28]
> если экземпляр данного объекта=nil то он еще определенно
> не существует... :)
не экземпляр обьекта = nil а его родитель = nil
← →
MsGuns © (2006-09-18 16:36) [29]>vodvorezlaya (18.09.06 16:29) [28]
>не экземпляр обьекта = nil а его родитель = nil
Беспорочное зачатие ?
← →
Palladin © (2006-09-18 16:39) [30]theStringList:TStringList;
theStringList:=TStringList.Create
к сожалению у theStringList нет никакого родителя, значит сколько его не создавай, существовать он не будет... это ставит под сомнение правильность моего понимания мира...
← →
Barloggg (2006-09-18 16:56) [31]шутники блин. :)
ха.
кстати а кто мешает воспользоваться вместо nil методами-затычками?
т.е. все простаивающие указатели объектов ссылаются не на nil а на "объект по умолчанию".
я такое использвал как-то. получилось. правда что именно получилось это уже второй вопрос...
← →
MsGuns © (2006-09-18 16:57) [32]>Palladin © (18.09.06 16:39) [30]
>к сожалению у theStringList нет никакого родителя, значит сколько его не создавай, существовать он не будет... это ставит под сомнение правильность моего понимания мира...
Во-первых, автор, ИМХО, явно путает владельца а родителя,
Во-вторых, у всего есть начало и конец. В том числе у списков, которые порождаются и уничтожаются самой виндой ;)))
← →
Palladin © (2006-09-18 17:00) [33]автор вообще все путает, несет отсебятину и поправляет чужие сообщения...
← →
vodvorezlaya (2006-09-19 08:14) [34]
> автор вообще все путает, несет отсебятину и поправляет чужие
> сообщения...
да уж, без пива не разобраться
:)
> Беспорочное зачатие ?
Что - то по типуtype
NewClass = class
Ну и не беспорочное:в род доме "type" зачатое папой "class" вылезло через маму "="
Люди! не курите травы сидя за Delphi!
← →
Virgo_Style © (2006-09-19 08:33) [35]зачем трава, если есть Начинающие
← →
vodvorezlaya (2006-09-20 08:08) [36]Ну хорошо, создал.
А дальше?
У них имена есть?
Как к ним обращаться из программы чтоб все опрашивать?
У меня компонент создавался как шаблон (Panel а на нем ComboBox, и 3 Edit"а).
← →
Наиль © (2006-09-20 09:23) [37]Покажи как создал, а мы покажем как обращаться.
← →
vodvorezlaya (2006-09-20 14:49) [38]
> Palladin © (18.09.06 15:00) [18]
> TObjectList.Add
>
Компилятор не понимает TObjectList:
var MyList: TObjectList;
[Error] Unit1.pas(15): Undeclared identifier: "TObjectList"
Почему?
← →
Наиль © (2006-09-20 14:58) [39]
uses Contnrs
← →
vodvorezlaya (2006-09-20 15:30) [40]
> Наиль ©
Создаю:
MyList:=TObjectList.Create;
MyList.Add(TEdit.Create(nil));
MyList.Add(TEdit.Create(nil));
MyList.Add(TComboBox.Create(nil));
но в моём случае желательно было-бы создавать шаблон компонента,
но не получается его потом сделать Create паскаль его не видит.
Можно и сами компоненты.
Страницы: 1 2 вся ветка
Текущий архив: 2006.10.15;
Скачать: CL | DM;
Память: 0.54 MB
Время: 0.042 c