Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.03.30;
Скачать: [xml.tar.bz2];

Вниз

Событие   Найти похожие ветки 

 
Artem   (2008-02-27 16:17) [0]

Народ нужна помощь, уже два дня мучаюсь над одной проблемой, сразу скажу, что в программировании новичок так что извините за глупые вопросы.
Вообщем например есть файл в нем хранится текст:
Form1.Button1 OnClick ShowMessage
дальше считываем в три строковые переменные эти данные и получаем
SComp:="Form1.button1"
SEvent:="OnClick"
SProced:="ShowMessage"

и вот теперь нужно в рантайм присвоить компоненту Button1 на событие OnClick процедуру ShowMessage (она в тексте проги уже описана) т.е. в итоге чтобы компилятор подумал что это
Form1.Button1.OnClick:=ShowMessage;
и тут начались проблемы, ума не прилажу как это сделать


 
Сергей М. ©   (2008-02-27 16:21) [1]

А что такое в дан.случае "ShowMessage" ? Что под этим подразумевается ?


 
Artem   (2008-02-27 16:44) [2]

Ну это мне для примера :) Вообщем предположим что это
Procedure ShowMessage;
begin
label1.caption:="УРА :)"
end

процедура будет уже описана в тексте проги и будет присваиваться баттону1 по онклик


 
Сергей М. ©   (2008-02-27 16:46) [3]


> процедура будет уже описана в тексте проги и будет присваиваться
> баттону1 по онклик
>


Не будет она "присваиваться" - компилятор не допустит такое безобразие.
Допустимо присвоение метода объекта, а не регулярной процедуры.


 
Artem   (2008-02-27 17:11) [4]

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

private
Procedure ShowMsg( Sender : TObject );
...
Procedure TForm1.ShowMsg( Sender : TObject );
begin
ShowMessage("1111111");
end;
...
procedure TForm1.Button3Click(Sender: TObject);
begin
Button4.OnClick:=ShowMsg;//вот эту строку и нужно "собрать" по кусочкам
end;

Вот в таком виде все работает в рантайм, но загвоздка в том как "собрать" эту строку из стринговых переменных


 
Сергей М. ©   (2008-02-27 17:18) [5]


> мне и не важно процедура или метод


тебе мож и неважно, а вот компилятору оч даже важно.


> разобраться в том как это сделать в рантайм и из стринговых
> переменных


RTTI нужно задействовать.


 
Artem   (2008-02-27 18:39) [6]

А можно небольшой примерчик, как это сделать?

И еще на данный момент стоит несколько дополнительных, сопутствующих вопросов:
1.Какого типа должна быть переменная чтобы она наследовала все события присвоенного ей компонента?(например Button, edit, label)(может TComponent?)
2.Какого типа должна быть переменная чтобы назначить компоненту события например чтобы создать OnClick или OnChange?
...тьфу сам непонял что написал, ну да ладно попробую обьяснить. Вообщем должна быть переменная FCompon которой может присвоиться любой компонент(button1,edit3,label5...), а затем вызывать события уже из переменной(ну предположим это будет FCompon.OnClick). Что касается второго то тут уже переменная FEvent должна содержать значение самого события, т.е. в итоге мне нужно получить выражение что-то типа FCompon.FEvent:=....... эквивалентное Form1.Button1.OnClick если FCompon:=Form1.Button1, а FEvent:=OnClick
еще раз сорри за этот бред, но уже голова не работает, второй день на это угробил...
спасибо...


 
Amoeba ©   (2008-02-27 19:24) [7]

Читаем до полного просветления:
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=342


 
Artem   (2008-02-27 23:37) [8]

Прочитал два раза спасибо, некоторые моменты стали понятнее, но как реализовать то что мне нужно так и не понял
Имеем:

private
Procedure ShowMsg( Sender : TObject );
...
Var
Str1:String="Form1.Button1";
Str2:String="OnClick";
Str3:String="ShowMsg";
...
Procedure TForm1.ShowMsg( Sender : TObject );
begin
ShowMessage("1111111");
end;
...

Возможно ли создать при помощи этих трех стринговых переменных "собрать" выражение равное по смыслу

Button1.OnClick:=ShowMsg;

это реально?или нет?можно примерчик пожалуста.


 
korneley ©   (2008-02-27 23:47) [9]


> Возможно ли создать при помощи этих трех стринговых переменных
> "собрать" выражение равное по смыслу Button1.OnClick:=ShowMsg;
>

Result := Str1 + "." + Str2 + ":=" + Str3 + ";";


 
Семеныч   (2008-02-28 00:19) [10]

> Artem   (27.02.08 16:17)

type
 TForm1 = class(TForm)
   Button1: TButton;
   procedure FormCreate(Sender: TObject);
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

uses
 TypInfo;

procedure TForm1.FormCreate(Sender: TObject);

const
 FormName = "Form1";
 ComponentName = "Button1";
 EventName = "OnClick";
 MethodName = "Button1Click";

var
 Form: TForm;
 Component: TComponent;
 EventInfo: PPropInfo;
 Method: TMethod;

begin

 // 1. Находим форму
 Form := TForm(Application.FindComponent(FormName));
 if Form = nil then
   raise Exception.Create("Form not found");

 // 2. Находим компонент на форме
 Component := Form.FindComponent(ComponentName);
 if Component = nil then
   raise Exception.Create("Component not found");

 // 3. Находим событие компонента
 EventInfo := GetPropInfo(Component, EventName, [tkMethod]);
 if EventInfo = nil then
   raise Exception.Create("Event not found");

 // 4. Находим метод формы
 Method.Code := Form.MethodAddress(MethodName);
 if Method.Code = nil then
   raise Exception.Create("Method not found");

 // 5. Инициализируем Self метода формы
 Method.Data := Form;

 // 6. Назначаем метод формы обработчиком события компонента
 SetMethodProp(Component, EventInfo, Method);

end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 ShowMessage("Привет от Семеныча!")
end;


 
korneley ©   (2008-02-28 01:02) [11]

Поборол... :) Хотя про RTTI ещё в [5] писАлось


 
Германн ©   (2008-02-28 01:39) [12]


> korneley ©   (28.02.08 01:02) [11]
>
> Поборол... :) Хотя про RTTI ещё в [5] писАлось
>

Не. Не поборол, а дал готовый код для того, кто "только недавно стал изучать Делфи и программирование и пока не сильно разбираюсь".
И ес-сно взял на себя ответственность за ответы на последующие вопросы :)


 
Семеныч   (2008-02-28 07:13) [13]

> korneley ©   (28.02.08 01:02) [11]

> Поборол...

Собственно, бороть тут было нечего. Вы тоже вполне могли бы это сделать. Но в [9] вместо помощи новичку почему-то решили сострить над его неудачным выражением. Ха-ха-ха, как смешно Вы, право, сострили! Мои поздравления!

Почему он неудачно выразился - понятно. Потому что новичок. Непонятно остальное.

> Хотя про RTTI ещё в [5] писАлось

Угу, писалось. Там слово такое есть. И человек, конечно же, знает, что оно означает и как его надо задействовать. Прочитал он "RTTI надо задействовать" - и сразу все ясно ему стало.

Пусть извинит меня Сергей, но в ТАКОМ виде совет его, хотя и абсолютно правилен, но столь же и бесполезен.


 
Сергей М. ©   (2008-02-28 08:22) [14]


> Семеныч   (28.02.08 07:13) [13]


Анекдот про Холмса с Ватсоном на воздушном шаре знаешь ?)


 
Сергей М. ©   (2008-02-28 08:25) [15]


> Семеныч   (28.02.08 07:13) [13]


> столь же и бесполезен


Равно как и твой код, если, к примеру, искомый в п.4 метод объекта формы не является опубликованным)


 
@!!ex ©   (2008-02-28 08:37) [16]

> Собственно, бороть тут было нечего. Вы тоже вполне могли
> бы это сделать. Но в [9] вместо помощи новичку почему-то
> решили сострить над его неудачным выражением. Ха-ха-ха,
> как смешно Вы, право, сострили! Мои поздравления!
>
> Почему он неудачно выразился - понятно. Потому что новичок.
> Непонятно остальное.

Пусть учится задавать вопросы.


> Угу, писалось. Там слово такое есть. И человек, конечно
> же, знает, что оно означает и как его надо задействовать.
> Прочитал он "RTTI надо задействовать" - и сразу все ясно
> ему стало.
>
> Пусть извинит меня Сергей, но в ТАКОМ виде совет его, хотя
> и абсолютно правилен, но столь же и бесполезен.

Пусть учится пользоваться гуглем.


 
Семеныч   (2008-02-28 09:14) [17]

