Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.09.2012, 18:23   #11
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
Например: "Выполнено событие = OnClick". Это возможно сделать?
самый простой вариант. Мы же сами пишем код приведенный Аватаром, так кто нам мешает приписать к выводимой строке и имя прцедуры которое у нас перед глазами, и все другое что нам заблагорассудится, не прибегая к каким-либо ухищрениям.
Код:
showmessage((sender as Tcomponent).Name +'.Onclick');
showmessage((sender as Tcomponent).Name +'.OnChange');
Если у вас один обработчик на разные виды событий (OnClick, OnChange) то имя самой процедуры обработчика, все равно не поможет узнать вид события.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 07.09.2012, 18:32   #12
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Сделай процедуру с параметрами имя обработчика и Sender и обращайся к ней из обработчиков событий MyProcedure('Button1Click',Sender), а в ней реализуй сохранение данных. Лог предложил решив, что это для отладки нужно. Другого применения не вижу. Тип события? Разве что для каждого типа событий своя процедура, ее имя и определит тип события. Можно влезть в код компонент или переопределить классы, а нужно ли оно?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 07.09.2012 в 18:37.
Аватар вне форума Ответить с цитированием
Старый 07.09.2012, 18:37   #13
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,194
По умолчанию

Мне кажется, что меня не до конца правильно поняли, что мне нужно . Приведу другой пример. Есть кнопка (Button1). Допустим, что я в Design Time сделал обработчики событий (например в OnClick и OnContextPopup добавил некий код). Мне нужно, что если я нажму на кнопку ЛКМ, то, например, в Label будет написано "Событие=OnClick". Если ПКМ, то в Label будет написано "Событие=OnContextPopup". Мне не нужно код событий получать. Мне нужно получить имя события (процедуры или функции). Заранее неизвестно какое действие будет выполнено кнопкой. Поэтому делать:
Код:
showmessage((sender as Tcomponent).Name +'.Onclick');
showmessage((sender as Tcomponent).Name +'.OnChange');
заранее прописывая имена событий нельзя.
Ранее приведенный код тоже сослужит мне службу, но он не решает мою проблему.
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 07.09.2012, 18:58   #14
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Ты их не слушай, ты меня слушай (С)

Ответ на твой вопрос зависит от того, зачем тебе это надо.

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

Поэтому ответ на твой зависит от того, какие именно процедуры ты хочешь использовать. Для некоторых имена получить можно. Для остальных надо имена хранить. Делать это можно, опять же, разными способами. А правильный способ зависит от твоей цели.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 07.09.2012, 19:06   #15
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Цитата:
Сообщение от artemavd Посмотреть сообщение
Есть кнопка (Button1). Допустим ...
Насколько я понял:
Код:

type
  {$METHODINFO ON}
  TForm3 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
  {$METHODINFO OFF}

var
  Form3: TForm3;

implementation

{$R *.dfm}

uses ObjAuto;

function GetMethodName(F:TObject; code:pointer):String; forward;

procedure TForm3.Button1Click(Sender: TObject);
begin
//
end;

// ЛКМ
procedure TForm3.Button2Click(Sender: TObject);
begin
   label1.Caption := GetMethodName(Form3, @Button1.OnClick);
end;

function GetMethodName(F:TObject; code:Pointer):String;
var VMT: Pointer;
    MethodInfo: Pointer;
    count : integer;
    P:PMethodInfoHeader;
begin
   result := '';
   VMT := PPointer(F)^;
   while true do begin
      MethodInfo := PPointer(Integer(VMT) + vmtMethodTable)^;
      if MethodInfo <> nil then begin
         Count := PWord(MethodInfo)^;
         Inc(Integer(MethodInfo), 2);
         while Count > 0 do begin
            P := MethodInfo;
            if P.Addr = code then begin
               result := P^.Name;
               exit;
            end;
            Inc(Integer(MethodInfo), PMethodInfoHeader(MethodInfo)^.Len);
            Dec(Count);
         end;
     end;
     // Find the parent VMT
     VMT := PPointer(Integer(VMT) + vmtParent)^;
     if VMT = nil then begin
        Result := '';
        Exit;
     end;
     VMT := PPointer(VMT)^;
   end;
end;
А не. Это только для обработчиков, описанных в этом же классе, то есть не совсем то.

Последний раз редактировалось alexBlack; 07.09.2012 в 19:09.
alexBlack вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как run-time создать от руки компонент? SovereignSun Общие вопросы Delphi 12 23.11.2011 16:30
Создание run-time TLabel как в Delphi? SovereignSun Общие вопросы Delphi 0 22.11.2011 16:30
Как создать TPageControl в run-time tonatas Общие вопросы Delphi 4 13.08.2010 22:57
обработчик события onClose для формы созданной в Run-Time tonatas Общие вопросы Delphi 3 13.08.2010 21:46
Как отловить события которое вызывается при розворачивании подменющек (PopupMenu) DarkEvil Общие вопросы Delphi 9 09.05.2009 18:17