Форум: "Начинающим";
Текущий архив: 2005.10.16;
Скачать: [xml.tar.bz2];
ВнизWith Tpanel.Create(scroolbox).... Найти похожие ветки
← →
Ragazor (2005-09-09 11:37) [0]Делается следующее, n количетво раз:
With Tpanel.Create(scroolbox) do .....
на созданной панели нужно создать таким же макаром 2 едита
With TEdit.Create(???)
Как это сделать?
← →
Плохиш © (2005-09-09 11:44) [1]Что, религиозный запрет на временные переменные?
← →
Dilmo (2005-09-09 11:56) [2]const
maxPanel = n;
maxEdit = m;
var
newPanel: TPanel;
newEdit: TEdit;
i, j: integer;
begin
for i:=1 to maxPanel do begin
newPanel := TPanel.Create(MainForm);//MainForm - owner
newPanel.Parent := scroolbox; // если надо чтобы на контрол легла
newPanel.Visible := true; //если надо визибл
newPanel.Alignment := .. //если надо алигн
newPanel.top(Left. Height, Width);//размеры и положение
for j:=1 to maxEdit do begin
newEdit := TEdit.Create(MainForm);
newEdit.Parent := newPanel;//на панель положить
newEdit.Top(Left, Height, Width);//размеры и положение осительно панели
newEdit.Visible := true;//показать
end;
end;
end;
← →
Ragazor (2005-09-09 11:57) [3]сказал же n количество раз... и без free!
← →
Ragazor (2005-09-09 11:59) [4]Мне нужно их создавать динамически по нажатию кнопки. Причем много, N штук.
Никаких переменных тут быть не может.
← →
Плохиш © (2005-09-09 12:02) [5]
> Ragazor (09.09.05 11:59) [4]
> Мне нужно их создавать динамически по нажатию кнопки. Причем
> много, N штук.
> Никаких переменных тут быть не может.
Понятно. Обсуждение вопросов религии производится в конференции "Потрепаться".
PS. Книжки бы что ли почитал.
← →
Ragazor (2005-09-09 12:11) [6]const
maxPanel = n;
maxEdit = m;
не катит.
n - в смыле неизвестное количество, предположим, бесконечно
← →
Digitman © (2005-09-09 12:13) [7]
> Ragazor (09.09.05 11:57) [3]
> Причем много, N штук
> и без free
ценнейшие комментарии
> Никаких переменных тут быть не может
мыль веревку.
ибо при таких претензиях задача не имеет решения.
← →
Dilmo (2005-09-09 12:14) [8]ну блин, не используй константу, подставляй переменное значение в цикл, смысл то не меняется
← →
Ragazor (2005-09-09 12:23) [9]нашел решение
...
with TPanel.Create(ScrBx) do begin
Parent := ScrBx;
Align := alTop;
Width := 30;
BevelOuter := bvLowered;
BevelInner := bvRaised;
Tag := Aindex; // procedure input param
Pnlhdl := Handle; //var Pnlhdl: HWND
Cidx := ComponentIndex; //var Cidx: integer
end;
CreateEdit(Cidx, 40, ATRGtext);
CreateEdit(Cidx, 260, ADESCRtext);
...
function CreateEdit(ATag, Aleft: integer; Txt: Widestring): boolean;
begin
with TEdit.Create(Components[Atag]) do begin
Parent := FindControl(Pnlhdl);
Left := ALeft;
Top := 5;
Caption := Txt;
end;
end;
← →
Dilmo (2005-09-09 12:26) [10]Чтото не понял я чем тебя мой вариант не устроил, но в принципе главное чтобы работало ;)
← →
Ragazor (2005-09-09 12:29) [11]для Dilmo
ну твой вариант подразумевает создание всего сразу в цикле столько сколько указать в константах.
а мой вариант пихается в процедуру и по нажатии кнопки вызывается криэйт. Таким образом я могу насоздавать туеву хучу панелек и эдитов, а не фиксированное число
← →
Digitman © (2005-09-09 12:29) [12]
> Никаких переменных тут быть не может
а Cidx, по-твоему, - это не переменная ?
← →
Digitman © (2005-09-09 12:31) [13]
> Ragazor (09.09.05 12:29) [11]
а переменные-то тут причем ?!
← →
Ragazor (2005-09-09 12:37) [14]имеются ввиду переменные для Tpanel & Tedit
← →
Плохиш © (2005-09-09 12:38) [15]
> Digitman © (09.09.05 12:31) [13]
> а переменные-то тут причем ?!
Человек просто не знает про локальные переменные и ООП для него тёмный лес :-(
← →
Digitman © (2005-09-09 12:42) [16]
> Ragazor (09.09.05 12:37) [14]
> имеются ввиду переменные для Tpanel & Tedit
и что ?
ЧТО мешает создать переменную типа TComponent ?
← →
Ragazor (2005-09-09 13:01) [17]Ничто не мешает, просто это делать не нужно по требованию.
Вот ещё лучший вариант:(Никаких переменных панел и эдит)
procedure CreatePnlEdt(APanel: Tpanel; ATTxt, ADtxt: Widestring);
begin
with TTntEdit.Create(APanel) do begin
Parent := APanel;
Left := 40;
Top := 5;
Text := ATTxt;
end;
//тут можно насоздавать всего что хочешь, и все будет на панели.
end;
function CreatePanel: TPanel;
begin
Result := TPanel.Create(ScrBx);
with Result do begin
Parent := ScrBx;
Align := alTop;
Width := 30;
BevelOuter := bvLowered;
BevelInner := bvRaised;
end;
end;
И теперь, скажем, в Button1Click пишем
CreatePnlEdt(CreatePanel,"some text", "sometext");
и кликаем наздоровье (а не const
maxPanel = n;
maxEdit = m;) ...
← →
Ragazor (2005-09-09 13:03) [18]А Digitman и кто там ещё, со своими переменными попробуйте реализуйте красиво на переменных. Интересно сколько строк кода добавится в программу...
← →
Digitman © (2005-09-09 13:05) [19]
> это делать не нужно по требованию
по какому такому "требованию" ?
кто и на каком основании мог потребовать от тебя не использовать переменные ?!
← →
Alexander Panov © (2005-09-09 13:05) [20]Ragazor (09.09.05 13:03) [18]
Интересно сколько строк кода добавится в программу...
Ни одной. Только уменьшится.
← →
Плохиш © (2005-09-09 13:08) [21]1. Ты просил 2 едита.
2. Result - это переменная.
3. Гланды можно вырезать по-разному.
← →
Digitman © (2005-09-09 13:12) [22]
> Ragazor (09.09.05 13:03) [18]
var Comp: TComponent;
..
Comp := Tpanel.Create(..);
with Tpanel(Comp) do
begin
..
end;
..
for .. to .. do
with TEdit.Create(Comp) do
begin
..
end;
← →
Dilmo (2005-09-09 13:13) [23]не уверен что TEdit.Create(Comp) это как раз то, что нужно
потому как таким макаром Owner выставляется, а ему нужен парент
owner"ом в полне может быть форма на которую все ложится.. и этого будет достаточно
← →
Игорь Шевченко © (2005-09-09 13:16) [24]
> А Digitman и кто там ещё, со своими переменными попробуйте
> реализуйте красиво на переменных
Красота вообще убийственная сила.
Мой совет по теме красоты - почитай исходники VCL, там достаточно красиво и без извратов.
← →
Digitman © (2005-09-09 13:17) [25]
> Dilmo (09.09.05 13:13) [23]
да по колено, нужно или не нужно !)
суть не в этом ..
суть - в использовании переменной
← →
Ragazor (2005-09-09 13:20) [26]для Digitman ©
>>по какому такому "требованию" ?
>>кто и на каком основании мог потребовать от тебя не >>использовать переменные ?!
Такому, есть требования "красивости", неписаные. Я ж не шутки
пишу, для моей конкретной цели нужно только так и никак более и точка. Что за вопрос вообще. Нужно мне и все, зачем тебе знать знать кто от меня и что требует?. Можешь помочь помоги, не можешь не трепи нервы.
При твоих раскладах код будет множится как тараканы.
А то что ты написал попробуй запусти в делфи прежде чем сюда парить.
← →
Digitman © (2005-09-09 13:24) [27]
> Ragazor (09.09.05 13:20) [26]
> есть требования "красивости", неписаные
какие такие требования ?!
просвети уж меня, тундру ..
← →
Ragazor (2005-09-09 13:26) [28]для Digitman ©
я так понял, что ты не понял что мне нужно, а я соответственно не пойму что ты мне доказываешь...
← →
Alexander Panov © (2005-09-09 13:28) [29]Ragazor (09.09.05 13:20) [26]
Твоя задачка для всех здесь может представлять только теоретический интерес, да и он будет весьма сомнительным.
С практической точки зрения твои условия абсолютно не имеют смысла.
Лучше бы сказал, чего добиться хочешь от такой "оптимизации".
← →
Игорь Шевченко © (2005-09-09 13:29) [30]
> Такому, есть требования "красивости", неписаные.
Есть только два требования - программа должна работать и быть удобочитаемой. Все остальные "требования" - ламерство.
← →
Ragazor (2005-09-09 13:29) [31]Закинь вот тот код, что я написал последним, в делфи и посмотри что он делает. Если то, что ты писал делает тоже самое и меньше писанины, тебе + мне -, а нет, тогда тебе - мне + :)
← →
Tonich © (2005-09-09 13:30) [32]ндааа сам задал вопрос, сам ответили сам же себя и похвалил за такое обалденный код который написал))
← →
Alexander Panov © (2005-09-09 13:31) [33]Ragazor (09.09.05 13:29) [31]
Закинь вот тот код, что я написал последним, в делфи и посмотри что он делает. Если то, что ты писал делает тоже самое и меньше писанины, тебе + мне -, а нет, тогда тебе - мне + :)
Тебе дана рабочая, опробованная не одну тысячу раз схема.
← →
Ragazor (2005-09-09 13:32) [34]для Игорь Шевченко ©
... удобна для пользователей, и обеспечивать тот уровень возможностей который они требуют ( для того чтобы её покупали, а не конкурентов).
← →
Игорь Шевченко © (2005-09-09 13:35) [35]Ragazor (09.09.05 13:32) [34]
Это все первое требование. Для этого извратов в исходном тексте не требуется - пользователи не покупают исходный код.
← →
Ragazor (2005-09-09 13:36) [36]для Tonich
Столкнулся с проблемой, тут начали умничать всякие умники а зечем тебе а почему так а давай по другому задачу тебе изменю...
Потом сам походу нашел решение...и себя не хвалю.
Если у кого-то есть лучшее и проверенное решение то давайте,я только ЗА, я ж для этого и написал свой пост! Так нет же, сначала обосрать, а потом поумничать...
← →
Ragazor (2005-09-09 13:39) [37]для Игорь Шевченко
Ну по твоим правилам тогда можно просто "в ЛОБ" программировать... И когда в проекте уже более 150 форм и юнитов уже никто ничего не спасет...
← →
Игорь Шевченко © (2005-09-09 13:42) [38]Ragazor (09.09.05 13:39) [37]
> Ну по твоим правилам тогда можно просто "в ЛОБ" программировать.
Кстати да, рекомендую. Результат обычно достигается наиболее оптимальный.
> И когда в проекте уже более 150 форм и юнитов уже никто
> ничего не спасет...
Это мало. Я понимаю, 500-1000
← →
Ragazor (2005-09-09 13:42) [39]для Alexander Panov ©
Нет здесь никакой оптимизации...
Просто это единственное решение которое я нашел, без лишнего кода(это конечно на мой взгляд)...
Пока никто ничего альтернативного не предоставил, кроме Dilmo, который несовсем правильно понял задачу.
← →
Digitman © (2005-09-09 13:43) [40]да что ж ты за олух-то царя небесного, а ?)
ведь ты ж спросил, ЧТО подставить вместо ???? !
тебе ж и был ответ - вместо ???? подставить идентификатор любой переменной, в которой следовало зафиксировать ссылку на только что созданный объект класса-наследника TComponent, который в соответствии с логикой метода Create должен стать владельцем TEdit-компонентов, далее по тексту тобой создаваемых ..
← →
Ragazor (2005-09-09 13:44) [41]Игорь Шевченко ©
при лобовом программировани и 100 вполне достаточно для того чтобы если не потерятся, то замедлить ход работы существенно.
← →
Ragazor (2005-09-09 13:45) [42]для Digitman ©
а зачем мне FOR ...TO ... DO???
← →
Ragazor (2005-09-09 13:49) [43]я ж посути реализовал то что у тебя только не через переменную обхявленую в вар, а через фынкцию, которая просто возварщает Tpanel.
Мне нужно создавать не 1 панел а n панелей и на каждой панели создавать что-то своё.
И по твоему коду уже 2 создание панели даст что? Правильно access violation... потому как фрее небыл вызван, да и не нужен он мне.
← →
Игорь Шевченко © (2005-09-09 13:50) [44]Ragazor (09.09.05 13:44) [41]
Что есть "лобовое программирование", поясни ?
А то, может мы о разном ?
Я сторонник того, чтобы не извращаться с "неиспользованием переменных" из соображений "красивости".
← →
Ragazor (2005-09-09 13:51) [45]Скажем так, 1 пост немного нужно переделать для того кто не понял 1 предложение.
вместо
"
Делается следующее, n количетво раз:
With Tpanel.Create(scroolbox) do .....
на созданной панели нужно создать таким же макаром 2 едита
With TEdit.Create(???)
Как это сделать?"
написать
"Делается следующее, n количетво раз:
With Tpanel.Create(scroolbox) do .....
на каждой созданной панели нужно создать таким же макаром 2 едита
With TEdit.Create(???)
Как это сделать?"
← →
Digitman © (2005-09-09 13:51) [46]
> Ragazor (09.09.05 13:45) [42]
да какие нафих еще FOR ...TO ... DO ?!
при чем они здесь ВООБЩЕ ?)
ты перечитай свой ИЗНАЧАЛЬНЫЙ вопрос, а не всю ту байду, что ты понес далее по ходу обсуждения !
вопрос же имеет тривиальный ответ - создать объект класса TPanel и ЗАФИКСИРОВАТЬ ссылку на него в некоей переменной (хоть локальной хоть статической - по барабану), а затем факт.параметром констр.метода класса TEdit передать значение этой переменной !
что, от того что ты объявишь, скажем, лок.переменную Comp: TComponent, твой проект потерпит катастрофу ?)
← →
Ragazor (2005-09-09 13:57) [47]Игорь Шевченко ©
ну это как говорится "кто на что учился"...
вот можно написать так
var ddd: Tpanel;
...
ddd := Tpanel.Create(..);
...
а можно
wtih Tpanel.Create(..) do
вот если нет надобности в ddd, не нужно к ней обращаться где нить, то 1 вариант это лобовое программирование.
Хотя с другой точки зрения криворукостей нет ни в 1 ни в 2.
Просто 2 вариант экономичней
← →
Ragazor (2005-09-09 13:58) [48]>>что, от того что ты объявишь, скажем, лок.переменную Comp: TComponent, твой проект потерпит катастрофу ?)
Да. В моей задаче в ней нет надобности.
← →
Плохиш © (2005-09-09 13:58) [49]
> Ragazor (09.09.05 13:49) [43]
> И по твоему коду уже 2 создание панели даст что? Правильно
> access violation... потому как фрее небыл вызван, да и не
> нужен он мне.
Скажите, пожалуйста, название вашего программного продукта, что бы я его как-нибуть нечаенно не установил у себя.
← →
Ragazor (2005-09-09 14:01) [50]Плохиш ©
Delphi
← →
Alexander Panov © (2005-09-09 14:02) [51]Ragazor (09.09.05 13:57) [47]
Просто 2 вариант экономичней
Чем он экономичнее?
Можно объяснить?
Ragazor (09.09.05 13:58) [48]
Да. В моей задаче в ней нет надобности.
Как все запущено.procedure CreateObj(aParent: TObject; aText1,aText2: String);
var
Panel: TPanel;
begin
Panel := TPanel.Create(aParent as TWinControl);
with Panel do
begin
Align := alTop;
Height := 50;
BevelOuter := bvLowered;
BevelInner := bvRaised;
Parent := aParent as TWinControl;
end;
with TEdit.Create(Panel) do
begin
Left := 40;
Top := 5;
Text := aText1;
Parent := Panel;
end;
with TEdit.Create(Panel) do
begin
Left := 40;
Top := 23;
Text := aText2;
Parent := Panel;
end;
end;
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
CreateObj(Form1,"Text1","Text2");
end;
← →
Игорь Шевченко © (2005-09-09 14:02) [52]Ragazor (09.09.05 13:57) [47]
> ну это как говорится "кто на что учился"...
> вот можно написать так
>
> var ddd: Tpanel;
> ...
> ddd := Tpanel.Create(..);
> ...
> а можно
> wtih Tpanel.Create(..) do
> вот если нет надобности в ddd, не нужно к ней обращаться
> где нить, то 1 вариант это лобовое программирование.
> Хотя с другой точки зрения криворукостей нет ни в 1 ни в
> 2.
> Просто 2 вариант экономичней
За фразу ddd := TPanel.Create (..); программист становится кандидатом на увольнение. Не потому, что with не использует, а по другой причине.
Насколько я понимаю, ты задаешь вопрос не о единственном with, в случае с единственным компонентом все просто. Ты же хочешь извратиться, не имея переменной для панели (из соображений "красивости") создать на ней еще какие-то компоненты.
Вот за такие извраты обычно программисты тоже увольняются довольно быстро.
← →
Digitman © (2005-09-09 14:06) [53]
> Ragazor (09.09.05 14:01) [50]
> Delphi
плагиат-с это, уважаемый) ... мягко говоря) .. при худшем же для тебя раскладе Борланд будет вправе призвать тебя к ответственности за фривольное использование тобой наименования запатентованной компанией Borland торговой марки "Delphi")
← →
Игорь Шевченко © (2005-09-09 14:07) [54]Alexander Panov © (09.09.05 14:02) [51]
> procedure CreateObj(aParent: TObject; aText1,aText2: String);
aParent: TWinControl
← →
Digitman © (2005-09-09 14:08) [55]
> В моей задаче в ней нет надобности
ты просто "зажал" по недоумию своему каких-то 4 байта в стеке, которые будут жить там всего лишь на протяжении времени жизни п/программы.. не более того
← →
Alexander Panov © (2005-09-09 14:11) [56]Да ладно, чего вы распинаетесь.
Если бы человек из спортивого интереса мучался - тогда можно было бы подумать. А Извращение с экономией памяти в размер указателя в течение 50 мс в практической задаче - это уже мазохизмом попахивает.
← →
Ragazor (2005-09-09 14:11) [57]Alexander Panov ©
Чем он экономичнее?
Можно объяснить?
От того что вы дали - ничем, проехали...
ну вот ще одна реализация...
Чё вы на меня накинулись?
Я что кого-то унизил? Просто спросил помощи...
И вот дали ещё 1 вариант.
Почти тоже самое что и у меня только в 1 процедуре....
← →
Alexander Panov © (2005-09-09 14:16) [58]Ragazor (09.09.05 14:11) [57]
Не обижайся, но твоя постанока вопроса с неподтвержденными ничем утверждениями, алогичная с нашей точки зрения и привела к такому результату.
← →
Digitman © (2005-09-09 14:16) [59]
> Просто спросил помощи
в том виде, в каком ты ее попросил в изнач.вопросе, ты ее получил (см. [1], [51])
дальнейшие твои инсинуации около сабжа НЕ имеют прямого отношения к изнач.вопросу - тебя понесло в какие-то "циклы", "красивость" и пр.
если же имеют, тогда впредь вопрос свой ставь как положено : кратко, внятно, точно. ... а не в виде ???
← →
Ragazor (2005-09-09 14:18) [60]Alexander Panov ©
Да ты такой же мазохизм написал как и я, только в 1 процедуру...
У тебя переменная "панел" а у меня "Результ"
← →
Ragazor (2005-09-09 14:20) [61]>>в том виде, в каком ты ее попросил в изнач.вопросе, ты ее >>получил (см. [1], [51])
Согласен...
Токо почитай что ты там мне писал до 51...
← →
Digitman © (2005-09-09 14:25) [62]
> Ragazor (09.09.05 14:20) [61]
> что ты там мне писал до 51
тоже самое и написал - создай TPanel-объект, ссылкку на него зафиксируй в некоей ПЕРЕМЕННОЙ, и эту самую переменную потом передавай/используй в кач-ве Owner и/или Parent для далее создаваемых тобой TEdit-объектов .. в чем ты видишь расхождения того, что я тебе сказал, с [1], [51] ? ... тебя понесло в какие-то там "циклы", что никаким боком к сему тривиальному решению задачи не относится)
← →
Игорь Шевченко © (2005-09-09 14:27) [63]Ragazor (09.09.05 14:20) [61]
А ты не страдай. Сделай TFrame, положи туда 2 Edit"а, и плоди сами фреймы.
← →
Ragazor (2005-09-09 14:28) [64]ну где мой пост где я про циклы говорил?
← →
Ragazor (2005-09-09 14:29) [65]>>Игорь Шевченко ©
>>А ты не страдай. Сделай TFrame, положи туда 2 Edit"а, и плоди сами фреймы.
Тоже выход...
← →
Digitman © (2005-09-09 14:33) [66]
> Ragazor (09.09.05 12:11) [6]
> const
> maxPanel = n;
> maxEdit = m;
> не катит.
>
> n - в смыле неизвестное количество, предположим, бесконечно
вот это ЧТО ?
КАКОЕ отношение ЭТО имеет к сабжу ?
сабж-то в чем ?
сабж-то в том , что при твоем with TPanel.Create(..) в теле with-блока ты НЕ имеешь доступа к ссылке на только что созданный (текущий) объект, а она тебе нужна для того чтобы сослаться на этот объект в кач-ве Owner/Parent при последующем конструировании одного или более TEdit-объектов (неважно при этом, в цикле или иначе эти TEdit-объекты ты вознамерился конструировать) .. тривиальнейшее решение очевидно - зафиксировать результат вызова констр.метода класса TPanel в любой переменной, имеющей подходящий тип, и затем указывать эту переменную при вызове констр.метода класса TEdit и при назначении св-ва Parent сконструированного TEdit-объекта (с приведением типа переменной к TWinControl, если необходимо)
← →
Ragazor (2005-09-09 14:44) [67]Digitman ©
ну согласен к САБЖу это отношения не имеет, этоответ на сообщение ..
тут много чего не имеет отношения к САБЖу..
И про циклы, кстати, я тут нигде не говорил...
>> сабж-то в том , что при твоем with TPanel.Create(..) в
Начиная отсюда прав. Я это уже понял давно.
Вот это я и реализовал и ещё кое кто написал там реализацию...
Так в чем проблема?
← →
Digitman © (2005-09-09 15:03) [68]
> про циклы, кстати, я тут нигде не говорил
а к чему тогда стольль живо отреагировал в своем [6] в ответ на [2] ?
какая, спрашивается, разница, известно n или неизвестно ?
> тут много чего не имеет отношения к САБЖу
разумеется не имеет)
в конечном итоге все что от тебя требовалось - задать вопрос в примерно след.виде - как и возможно ли вообще в теле with-блока для некоего объекта-наследника класса TWinControl получить на него ссылку
← →
Ragazor (2005-09-09 15:41) [69]<<как и возможно ли вообще в теле with-блока для некоего объекта-наследника класса TWinControl получить на него ссылку
Если бы я задал так вопрос, то я бы нашел на него ответ не дописав бы до конца предложение...
← →
wal © (2005-09-09 15:47) [70]
> Если бы я задал так вопрос, то я бы нашел на него ответ
> не дописав бы до конца предложение...
А тебе на smart question cсылку еще не давали?
← →
Digitman © (2005-09-09 15:48) [71]именно потому, что ты НЕ задал так вопрос, ты и имеешь проблему)
ибо правильно поставленный вопрос - это чуть ли не 90% его решения)
← →
ananax (2005-09-12 16:08) [72]Извините, что вмешиваюсь, но у меня по этой теме (во время проверки работоспособности предложенных вариантов - кстати, TComponent мне показалось интереснне) возникли вопросы:
1. я сделал не TPanel а TForm. Все ОК, но не получается вызвать ее модально. (( что посоветуете?
2. как и какими средствами можно вести лист созданных форм и как используя это лист их (при нажатии кнопки на них) их убивать???
С этим получается такая история, что пока у меня по одной форме создается и убивается, то все работает. как только я создаю их бльше чем 1, то сразу возникает ошибка.
← →
Digitman © (2005-09-12 16:12) [73]
> ananax (12.09.05 16:08) [72]
> не получается вызвать ее модально
1. что значит "не получается" ?
2. какая ?
← →
ananax (2005-09-12 16:29) [74]1. С первым я справился! СпасиБо Digitman"у
2. Хочется: потыкать по кнопке (получается) насоздавать форм с кнопками (получается) присобачить к кнопке событие (получается) замачивания формы на которой она сидит.
Но: если нарушито последовательность: создал форму -> замочил
то выскакивает ошибка..
всвязи с этим вопросы...
можно ли и как найти форму после того, как я их на штамповал?
как можно задать имя создаваемой формое (у меня почему-то вываливается ошибка)?
Где про это можно почитать?
← →
Digitman © (2005-09-12 16:35) [75]
> можно ли и как найти форму после того, как я их на штамповал?
не теряй.
тогда и искать не придется.
← →
ananax (2005-09-12 16:50) [76]))) Ладно, Digitman.
Ты умный! Вот скажи мне, создал я форму:
with TForm.Create(...) do
begin
....
end;
или
f := TForm.Create(...);
и тд.
не получается у меня изменить имя формы (чтобы ее в последствии ))))) найти) и не получается воспользоваться ComponentIndex для работы с формой и ее компонентами... (((
Подскажи, как ты это делаешь?
если я создаю глобальную переменную l: TLabel; то я и имя могу задать... и из любого места программы изменить его свойства..
← →
Игорь Шевченко © (2005-09-12 16:56) [77]ananax (12.09.05 16:50) [76]
Обычно, для того, чтобы получить верный ответ, нужно привести полное описание своих действий и код, которыми эти действия выполняются. У отвечающих обычно нет перед глазами экрана спрашивающего, и додумать они не могут, а чаще всего- не хотят.
← →
Digitman © (2005-09-12 16:56) [78]
> не получается у меня изменить имя формы
что такое "имя формы" ?
← →
ananax (2005-09-12 17:25) [79]у меня так:
L := TLabel.Create(Form1);
L.Name := "Пусик"; //Работает ))))
F := TForm.Create(Form1);
F.Name := "abcdf"; //Не работает ((((
Как мне действовать?
← →
kot andrei © (2005-09-12 17:31) [80]что так и говорит...
Warning[17]: Может не работать.
Error[17]: Действительно не работает.
← →
Игорь Шевченко © (2005-09-12 17:33) [81]
> F := TForm.Create(Form1);
F := TForm.Create(nil);
← →
Digitman © (2005-09-12 17:33) [82]
> ananax (12.09.05 17:25) [79]
> Как мне действовать?
для начала понять, что и L.Name и F.Name есть обращения к опубликованному СВОЙСТВУ КОМПОНЕНТА.
св-во объекта (экз-ра класса-наследника) класса TComponent НЕ может иметь значения, содержащие символы кириллицы (*).
Объекты классов И TLabel И TForm - это КОМПОНЕТНТЫ, потому что они являются экз-рами классов-наследников класса TComponent.
а раз так, то см. (*)
← →
ananax (2005-09-12 17:56) [83]АГА!!!
Вот оказываестя что! Интересно!
Имя дать смог..... Но как теперь изменить свойства найденного компонента?
FindComponent("abcdef") видимо для других целей...
← →
Игорь Шевченко © (2005-09-12 18:01) [84]ananax (12.09.05 17:56) [83]
А собственно, форму ты так не создашь, поэтому FindComponent не сработает.
Кроме того, список всех созданных форм находится в списке Screen.Forms
← →
Digitman © (2005-09-12 18:06) [85]
> как теперь изменить свойства найденного компонента?
обычным образом
Идентификатор.Свойство := НовоеЗначениеЭтогоСвойства;
> FindComponent("abcdef") видимо для других целей
да, для других .. а именно - для поиска/идентификации компонента по имени в списке компонентов, владельцем корогого является компонент, метод FindComponent() которого ты вызываешь
← →
ananax (2005-09-13 11:05) [86]Уж очень разрозненно как-то получается...
с объяснениями..
Подскажите, что можно по данной теме почитать... Перелистал свои домашние книжки, все что-то не то... В примерах тоже только совсем примитив ((((
← →
Digitman © (2005-09-13 11:29) [87]
> ananax (13.09.05 11:05) [86]
тебе следует понять, что в среде Делфи компонентом считается любой класс/объект-наследник класса TComponent
форма (т.е. класс/объект-наследник класса TForm) - не исключение, это тоже компонент
- любой компонент в среде Делфи имеет св-во Owner, которое либо ссылается на заведомо существующего владельца (компонент-владелец) данного компонента (объект-владелец при своем уничтожении неявно ответственен уничтожение всех объектов, зн-е св-ва Owner которых есть ссылка на уничтожаемый объект-владелец) либо хранит nil, что означает отсутствие заведомо указанного компонента-владельца; св-во Owner любого компонента указывается при его создании/конструировании и не м.б. изменено после создания/конструирования
- любой компонент в среде Делфи имеет св-во Name, зн-е которого м.б. либо пустой строкой либо строкой символов (лат.алфавит + алф.-цифр. символы + некоторые спец.символы
- если зн-е св-ва Name компонента не пустое, оно д.б. уникальным в пределах значений св-в Name каждого из компонентов в св-ве-списке Components[] того компонента, который "владеет" данным компонентом; именно на этом правиле основана логика работы метода любого компонента FindComponent()
← →
ananax (2005-09-13 14:48) [88]ок. это я вроде понял.
Теперь дальше:
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 15:10) [89]
> 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
← →
msguns © (2005-09-13 16:11) [90]>Digitman © (13.09.05 15:10) [89]
Все это, конечно, круто и правильно, но..
А почему везде упоминается слово компонент ? Если надо создать экземпляр класса, порожденного не от TComponent, с ним что, надо шаманить по-особенному ?
;))
← →
ananax (2005-09-14 14:51) [91]Огромное спасибо Digitman!
Вроде бы я это понял, только вот вопрос:
если по клику у меня будет выполняться описанная выше процедура, то получается, что моя ссылка (F) переписовается каждый раз, когда я тыкаю по этой кнопке... Так? Те стоит действовать что-то вроде динамического массива создать fff: array of TForm.... попробую так... есть ли другое решение?
← →
Digitman © (2005-09-14 15:07) [92]
> msguns © (13.09.05 16:11) [90]
> Если надо создать экземпляр класса, порожденного не от
> TComponent, с ним что, надо шаманить по-особенному ?
а разве нет ?
и в чем "шаманство". по-твоему, заключается ?
← →
Digitman © (2005-09-14 15:16) [93]
> ananax (14.09.05 14:51) [91]
> если по клику у меня будет выполняться описанная выше процедура,
> то получается, что моя ссылка (F) переписовается каждый
> раз, когда я тыкаю по этой кнопке... Так?
судя по описанной выше процедуре - не так.
твоя переменная F - это локальная переменная процедуры, она "живет" только при "жизни" той самой процедуры, где F объявлена в кач-ве локальной.
в дан.случае ты ничего не "переписываешь" - ты просто записываешь во "временную" переменную некое значение (ссылку на только что созданный объект), потом где-то в той же процедуре используешь эту переменную и ее значение, после чего (т.е. после возврата из процедуры) эта переменная благополучно "умирает", унося с собой "в могилу" свое содержимое.
← →
ananax (2005-09-14 16:00) [94]Тогда как будет правельнее сделать?
1. через локальные переменные и FindComponent() или
2. через глобальные массивы и уже обращаться к форме через массив?
Если 1, то возникает вопрос:
как после нахождения компонента (формы и всего, что на ней находится) можно изменить, скажем, лейбл лежащий на форме? У меня не получилось...
я сделал:
FindComponent("abcdef").<а тут только общие для TComponent процедуры и совйства...>;
← →
Digitman © (2005-09-14 18:38) [95]
> FindComponent("abcdef").<а тут только общие для TComponent
> процедуры и совйства...>;
приведи рез-т работы FindComponent() к нужному типу
например, если ты точно знаешь, что на форме F есть компонент класса TLabel с именем "abcdef", то обратиться, например, к св-ву Caption этого компонента проще простого :
TLabel(F.FindComponent("abcdef")).Caption := "....";
← →
ananax (2005-09-19 10:08) [96]ДА! Точно! DigitMan, ты просто монстр!
я сделал немного по другому, но смысл, видимо, тотже.
Вроде все работает, только вот хотелось сделать код краси"вее.
unit main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
bnNew: TButton;
cbList: TComboBox;
edMsg: TEdit;
bnSend: TButton;
procedure bnNewClick(Sender: TObject);
procedure bnClick(Sender: TObject);
procedure bnSendClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
f: array[0..100] of TForm;
i: Integer = 0;
implementation
{$R *.dfm}
procedure TForm1.bnClick(Sender: TObject);
begin
with Sender as TButton do
begin
with GetParentComponent as TForm do
begin
Close;
end;
end;
end;
procedure NewWindow;
begin
f[i] := TForm.Create(Form1);
//Само окно
with f[i] do
begin
Name := "f"+IntToStr(i);
Caption := Name;
Width := 200;
Height := 200;
Top := 100;
Left := 100;
Visible := True;
end;
//Кнопка закрытия
with TButton.Create(f[i]) do
begin
Name := "b"+IntToStr(i);
Caption := "Close";
top := 130;
left := 10;
Visible := True;
Parent := f[i];
OnClick := Form1.bnClick;
end;
//Мемо для текста
with TMemo.Create(f[i]) do
begin
Name := "m"+ IntToStr(i);
Text := "";
top :=1;
left :=1;
width := 190;
height := 120;
Visible := True;
Parent := f[i];
end;
i := i+1;
end;
procedure TForm1.bnNewClick(Sender: TObject);
begin
NewWindow;
cbList.Items.Add(IntToStr(i-1));
end;
procedure TForm1.bnSendClick(Sender: TObject);
begin
if cbList.ItemIndex<>-1 then
with f[cbList.ItemIndex].FindComponent("m"+IntToStr(cbList.ItemIndex)) as TMemo do
begin
Lines.Add(edMsg.Text);
end;
end;
end.
Ругайте! Не стесняйтесь!
← →
Leonid Troyanovsky © (2005-09-19 11:23) [97]
> ananax (19.09.05 10:08) [96]
> Ругайте! Не стесняйтесь!
1. Глобальные переменные - MD, есть Screen, есть Forms.
2. Формы удобно проектировать в дизайнере (отдельный юнит),
убирая из autocreate. Если форм много, то их, видимо, лучше
уничтожать при закрытии (action := caFree).
3. Ссылки в комбобоксе должны обновляться при уничтожении
(a propos?) формы, RTFM: Notification.
--
Regards, LVT.
← →
ananax (2005-09-19 12:13) [98]Ага!
Все верно!
те делаем так...
procedure TForm1.bnClick(Sender: TObject);
begin
with Sender as TButton do
begin
with GetParentComponent as TForm do
begin
action := caFree;
end;
end;
end;
> 2. Формы удобно
Так вся фишка была в том, чтобы их создавать динамически...
если знаешь, как по "шаблону" создавать формы (не чайлды) пиши :)
> 1. Глобальные переменные
А можно про это поподробнее? что не так?
← →
ananax (2005-09-19 12:15) [99]
> procedure TForm1.bnClick(Sender: TObject);
> begin
> with Sender as TButton do
> begin
> with GetParentComponent as TForm do
> begin
> action := caFree;
> end;
> end;
> end;
не работает (((((
← →
msguns © (2005-09-19 13:00) [100]>ananax (19.09.05 12:15) [99]
>не работает (((((
И не должно.
← →
Leonid Troyanovsky © (2005-09-19 13:00) [101]
> ananax (19.09.05 12:13) [98]
> те делаем так...
> with GetParentComponent as TForm do
> begin
> action := caFree;
> end;
> end;
Action := caFree делается в OnClose той самой формы.
Или, если уж на то пошло - в DoClose; override.
Кроме того, GetParentComponent здесь ни к чему.
По смыслу: в цепочке Parent"ов найти контрол класса формы,
или, на худой конец, это Owner.
--
Regards, LVT.
← →
Leonid Troyanovsky © (2005-09-19 13:10) [102]
> ananax (19.09.05 12:13) [98]
> Так вся фишка была в том, чтобы их создавать динамически.
> ..
> если знаешь, как по "шаблону" создавать формы (не чайлды)
> пиши :)
Формы и так создаются по шаблону, записанному в ресурс
экзешника. Оный шаблон можно и просмотреть ObjectBinaryToText,
а можно и изменить путем ObjectTextToBinary.
RTFM: VCL Reference
WriteComponent, Seek, ObjectBinaryToText, DataString, ObjectTextToBinary,
ReadComponent Example
--
Regards, LVT.
← →
Leonid Troyanovsky © (2005-09-19 13:24) [103]
> ananax (19.09.05 12:13) [98]
> > 1. Глобальные переменные
>
> А можно про это поподробнее? что не так?
Глобальных переменных быть не должно.
Неизбежное зло - это переменные, которые уже объявлены Борландом,
т.е., Screen, Application, Printer и т.д. Т.е., умножать их кол-во не стоит.
Во избежании неприятностей никогда не следует использовать
автоматически генерируемые переменные типа FormX: TFormX.
Ну, а если, вдруг, понадобился, скажем список создаваемых
форм (или массив), то его можно сделать полем формы.
Хотя, лучше не создавать список, а каждый раз выделять из Screen.Forms
те, что имеют, например, искомый клас, т.е. Screen.Forms[i] is TFormX.
Кроме того, нужно быть весьма осторожным с регулярными процедурами,
типа NewWindow, особенно если они вдруг описаны в разделе интерфейса.
--
Regards, LVT.
← →
msguns © (2005-09-19 13:27) [104]>ananax
Диджитмэн абсолютно верно объяснил как можно использовать объекты не по их именам. Только вот мне лично совершенно непонятно, почему при этом он "плясал" от TComponent, ведь далеко не все объекты приложения являются оными. Есть еще TControls, который, имхо, существеннее при анализе динамически создаваемых визуальных объектов, кроме того, подлежит "контейнеризации", т.е. позволяет перебирать, например, все эдиты, расположенные на панели.
Что же касается формы "по шаблону", то есть два весьма удобных способа:
1. Создание базового класса с визуальной конструкцией внешнего вида и инкапсуляцией в нем большинства методов
2. Использование вместо форм фрэймов, также сконструированных в дизайне во вполне комфортабельных условиях ;) Собственно, для того и придуманы.
← →
Игорь Шевченко © (2005-09-19 13:28) [105]Leonid Troyanovsky © (19.09.05 13:24) [103]
> Во избежании неприятностей никогда не следует использовать
>
> автоматически генерируемые переменные типа FormX: TFormX.
>
Во избежание каких именно неприятностей ?
← →
Leonid Troyanovsky © (2005-09-19 14:24) [106]
> Игорь Шевченко © (19.09.05 13:28) [105]
> > Во избежании неприятностей никогда не следует использовать
> > автоматически генерируемые переменные типа FormX: TFormX.
> Во избежание каких именно неприятностей ?
Для начинающих наиболее распространен вариант с потерей ссылок
при неоднократном создании формы.
Да и, вообще, наличие оной переменной толкает их к смешению стилей
и bad design (в смысле ООП).
--
Regards, LVT.
← →
ananax (2005-09-19 14:35) [107]
> msguns ©
Действительно стоящие замечания!
Глобальные переменные мне самому не нравятся ))))
Но
Action := caFree все равно не работает((( пишет
[Error] main.pas(74): Incompatible types: "TBasicAction" and "TCloseAction"
> Leonid Troyanovsky ©
Мда... про базовый класс - действительно интересно... надо почитать, как это делается.
← →
Leonid Troyanovsky © (2005-09-19 14:42) [108]
> msguns © (19.09.05 13:27) [104]
> непонятно, почему при этом он "плясал" от TComponent, ведь
> далеко не все объекты приложения являются оными. Есть еще
> TControls, который, имхо, существеннее при анализе динамически
> создаваемых визуальных объектов, кроме того, подлежит "контейнеризации",
>
TControl is TComponent.
А контейнером для него может быть лишь TWinControl.
Т.е., это сужение предметной области.
Поэтому, оно и "существеннее".
Например, для динамически создаваемых контролов отсутствие Owner -
нормальное явление, а отсутствие Parent - экзотика.
--
Regards, LVT.
← →
Leonid Troyanovsky © (2005-09-19 14:53) [109]
> ananax (19.09.05 14:35) [107]
> Глобальные переменные мне самому не нравятся ))))
> Но
> Action := caFree все равно не работает((( пишет
У формы есть событие OnClose, там нужная переменная и
фигурирует.
Внимательней надо, внимательней ;)
--
Regards, LVT.
← →
msguns © (2005-09-19 15:23) [110]>Leonid Troyanovsky © (19.09.05 14:42) [108]
>TControl is TComponent.
Сам же и подтверждаешь мои слова:
любой контрол есть компонент, но не любой компонент есть контрол
Отсюда делаем вывод, что при поиске визуального контрола (читаем сабж про динамически создаваемые группы контролов нв контейнере (форме, фрэйме, панели..) предпочтительнее перебирать контролы, чем компоненты, т.к. последних может быть существенно больше.
Самое же главное отличие в том, что Components/ComponentCount адресует только "подотчетные" (т.е. у кого овнер - адресующийся объект) объекты, а Controls/ControlCount - содержащиеся внутри (Parent) объекты, что для поиска-перебора визуальных кнтролов внутри контейнера-носителя куда важнее.
Другими словами, соданные на панели эдиты могут иметь собственника форму и через TPanel.Component к ним не обратишься. А через Controls запросто.
← →
Leonid Troyanovsky © (2005-09-19 15:37) [111]
> msguns © (19.09.05 15:23) [110]
> >TControl is TComponent.
> Сам же и подтверждаешь мои слова:
> любой контрол есть компонент, но не любой компонент есть
> контрол
Это, конечно, слова правильные, но не похожи "от TComponent,
ведь далеко не все объекты приложения являются оными".
А уж TControl, в отличии от многих других объектов, is TComponent.
В остальном, смысл моих слов понят почти правильно ;)
--
Regards, LVT.
← →
Игорь Шевченко © (2005-09-19 15:40) [112]Leonid Troyanovsky © (19.09.05 14:24) [106]
> Для начинающих наиболее распространен вариант с потерей
> ссылок
> при неоднократном создании формы.
> Да и, вообще, наличие оной переменной толкает их к смешению
> стилей
> и bad design (в смысле ООП).
Я бы не сказал, что использование переменных есть bad design в смысле ООП.
Кроме того, Borland зачем-то сделал ведь такую конструкцию, с самой первой версии она в Delphi существует - Application.CreateForm. Для DataModule"й, например, очень удобно - создаешь один раз, используешь по мере надобности в нужных местах.
С уважением,
← →
msguns © (2005-09-19 15:42) [113]>Leonid Troyanovsky © (19.09.05 15:37) [111]
>Это, конечно, слова правильные, но не похожи "от TComponent,
ведь далеко не все объекты приложения являются оными".
Да уж.. Иногда перечитаешь то, что написал по-другому и ужаснешься ;))
Я хотел сказать кратко то, что подробно изложил в [110], ан не вышло ;((
← →
Leonid Troyanovsky © (2005-09-19 16:33) [114]
> Игорь Шевченко © (19.09.05 15:40) [112]
> Я бы не сказал, что использование переменных есть bad design
> в смысле ООП.
Вообще, с глобальными FormX легко согрешить не только
начинающему, но и даже более продвинутому ООПрограммисту,
когда он впервые сталкивается с необходимостью, например,
использовать Win32 API, скажем некий Enum* из объектного кода.
Ведь тот же MakeObjectInstance открывают для себя после (пары) шишек.
> Кроме того, Borland зачем-то сделал ведь такую конструкцию,
> с самой первой версии она в Delphi существует - Application.
> CreateForm. Для DataModule"й, например, очень удобно - создаешь
> один раз, используешь по мере надобности в нужных местах.
Им, наверное, влом было чего-то менять в концепции главной
формы приложения ;)
Да, и угодить они старались дезертирам бейсика, а не c++, IMHO.
Ну, а по-поводу как лучше на rsdn.ru\delphi было даже что-то
вроде конкурса. Затолкали всех сторонники IInterface.
--
Regards, LVT.
← →
Игорь Шевченко © (2005-09-19 16:38) [115]Leonid Troyanovsky © (19.09.05 16:33) [114]
> Ну, а по-поводу как лучше на rsdn.ru\delphi было даже что-
> то
> вроде конкурса. Затолкали всех сторонники IInterface.
Что касается теории и пуризма, я конечно понимаю, тем более, что rsdn особой любовью к Delphi не блещет :)
Но зачем изобретать себе дополнительные трудности, уже перестаю понимать, делать всякие интерфейсы и прочее. Убрать форму из AutoCreate может каждый, два клика мышью :)
Я всегда использую эти переменный для тех форм, которые гарантировано будут в единственном экземпляре и создаются в момент инициализации приложения. Например, для главной формы и для всегда необходимых датамодулей.
Страницы: 1 2 3 вся ветка
Форум: "Начинающим";
Текущий архив: 2005.10.16;
Скачать: [xml.tar.bz2];
Память: 0.8 MB
Время: 0.04 c