Вверх ↑
Этот топик читают: Гость
Ответов: 1926
Рейтинг: 172
#1: 2010-07-26 07:33:42 ЛС | профиль | цитата
Подскажите, почему не работает?

code_19691.txt
карма: 9
0
файлы: 1code_19691.txt [1.7KB] [245]
Разработчик
Ответов: 26151
Рейтинг: 2127
#2: 2010-07-26 09:00:01 ЛС | профиль | цитата
Вообще-то, функции обратного вызова надо объявлять так, и не полем класса, а отдельной функцией после implementation



function CopyProgressRoutine(TotalFileSize, TotalBytesTransferred,
StreamSize, StreamBytesTransferred: LongInt;
dwStreamNumber, dwCallbackReason: DWORD;
hSourceFile, hDestinationFile: THandle;
lpData: Pointer): DWORD; stdcall;
begin
Result := PROGRESS_CONTINUE;
end;
карма: 22

1
Голосовали:3042
Ответов: 1926
Рейтинг: 172
#3: 2010-07-26 09:52:08 ЛС | профиль | цитата
nesco, только я не помнимаю, почему
lpData: Pointer): DWORD; stdcall
, в справке WinAPI написано:
function CopyFileEx(lpExistingFileName, lpNewFileName: PChar; lpProgressRoutine: TFNProgressRoutine; lpData: Pointer; pbCancel: PBool; dwCopyFlags: DWORD): BOOL;

------------ Дoбавленo в 09.52:
Поэтому я и ставил
lpData: Pointer): TFNProgressRoutine; stdcall
. А компилятор мне:
Incompatible types: 'Integer' and 'Pointer'

карма: 9
0
Разработчик
Ответов: 4698
Рейтинг: 426
#4: 2010-07-26 10:09:05 ЛС | профиль | цитата
Попробуй вставить это: Result := rs;
А вот это: Result := @rs; Не верно, это извлекает ссылку на переменную, а не ее саму, тем более, что TFNProgressRoutine, обычно это значит, что тип не ссылочный
------------ Дoбавленo в 10.09:
Мне думается, что TFNProgressRoutine - это перечисление, которое можно обозначить как DWORD, что и сделал nesco
Пример перечисления:
#pas
TEnum = (one_val, two_val, three_val); //one_val = 0, two_val = one_val + 1, three_val = two_val + 1
карма: 10
0
Разработчик
Ответов: 26151
Рейтинг: 2127
#5: 2010-07-26 10:12:13 ЛС | профиль | цитата
3042 писал(а):
в справке WinAPI написано

Тут я не знаю, что там точно стоит, пробовать надо, я тебе пример привел, как правильно делается функция обратного вызова, а что там должно стоять, надо искать или пробовать. Не забудь, что в таком обявлении отсутствует указатель класса THiAsmClass и его надо передавать в CallBack-функцию через параметр lpData, если тебе надо выдавать текущее состояние прогресса через событие класса _hi_onEvent
------------ Дoбавленo в 10.12:
Assasin писал(а):
Мне думается, что TFNProgressRoutine

Вообще-то нет, в Windows оно прописано так


  TFarProc = Pointer;
//...
TFNProgressRoutine = TFarProc;

те, это -- Pointer
карма: 22

0
Разработчик
Ответов: 4698
Рейтинг: 426
#6: 2010-07-26 10:14:10 ЛС | профиль | цитата
nesco писал(а):
Вообще-то нет. в Windows оно апрписано так

Хм, тогда как-то странно, обычно юниты WinAPI используют именно перечисления, ну тогда я просто не знаю, надо видеть реализацию функции копирования, а это невозможно
карма: 10
0
Ответов: 1926
Рейтинг: 172
#7: 2010-07-26 10:18:47 ЛС | профиль | цитата
code_19692.txt

Вот так прога просто виснет. А ведь должна, по идее, прерывать копирование сразу после первого вызова CopyProgressRoutine.
карма: 9
0
файлы: 1code_19692.txt [1.7KB] [225]
Разработчик
Ответов: 4698
Рейтинг: 426
#8: 2010-07-26 10:35:36 ЛС | профиль | цитата
Этот вариант, конечно, намного хуже, и иногда виснет, но работает и управлять им проще: code_19693.txt
карма: 10
0
файлы: 1code_19693.txt [2.2KB] [143]
Разработчик
Ответов: 26151
Рейтинг: 2127
#9: 2010-07-26 10:57:41 ЛС | профиль | цитата
3042, вот так работает, только подвисает немного в конце

code_19695.txt
карма: 22

0
файлы: 1code_19695.txt [1KB] [204]
9
Сообщение
...
Прикрепленные файлы
(файлы не залиты)