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

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

TEdit


Страницы:   1 2

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]
Вопрос про владельца, а не где лежат.


Страницы:   1 2

Наверх

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