Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 3 265

/ вопрос открыт /

Доброго времени суток, уважаемые эксперты!
Из функции возвращается string-овое значение команды для перехода на назначенный frame. Если эту команду прописать прямо в процедуре, то переход проиходит бех проблем. Но так как возвращается строка, как можно перейти по ней?
Пример.
Если написать, к примеру, DiskClass.HistoryFrameShow; то происходит переход на фрейм HistoryFrame, т.е он показывается (visible)
Но нужно получить фрейм динамически и можно получить через navigationClass.getLastPageFromFile, но возвращается 'DiskClass.HistoryFrameShow;' - строка... С которой неизвестно, что можно сделать, чтобы по ней перейти.

mikolabel Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: mikolabel (статус: Посетитель)
Вопрос отправлен: 9 октября 2009, 04:44
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: min@y™

Допустми, что твой объект DiskClass - это экземпляр класса TDiskClass. Так как все классы - это наследники TObject, то для поиска точки входа в метод с именем 'HistoryFrameShow' воспользуйся методом

class function MethodAddress(const Name: ShortString): Pointer;


Description

MethodAddress is used internally by the streaming system. When an event property is read from a stream, MethodAddress converts a method name, specified by Name, to a pointer containing the method address. There should be no need to call MethodAddress directly.

If Name does not specify a published method for the object, MethodAddress returns nil (Delphi) or NULL (C++).


Я никогда такими вещами не пользовался, поэтому пришлось написать пример, чтобы проверить, как это работает:

program p3265;
 
{$APPTYPE CONSOLE}
 
uses
  SysUtils, Classes;
 
type
  TMyObject = class
  published // <--- обязательно !
    procedure MyMethod(const Value: Integer);
  end;
 
  TMyMethod = procedure (const Value: Integer);
 
var
  MO: TMyObject;
  Method: TMyMethod;
 
{ TMyObject }
 
procedure TMyObject.MyMethod(const Value: Integer);
begin
  WriteLn(' Method found! Value = ', Value);
end;
 
begin
  Randomize();
  MO:= TMyObject.Create();
  try
    Method:= MO.MethodAddress('MyMethod');
    if Assigned(Method)
      then Method(Random(100))
      else WriteLn(' Method not found :(((');
  finally
    MO.Free();
  end;
 
  ReadLn;
end.

Надеюсь, я правильно понял вопрос.

Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 9 октября 2009, 08:48


Мини-форум вопроса

Мини-форум пуст.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:34
Выполнено за 0.03 сек.