Форум: "Основная";
Текущий архив: 2005.07.18;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.037 c