Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.02.11;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.039 c
15-1168961336
isasa
2007-01-16 18:28
2007.02.11
Беспроводная сеть в офисе(обычные 100 Мбит/с).


3-1163846329
PEAKTOP
2006-11-18 13:38
2007.02.11
Создание внешнего ключа - глюк ?


4-1158081492
vidiv
2006-09-12 21:18
2007.02.11
Копирование выделенного текста с Активного окна.


15-1169415457
Kerk
2007-01-22 00:37
2007.02.11
Skype пытается отобрать домен skype.tv за $75


3-1163760861
s_t_d
2006-11-17 13:54
2007.02.11
Можно ли исп. экспоненту и логарифм в языке ХП FB 1.5





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский