Текущий архив: 2007.02.11;
Скачать: CL | DM;
ВнизInvalid pointer operation Найти похожие ветки
← →
Garacio © (2007-01-22 22:43) [0]Прочитав статью про файловые операции средствами, я решил использовать описанный там код для копирования файлов:
procedure TForm4.ButtonCopyClick(Sender: TObject);
var Dir1, Dir2: string;
begin
DirCopy := ExcludeTrailingPathDelimiter(DirCopy);
if RadioGroup1.ItemIndex = -1 then
begin
Exit;
end;
Form4.Hide;
if RadioGroup1.ItemIndex = 0 then
begin
if Copy(Dir1, Length(Dir1) - 2, 3) = "LOG"
then begin
CopyFiles( Handle, [ Dir1 ], DirCopy, False, False ); //ошибка!!!
end
else begin
ShowMessage("Выберите папку LOG!");
Form4.Show;
Exit;
end;
end;
if RadioGroup1.ItemIndex = 1 then
begin
Dir2 := DirCopy +"\Tools";
CopyFiles( Handle, [ Dir1 ], Dir2, False, False );
end;
if RadioGroup1.ItemIndex = 2 then
begin
Dir2 := DirCopy +"\Tools";
CopyFiles( Handle, [ Dir3 ], Dir2, False, False );
end;
Form4.Show;
end;
RadioGroup1 я использую для выбора каталога-назначения. При ItemIndex = -1, 1, 2 всё работает как часы, но при ItemIndex = 0 появляется ошибка "Invalid pointer operation."
Помогите разобраться!
← →
Eraser © (2007-01-22 22:49) [1]> CopyFiles( Handle, [ Dir1 ], DirCopy, False, False ); //ошибка!
> !!
странная конструкция )
неужели скомпилилось?
← →
Garacio © (2007-01-22 23:01) [2]Да! И, как я сказал, работает по большей части!
← →
Loginov Dmitry © (2007-01-23 07:50) [3]Как объявлено DirCopy? Есть ли для этой переменной присвоение константы, типа
DirCopy := "C:\Windows\System32";
Если да, то после DirCopy := ExcludeTrailingPathDelimiter(DirCopy); попробуй сделать
UniqueString(DirCopy);
← →
Ksan © (2007-01-23 10:08) [4]IncludeTrailingPathDelimiter(DirCopy); на сколько я помню ... а вообще по хорошему добавь проверку на существование папки куда копируешь файл
← →
Garacio © (2007-01-23 11:23) [5]добавь проверку на существование папки
- имеется такая!
За время мего отсутствия на форуме, я поискал похожие случаи на других сайтах, советы- как это исправить. В результате я исправил появление ошибок "Invalid pointer operation" редактированиемfunction CreateBuffer
.
Теперь: :-)
При ItemIndex = -1, 1, 2 всё работает как часы, но при ItemIndex = 0, после успешного копирования, значок формы появляется в панели задач и не разворачивается! Помогает только Alt+F4. Иногда такое "зависание в панели" происходит после первого копирования, иногда после второго.
P.S. Код я использовал из широко растиражированной статьи "Файловые операции средствами ShellAPI."
← →
Elen © (2007-01-23 11:37) [6]
> Garacio
А при ошибке чему равен DirCopy?
> Eraser © (22.01.07 22:49) [1]
>
> > CopyFiles( Handle, [ Dir1 ], DirCopy, False, False );
> //ошибка!
> > !!
>
> странная конструкция )
> неужели скомпилилось?
Почему нет - похоже там в параметрах массив
← →
Garacio © (2007-01-23 11:42) [7]C:\Temp\LOG
[ ] - я убрал;
Меня больше всего беспокоит, что отсутствует закономерность происходящего (то с первого раза виснет то нет)
← →
Elen © (2007-01-23 11:44) [8]
> [ ] - я убрал;
И тоже скомпилилось? Что за CopyFiles? Где выдрал?
← →
Garacio © (2007-01-23 11:45) [9]Извиняюсь, это Dir1 !
DirCopy - всегда одно и то-же: D:\Soft\New\
← →
Garacio © (2007-01-23 11:49) [10]Код я использовал из широко растиражированной статьи "Файловые операции средствами ShellAPI."
← →
Garacio © (2007-01-23 11:52) [11]Т.е. сейчас вопрос сводится к тому - почему после Form4.Show форма появляется в панели задач и не разворачивается?
В результате чего это может быть?
И как отследить теперь ошибку, если сообщений об ошибке нет?
← →
Elen © (2007-01-23 11:54) [12]
> Код я использовал из широко растиражированной статьи "Файловые
> операции средствами ShellAPI."
Мона ссылочку, ато искать ленька.
> Т.е. сейчас вопрос сводится к тому - почему после Form4.
> Show форма появляется в панели задач и не разворачивается?
>
А чего ты при креации или при показе прописал?
← →
Garacio © (2007-01-23 12:02) [13]http://www.delphikingdom.com/asp/viewitem.asp?catalogid=91
+ там-же комментарии
И затем загляни http://prog-gate.pp.ru/fido7.ru.delphi/12930.html
← →
Garacio © (2007-01-23 12:05) [14]
> А чего ты при креации или при показе прописал?
При показе - ничего,
При креации - чтение из ini
← →
TRUNK © (2007-01-23 12:05) [15]
> Garacio © [11]
> форма появляется в панели задач
Вообще-то в панели задач появляется не окно формы,
а окно приложения (если его можно назвать окном).
← →
ЮЮ © (2007-01-23 12:06) [16]
> При ItemIndex = -1, 1, 2 всё работает как часы,
Т.к. Dir1 = Dir3 = "", то при ItemIndex = 1, 2 выполняется ожно и то же
При ItemIndex = 0 должно быть только ShowMessage("Выберите папку LOG!"), но никак не "после успешного копирования, значок формы появляется в панели задач и не разворачивается!"
Так что ставь бряк в реальном кде и пройди пошагово. Искать же ошибку в другом коде, глядя на приседенный, невозможно. Тем более, если она и есть, то скорее в CopyFiles, чем TForm4.ButtonCopyClick.
З.Ы. Неужели в широко растиражированных статьях так нелепо пишут, как в TForm4.ButtonCopyClick?
← →
Игорь Шевченко © (2007-01-23 12:08) [17]
> но при ItemIndex = 0 появляется ошибка "Invalid pointer
> operation."
> var Dir1, Dir2: string;
> begin
> DirCopy := ExcludeTrailingPathDelimiter(DirCopy);
> if RadioGroup1.ItemIndex = -1 then
> begin
> Exit;
> end;
> Form4.Hide;
> if RadioGroup1.ItemIndex = 0 then
> begin
> if Copy(Dir1, Length(Dir1) - 2, 3) = "LOG"
> then begin
> CopyFiles( Handle, [ Dir1 ], DirCopy, False, False );
> //ошибка!!!
> end
> else begin
> ShowMessage("Выберите папку LOG!");
> Form4.Show;
> Exit;
> end;
> end;
И чему равен Dir1 перед Copy ?
← →
Garacio © (2007-01-23 12:14) [18]
> Игорь Шевченко © (23.01.07 12:08) [17]
> var Dir2: string;
Dir1 я убрал из var
> C:\Temp\LOG
И проблема ни в этих мелочах, я их уже давно все исправил, переисправил!
> Garacio © (23.01.07 11:52) [11]
> Т.е. сейчас вопрос сводится к тому - почему после Form4.
> Show форма появляется в панели задач и не разворачивается?
>
> В результате чего это может быть?
> И как отследить теперь ошибку, если сообщений об ошибке
> нет?
← →
clickmaker © (2007-01-23 12:15) [19]
> почему после Form4.
> Show форма появляется в панели задач и не разворачивается?
SetForegroundWindow(Form4.Handle)
← →
Garacio © (2007-01-23 12:17) [20]Попробую!
← →
Garacio © (2007-01-23 12:22) [21]
> SetForegroundWindow(Form4.Handle)
Не помогло! Более того, я заметил, что если сразу Alt+F4 не нажимать, то спустя некоторое время приложение вообще подвисает!
← →
Elen © (2007-01-23 12:23) [22]
> Garacio
Что-то явно тормозит при креации. Весь код большой?
← →
clickmaker © (2007-01-23 12:35) [23]
> [21] Garacio © (23.01.07 12:22)
обработчика OnShow нету случаем?
а вообще-то лучше отладчиком пройтись по этому месту
← →
Garacio © (2007-01-23 13:10) [24]Кажется я понял! Такая ерунда происходит, когда я копирую маленькие файлы! Как только я добавляю в копируемую папку большой файл... всё копируется без "глюков"!
Как изменить код, чтобы такого не было? Sleep, чтоли поместить, но куда? Видимо программа "не успевает сообразить", когда копируемые объекты маленькие!function CopyFiles(Handle:Hwnd;Src:array of
string;Dest:string;Move:Boolean;AutoRename:Boolean):Integer;
var
SHFileOpStruct:TSHFileOpStruct;
SrcBuf:PBuffer;
begin
CreateBuffer(Src,SrcBuf);
with SHFileOpStruct do
begin
Wnd:=Handle;
wFunc:=FO_COPY;
if Move then wFunc:=FO_MOVE;
pFrom:=Pointer(SrcBuf);
pTo:=PChar(Dest);
fFlags:=0;
if AutoRename then fFlags:=FOF_RENAMEONCOLLISION;
fAnyOperationsAborted:=False;
hNameMappings:=nil;
lpszProgressTitle:=nil;
end;
Result:=SHFileOperation(SHFileOpStruct);
FreeMem(SrcBuf);
end;
← →
Elen © (2007-01-23 13:13) [25]
> Такая ерунда происходит, когда я копирую маленькие файлы!
> Как только я добавляю в копируемую папку большой файл..
> . всё копируется без "глюков"!
Странно. Что-то я сомневаюсь в правильности этих выводов...
← →
clickmaker © (2007-01-23 13:15) [26]
> программа "не успевает сообразить",
чего она не успевает сообразить?
← →
Garacio © (2007-01-23 13:18) [27]
> Странно. Что-то я сомневаюсь в правильности этих выводов...
Доказанно многочисленными экспериментами! ;-)
Как написать защиту для копирования "маленьких" файлов?
← →
clickmaker © (2007-01-23 13:28) [28]
> [27] Garacio © (23.01.07 13:18)
какую защиту? от чего?
← →
Elen © (2007-01-23 13:32) [29]
> Доказанно многочисленными экспериментами! ;-)
Код большой? Влезет в студию?
← →
Garacio © (2007-01-23 13:36) [30]Уже влез, см.[24]
← →
Elen © (2007-01-23 13:41) [31]
> Garacio
Здесь глюков быть не должно. Пройдись дебаггером по этому коду при копировании маленьких файлов и посмотри где будет застрявать на
CreateBuffer(Src,SrcBuf); или на Result:=SHFileOperation(SHFileOpStruct);
← →
clickmaker © (2007-01-23 13:53) [32]
> [30] Garacio © (23.01.07 13:36)
что, кстати, в CreateBuffer?
← →
Elen © (2007-01-23 14:00) [33]
> что, кстати, в CreateBuffer?
см. [13]
← →
Игорь Шевченко © (2007-01-23 14:18) [34]Garacio © (23.01.07 12:14) [18]
> Dir1 я убрал из var
То есть, у тебя не работает один код а ты сюда постишь другой ?
Удачи тебе. Ищи где светлее.
← →
Anatoly Podgoretsky © (2007-01-23 21:41) [35]> clickmaker (23.01.2007 13:28:28) [28]
> какую защиту? от чего?
От автора конечно.
← →
Garacio © (2007-01-24 08:53) [36]После того, как я дописал после CopyFiles строку: Sleep(1000), зависания в панели прекратились. Видимо, действительно, не хватало времени! Но мне кажется sleep - не совсем удачный выход: для моего компьютера достаточно 1 секунды, а что будет на более быстром?
Можно заменить sleep на Application.ProcessMessages? или на что-то подобное, чтобы не гадать – сколько времени необходимо для конкретного компьютера?
← →
Elen © (2007-01-24 09:22) [37]
> Видимо, действительно, не хватало времени!
Для какой процедуры?
← →
Garacio © (2007-01-24 09:49) [38]Я так понимаю для Form4.Show после CopyFiles
← →
Elen © (2007-01-24 09:57) [39]
> Я так понимаю для Form4.Show после CopyFiles
А что там такого в Шоу этой формы прописано, что может так действовать?
Мой тебе совет - пройдись дебуггером.
← →
TRUNK © (2007-01-24 10:29) [40]
> Garacio © (23.01.07 13:10) [24]
> Кажется я понял! Такая ерунда происходит, когда я копирую
> маленькие файлы
Я кажется знаю, в чём причина подвисания программы. Судя по всему
используемая функция копирования создаёт дополнительный поток
для копирования и тут же возвращает управление, не дожидаясь
завершения копирования, после этого происходит то же самое со
следующим файлом и так далее. В результате быстро возрастает
количество потоков в программе из-за чего она и виснет.
Справедливость моих рассуждений можно проверить открыв в
Delphi окно Threads и посмотреть сколько потоков образуется
при копировании.
Страницы: 1 2 вся ветка
Текущий архив: 2007.02.11;
Скачать: CL | DM;
Память: 0.55 MB
Время: 0.066 c