![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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.
А по сабжу - в каком порядке должны обходиться эдиты?