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

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

Edit [D7, WinXP]


MY ©   (2005-06-30 19:54:00) 

Привет мастерам. У меня возник вопрос у меня есть 45 Edit-ов
и вкаждом  Edit заполнен какимто словам и мне надо чтоб поочерёдно из Edit-ов бролась строка и присваевалась к стрингу.
Подскажите пожалуйста как это можно зделать


begin...end   (2005-06-30 21:06:00) [1]

> -=XP=- ©   (30.06.05 20:50) [8]

> for i := 1 to 45 do
> ...
> C := FindComponent('Edit' + IntToStr(i));

Процессор не жалко?


MY   (2005-06-30 21:05:00) [2]

всем большое спосибо я всё понел


Просто Джо   (2005-06-30 21:05:00) [3]


> [7] begin...end ©   (30.06.05 20:50)

А, ну да, с TWinControl.Controls спутал.


begin...end   (2005-06-30 20:50:00) [4]

> Просто Джо ©   (30.06.05 20:40) [4]

> Причем, нужно учесть, что едиты могут располагаться на
> других контейнерах, например TGroupBox или TPanel.
> Приходим к необходимости писать функцию рекурсивного
> обхода.

А потом думаем и приходим к выводу об отсутствии необходимости рекурсивного обхода.


-=XP=-   (2005-06-30 20:50:00) [5]

Эдиты должны обходится с 1 до 45 и мне толко они подходят

Телепатируя, подозреваю, что в Вашем уникальном проекте они называются Edit1, Edit2...Edit45. Тогда:

var
 C: TComponent;
 S: string;
begin
 for i := 1 to 45 do
 begin
   C := FindComponent('Edit' + IntToStr(i));
   if (C is TEdit) then
   begin
     S := TEdit(C).Text;
     // операции с S
   end;
 end;
end;


Просто Джо   (2005-06-30 20:48:00) [6]


> [5] MY ©   (30.06.05 20:40)
> Толко эти 45

Тогда загоняй их в массив или список ручками. Или же просто напиши функцию-фильтр, которая будет удалять из списка Эдиты, свойство Tag, которых не равно какому-то значению. Все это несложно прикрутить к моему примеру.


Просто Джо   (2005-06-30 20:40:00) [7]

Ну, вначале необходимо получить список всех эдитов на форме. Причем, нужно учесть, что едиты могут располагаться на других контейнерах, например TGroupBox или TPanel. Приходим к необходимости писать функцию рекурсивного обхода. Например, такую:

function EnumControls (Form: TForm; AClass: TWinControlClass): TComponentList;
var
 List: TComponentList;
 procedure RecurseEnum (Root: TWinControl);
 var
   I: Integer;
 begin
   for I := 0 to Root.ComponentCount-1 do
   begin
     if Root.Components[I] is AClass then
       List.Add(Root.Components[I]);
     if Root.Components[I] is TWinControl then
       RecurseEnum(TWinControl(Root.Components[I]));
   end;
 end;
begin
 Result := nil;
 List := TComponentList.Create (False);
 RecurseEnum(Form);
 Result := List;
end;

Функция создает и возвращает список ВСЕХ контроллов, класс которых производен отTWinControl.
Теперь нужно решить, в каком порядке элементы должны быть в списке. Предположим, что Едиты должны обходиться в порядке, зависящем от их свойства TabOrder (порядок, по которому осуществляется последовательный переход клавишей Tab).
Приходим к необходимости написать функцию сортировки. Например, такую:

// Call-back функция - НЕ вызывать напрямую
function SortProc(Item1, Item2: Pointer): Integer;
 function CompareInt (a,b: Integer): Integer;
 begin
   if a = b then
     Result := 0
   else if a > b then
     Result := 1
   else if a < b then
     Result := -1
 end;
begin
 Result := CompareInt(
   TWinControl(Item1).TabOrder,
   TWinControl(Item2).TabOrder
 )
end;
// Функция сортировки, использует стандартный метод объекта TList

procedure SortByTabOrder (List: TComponentList);

begin
 List.Sort(SortProc);
end;

Ну, вот, теперь мы можем написать итоговую функцию:

function GetEditStrings(Form: TForm): string;
var
 List: TComponentList;
 I: Integer;
begin
 Result := '';
 List := EnumControls(Form,TEdit);
 try
   SortByTabOrder(List);
   for I := 0 to List.Count-1 do
     Result := Result + ' ' + TEdit(List[I]).Text
 finally
   List.Free
 end;
end;

Тестируем:

procedure TForm1.Button1Click(Sender: TObject);
begin
 ShowMessage ( GetEditStrings(Self))
end;

Вуаля.
--
П.С. Но все же искренне рекоммендую использование TValueListEditor или TStringGrid.


MY   (2005-06-30 20:40:00) [8]

Толко эти 45


_dimka   (2005-06-30 20:30:00) [9]

var i: integer;
   s: string;
begin
for i:=0 to Form1.ComponentCount-1 do
begin
if (Form1.Components[i] is TEdit) then
 s:=s+TEdit(Form1.Components[i]).text;
end;

или вам нужно только эти 45, а остальные не нужно трогать?


MY   (2005-06-30 20:10:00) [10]

Эдиты должны обходится с 1 до 45 и мне толко они подходят


Просто Джо   (2005-06-30 19:59:00) [11]

А может, имеется вместо этой ужасной толпы эдитов использовать TValueListEditor или TStringGrid.
А по сабжу - в каком порядке должны обходиться эдиты?


Наверх

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