> Сергей М. ©   (28.02.08 08:25) [15]

> если, к примеру, искомый в п.4 метод объекта формы
> не является опубликованным

А вот специально для этого и приведено объявление класа формы. Чтоб видно было.

Там не только это. Форма должна иметь владельцем Application - раз. Компонент должен иметь владельцем форму - два. Метод должен принадлежать форме - три. Он должен быть опубликован - четыре.

Но человек имеет перед глазами простой, понятный и работающий пример. Когда начнет его разбирать - что-то поймет. Когда начнет его корежить и тот перестанет работать - тоже что-то поймет. И т.д.

А не поймет - так снова задаст вопрос. Но уже другой. И немного на другом уровне.

> @!!ex ©   (28.02.08 08:37) [16]

Браво! Я в восторге. Предлагаю Вам самому попробовать воспользоваться Гуглем и на основании изысканий по ключевому слову "Галеркин" на практике решить нестационарное уравнение теплопроводности для плоской стенки при Bi=20 и граничных условиях второго рода.

Все необходимое для этого содержится в сказанном. И мне будет крайне любопытно узнать, хватит ли вам пары месяцев гугления. Желаю успехов.


 
@!!ex ©   (2008-02-28 09:19) [18]

> [17] Семеныч   (28.02.08 09:14)

Мы вообще то об RTTI говорили.
инфа по RTTI находится без проблем и с примерами.
ферштейн?


 
Сергей М. ©   (2008-02-28 09:38) [19]


> Семеныч   (28.02.08 09:14) [17]


Тебе виднее)


 
{RASkov} ©   (2008-02-28 11:25) [20]

Как не крутите, но Семеныч здесь более прав, чем не прав.....
:)
Но люди разные все.... мне вот по готовым примерам легче учится, нежели читать только хелп или теорию....
Мне лучше конкретный пример, а вот как он работает - тут в этом поможет разобраться хэлп(теория).
Я так думаю. Но опять же.... люди разные :(
Можно былоб поспорить на эту тему, но ...не место здесь :)


 
Leonid Troyanovsky ©   (2008-02-28 12:44) [21]


> Семеныч   (28.02.08 09:14) [17]

> Форма должна иметь владельцем Application - раз.

Screen.Forms.

--
Regards, LVT.


 
Artem   (2008-02-28 14:49) [22]

Огромное Вам спасибо, все очень доходчиво :) пока буду разбирать пример и курить хелпы уже по примеру, так гораздо легче усвоить материал, а гуглем действительно трудно искать когда незнаешь что вообщем то ищеш...
Семеныч:
Вам отдельная благодарность :)


 
Семеныч   (2008-02-28 14:52) [23]

> @!!ex ©   (28.02.08 09:19) [18]

> Мы вообще то об RTTI говорили.
> инфа по RTTI находится без проблем и с примерами.
> ферштейн?

Информация по решению уравнения теплопроводности тоже находится без проблем и с примерами. Тем не менее, мне действительно было бы интересно узнать, сможет ли неподготовленный человек найти именно то, что нужно (отсеяв то, что не нужно) и решить эту задачу за пару месяцев.

А для человека, задавшего вопрос слово "RTTI" - такая же филькина грамота, как для другого - "уравнение теплопроводности". Они оба к такому поиску и анализу одинаково неподготовлены.

Ферштейн?

Ну да ладно - раз Вы настаиваете, давайте поговрим об RTTI. Изменим задание. Раз "инфа по RTTI находится без проблем и с примерами", то предлагаю Вам последовать своему же совету, погуглить и привести здесь ссылку на страницу, где описывалось бы  решение такой задачи: вывести список published-полей произвольного класса, зная только сам класс.

Чистое RTTI. И очень интересно узнать, за какое время Вы найдете такую ссылку (если Вы ее вообще найдете).



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2008.03.30;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.045 c
2-1204179765
Layner
2008-02-28 09:22
2008.03.30
Как идентифицировать TTreeNode в TTreeView


2-1204619691
simon26
2008-03-04 11:34
2008.03.30
Не получается удалять содержимое таблицы


9-1168453494
DillerXX
2007-01-10 21:24
2008.03.30
Загрузка процессора


15-1202826268
Real
2008-02-12 17:24
2008.03.30
Как обломать wine?


2-1204353229
Lamer666
2008-03-01 09:33
2008.03.30
Как лучше обработать результаты GET?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский