![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TEdit
Evgenxxxx © (2005-12-06 16:46:00)Допустим у меня много едитов edit1, edit2,.... и с каждого мне нужно прочитать инфрмацию и занести её в массив например:
For i:=1 to n do
begin
array[i]:=edit_i.text; ???????????????????????????????????
end
как это можно реализовать?
Leonid Troyanovsky (2005-12-07 16:50:00) [1]
> Evgenxxxx (07.12.05 15:43) [26]
> Editам котрые необходимо считать присваеваем в начеле имени
> какой нибудь идентификато например 'XX' а потом поэтому
> идентифекатора определяем считать на этот едит или нет.
Если еще немного напрячься с именами, а также сделать Owner для Edit
тот же PageControl1, легко заметить, что массив а - лишний.
Т.е., перебирать PageControl1.Components или PageControl1.FindComponent.
--
Regards, LVT.
Evgenxxxx (2005-12-07 15:43:00) [2]Получилось!!!
for i := 0 to ComponentCount - 1 do
if Components[i] is TEdit then
begin
s:=TEdit(Components[i]).Name ;
If Copy(S,0,2)='xx' then
begin
a[j]:=s;
inc(j);
end;
end;
Editам котрые необходимо считать присваеваем в начеле имени какой нибудь идентификато например 'XX' а потом поэтому идентифекатора определяем считать на этот едит или нет.
Leonid Troyanovsky (2005-12-07 13:38:00) [3]
> Digitman © (07.12.05 13:21) [23]
> if Components[i] is TEdit then
if Component[i] is TEdit then
if TEdit(Components[i]).Parent is TTabSheet then
--
Regards, LVT.
Leonid Troyanovsky (2005-12-07 13:28:00) [4]
> Evgenxxxx (07.12.05 12:53) [22]
Насчет того, что if Pages[i].Controls[j] is TEdit не срабатывает,
при условии [20], - не верю.
А вот left = 288, кажется мне, завышено.
Кста, у страниц Owner естественней быть PageControl1.
--
Regards, LVT.
Digitman (2005-12-07 13:21:00) [5]
> Evgenxxxx (07.12.05 12:53) [22]
> Незнаю
плохо !
Self - это ссылка на объект, метод-обработчик события которого в данный момент времени в данном контексте выполняется.
Пусть в обработчике, например, события TMyForm.OnCreate ты создаешь некий объект-компонент вызовом
NewEdit1:= TEdit.Create(Self);
Указание Self в кач-ве параметра Owner конструирующего метода TEdit.Create означает, что отныне (и до самой смерти) создаваемого тобой объекта-компонента TEdit его владельцем будет являться объект-форма MyForm, в обработчике события OnCreate которого ты создаешь Edit-компонент ... Владение одного компонента другим компонентом означает, что владеющий объект-компонент (MyForm) отныне ответственен за неявное автоуничтожение (если таковое не выполнено тобой явно) владеемых им объектов-компонентов (Edit) в ходе собственного уничтожения ... Список владеемых объектов-компонентов доступен через св-во-список компонента-владельца Components[] ... В этом списке в дан.случае как раз и находятся ссылки на все Edit-компоненты, которые ты сконструировал с указанием Self в кач-ве владельца
отсюда следует и решение :
//предполагается что этот код выполняется в контексте любого из методов
//объекта MyForm
for i := 0 to ComponentCount - 1 do
if Components[i] is TEdit then
ShowMessage(Components[i].Name); //обращение к найденному компоненту
Evgenxxxx (2005-12-07 12:53:00) [6]Незнаю так было описано создание новых компонентов в одной книге.
Digitman (2005-12-07 12:36:00) [7]кто у тебя в дан.случае Self ?
форма ?
Evgenxxxx (2005-12-07 12:23:00) [8]
> ну вот и показывай фрагмент кода, где ты их "располагал"
> ..
//формирование страниц
For i:=0 to StrToInt(edcolaccountpoints.text)-1 do
begin
NewPage:=TtabSheet.Create(self);
NewPage.PageControl:=PageControl1;
NewPage.Caption:='Точка учета №'+ IntToStr(i+1);
//1
NewEdit1:= TEdit.Create(Self);
NewEdit1.Name:='edDataAP'+inttostr(i+1);
NewEdit1.Left:= 288;
NewEdit1.Top:= 16;
NewEdit1.Text:='';
NewEdit1.Parent:=newPage;
//2
NewEdit2:= TEdit.Create(Self);
NewEdit2.Name:='edCounterAP'+inttostr(i+1);
NewEdit2.Left:= 288;
NewEdit2.Top:= 48;
NewEdit2.Text:='';
NewEdit2.Parent:=newPage;
//3
NewEdit3:= TEdit.Create(Self);
NewEdit3.Name:='edLossesAP'+inttostr(i+1);
NewEdit3.Left:= 288;
NewEdit3.Top:= 80;
NewEdit3.Text:='';
NewEdit3.Parent:=newPage;
end;
Leonid Troyanovsky (2005-12-07 11:58:00) [9]
> msguns © (07.12.05 11:36) [13]
> Во-первых, потому что заранее неизвестно на сколько элементов
> резервировать массив
> Во-вторых, что делать с "дырками" (эелементами, не имеющими
> значения, которые "появляются" от не TEdit-контролов) массива
Оно мне надо?
Возжелавшие массив пусть о нем и пекутся.
При данной постановке задачи массив и вовсе лишний.
--
Regards, LVT.
Digitman (2005-12-07 11:56:00) [10]
> Evgenxxxx (07.12.05 11:54) [17]
> Это значит расположены.
ну вот и показывай фрагмент кода, где ты их "располагал" ..
а из пустого в порожнее можно долго переливать)
Evgenxxxx (2005-12-07 11:54:00) [11]
> что значит "лежат" ?
Это значит расположены.
Leonid Troyanovsky (2005-12-07 11:50:00) [12]
> Evgenxxxx (07.12.05 11:40) [14]
> Editы лежат непосредственно на страницах PageControla
Edit какого класса?
--
Regards, LVT.
Digitman (2005-12-07 11:47:00) [13]
> Editы лежат
что значит "лежат" ?
ты их в ран-таймтуда "положил" ?
ну так и демонстрируй свой код, который "наклал" Edit'ы на TabSheet'ы !
Evgenxxxx (2005-12-07 11:40:00) [14]Editы лежат непосредственно на страницах PageControla (TabSheetaх)
msguns (2005-12-07 11:36:00) [15]>Leonid Troyanovsky © (07.12.05 09:01) [10]
>with PageControl1 do
for i := 0 to PageCount-1 do
begin
for j := 0 to Pages[i].ControlCount-1 do
if Pages[i].Controls[j] is TEdit then
a[i, j] := TEdit(Pages[i].Controls[j]).Text;
end;
Неверно.
Во-первых, потому что заранее неизвестно на сколько элементов резервировать массив
Во-вторых, что делать с "дырками" (эелементами, не имеющими значения, которые "появляются" от не TEdit-контролов) массива ?
ИМХО:
- считать контролы "в ряд", игнорируя иерархию, при необходимости запоминая контейнер-носитель
- вместо массива - список указателей на структуру, включая парент, если надо (см. п.1)
- переменная j для правильного отсчета найденных контролов необходима.
Leonid Troyanovsky (2005-12-07 11:24:00) [16]
> Evgenxxxx (07.12.05 10:21) [11]
> Почему то не выполняется следующее условие и естественно
> массив не заполняется
> > if Pages[i].Controls[j] is TEdit then
Если TEdit лежит, скажем, не непосредственно на Pages,
а, например, на TPanel, то Controls должен быть панели.
--
Regards, LVT.
Evgenxxxx (2005-12-07 10:21:00) [17]Почему то не выполняется следующее условие и естественно массив не заполняется
> if Pages[i].Controls[j] is TEdit then
Leonid Troyanovsky (2005-12-07 09:01:00) [18]
> Evgenxxxx (07.12.05 08:39) [7]
> Как я понял из примера здесь на одном компоненте формы 1
> Edit а у меня их несколько. Вся сложножность заключается
> в том что я не знаю заранее сколько Editов у меня будет.
> Это определяется программно пользователем. Поетому мне
> их необходимо считывать через цикл
with PageControl1 do
for i := 0 to PageCount-1 do
begin
for j := 0 to Pages[i].ControlCount-1 do
if Pages[i].Controls[j] is TEdit then
a[i, j] := TEdit(Pages[i].Controls[j]).Text;
end;
--
Regards, LVT.
Evgenxxxx (2005-12-07 08:58:00) [19]Вопрос на счет владельца не понял!!! По несколько Editов лежат на разных вкладках компонента PageControl
Anatoly Podgoretsky (2005-12-07 08:45:00) [20]EvgenXXXX (06.12.05 18:44) [4]
Вопрос про владельца, а не где лежат.