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

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

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

Delphi.int.ru Expert

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

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

#   

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


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

Подробнее »



Вопрос # 3 032

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

Приветствую, уважаемые эксперты!

Не могу понять почему компилятор Delphi 2009 нехочет воспринимать код.
Есть объекты:

TCurlBase = class ( TComponent )
TCurl = class ( TCurlBase )
TCurlMulti = class ( TCurlBase )

В их конструкторах используется процедура FAIL, использование которой вызывает ошибку компилятора:
Error: E2078 Procedure FAIL only allowed in object constructor

constructor tCurl.Create(aOwner:tComponent);
begin
inherited Create(aOwner);
fCurl:=curl_easy_init;
if ( fCurl = nil ) then begin
fCurlResult:=CURLE_FAILED_INIT;
Self.Destroy;
Self:=nil;
FAIL; /* ошибка здесь */
end else fCurlResult:=CURLE_OK;
...
end;

constructor tCurlMulti.Create(aOwner:tComponent);
begin
inherited Create(aOwner);
fMultiHandle:=curl_multi_init();
if ( fMultiHandle = nil ) then FAIL; /* ошибка здесь */
...
end;

В прикрепленном архиве находится исходный текст модуля + примеры работы.

Подскажите в чем проблема?

К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)

Лёга Е.Н. Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Лёга Е.Н. (статус: Посетитель)
Вопрос отправлен: 23 июля 2009, 20:18
Состояние вопроса: открыт, ответов: 0.


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

Всего сообщений: 5; последнее сообщение — 23 июля 2009, 23:39; участников в обсуждении: 4.
Егор

Егор (статус: 10-ый класс), 23 июля 2009, 21:22 [#1]:

не понял

constructor tCurl.Create(aOwner:tComponent);
begin
...
Self.Destroy;
Self:=nil;
FAIL; /* ошибка здесь */
...
end

это вы мало того, что в конструкторе ещё и деструктор вызываете, а затем Nil указателю присваиваете (и на это компилятор не ругается?), так ещё и потом, после того, как объект удалили - вызываете метод этого, уже удалённого объекта?!
хм... оригинально...
:)
или я чего-то не понял?
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
Death_Master

Death_Master (статус: Посетитель), 23 июля 2009, 21:24 [#2]:

Если вопрос почему не работает компонент- могу ответить что его писали и тестировали под старыми версиями делфи...
Цитата с оффсайта:
CurlPas was developed and tested on the following systems:

* FreePascal-2.0 for Linux-i386 on SuSE-9.2.
* Kylix-3.0 Open Edition on SuSE-9.2.
* FreePascal-2.0 for MS-Windows on Win98.
* Delphi-6.0 Personal Edition on Win98.

In addition, the CurlPas components are also compatible with the Lazarus LCL.

Тоесть в делфи 2009 он работать и не должен...

Если есть желание- можно переписать под свежие версии....
На сайте curl есть API для си
Обычно захожу по ночам... (60-70%)
Если нужно что-то написать, то беру оборудованием, деньгими и пивом(при личной встрече)...
P.S. Помогаю и рассказываю бесплатно ^_^.....Nyaaa!
Лёга Е.Н.

Лёга Е.Н. (статус: Посетитель), 23 июля 2009, 22:06 [#3]:

В том-то и дело, что мне он нужен для 2009-й Дельфи.
Вадим К

Вадим К (статус: Академик), 23 июля 2009, 23:03 [#4]:

За такой код надо отрывать ручки и ножки. Он вообще не должен работать. А то, что он заработал, это просто повезло. Или используются недокументированные особенности компилятора.
В добавок код пестрит include'ами. такой стиль уже давно не приветствуется в делфи - слишком сложно удерживать такой код в компилируемом состоянии.

Специально пересмотрел код - в нем сколько есть идиотизмов - иначе не назовешь. Например
SetLength(Hdr, StrLen(@Hdr[1])); С логической точки зрения эта функция строка - фикция. Так как она устанавливает длину строки равную ей же самой. На самом деле используется тот факт, что делфовская строка может содержать символы #0 и они не будут её концом... и усекаем строку.
код вида
TmpStrm:=fopen( filename, 'w'#0 );
здесь вообще плакать нужно... код то вообще то рабочий. Но как!
Есть много участков кода, который не будет работать под 2009 делфи. (причина - юникод).

Мой вердикт - выбрость этот код и использовать например synapse.
Галочка "подтверждения прочтения" - вселенское зло.
Лёга Е.Н.

Лёга Е.Н. (статус: Посетитель), 23 июля 2009, 23:39 [#5]:

Под 2007-й Дельфи весь код откомпилился без ошибок, запустился и сделал все, что требовалось.
Спасибо всем за беспокойство!

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

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