![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
With Tpanel.Create(scroolbox).... [D6, WinXP]
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; то я и имя могу задать... и из любого места программы изменить его свойства..