Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.033 c
11-1103113734
Valet
2004-12-15 15:28
2005.07.18
EditBox не редактируется ручками в W2K SP3 Eng


3-1118306473
sapsi
2005-06-09 12:41
2005.07.18
Фильтры в БД Аксесс


14-1119526376
Магнум
2005-06-23 15:32
2005.07.18
Pocket PC


1-1120148063
Belkova
2005-06-30 20:14
2005.07.18
Процесс не выгружается


14-1118917235
alless
2005-06-16 14:20
2005.07.18
Карты городов Европы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский