Текущий архив: 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 паскаль его не видит.
Можно и сами компоненты.
← →
Virgo_Style © (2006-09-20 15:35) [41]vodvorezlaya (20.09.06 15:30) [40]
стало быть, все созданное находится в MyList
← →
Сергей М. © (2006-09-20 15:41) [42]
> не получается его потом сделать Create паскаль его не видит
Что, прямо так и и говрит, мол, не вижу и все тут ?)
← →
Наиль © (2006-09-20 15:47) [43]
TEdit(MyList[0]).Text:="Привет";
TComboBox(MyList[2]).Text:="Пока";
← →
vodvorezlaya (2006-09-20 16:33) [44]
> Что, прямо так и и говрит, мол, не вижу и все тут ?)
Нет, я перефразировал с англиканского:
[Error] Unit1.pas(60): Undeclared identifier: "TPanelTemplate"
[Pascal Error] Unit1.pas(1): Unable to invoke Code Completion due to errors in source code
Но вопрос остаётся открытым. Как его(шаблон) create?
> TEdit(MyList[0]).Text:="Привет";
> TComboBox(MyList[2]).Text:="Пока";
Спасибо.Работает.
А как узнать их колличество?
И на что влияет nil в строчке: MyList.Add(TEdit.Create(nil))?
← →
Virgo_Style © (2006-09-20 16:39) [45]vodvorezlaya (20.09.06 16:33) [44]
А как узнать их колличество?
Сколько ТЫ создал - столько и есть.
← →
Сергей М. © (2006-09-20 16:48) [46]
> vodvorezlaya (20.09.06 16:33) [44]
> Undeclared identifier: "TPanelTemplate"
> я перефразировал с англиканского
Спасибо за одолжение)
Ну и ?
Паскаль-то знаем ?
Про USES знаем ?
← →
vodvorezlaya (2006-09-21 08:14) [47]
> Virgo_Style ©
> Сколько ТЫ создал - столько и есть.
Ну я то может и знаю сколько, а прога не знает сколько я ей создам.
Есть некая процедура, которую нужно выполнять столько - сколько этих компонентов (набор Panel а на ней 2 Edit и 1 ComboBox) создаст пользователь (который не знает что такое D7).
Т.е. кроме создания компонентов нужно ещё выполнять процедуру опроса каждого из них.
> Про USES знаем ?
Я не знаю какой модуль отвечает за шаблоны компонентов.
← →
Наиль © (2006-09-21 09:07) [48]
> А как узнать их колличество?MyList.Count
> И на что влияет nil в строчке: MyList.Add(TEdit.Create(nil))?
TEdit.Create(self) - Edit уничтожается формой (если self - форма) при уничтожении формы.
TEdit.Create(Panel1) - Edit уничтожается при уничтожении панели.
TEdit.Create(nil) - уничтожание - обязаность программиста.
MyList.OwnsObjects:=true; - объекты будут уничтожатся автоматически при удалении их из списка MyList, и как следствие, при уничтожении самого MyList.
← →
Наиль © (2006-09-21 09:10) [49]
> нужно ещё выполнять процедуру опроса каждого из них
как-такой "опрос"?
← →
Сергей М. © (2006-09-21 09:19) [50]
> не знаю какой модуль отвечает за шаблоны компонентов
Никакой.
Инф-ция о существующих шаблонах хранится в файле (%DELPHI)\bin\delphi.dct.
Делфи использует этот файл исключительно в дизайн-тайм.
Тот самый идентификатор TPanelTemplate не является идентификатором класса, поэтому строчка TPanelTemplate.Create(..) бессмысленна.
Для создания группы контролов в ран-тайм "по шаблону" следует использовать фреймы.
← →
vodvorezlaya (2006-09-21 10:15) [51]
> > нужно ещё выполнять процедуру опроса каждого из них
>
> как-такой "опрос"?
Есть процедура, входные параметры которой задаются динамически созданными компонентами(набором на TPanel).
Вот сколько таких TPanel(c Edit,Edit,ComboBox) создадим столько нужно и процедуру выполнять, с той последовательностью входных параметров скакой мы создавали их.
Огромное всем спасибо.
Пока пошёл это пробовать.
← →
vodvorezlaya (2006-09-22 08:05) [52]
> Есть процедура, входные параметры которой задаются динамически
> созданными компонентами(набором на TPanel).
>
> Вот сколько таких TPanel(c Edit,Edit,ComboBox) создадим
> столько нужно и процедуру выполнять, с той последовательностью
> входных параметров скакой мы создавали их.
Как прописать и где вызов этой процедуры?
← →
Наиль © (2006-09-22 08:18) [53]
> Как прописать и где вызов этой процедуры?
Откуда нам знать. В [51] ни слова не сказано, что за процедура такая.
← →
vodvorezlaya (2006-09-22 08:32) [54]
> Откуда нам знать. В [51] ни слова не сказано, что за процедура
> такая.
Процедура связи по COM порту, протокол RK-512.
В ней 4 параметра.procedure READ_RK512(temp: array of byte; c: integer; var data: array of byte;count: integer);
Нужно узнать сколько создали элементов(допустим TEdit"ов) и ровно столько раз выполнять эту процедуру, а входным параметром будет строка TEdit"а. (Это всё нужно делать во время работы программы без компилятора).
Спасибо.
← →
vodvorezlaya (2006-09-22 08:47) [55]Да в принципе любая процедура.
Procedure Rulezz;
← →
Ketmar © (2006-09-22 08:53) [56]offtop:
sql не знаем. Delphi не знаем. а программу, судя по всему, пишем за деньги (иначе зачем порт пинать?). ужос. УВЧ.
← →
Сергей М. © (2006-09-22 08:54) [57]
> vodvorezlaya (22.09.06 08:47) [55]
Если ссылки на созданные тобой контролы фигурируют в некоем списке (неважно каком, будь он хоть TObjectList, хоть Controls, хоть Components), то всегда есть возможность получить кол-во элементов этого списка, чтобы использовать его в кач-ве верхней границы цикла:
for i := 0 to MyObjectList.Count - 1 do
Rulezz;
← →
Ketmar © (2006-09-22 08:57) [58]>[57] Сергей М.(c) 22-Sep-XLI A.S., 08:54
>Если ссылки на созданные тобой контролы
...
а по-моему -- метла. или это я просто зол от того, что у меня вся DNA-таки кривая?
← →
Наиль © (2006-09-22 11:34) [59]
> что у меня вся DNA-таки кривая
Что за DNA?
> а по-моему -- метла
А по моему метла - это слишком мягко.
А с другой стороны. У человека хватает терпения ждать ответа.
Так почему бы не дать ему (потом догнать и ещё раз дать:-) несколько уроков правильной поставки вопроса. Уж это ему точно в жизни пригодиться.
← →
Игорь Шевченко © (2006-09-22 11:41) [60]Ketmar © (22.09.06 08:57) [58]
Дату при цитировании приведи в нормальный вид, плз.
← →
vodvorezlaya (2006-09-22 16:28) [61]
> offtop:
offtop:
Ну если кому-то интересно, то в данный момент у меня цель изучить Delphi, SQL и многое другое.
Работаю программером на окладе, где написание программ не обязательно но приветствуется.
То что узнаю из опыта передаю другим в форумах.
← →
Ketmar © (2006-09-22 18:24) [62]>[60] Игорь Шевченко(c) 22-Sep-2006, 11:41
>Дату при цитировании приведи в нормальный вид,
>плз.
не вопрос. так нормально? или всё цифрами сделать?
← →
vodvorezlaya (2006-09-25 08:03) [63]
> for i := 0 to MyObjectList.Count - 1 do
> Rulezz;
Ну вроде то.
А вообще можно было бы компонент написать, который имел-бы метод Rulezz;
Всем вери сенькс.
← →
Плохиш © (2006-09-25 10:53) [64]
> vodvorezlaya (22.09.06 16:28) [61]
> Ну если кому-то интересно, то в данный момент у меня цель
> изучить Delphi, SQL и многое другое.
Книжки читать не пробовал?
> То что узнаю из опыта передаю другим в форумах.
Я плякал, а вы говорите "Архангельский" :-))
Страницы: 1 2 вся ветка
Текущий архив: 2006.10.15;
Скачать: CL | DM;
Память: 0.62 MB
Время: 0.042 c