Я управляю собственным личным социальным сайтом для 100+ пользователей. Python был просто фантастическим для создания и запуска этого.
- тебе было веселее с питоном?
Наиболее определенно.
- Вы так же продуктивны, как и при использовании PHP?
В основном, да. Стиль кодирования Python, по крайней мере для меня, намного быстрее и проще. Но иногда Python не хватает включенных библиотек и документации поверх PHP. (Но PHP кажется непревзойденным в этом отношении). Также требуется немного больше, чтобы работать под Apache.
- что заставило вас перейти на python?
Проще управлять кодом и быстрее разрабатывать (хорошая IDE помогает, я использую WingIDE для python), а также совершенствования своих навыков в Python, когда я переключаюсь на не-сетевые проекты.
- Не могли бы вы сделать проект снова на PHP? Если так, то почему?
Возможно, если бы я работал над крупным профессиональным проектом. PHP настолько вездесущ в Интернете. Компании было бы намного легче найти заменяющего программиста PHP.
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;
Есть два способа сравнить указатели методов. Указатели методов состоят из двух указателей, указателя кода и указателя объекта. Собственный способ сравнения указателей методов в Delphi сравнивает только указатели кода, и это выглядит так:
if @EditorWindowMethod = @TEditForm.GetFrameWindow then
EditorWindowMethod := nil;
Он проверяет, соответствует ли указатель кода в переменной EditorWindowMethod
начальному адресу метода GetFrameWindow
в TEditForm
. Он не проверяет, совпадает ли ссылка на объект в EditorWindowMethod
с Self
. Если вы хотите, чтобы ссылки на объекты были такими же, то вам нужно разделить указатель метода на составные части с помощью записи TMethod
, что демонстрирует ответ Мги . (И вы, вероятно, действительно захотите сравнить ссылки на объекты, поскольку похоже, что у вас несколько форм редактирования. Все они имеют одинаковый указатель кода GetFrameWindow
, но имеют разные ссылки на объекты. )
Причина @
в коде состоит в том, чтобы сообщить компилятору, что вы хотите ссылаться на указатели методов. Без него компилятор попытается вызвать указатели методов, и это доставит вам неприятности. В первый раз, когда окно было деактивировано, вы вызвали EditorWindowMethod
и сравнили полученный дескриптор окна с возвращаемым значением из , вызвавшего GetFrameWindow
. Они, конечно же, совпадают, поэтому вы не назначили EditorWindowMethod
. В следующий раз, когда форма была деактивирована, вы снова попытались вызвать EditorWindowMethod
, но это был пустой указатель.
Вам следует подумать о том, чтобы избавиться от зависимости от уведомлений об активации и деактивации. Вместо,