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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.09.2010, 00:08   #1
godlsd
Пользователь
 
Регистрация: 05.03.2010
Сообщений: 16
По умолчанию Обнуление THandle

Нашел в интернете такой вариант:

Код:
var
  GForm: TGForm;
  ShowConnectionForm: function():Boolean;
  hConnectionLib: THandle;

....

procedure TGForm.FormShow(Sender: TObject);
begin
  @hConnectionLib:=nil;
end;
Но в ответ компилятор выдаёт это:
[Error] main.pas(34): Left side cannot be assigned to


Ещё попался такой вариант:
FreeAndNil(hConnectionLib);
Второй вариант работает, но меня интересует почему не работает первый???
Ведь примеры в интернете не из головы пишут...

Вот отрывок этого примера:
Код:
Пример 2. Динамическая загрузка DLL
{... Здесь идет заголовок файла и определение формы TForm1 и ее экземпляра Form1}

var
      Form1: TForm1;
      GetSimpleText: function(LangRus: Boolean): PChar;
      LibHandle: THandle;

procedure Button1Click(Sender: TObject);
begin
  {"Чистим" адрес функции от "грязи"}
  @GetSimpleText := nil;
  {Пытаемся загрузить библиотеку}
  LibHandle := LoadLibrary('MYDLL.DLL');
  {Если все OK}
  if LibHandle >= 32 then begin
    {...то пытаемся получить адрес функции в библиотеке}
    @GetSimpleText := GetProcAddress(LibHandle,'GetSimpleText');
    {Если и здесь все OK}
    if @GetSimpleText <> nil then
      {...то вызываем эту функцию и показываем результат}
      ShowMessage(StrPas(GetSimpleText(True)));
  end;
  {И не забываем освободить память и выгрузить DLL}
  FreeLibrary(LibHandle);
end;
Если разрешите, могу кинуть ссылку, где я это взял.
godlsd вне форума Ответить с цитированием
Старый 02.09.2010, 00:24   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

hConnectionLib=0

трудно посмотреть что есть THandle?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 02.09.2010, 00:30   #3
godlsd
Пользователь
 
Регистрация: 05.03.2010
Сообщений: 16
По умолчанию

Код:
  hConnectionLib: THandle;

implementation

{$R *.dfm}

procedure TGForm.FormShow(Sender: TObject);
begin
  @hConnectionLib:=0;
В итоге:
[Error] main.pas(34): Left side cannot be assigned to

А на счёт THandle:
THandle = LongWord
godlsd вне форума Ответить с цитированием
Старый 02.09.2010, 00:33   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

я где то написал @?
посмотрите внимательно что я написал, нечего придумывать.

вы хоть знаете что такое @?

Цитата:
THandle = LongWord
ну и как итог, какая разница?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 02.09.2010, 00:41   #5
godlsd
Пользователь
 
Регистрация: 05.03.2010
Сообщений: 16
По умолчанию

Не сердитесь на меня, только начал изучать Delphi, всё время писал на C++, прошу прощения за невнимательность, спасибо за подсказку.
godlsd вне форума Ответить с цитированием
Старый 02.09.2010, 00:43   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

на будущее, @ это взятие адреса переменной, его вы изменить не можете(разве что через указатель, но присвоить ему нельзя, исключение в динамических функциях(точнее переменные типа функция), но там она не обязательна)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 02.09.2010, 01:37   #7
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
Сообщение от godlsd Посмотреть сообщение
Ведь примеры в интернете не из головы пишут...
Наивный

Цитата:
Сообщение от godlsd Посмотреть сообщение
Не сердитесь на меня, только начал изучать Delphi, всё время писал на C++
Ну а в C++ вы как hConnectionLib (он же - LibHandle во втором примере) обнуляли?

Небось так?

Код:
hConnectionLib = NULL;
Или так?

Код:
hConnectionLib = 0;
В Delphi аналогично:

Код:
hConnectionLib := 0;
С nil (аналогом NULL) не пройдёт, потому что THandle описан в Delphi как число, а не указатель, как в C++.

P.S. И, конечно же, как я мог забыть про хит сезона:
Код:
PInteger(@hConnectionLib)^ := 0;
Расшифровка этого выражения остаётся вам домашним заданием - это хорошая тренировка. А вот и статейка подходящая.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.

Последний раз редактировалось GunSmoker; 02.09.2010 в 01:47.
GunSmoker вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обнуление катриджа. Xeon332 Компьютерное железо 2 11.05.2009 07:37
обнуление счетчика в бд Tanuska___:) БД в Delphi 2 22.01.2009 23:10
Обнуление переменной [MI_nor] Общие вопросы C/C++ 3 05.11.2008 18:01
что за тип THandle shurik_7866 Win Api 7 10.08.2007 18:17