Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

With Tpanel.Create(scroolbox).... [D6, WinXP]


Страницы:   1 2 3 4 5 6

Ragazor ©   (2005-09-09 11:37:00) 

Делается следующее, n количетво раз:
With Tpanel.Create(scroolbox) do .....

на созданной панели нужно создать таким же макаром 2 едита
With TEdit.Create(???)
Как это сделать?


Digitman   (2005-09-14 18:38:00) [21]


> FindComponent('abcdef').<а тут только общие для TComponent
> процедуры и совйства...>;


приведи рез-т работы FindComponent() к нужному типу

например, если ты точно знаешь, что на форме F есть компонент класса TLabel с именем 'abcdef', то обратиться, например, к св-ву Caption этого компонента проще простого :

TLabel(F.FindComponent('abcdef')).Caption := '....';


ananax   (2005-09-14 16:00:00) [22]

Тогда как будет правельнее сделать?
1. через локальные переменные и FindComponent() или
2. через глобальные массивы и уже обращаться к форме через массив?

Если 1, то возникает вопрос:
как после нахождения компонента (формы и всего, что на ней находится) можно изменить, скажем, лейбл лежащий на форме? У меня не получилось...
я сделал:
FindComponent('abcdef').<а тут только общие для TComponent процедуры и совйства...>;


Digitman   (2005-09-14 15:16:00) [23]


> ananax   (14.09.05 14:51) [91]


> если по клику у меня будет выполняться описанная выше процедура,
>  то получается, что моя ссылка (F) переписовается каждый
> раз, когда я тыкаю по этой кнопке... Так?


судя по описанной выше процедуре - не так.

твоя переменная F - это локальная переменная процедуры, она "живет" только при "жизни" той самой процедуры, где F объявлена в кач-ве локальной.

в дан.случае ты ничего не "переписываешь" - ты просто записываешь во "временную" переменную некое значение (ссылку на только что созданный объект), потом где-то в той же процедуре используешь эту переменную и ее значение, после чего (т.е. после возврата из процедуры) эта переменная благополучно "умирает", унося с собой "в могилу" свое содержимое.


Digitman   (2005-09-14 15:07:00) [24]


> msguns ©   (13.09.05 16:11) [90]


> Если надо создать экземпляр класса, порожденного  не от
> TComponent, с ним что, надо шаманить по-особенному ?


а разве нет ?

и в чем "шаманство". по-твоему, заключается ?


ananax   (2005-09-14 14:51:00) [25]

Огромное спасибо Digitman!

Вроде бы я это понял, только вот вопрос:

если по клику у меня будет выполняться описанная выше процедура, то получается, что моя ссылка (F) переписовается каждый раз, когда я тыкаю по этой кнопке... Так? Те стоит действовать что-то вроде динамического массива создать fff: array of TForm.... попробую так... есть ли другое решение?


msguns   (2005-09-13 16:11:00) [26]

>Digitman ©   (13.09.05 15:10) [89]

Все это, конечно, круто и правильно, но..
А почему везде упоминается слово компонент? Если надо создать экземпляр класса, порожденного  не от TComponent, с ним что, надо шаманить по-особенному ?

;))


Digitman   (2005-09-13 15:10:00) [27]


> ananax   (13.09.05 14:48) [88]


вникай .. я комментирую каждую твою строчку :

//создать объект-компонент класса TForm
//владельцем создаваемого объекта назначить объект-компонент, на кототрый ссылается значение переменной Form1
//ссылку на созданный объект-компонент записать в переменную f

f:=TForm.Create(Form1);

//создать объект-компонент класса TButton
//владельцем создаваемого объекта назначить объект-компонент, на кототрый ссылается значение переменной f
//ссылку на созданный объект-компонент записать в переменную b

b:=TButton.Create(f);

//назначить с-ву Parent объекта, ссылка на который хранится в переменной b, значение, равное ссылке на объект, хранящейся в переменной f

b.Parent:=f;

//указать, что на объекте-компоненте-форме, ссылка на который хранится в переменной f, объект-компонент-"кнопка" с этого момента должна быть видимой
b.Visible:=True;

//показать модально объект-компонент-форму, ссылка на который хранится в переменной f

f.ShowModal;


> f и b локальные переменные


это значит, что время их жизни равно времени жизни той п/программы, где эти переменные объявлены.

непосредственно после возврата из п/программы эти переменные более не существуют в памяти, следовательно хранимые в них значения (ссылки на некие объекты) безвозвратно утеряны.

НО !

при
TForm.Create(Form1);

ссылка на только что созданный объект-форму будет фигурировать в списке Screen.Forms[] вплоть до момента вызова метода-деструктора ЭТОГО объекта-формы

а поскольку владельцем объекта-компонента b: TButton является тот самый объект-форма, который таки пока еще фигурирует в списке Screen.Forms[], его всегда можно найти методом FindComponent(имя_компонента) среди прочих объектов-компонентов на этом объекте-форме - все эти объекты-компоненты имеют владельцем тот самый объект-форму и имеют уникальное значение св-ва Name


ananax   (2005-09-13 14:48:00) [28]

ок. это я вроде понял.

Теперь дальше:

procedure MyPr;
var
 f: TForm;
 b: TButton;
