Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Как почистить любые значения контролов ??


Автор: Denchik 1.3.2008, 19:41
Есть вот такая милая вещь
Код


procedure TForm1.SetProperties(ClassName, SomeProperty: string; Value: Integer);
 var
   i: integer;
   PropInfo: PPropInfo;
   Component: TComponent;
 begin
   for i := 0 to ComponentCount - 1 do
   begin
     Component := Components[i];
     if (Component is TControl) and ((Component.ClassName = ClassName)
       or (ClassName = 'AllComponents')) then
     begin
       PropInfo := GetPropInfo(Component.ClassInfo, SomeProperty);
       if Assigned(PropInfo) then
         SetOrdProp(Component, PropInfo, Integer(Value));
     end;
   end;
 end;


Вот так к примеру чистит все свойства контролов на форме
SetProperties('AllComponents', 'text',0);
SetProperties('AllComponents', 'checked',0);
SetProperties('AllComponents', 'value',0);

А вот так не работает 
SetProperties('TDateTimePicker', 'time',0);
и вроде еще Radiobox не чистит

нет ни у кого более универсального решения ??



Автор: Rrader 2.3.2008, 08:43
Пример в аттаче. И еще: обнулить дату просто так не получится. Потому что при установке свойства Date у TDateTimePicker выполняется такой метод:
Код

procedure TCommonCalendar.SetDate(Value: TDate);
begin
  ReplaceTime(TDateTime(Value), FDateTime);
  if Value = 0.0 then CheckEmptyDate;
  try
    CheckValidDate(Trunc(Value));
    SetDateTime(Value);
  except
    SetDateTime(FDateTime);
    raise;
  end;
end;

А дата типа 00.00.0000 не является верной. Ну здесь тоже есть пути решения, н-р, Class Cracking smile 

Автор: MetalFan 2.3.2008, 10:03
Цитата(Denchik @  1.3.2008,  19:41 Найти цитируемый пост)
А вот так не работает 
SetProperties('TDateTimePicker', 'time',0);

Цитата(Denchik @  1.3.2008,  19:41 Найти цитируемый пост)
       if Assigned(PropInfo) then
         SetOrdProp(Component, PropInfo, Integer(Value));

ответ в твоем коде.
попытка установить OrdProp, которое на самом деле TDateTime


Автор: Denchik 2.3.2008, 16:43
Еще последний вопрос ,
чтобы было мне счастье  smile 

как одолеть вот этот коварный вид контролов TCheckListBox
checked - 0 не помагает  smile 

Автор: lukas 2.3.2008, 17:31
Denchik, 

такое невозможно, потому что Checked это массив... Array, а массивы задавать через TypInfo нельзя...


Автор: bems 2.3.2008, 17:36
а вызвать конструктор на уже созданом объекте не подойдет?

Автор: Denchik 2.3.2008, 17:41
На ум приходит тока 
FindComponent и цикл анчекед до упора 

типа будет полуниверсальное решение 

Автор: lukas 2.3.2008, 18:13
bems, 

а чего не пойдет... ты хоть тысяча раз его вызывай, это практически функция возвращающая указатель на экземпляр класса... а твоя переменная это типовой указатель....  smile 


P.S. А собествено к чему вопрос?

Автор: bems 2.3.2008, 20:09
Цитата(lukas @  2.3.2008,  18:13 Найти цитируемый пост)
это практически функция возвращающая указатель на экземпляр класса... а твоя переменная это типовой указатель....  
Спасибо, ты открыл мне гдаза на устройство мира smile

Цитата(lukas @  2.3.2008,  18:13 Найти цитируемый пост)
А собествено к чему вопрос?
Я хотел спросить не подойдет ли автору ветки такой способ реинициализации свойств

Автор: Denchik 2.3.2008, 21:15
Цитата(bems @  2.3.2008,  17:36 Найти цитируемый пост)
а вызвать конструктор на уже созданом объекте не подойдет? 

Честно говоря , я это не совсем понял  smile 

Автор: bems 2.3.2008, 21:29
Цитата(Denchik @  2.3.2008,  21:15 Найти цитируемый пост)
Честно говоря , я это не совсем понял  

Код

Component.Create(component.owner)


Добавлено через 4 минуты и 13 секунд
где Component объект а не класс

Автор: MetalFan 2.3.2008, 22:21
имхо это может привести к непредвиденным последствиям... например утечкам памяти...

Автор: Denchik 3.3.2008, 14:04
Цитата(lukas @  2.3.2008,  17:31 Найти цитируемый пост)
такое невозможно, потому что Checked это массив... Array, а массивы задавать через TypInfo нельзя...

А может как-то NIL ему передать  smile 

Автор: MetalFan 3.3.2008, 17:24
Цитата(Denchik @  3.3.2008,  14:04 Найти цитируемый пост)
А может как-то NIL ему передать  smile 

сказали низя, значит низя.
дак это еще и не published св-во. так что забудь

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)