purebasic.info

PureBasic forum
Текущее время: Ср апр 25, 2018 11:04 pm

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 39 ]  На страницу Пред.  1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения: Re: Удаление в Корзину
СообщениеДобавлено: Ср окт 09, 2013 5:07 pm 
Не в сети
PureBasic Coder
Аватар пользователя

Зарегистрирован: Чт ноя 10, 2011 10:50 am
Сообщений: 4049
Откуда: Ростов-на-Дону
Благодарил (а): 70 раз.
Поблагодарили: 80 раз.
Пункты репутации: 24
lakomet, спасибо! Теперь понял :)

Сейчас все в порядке?

_________________
Пурик - лучший язык программирования


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Удаление в Корзину
СообщениеДобавлено: Ср окт 09, 2013 5:20 pm 
Не в сети
доцент
Аватар пользователя

Зарегистрирован: Ср окт 09, 2013 5:00 pm
Сообщений: 51
Благодарил (а): 2 раз.
Поблагодарили: 1 раз.
Пункты репутации: 0
Неправильно.
Else
FreeMemory(*mem)
ProcedureReturn #False

Если у тебя не получилось выделить память, то какого фига ты ее освобождаешь?
Это не дескриптор, чтобы его затыкать.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Удаление в Корзину
СообщениеДобавлено: Ср окт 09, 2013 5:23 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1608
Откуда: Алматы
Благодарил (а): 13 раз.
Поблагодарили: 43 раз.
Пункты репутации: 5
нет, не прокси - 502 фигачит у меня тоже :) а фримемов чот действительно дофига :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Удаление в Корзину
СообщениеДобавлено: Ср окт 09, 2013 6:15 pm 
Не в сети
PureBasic Coder
Аватар пользователя

Зарегистрирован: Чт ноя 10, 2011 10:50 am
Сообщений: 4049
Откуда: Ростов-на-Дону
Благодарил (а): 70 раз.
Поблагодарили: 80 раз.
Пункты репутации: 24
Всё, зашёл нормально с компа, подумал :) Вроде как убрал все ошибки

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
Procedure DeleteToBin(FileName$,Confirm)
  Protected len, *mem, ok
  len = Len(FileName$)
  *mem = AllocateMemory(len + 2)
  If *mem
    If FileSize(FileName$) >= 0 ;Если это файл
      PokeS(*mem,FileName$)
    ElseIf FileSize(FileName$) = -2 ;Если это папка
      PokeS(*mem,FileName$)
      PokeB(*mem+len+1,0)
      PokeB(*mem+len+2,0)
    Else
      FreeMemory(*mem)
      ProcedureReturn #False
    EndIf
  Else
    ProcedureReturn #False
  EndIf
  SHFileOp.SHFILEOPSTRUCT
  SHFileOp\pFrom=*mem
  SHFileOp\wFunc=#FO_DELETE
  SHFileOp\fFlags=#FOF_ALLOWUNDO|#FOF_SILENT
  If Confirm = 0
    SHFileOp\fFlags = SHFileOp\fFlags|#FOF_NOCONFIRMATION
  EndIf
  FreeMemory(*mem)
  ok = SHFileOperation_(SHFileOp)
  If ok = 0
    ProcedureReturn #True
  Else
    ProcedureReturn #False
  EndIf
EndProcedure


_________________
Пурик - лучший язык программирования


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Удаление в Корзину
СообщениеДобавлено: Ср окт 09, 2013 6:26 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1608
Откуда: Алматы
Благодарил (а): 13 раз.
Поблагодарили: 43 раз.
Пункты репутации: 5
все равно как-то не так... разве после
Код:
1
2
3
    Else
      FreeMemory(*mem)
      ProcedureReturn #False


выполнение прерывается? я полагаю оно пойдет дальше и когда дойдет до второго FreeMemory(*mem) вылетит с ошибкой, так как мема уже какбы и нету - мыж его уже освободили...


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Удаление в Корзину
СообщениеДобавлено: Ср окт 09, 2013 6:35 pm 
Не в сети
доцент
Аватар пользователя

Зарегистрирован: Ср окт 09, 2013 5:00 pm
Сообщений: 51
Благодарил (а): 2 раз.
Поблагодарили: 1 раз.
Пункты репутации: 0
Сразу прерывается.

Вот это место какое-то корявое, ИМХО
If FileSize(FileName$) >= 0 ;Если это файл
PokeS(*mem,FileName$)
ElseIf FileSize(FileName$) = -2 ;Если это папка
PokeS(*mem,FileName$)
PokeB(*mem+len+1,0)
PokeB(*mem+len+2,0)
Else
FreeMemory(*mem)
ProcedureReturn #False
EndIf

Лучше через Select-case


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Удаление в Корзину
СообщениеДобавлено: Ср окт 09, 2013 6:50 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1608
Откуда: Алматы
Благодарил (а): 13 раз.
Поблагодарили: 43 раз.
Пункты репутации: 5
вот так не правильнее ли будет?
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
Procedure DeleteToBin(FileName$,Confirm)
  Protected len, *mem, ok, filesize
  len = Len(FileName$)
  *mem = AllocateMemory(len + 2)
  filesize = FileSize(FileName$) ; зачем каждый раз гонять FileSize()?
  If *mem
    If filesize <> -1
      If filesize = -2 ;Если это папка
        PokeS(*mem,FileName$)
        PokeB(*mem+len+1,0)
        PokeB(*mem+len+2,0)
      Else
        PokeS(*mem,FileName$)
      EndIf
   
      SHFileOp.SHFILEOPSTRUCT
      SHFileOp\pFrom=*mem
      SHFileOp\wFunc=#FO_DELETE
      SHFileOp\fFlags=#FOF_ALLOWUNDO|#FOF_SILENT
   
      If Confirm = 0
        SHFileOp\fFlags = SHFileOp\fFlags|#FOF_NOCONFIRMATION
      EndIf
 
      ok = SHFileOperation_(SHFileOp)
     
      If ok = 0
        ProcedureReturn #True
      Else
        ProcedureReturn #False
      EndIf
 
      FreeMemory(*mem)
     
    Else
      ProcedureReturn #False
    EndIf
   
  Else
    ProcedureReturn #False
  EndIf
 
EndProcedure



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Удаление в Корзину
СообщениеДобавлено: Ср окт 09, 2013 7:03 pm 
Не в сети
PureBasic Coder
Аватар пользователя

Зарегистрирован: Чт ноя 10, 2011 10:50 am
Сообщений: 4049
Откуда: Ростов-на-Дону
Благодарил (а): 70 раз.
Поблагодарили: 80 раз.
Пункты репутации: 24
SereZa писал(а):
выполнение прерывается? я полагаю оно пойдет дальше и когда дойдет до второго FreeMemory(*mem) вылетит с ошибкой, так как мема уже какбы и нету - мыж его уже освободили...
После ProcedureReturn процедура завершится

_________________
Пурик - лучший язык программирования


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Удаление в Корзину
СообщениеДобавлено: Ср окт 09, 2013 7:08 pm 
Не в сети
доцент
Аватар пользователя

Зарегистрирован: Ср окт 09, 2013 5:00 pm
Сообщений: 51
Благодарил (а): 2 раз.
Поблагодарили: 1 раз.
Пункты репутации: 0
Твой код очень хорош. Вот только это место
FreeMemory(*mem)
If ok = 0
ProcedureReturn #True
Else
ProcedureReturn #False
EndIf
вот так правильно. Вообще, всегда освобождать выделенную память,как только перестали ее использовать.


Последний раз редактировалось DarkAbyss Ср окт 09, 2013 7:10 pm, всего редактировалось 1 раз.

Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Удаление в Корзину
СообщениеДобавлено: Ср окт 09, 2013 7:10 pm 
Не в сети
PureBasic Coder
Аватар пользователя

Зарегистрирован: Чт ноя 10, 2011 10:50 am
Сообщений: 4049
Откуда: Ростов-на-Дону
Благодарил (а): 70 раз.
Поблагодарили: 80 раз.
Пункты репутации: 24
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
Procedure DeleteToBin(FileName$,Confirm)
  Protected len, *mem, ok
  len = Len(FileName$)
  *mem = AllocateMemory(len + 2)
  If *mem
    If FileSize(FileName$) >= 0 ;Если это файл
      PokeS(*mem,FileName$)
    ElseIf FileSize(FileName$) = -2 ;Если это папка
      PokeS(*mem,FileName$)
      PokeB(*mem+len+1,0)
      PokeB(*mem+len+2,0)
    Else
      FreeMemory(*mem)
      ProcedureReturn #False
    EndIf
  Else
    ProcedureReturn #False
  EndIf
  SHFileOp.SHFILEOPSTRUCT
  SHFileOp\pFrom=*mem
  SHFileOp\wFunc=#FO_DELETE
  SHFileOp\fFlags=#FOF_ALLOWUNDO|#FOF_SILENT
  If Confirm = 0
    SHFileOp\fFlags = SHFileOp\fFlags|#FOF_NOCONFIRMATION
  EndIf
  ok = SHFileOperation_(SHFileOp)
  FreeMemory(*mem)
  If ok = 0
    ProcedureReturn #True
  Else
    ProcedureReturn #False
  EndIf
EndProcedure


_________________
Пурик - лучший язык программирования


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Удаление в Корзину
СообщениеДобавлено: Ср окт 09, 2013 7:13 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1608
Откуда: Алматы
Благодарил (а): 13 раз.
Поблагодарили: 43 раз.
Пункты репутации: 5
Код:
1
2
3
    If FileSize(FileName$) >= 0 ;Если это файл
      PokeS(*mem,FileName$)
    ElseIf FileSize(FileName$) = -2


и все таки тут бы я поспорил :) я полагаю в этом коде произойдет дважды обращение к этому файлу? не проще ли все-таки обратиться один раз FileSize, а результат загнать в переменную и уже производить сравнения с этой переменной?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Удаление в Корзину
СообщениеДобавлено: Ср окт 09, 2013 7:18 pm 
Не в сети
PureBasic Coder
Аватар пользователя

Зарегистрирован: Чт ноя 10, 2011 10:50 am
Сообщений: 4049
Откуда: Ростов-на-Дону
Благодарил (а): 70 раз.
Поблагодарили: 80 раз.
Пункты репутации: 24
Вот оптимизаторы :D
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
Procedure DeleteToBin(FileName$,Confirm)
  Protected len, *mem, ok
  len = Len(FileName$)
  *mem = AllocateMemory(len + 2)
  If *mem
    Select FileSize(FileName$)
      Case -2 ;Если это папка
        PokeS(*mem,FileName$)
        PokeB(*mem+len+1,0)
        PokeB(*mem+len+2,0)
      Case -1 ;Файла и папки нет
        FreeMemory(*mem)
        ProcedureReturn #False
      Default ;Если это файл
        PokeS(*mem,FileName$)
    EndSelect
  Else
    ProcedureReturn #False
  EndIf
  SHFileOp.SHFILEOPSTRUCT
  SHFileOp\pFrom=*mem
  SHFileOp\wFunc=#FO_DELETE
  SHFileOp\fFlags=#FOF_ALLOWUNDO|#FOF_SILENT
  If Confirm = 0
    SHFileOp\fFlags = SHFileOp\fFlags|#FOF_NOCONFIRMATION
  EndIf
  ok = SHFileOperation_(SHFileOp)
  FreeMemory(*mem)
  If ok = 0
    ProcedureReturn #True
  Else
    ProcedureReturn #False
  EndIf
EndProcedure


_________________
Пурик - лучший язык программирования


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Удаление в Корзину
СообщениеДобавлено: Ср окт 09, 2013 7:31 pm 
Не в сети
доцент
Аватар пользователя

Зарегистрирован: Ср окт 09, 2013 5:00 pm
Сообщений: 51
Благодарил (а): 2 раз.
Поблагодарили: 1 раз.
Пункты репутации: 0
Издеваешься?
Код:
1
2
3
4
5
6
7
8
9
SHFileOp.SHFILEOPSTRUCT
  SHFileOp\pFrom=*mem
  SHFileOp\wFunc=#FO_DELETE
  SHFileOp\fFlags=#FOF_ALLOWUNDO|#FOF_SILENT
  If Confirm = 0
    SHFileOp\fFlags = SHFileOp\fFlags|#FOF_NOCONFIRMATION
  EndIf
  ok = SHFileOperation_(SHFileOp)
  FreeMemory(*mem)



Если даже конфирм будет тру, ты все равно передаешь в структуру флаг #FOF_SILENT
Юзер не заметит удаления.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Удаление в Корзину
СообщениеДобавлено: Ср окт 09, 2013 7:32 pm 
Не в сети
PureBasic Coder
Аватар пользователя

Зарегистрирован: Чт ноя 10, 2011 10:50 am
Сообщений: 4049
Откуда: Ростов-на-Дону
Благодарил (а): 70 раз.
Поблагодарили: 80 раз.
Пункты репутации: 24
FOF_SILENT это скрытие прогрессбара. Предупреждение показывается


Вложения:
Безымянный.png [14.49 KiB]
Скачиваний: 0

_________________
Пурик - лучший язык программирования
Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Удаление в Корзину
СообщениеДобавлено: Ср окт 09, 2013 7:37 pm 
Не в сети
доцент
Аватар пользователя

Зарегистрирован: Ср окт 09, 2013 5:00 pm
Сообщений: 51
Благодарил (а): 2 раз.
Поблагодарили: 1 раз.
Пункты репутации: 0
Это в 7/8, в икспи удаляет на тихую.


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 39 ]  На страницу Пред.  1, 2, 3  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB