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

Вниз

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

 
MY ©   (2005-06-30 19:54) [0]

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


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

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


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

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


 
_dimka ©   (2005-06-30 20:30) [3]

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, а остальные не нужно трогать?


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

Ну, вначале необходимо получить список всех эдитов на форме. Причем, нужно учесть, что едиты могут располагаться на других контейнерах, например 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) [5]

Толко эти 45


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


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

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


 
begin...end ©   (2005-06-30 20:50) [7]

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

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

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


 
-=XP=- ©   (2005-06-30 20:50) [8]

Эдиты должны обходится с 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;


 
MY ©   (2005-06-30 21:05) [9]

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


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


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

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


 
begin...end ©   (2005-06-30 21:06) [11]

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

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

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



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

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

Наверх




Память: 0.49 MB
Время: 0.034 c
9-1112792754
anat
2005-04-06 17:05
2005.07.18
OpenGL нужна помощь


1-1119806503
Ландграф Павел
2005-06-26 21:21
2005.07.18
свернуть/развернуть программно


4-1116854839
Dextor
2005-05-23 17:27
2005.07.18
Перехват всех сообщений программы


1-1120186136
dm37
2005-07-01 06:48
2005.07.18
DBGrid scrolling


14-1119482785
kaif
2005-06-23 03:26
2005.07.18
Зацените сайт