Сравнение указателя на значение функции в Delphi

Я управляю собственным личным социальным сайтом для 100+ пользователей. Python был просто фантастическим для создания и запуска этого.

  1. тебе было веселее с питоном?

Наиболее определенно.

  1. Вы так же продуктивны, как и при использовании PHP?

В основном, да. Стиль кодирования Python, по крайней мере для меня, намного быстрее и проще. Но иногда Python не хватает включенных библиотек и документации поверх PHP. (Но PHP кажется непревзойденным в этом отношении). Также требуется немного больше, чтобы работать под Apache.

  1. что заставило вас перейти на python?

Проще управлять кодом и быстрее разрабатывать (хорошая IDE помогает, я использую WingIDE для python), а также совершенствования своих навыков в Python, когда я переключаюсь на не-сетевые проекты.

  1. Не могли бы вы сделать проект снова на PHP? Если так, то почему?

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

5
задан mj2008 22 June 2009 в 10:45
поделиться

2 ответа

procedure TEditForm.FormDeactivate(Sender: TObject);
begin
  if Assigned(EditorFrameWindow) and (EditorFrameWindow = GetFrameWindow) then
    EditorFrameWindow := nil;
end;

сработает случайно?

Изменить:

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

Чтобы действительно проверить, установлена ​​ли переменная для определенного обработчика событий, вам нужно будет сравнить оба элемента в записи TMethod . Что-то вроде:

procedure TEditForm.FormDeactivate(Sender: TObject);
begin
  if (TMethod(EditorFrameWindow).Code = @TForm1.GetFrameWindow)
    and (TMethod(EditorFrameWindow).Data = Self)
  then
    EditorFrameWindow := nil;
end;
14
ответ дан 18 December 2019 в 06:51
поделиться

Есть два способа сравнить указатели методов. Указатели методов состоят из двух указателей, указателя кода и указателя объекта. Собственный способ сравнения указателей методов в Delphi сравнивает только указатели кода, и это выглядит так:

if @EditorWindowMethod = @TEditForm.GetFrameWindow then
  EditorWindowMethod := nil;

Он проверяет, соответствует ли указатель кода в переменной EditorWindowMethod начальному адресу метода GetFrameWindow в TEditForm . Он не проверяет, совпадает ли ссылка на объект в EditorWindowMethod с Self . Если вы хотите, чтобы ссылки на объекты были такими же, то вам нужно разделить указатель метода на составные части с помощью записи TMethod , что демонстрирует ответ Мги . (И вы, вероятно, действительно захотите сравнить ссылки на объекты, поскольку похоже, что у вас несколько форм редактирования. Все они имеют одинаковый указатель кода GetFrameWindow , но имеют разные ссылки на объекты. )

Причина @ в коде состоит в том, чтобы сообщить компилятору, что вы хотите ссылаться на указатели методов. Без него компилятор попытается вызвать указатели методов, и это доставит вам неприятности. В первый раз, когда окно было деактивировано, вы вызвали EditorWindowMethod и сравнили полученный дескриптор окна с возвращаемым значением из , вызвавшего GetFrameWindow . Они, конечно же, совпадают, поэтому вы не назначили EditorWindowMethod . В следующий раз, когда форма была деактивирована, вы снова попытались вызвать EditorWindowMethod , но это был пустой указатель.

Вам следует подумать о том, чтобы избавиться от зависимости от уведомлений об активации и деактивации. Вместо,

9
ответ дан 18 December 2019 в 06:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: