Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 21.07.2012, 10:32
DOR DOR вне форума
Начинающий
 
Регистрация: 14.01.2011
Сообщения: 171
Версия Delphi: 7
Репутация: 10
По умолчанию Очистка большого числа Edit, ComboBox и т.д

Добрый день. Подскажите пожалуйста, как можно одновременно не перечисляя все нужные "контролы" очистить их. Например, есть форма на которой 10 Edit, 10 ComboBox из которых нужно очистить только те, Name которых равны: tb_1, tb_2, tb_3, cb_1, cb_2, cb_3. Очистка происходит по нажатию на кнопки. Спасибо.
Ответить с цитированием
  #2  
Старый 21.07.2012, 16:49
MiraLaklamon MiraLaklamon вне форума
Новичок
 
Регистрация: 07.06.2012
Сообщения: 59
Версия Delphi: 6, 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от DOR
Добрый день. Подскажите пожалуйста, как можно одновременно не перечисляя все нужные "контролы" очистить их. Например, есть форма на которой 10 Edit, 10 ComboBox из которых нужно очистить только те, Name которых равны: tb_1, tb_2, tb_3, cb_1, cb_2, cb_3. Очистка происходит по нажатию на кнопки. Спасибо.
"одновременно не перечисляя" никак нельзя.
Ответить с цитированием
  #3  
Старый 21.07.2012, 21:39
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Можно требуемым для очистки контролам присвоить одинаковый и уникальный Tag. Затем используя цикл с использованием ComponentCount очистить их, примерно так:
Код:
var
  I : Integer;
begin
  for I := 0 to ComponentCount - 1 do
    if (Components[i] is TEdit) and ((Components[i] as TEdit).Tag = 12345) then
      (Components[i] as TEdit).Text := ''
    else if (Components[i] is TComboBox) and ((Components[i] as TComboBox).Tag = 12345) then
      (Components[i] as TComboBox).Clear;
end;
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
Этот пользователь сказал Спасибо angvelem за это полезное сообщение:
DOR (29.07.2012)
  #4  
Старый 21.07.2012, 21:48
MiraLaklamon MiraLaklamon вне форума
Новичок
 
Регистрация: 07.06.2012
Сообщения: 59
Версия Delphi: 6, 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от angvelem
Можно требуемым для очистки контролам присвоить одинаковый и уникальный Tag. Затем используя цикл с использованием ComponentCount очистить их, примерно так:
Код:
var
  I : Integer;
begin
  for I := 0 to ComponentCount - 1 do
    if (Components[i] is TEdit) and ((Components[i] as TEdit).Tag = 12345) then
      (Components[i] as TEdit).Text := ''
    else if (Components[i] is TComboBox) and ((Components[i] as TComboBox).Tag = 12345) then
      (Components[i] as TComboBox).Clear;
end;
Но это будет всё-же "перечисляя" (более того, перечисляя не только те компоненты которые нужно очистить, а все которые лежат на форме), а по условию задачи нужно "одновременно не перечисляя"...
Ответить с цитированием
  #5  
Старый 21.07.2012, 21:56
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Пусть пробует по-своему, может получится.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #6  
Старый 21.07.2012, 22:11
Аватар для YVitaliy
YVitaliy YVitaliy вне форума
Местный
 
Регистрация: 14.12.2011
Сообщения: 481
Версия Delphi: Borland Delphi7
Репутация: 17
По умолчанию

Можешь извращаться типа массивом Pointer'ов:
Код:
var pt:array of ^TWinControl;
ccount:Integer;
...........

begin
ccount:=6;
setlength(pt, ccount);
pt[0]:=@edit1;
pt[1]:=@edit2;
pt[2]:=ComboBox1;
..............


if pt[0].ClassType = TEdit then
(pt[0]^ as TEdit).text:='' else
if pt[0].ClassType = TComboBox then
(pt[0]^ as TCombobox).clear else
....................................
Ответить с цитированием
  #7  
Старый 21.07.2012, 23:40
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

В любом случае идёт перечисление контролов.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #8  
Старый 21.07.2012, 23:55
Аватар для YVitaliy
YVitaliy YVitaliy вне форума
Местный
 
Регистрация: 14.12.2011
Сообщения: 481
Версия Delphi: Borland Delphi7
Репутация: 17
По умолчанию

Ну, тогда просто - если они не на главной форме - "убить" форму, на которой они расположены, а потом создать заново. Но я все-же думаю, что и там идет перечисление всех контроллов на форме (при создании).
Ответить с цитированием
  #9  
Старый 22.07.2012, 12:24
DOR DOR вне форума
Начинающий
 
Регистрация: 14.01.2011
Сообщения: 171
Версия Delphi: 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от angvelem
Можно требуемым для очистки контролам присвоить одинаковый и уникальный Tag. Затем используя цикл с использованием ComponentCount очистить их, примерно так:
Код:
var
  I : Integer;
begin
  for I := 0 to ComponentCount - 1 do
    if (Components[i] is TEdit) and ((Components[i] as TEdit).Tag = 12345) then
      (Components[i] as TEdit).Text := ''
    else if (Components[i] is TComboBox) and ((Components[i] as TComboBox).Tag = 12345) then
      (Components[i] as TComboBox).Clear;
end;

Подобное использовал в VBA, это ближе. Спасибо всем, кто не прошел мимо, кто высказал свое мнение и предложил возможные варианты решения.
Ответить с цитированием
  #10  
Старый 22.07.2012, 13:41
PS11011010 PS11011010 вне форума
Новичок
 
Регистрация: 30.03.2012
Сообщения: 98
Репутация: 282
По умолчанию

А если сделать так, чтобы при создании формы все данные о элементах образовали непрерывный массив в памяти. То есть, допустим, есть 5 CheckBox и в памяти каждый занимает 10 байт, тогда 5 CheckBox будут занимать 50 ПОСЛЕДОВАТЕЛЬНЫХ байт. После создания формы кидаешь дамп памяти длиной в 50 байт в переменную, а потом просто меняешь значение памяти на значение переменной. Тут все, вроде даже перерисоваться должно на форме сразу (я имею ввиду наличие и отсутствие галочек на CheckBox).
Вы понимаете, о чем я?
Господа, Гуру, убейте меня ржавым носком, если такое невозможно реализовать.
Ответить с цитированием
  #11  
Старый 22.07.2012, 14:12
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Вот ещё один вариант с использованием FindComponent:
Код:
for i := 1 to 3 do
 begin
 (FindComponent('tb_' + inttostr(i)) as TEdit).Text := '';
 (FindComponent('cb_' + inttostr(i)) as TComboBox).Clear;
 end;
Ответить с цитированием
  #12  
Старый 22.07.2012, 14:51
MiraLaklamon MiraLaklamon вне форума
Новичок
 
Регистрация: 07.06.2012
Сообщения: 59
Версия Delphi: 6, 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от PS11011010
А если сделать так, чтобы при создании формы все данные о элементах образовали непрерывный массив в памяти. То есть, допустим, есть 5 CheckBox и в памяти каждый занимает 10 байт, тогда 5 CheckBox будут занимать 50 ПОСЛЕДОВАТЕЛЬНЫХ байт. После создания формы кидаешь дамп памяти длиной в 50 байт в переменную, а потом просто меняешь значение памяти на значение переменной. Тут все, вроде даже перерисоваться должно на форме сразу (я имею ввиду наличие и отсутствие галочек на CheckBox).
Вы понимаете, о чем я?
Господа, Гуру, убейте меня ржавым носком, если такое невозможно реализовать.
Конечно так невозможно сделать. Нет легальных способов сделать так, чтобы 10 нужных CheckBox при создании заняли память "друг за другом". Кроме того в процессе работы объекты резервируют и освобождают дополнительную память. Но даже если бы это возможно было сделать каким-то безумным способом, то простое копирование памяти тоже не даст эффекта, точнее даст скорее всего непредсказуемый результат. Так например свойство "Checked" у CheckBox это именно свойство, а не просто кусочек памяти. Если этому свойству присвоить какое-то значение (например: CheckBox1.Checked:=True), то это вызовет целую последовательность событий (в частности посылку сообщения BM_SETCHECK, которое и приведёт к установке флажка), если же просто сделать запись в тот кусочек памяти где хранится текущее состояние флажка, то это не приведёт к "визуальному" изменению.
Ну вобщем как-то так...
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 15:19.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter