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


Автор: student43 26.6.2006, 16:21
Вот такой вопрос у меня имею функцию но она немного не работает, программа не распознаёт функцию FindComponent в теле функции а если FindComponent выполняеться в программе то всё работает без проблем! Как сделать чтобы FindComponent работало в функции ?

Код

function popad(a:string):string;
var d:TComponent;
begin
d:=FindComponent('x'+Chr(a));
(d as TImage).Tag:=5;
end;
   

Автор: Romikgy 26.6.2006, 16:29
Цитата(student43 @  26.6.2006,  15:21 Найти цитируемый пост)
s

что за переменая? 

Автор: student43 26.6.2006, 16:32
Ошибся там вместо s идёт a.

Я бегло писал ) 

Автор: Alexeis 26.6.2006, 16:44
Цитата(student43 @  26.6.2006,  15:21 Найти цитируемый пост)
d:=FindComponent('x'+Chr(a));

Функция Chr принимает аргумент типа byte, а не string

Добавлено @ 16:46 
Вообще чесно говоря я так и не понял зачем она вообще здесь нужна smile  

Автор: Romikgy 26.6.2006, 16:48
И что ты в нем передаешь ? один символ? тогда зачем
Цитата(student43 @  26.6.2006,  15:21 Найти цитируемый пост)
a:string

?
 или несколько символов? тогда непонятно 
Цитата(student43 @  26.6.2006,  15:21 Найти цитируемый пост)
Chr(a)

 

Автор: skyboy 26.6.2006, 17:09
student43, findcomponent - это метод. Метод, вроде бы, класса TwindowControl или что-то типа. Т.е. у класса Tform этот метод есть, у Tpanel - есть. А просто так, у "ничего", этого метода нет. Так что передавай в свою функцию параметром контейнер...  

Автор: student43 26.6.2006, 17:11
Цитата(Romikgy @  26.6.2006,  16:48 Найти цитируемый пост)
И что ты в нем передаешь ? один символ? тогда зачем

Цитата(student43 @  26.6.2006,  15:21 )
a:string


?
 или несколько символов? тогда непонятно 

Цитата(student43 @  26.6.2006,  15:21 )
Chr(a)


Да не в этом дело! Хоть integer Тип можно поставить! Проблема с FindComponent выдаёт ошибку 

Undeclared identifie: 'FindComponent'. Программа определяет как переменую а не как функцию, а вот как сделать чтобы определяло как функцию

Добавлено @ 17:12 
Цитата(skyboy @  26.6.2006,  17:09 Найти цитируемый пост)
student43, findcomponent - это метод. Метод, вроде бы, класса TwindowControl или что-то типа. Т.е. у класса Tform этот метод есть, у Tpanel - есть. А просто так, у "ничего", этого метода нет. Так что передавай в свою функцию параметром контейнер...

А пример можно ? 

Автор: skyboy 26.6.2006, 17:18
пример:
Код

procedure Tform1.onbutton1click(sender: Tobject);
begin
(findcomponent('button1') as Tbutton).width:= 200; // это сработает, потому что тут неявно вызывается findcomponent именно для объекта типа Tform1(объект будет передан в переменной self)
end;

procedure simple;
begin
(findcomponent('button1') as Tbutton).width:= 200; // это не сработает, потому как функции findcomponent нет. Есть только метод. А в этой процедуре неясно, у кого же этот метод вызывать.
end;

з.ы. Метод findcomponent - это метод класса TComponent.  

Автор: Alexeis 26.6.2006, 17:38
skyboy, в данном случае это метод формы
Form1.findcomponent(...)
В методах Form1 опускают и подразумевают Self который в конечном итоге и будет form1 

Автор: student43 26.6.2006, 17:56
не сильно знаком с синтаксисом процедур в Делфи книжки щас нету так что дурацкий вопрос задам, вот сделал описание процедуры тут вроде всё правильно 
Код

procedure Tform1.onbutton1click(name:string;Sender: TObject);
begin
(findcomponent(name) as TImage).Picture:=Image4.Picture;
end;

Но ошибка выскакивает при обращении что писать во входные параметры ?
Вот так у меня!
Код

Tform1.onbutton1click('x11');

А вот мессага!
[Error] Unit1.pas(230): Not enough actual parameters 

Автор: Poseidon 26.6.2006, 17:58
Один топик, один вопрос!

Думаю в твоем случае подойдет 
Код
Tform1.onbutton1click('x11', Sender);
 

Автор: Alexeis 26.6.2006, 18:03
Цитата(student43 @  26.6.2006,  16:56 Найти цитируемый пост)
процедуры тут вроде всё правильно 

Обработчик сообщения имеет СТРОГО ОПРЕДЕЛЕННЫЙ ФИКСИРОВАННЫЙ НАБОР ПАРАМЕТРОВ smile  

Автор: skyboy 26.6.2006, 18:16
шутник. зачем ты объединяешь обработчик и свою функцию? Если не хошь искать в пределах обработчика процедуры, то выдели поиск компонента в отдельную функцию например так:
Код

function GetComponentOf(Source: Tcomponent;name: string): Tcomponent;
begin
 GetComponentOf:= Source.FindComponent(name);
end;

и вызывай так:
Код

(getcomponentof(form1,'Button1') as Tbutton).width:= 200;
(getcomponentof(form1.panel1,'Label2') as Tlabel).color:= clRed;

Цитата(alexeis1 @  26.6.2006,  17:38 Найти цитируемый пост)
В методах Form1 опускают и подразумевают Self который в конечном итоге и будет form1 

Твоя неправда  smile . В приведенном мною коде
Код

procedure TForm1.onbutton1click(sender: Tobject);    
begin    
(findcomponent('button1') as Tbutton).width:= 200; // это сработает, потому что тут неявно вызывается findcomponent именно для объекта типа Tform1(объект будет передан в переменной self)    
end;

в качестве self'a будет не объект с именем Form1, а любой объект класса TForm1, назвать которого ты вправе как угодно. Хоть BillGates smile Методы - относятся к классам, а не к объектам. Объекты их вызывают.  

Автор: Alexeis 27.6.2006, 13:29
skyboy, Строго говоря, конечно,
Цитата(skyboy @  26.6.2006,  17:16 Найти цитируемый пост)
 не объект с именем Form1, а любой объект класса TForm1, назвать которого ты вправе как угодно
, но судя по хорактеру вопроса student43, новичок - а потому вероятнее всего форма имеет имя Form1 (я сам сохраняю исходныее названия  smile )
Что касается 
Цитата(skyboy @  26.6.2006,  17:16 Найти цитируемый пост)
Методы - относятся к классам, а не к объектам. Объекты их вызывают. 
 то это не совсем верно каждый экземпляр объекта хранит указатели на свои методы, либо указатель на VMT - для виртуальных методов. Так что объект "владеет" своими методами.
 

Автор: skyboy 27.6.2006, 15:58
alexeis1, да, касательно не-виртуальных методов я как-то запамятовал smile Просто как-то не верится, что один и тот же код хранится в разных объектах smile 

Автор: Alexeis 27.6.2006, 17:10
Цитата(skyboy @  27.6.2006,  14:58 Найти цитируемый пост)
Просто как-то не верится, что один и тот же код хранится в разных объектах

Правельно не верится ведь код метода и вправду хранится в одном экземпляре общем для всех объектов данного класса. У каждого объекта имеется только адрес его метода, а не сам метод. Для виртуальных методов адрес таблицы виртуальных методов, правда насколько я помню для каждого экземпляра создается своя таблица витруальных методов. А вот с динамичискими посложнее... 

Дальнейшее обсуждение думаю выходит за рамки данной темы. 

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