Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.10.15;
Скачать: [xml.tar.bz2];

Вниз

Как опросить не существующие контролы?   Найти похожие ветки 

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.62 MB
Время: 0.065 c
3-1156069250
Johnny_Raw
2006-08-20 14:20
2006.10.15
помогите составить sql-запрос, а то поиск медленнее чем в paradox


2-1159597995
кукумбер
2006-09-30 10:33
2006.10.15
Книга


2-1159531313
Sergey_b
2006-09-29 16:01
2006.10.15
Где нажата кнопка


15-1159249195
Новичоккк
2006-09-26 09:39
2006.10.15
Вопрос по FastScript


3-1155278466
wipr
2006-08-11 10:41
2006.10.15
Open and detach





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский