Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.12.25;
Скачать: CL | DM;

Вниз

TEdit   Найти похожие ветки 

 
Evgenxxxx   (2005-12-06 16:46) [0]

Допустим у меня много едитов edit1, edit2,.... и с каждого мне нужно прочитать инфрмацию и занести её в массив например:
For i:=1 to n do
begin
 array[i]:=edit_i.text;  ???????????????????????????????????
end
как это можно реализовать?


 
Leonid Troyanovsky ©   (2005-12-06 16:49) [1]


> Evgenxxxx   (06.12.05 16:46)  
> как это можно реализовать?


TStringGrid.
Можешь считать его Cells - массивом.

--
Regards, LVT.


 
msguns ©   (2005-12-06 17:08) [2]

Если все эдиты "лежат" в одном контейнере (например, панели), то в случае, если порядок по барабану, то так

j := 0;
for i := 0 to Panel1.ControlCount-1 do
  if Panel1.Controls[i].ClassType=TEdit then
    begin
     ArrayA[j] := TEdit(Panel1.Controls[i]).Text;
     inc(j);
    end;


 
Digitman ©   (2005-12-06 17:09) [3]


> Допустим у меня много едитов


на Луне ? или таки эти самые твои "едиты" имеют в кач-ве владельца какой-то строго определенный компонент ?


 
EvgenXXXX   (2005-12-06 18:44) [4]


> Если все эдиты "лежат" в одном контейнере (например, панели),
>  то в случае, если порядок по барабану, то так
>
> j := 0;
> for i := 0 to Panel1.ControlCount-1 do
>   if Panel1.Controls[i].ClassType=TEdit then
>     begin
>      ArrayA[j] := TEdit(Panel1.Controls[i]).Text;
>      inc(j);
>     end;


Все Editы находятся на разных вкладках компонента TPageControl


 
VitGun ©   (2005-12-06 19:01) [5]

Вот так пропробуй.

for i:=0 to form1.ComponentCount-1 do
 begin
  if form1.Components[i] is TEdit then
   begin
    Myarray[i]:=(form1.Components[i] as TEdit).Text;
   end;
 end;


 
VitGun ©   (2005-12-06 19:08) [6]

Сорри...так будет правильнее.....

j:=0;
for i:=0 to form1.ComponentCount-1 do
begin
 if form1.Components[i] is TEdit then
  begin
   Myarray[j]:=(form1.Components[i] as TEdit).Text;
   inc(j);
  end;
end;


 
Evgenxxxx   (2005-12-07 08:39) [7]

Как я понял из примера здесь на одном компоненте формы 1 Edit а у меня их несколько. Вся сложножность заключается в том что я не знаю заранее сколько Editов у меня будет. Это определяется программно пользователем. Поетому мне их необходимо считывать через цикл


 
Anatoly Podgoretsky ©   (2005-12-07 08:45) [8]

EvgenXXXX   (06.12.05 18:44) [4]
Вопрос про владельца, а не где лежат.


 
Evgenxxxx   (2005-12-07 08:58) [9]

Вопрос на счет владельца не понял!!! По несколько Editов лежат на разных вкладках компонента PageControl


 
Leonid Troyanovsky ©   (2005-12-07 09:01) [10]


> 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 10:21) [11]

Почему то не выполняется следующее условие и естественно массив не заполняется

> if Pages[i].Controls[j] is TEdit then


 
Leonid Troyanovsky ©   (2005-12-07 11:24) [12]


> Evgenxxxx   (07.12.05 10:21) [11]
> Почему то не выполняется следующее условие и естественно
> массив не заполняется

> > if Pages[i].Controls[j] is TEdit then


Если TEdit лежит, скажем, не непосредственно на Pages,
а, например, на TPanel, то Controls должен быть панели.

--
Regards, LVT.


 
msguns ©   (2005-12-07 11:36) [13]

>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 для правильного отсчета найденных контролов необходима.


 
Evgenxxxx   (2005-12-07 11:40) [14]

Editы лежат непосредственно на страницах PageControla (TabSheetaх)


 
Digitman ©   (2005-12-07 11:47) [15]


> Editы лежат


что значит "лежат" ?

ты их в ран-тайм туда "положил" ?

ну так и демонстрируй свой код, который "наклал" Edit"ы на TabSheet"ы !


 
Leonid Troyanovsky ©   (2005-12-07 11:50) [16]


> Evgenxxxx   (07.12.05 11:40) [14]
> Editы лежат непосредственно на страницах PageControla


Edit какого класса?

--
Regards, LVT.


 
Evgenxxxx   (2005-12-07 11:54) [17]


> что значит "лежат" ?

Это значит расположены.


 
Digitman ©   (2005-12-07 11:56) [18]


> Evgenxxxx   (07.12.05 11:54) [17]
> Это значит расположены.


ну вот и показывай фрагмент кода, где ты их "располагал" ..

а из пустого в порожнее можно долго переливать)


 
Leonid Troyanovsky ©   (2005-12-07 11:58) [19]


> msguns ©   (07.12.05 11:36) [13]

> Во-первых, потому что заранее неизвестно на сколько элементов
> резервировать массив
> Во-вторых, что делать с "дырками" (эелементами, не имеющими
> значения, которые "появляются" от не TEdit-контролов) массива


Оно мне надо?
Возжелавшие массив пусть о нем и пекутся.

При данной постановке задачи массив и вовсе лишний.

--
Regards, LVT.


 
Evgenxxxx   (2005-12-07 12:23) [20]


> ну вот и показывай фрагмент кода, где ты их "располагал"
> ..


//формирование страниц
 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;


 
Digitman ©   (2005-12-07 12:36) [21]

кто у тебя в дан.случае Self ?
форма ?


 
Evgenxxxx   (2005-12-07 12:53) [22]

Незнаю так было описано создание новых компонентов в одной книге.


 
Digitman ©   (2005-12-07 13:21) [23]


> 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); //обращение к найденному компоненту


 
Leonid Troyanovsky ©   (2005-12-07 13:28) [24]


> Evgenxxxx   (07.12.05 12:53) [22]


Насчет того, что if Pages[i].Controls[j] is TEdit не срабатывает,
при условии [20],  - не верю.
А вот left = 288, кажется мне, завышено.

Кста, у страниц Owner естественней быть PageControl1.

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2005-12-07 13:38) [25]


> 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.


 
Evgenxxxx   (2005-12-07 15:43) [26]

Получилось!!!

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 16:50) [27]


> Evgenxxxx   (07.12.05 15:43) [26]

> Editам котрые необходимо считать присваеваем в начеле имени
> какой нибудь идентификато например "XX" а потом поэтому
> идентифекатора определяем считать на этот едит или нет.


Если еще немного напрячься с именами, а также сделать Owner для Edit
тот же PageControl1, легко заметить, что массив а - лишний.
Т.е., перебирать PageControl1.Components или PageControl1.FindComponent.

--
Regards, LVT.



Страницы: 1 вся ветка

Текущий архив: 2005.12.25;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.043 c
2-1133867414
it_work
2005-12-06 14:10
2005.12.25
Отправка сообщения из файла по сети


2-1134146773
kami
2005-12-09 19:46
2005.12.25
Не работает GetWindowModuleFileName


2-1134218831
De1uxe
2005-12-10 15:47
2005.12.25
Изменение типа переменной


11-1113730712
thaddy
2005-04-17 13:38
2005.12.25
KOL Extended registry object. Testers wanted!


2-1133993645
RX
2005-12-08 01:14
2005.12.25
Assignment to FOR-Loop variable n