begin
 f:=TForm.Create(Form1);
 b:=TButton.Create(f);
 b.Parent:=f;
 b.Visible:=True;
 f.ShowModal;
end;
Так?
f и b локальные переменные... да и если я несколько раз вызову эту процедуру (вместо ShowModal Visible:= True), то создастся несколько форм.
как получить указатель на созданные формы, чтобы их в последствии можно было изменить... я понимаю, что практически это не нужно (по крайней мере мне), но для общего развития не помешало бы научиться это делать.


Digitman   (2005-09-13 11:29:00) [29]


> ananax   (13.09.05 11:05) [86]


тебе следует понять, что в среде Делфи компонентом считается любой класс/объект-наследник класса TComponent

форма (т.е. класс/объект-наследник класса TForm) - не исключение, это тоже компонент

- любой компонент в среде Делфи имеет св-во Owner, которое либо ссылается на заведомо существующего владельца (компонент-владелец) данного компонента (объект-владелец при своем уничтожении неявно ответственен уничтожение всех объектов, зн-е св-ва Owner которых есть ссылка на уничтожаемый объект-владелец) либо хранит nil, что означает отсутствие заведомо указанного компонента-владельца; св-во Owner любого компонента указывается при его создании/конструировании и не м.б. изменено после создания/конструирования

- любой компонент в среде Делфи имеет св-во Name, зн-е которого м.б. либо пустой строкой либо строкой символов ( лат.алфавит + алф.-цифр. символы + некоторые спец.символы

- если зн-е св-ва Name компонента не пустое, оно д.б. уникальнымв пределах значений св-в Name каждого из компонентов в св-ве-списке Components[] того компонента, который "владеет" данным компонентом; именно на этом правиле основана логика работы метода любого компонента FindComponent()


ananax   (2005-09-13 11:05:00) [30]

Уж очень разрозненно как-то получается...
с объяснениями..

Подскажите, что можно по данной теме почитать... Перелистал свои домашние книжки, все что-то не то... В примерах тоже только совсем примитив ((((


Digitman   (2005-09-12 18:06:00) [31]


> как теперь изменить свойства найденного компонента?


обычным образом

Идентификатор.Свойство := НовоеЗначениеЭтогоСвойства;


> FindComponent('abcdef') видимо для других целей


да, для других .. а именно - для поиска/идентификации компонента по имени в списке компонентов, владельцем корогого является компонент, метод FindComponent() которого ты вызываешь


Игорь Шевченко   (2005-09-12 18:01:00) [32]

ananax   (12.09.05 17:56) [83]

А собственно, форму ты так не создашь, поэтому FindComponent не сработает.

Кроме того, список всех созданных форм находится в списке Screen.Forms


ananax   (2005-09-12 17:56:00) [33]

АГА!!!
Вот оказываестя что! Интересно!

Имя дать смог..... Но как теперь изменить свойства найденного компонента?
FindComponent('abcdef') видимо для других целей...


Digitman   (2005-09-12 17:33:00) [34]


> ananax   (12.09.05 17:25) [79]


> Как мне действовать?


для начала понять, что и L. Nameи F. Nameесть обращения к опубликованному СВОЙСТВУ КОМПОНЕНТА.

св-во объекта (экз-ра класса-наследника) класса TComponent НЕ может иметь значения, содержащие символы кириллицы (*).

Объекты классов И TLabel И TForm - это КОМПОНЕТНТЫ, потому что они являются экз-рами классов-наследников класса TComponent.

а раз так, то см. (*)


Игорь Шевченко   (2005-09-12 17:33:00) [35]


> F := TForm.Create(Form1);


F := TForm.Create(nil);


kot andrei   (2005-09-12 17:31:00) [36]

что так и говорит...

Warning[17]: Может не работать.
Error[17]: Действительно не работает.


ananax   (2005-09-12 17:25:00) [37]

у меня так:

L := TLabel.Create(Form1);
L.Name := 'Пусик'; //Работает ))))

F := TForm.Create(Form1);
F.Name := 'abcdf'; //Не работает ((((

Как мне действовать?


Игорь Шевченко   (2005-09-12 16:56:00) [38]

ananax   (12.09.05 16:50) [76]

Обычно, для того, чтобы получить верный ответ, нужно привести полное описание своих действий и код, которыми эти действия выполняются. У отвечающих обычно нет перед глазами экрана спрашивающего, и додумать они не могут, а чаще всего- не хотят.


Digitman   (2005-09-12 16:56:00) [39]


> не получается у меня изменить имя формы


что такое "имя формы" ?


ananax   (2005-09-12 16:50:00) [40]

))) Ладно, Digitman.
Ты умный! Вот скажи мне, создал я форму:

with TForm.Create(...) do
begin
....
end;

или

f := TForm.Create(...);
и тд.
не получается у меня изменить имя формы (чтобы ее в последствии ))))) найти) и не получается воспользоваться ComponentIndex для работы с формой и ее компонентами... (((
Подскажи, как ты это делаешь?
если я создаю глобальную переменную l: TLabel; то я и имя могу задать... и из любого места программы изменить его свойства..


Страницы:   1 2 3 4 5 6

Наверх

Титульная страница Поиск, карта сайта Написать письмо