Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > ошибка с function(Components[i]) as TsomeControl)


Автор: Bose 10.8.2006, 15:16
есть ф-ция: 
Код

Procedure PrepareCombobox(var ComboBox : TDBComboBoxEh; SetFirst: boolean); overload;
begin
     if (ComboBox.Items.Count > 0) and SetFirst
       then ComboBox.ItemIndex := 0;

     ComboBox.DropDownBox.Rows := Max(ComboBox.DropDownBox.Rows,Min(8, ComboBox.Items.Count));
end;

и аналогичная
Код

Procedure PrepareCombobox(var ComboBox : TDBLookupComboBoxEh; SetFirst: boolean); overload;
begin
     if (ComboBox.Items.Count > 0) and SetFirst
       then ComboBox.ItemIndex := 0;

     ComboBox.DropDownBox.Rows := Max(ComboBox.DropDownBox.Rows,Min(8, ComboBox.Items.Count));
end;



вызваю её вот так вот:
Код

  For i := 0 To Self.ComponentCount-1 Do
    Begin
      If (Self.Components[i] is TDBComboBoxEh)
         Then
      begin
           PrepareCombobox( (Self.Components[i]) as TDBComboBoxEh ,False);
      end;


и получаю ошибку: 
There is no overloaded version of 'PrepareCombobox' that can be called with these arguments.
 smile не понимаю в чём там дело .  smile Кто-нибудь знает почему так?

и в то же время, если создать переменную типа TDBComboBoxEh. Присвоить ей
Self.Components[i]) as TDBComboBoxEh и передать в виде параметра уже переменную, то всё происходит на ура. Но такой вариант меня не устраивает, потому что планируется по ходу работы добавлять перезагруженные варианты ф-ции для других типов контролов. 
п.с. Дельфи 6.

Автор: Bose 10.8.2006, 15:48
п.с. только что выяснил, что подобное поведение появляется, только в случае, если используются перегруженные (overload) функции. 

Автор: Snowy 10.8.2006, 15:58
Поправь параметр на 
ComboBox : TCustomComboBox;

Добавлено @ 16:02 
Или сделай один вариант функции, принимающеё TWinControl, а уже в ней разбирайся, что за контрол пришёл.

Добавлено @ 16:02 
И var убери smile Он там не нужен. Только мешать будет.

Автор: Bose 10.8.2006, 16:07
Цитата(Snowy @  10.8.2006,  15:58 Найти цитируемый пост)
И var убери  Он там не нужен. Только мешать будет.


Убрал и всё заработало.  smile  smile  smile  ни-че-го ни понимаю.

Спасибо, Snowy! 

 
добавлено: 
Цитата

Поправь параметр на 
ComboBox : TCustomComboBox;

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

Автор: Matematik 10.8.2006, 16:15
Цитата(Bose @  10.8.2006,  17:07 Найти цитируемый пост)
там не получилось бы. у этих контролов почему-то нет общего предка, обладающего нужными мне свойствами.

Можно использовать as и is
Код

if Sender is TButton then
begin
  (Sender as TButton).
end
else if Sender is TMemo then
begin
  (Sender as TMemo).
end
else

Автор: Snowy 10.8.2006, 16:25
Цитата(Bose @  10.8.2006,  16:07 Найти цитируемый пост)
Убрал и всё заработало.        ни-че-го ни понимаю.
Просто варом можно передавать только переменные. Приведённая переменная уже таковой не считается.

Цитата(Bose @  10.8.2006,  16:07 Найти цитируемый пост)
Спасибо, Snowy! 
Всегда пожалуйста.

Добавлено @ 16:27 
ЗЫ. Передавать объекты варом - нет смысла - они и так указатели.
Если только ты не хочешь создать новый объект, вместо переданного.

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