Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.64 MB
Время: 0.032 c
15-1159256427
IceBeerg
2006-09-26 11:40
2006.10.15
outpost и net send


2-1159520821
Term
2006-09-29 13:07
2006.10.15
Может туплю


2-1159371848
Helpsic
2006-09-27 19:44
2006.10.15
Матрицы


3-1155627561
Death
2006-08-15 11:39
2006.10.15
Создание индексов в THalcyonDataSet


1-1157350859
Alkid
2006-09-04 10:20
2006.10.15
IntfClear