ПОМОГНЕТЕ

8 отговора 245 прегледа
#1

ПОМОГНЕТЕ

Как мога при създаване на текстов файл на дискета да проверявам - поставена ли е дискета или е защитена.Написал съм го така ,когато има дискета файла се създава но ако няма или е защитена Еrr не действа,а направо гърми кода.

ПОМОГНЕТЕ.



On Err GoTo ErrLab
Dim Empl as String
Empl="ПРОБА"
OpenFile:
Open "a:\EMPL.txt" For Output As #1
Print #1, Empl3

ErrLab:
If Err.Number = 71 Then GoTo LipsvaDisketa
GoTo NeLipsvaDisketa

LipsvaDisketa:
Label6 = "НЕ СТЕ ПОСТАВЕЛИ ДИСКЕТА В УСТРОЙСТВО А."
GoTo KrEnd

NeLipsvaDisketa:
If Err.Number = 70 Then GoTo ZastitenaDisketa
GoTo DrugaError

ZastitenaDisketa:
Label6 = "ПОСТАВЕНАТА ДИСКЕТА В УСТРОЙСТВО А Е ЗАЩИТЕНА."
GoTo KrEnd

DrugaError:
Label6 = "ДРУГА ГРЕШКА "


KrEnd:

Отговор
в отговор на CTOЯH #2

Re: ПОМОГНЕТЕ

Извинявай, ама кода ти е отвратителен. Ако го види някой от големите С++ талибани ще се издрайфа отгоре му ище каже: "Ето защо не трябва да се пише на Бейсик. Глей к'ви простотии пишат." И може би ще бъде прав.

Първо, вземи сложи един Select Case и разглеждай всички кодове за грешки в него - много по-добре се чете.

По въпроса защо гърми ми е трудно да ти дам отговор. Може пък да се получава друга грешка, която не си прихванал. Ти дебъгвал ли си го step by step?

Отговор
в отговор на Killy-Man Jarro #3

Re: ПОМОГНЕТЕ

Сори, и колегата не е чел, въпреки, че твърдението му за отвратителен код е напълно вярно.

Първия ред трябва да е: On Error Goto Label

Успех в дебъгването.


Щирлиц
Отговор
в отговор на Щиpлиц #4

Re: ПОМОГНЕТЕ

Ето малка част от код, който ми върши добра работа на Excel.


Private Sub cmdSave_Click()

On Error GoTo ErrDebug
Worksheets("Дискета").Activate

If Dir(frmDisk.txtFile.Text) <> "" Then Kill frmDisk.txtFile.Text
Open frmDisk.txtFile.Text For Binary As #1
'
' Тук е кода за запис във файла
'
Close #1

MsgBox "Данните са записани във файл: " & frmDisk.txtFile.Text
Worksheets("Ремонти").Activate

Exit Sub
ErrDebug:
Select Case Err
Case 52: MsgBox "Дискетата не е готова."
Case Else: MsgBox "Грешка " & Err & ". Непозната грешка."
End Select
Worksheets("Ремонти").Activate
End Sub


С малко съкращения, защото кода е дълъг. Исках просто да отбележа, че обработката на грешките би трябвало да е отделена от същинската част на програмата. Възможно е за една определена грешка да не се спира изпълнението на процедурата, и в обработката на грешките да се пише Resume Next, и т.н., или при дадена грешка да се спре на въпросното място в кода, и да се цикли, докато премине успешно без грешка. Това става само с Resume в обработката на грешките. Всичко е според случая. В моите програми процедурите, в които има вероятност да възникне грешка приличат на тази. Така ги пиша още от самото начало на писане на кода. По въпроса имаше един спор с друг участник, задето за два реда код съм отделил лейбъл и част за обработка на грешките, но може ли човек да знае след месец докъде ще е стигнал проекта му, за да се съобрази с нещо такова минимално. А ако не бъде предвиден от самото начало - след това и бате Били няма да може да му помогне да преправи програмата си както трябва.

Никой свестен програмист не би се навил да поправя калпаво написана програма. В най-добрия случай ще препише необходимите процедури и функции, и програмата ще стане още по-трудна за разчитане. ...

Хайде, пиши после до къде си стигнал.


Щирлиц
Отговор
в отговор на Щиpлиц #5

Re: ПОМОГНЕТЕ

Не разбрах какво не съм чел, но по принцип съм съгласен с теб. Просто исках да му кажа, че кодът му е много парцалив и трудно се чете, което прави дебъгването още по-тежко.

Отговор
в отговор на Killy-Man Jarro #6

Re: ПОМОГНЕТЕ

Че кода е калпав калпав.Но ,че грешката е била в първия ред е вярно.
Благадаря и на двамата.

Отговор
в отговор на Killy-Man Jarro #7

Re: ПОМОГНЕТЕ

Точно така, и напълно се съгласих с теб.

А за Стоян. Както беше написал първия ред, той не е грешен. В Бейсик имаше едно такова, че On може да го ползваш за условен преход към лейбъл. Нещо такова:

Dim s As Integer
s = 4
On s GoTo Label1, Label2, Label3, Label4, Label5

което ще рече, че по дадена променлива, съдържаща целочислена стойност, можеш да правиш условен преход в програмния код. Но това е "спагети-код", и избягвай да го ползваш. Пиша ти това, за да знаеш защо интерпретатора не ти е върнал съобщение за синтактична грешка. Защото Err всъщност не е непозволена "променлива". Ти би могъл долу, в частта за обработка на грешките да пишеш така:

On Err GoTo l1, l2, l3, l4, l5, l6, l7 ...... и т.н.

Като обаче трябва да изредиш толкова лейбъли в кода, колкото са възможните грешки. Тогава при Err = 51, ще се прехвърли управлението на 51-вия лейбъл в условието. ;о) Гадничко, а... По-добре свикни да ползваш Select Case. ;о)


Щирлиц
Отговор
в отговор на CTOЯH #8

Re: ПОМОГНЕТЕ

Още един път БЛАГОДАРСКО.Направих го със select и всичко е OK.

Отговор
в отговор на CTOЯH #9

Re: ПОМОГНЕТЕ


Private Sub Command1_Click()
Dim fn As String
On Error GoTo DiskErr
fn = "A:\file.txt"
Open fn For Output As #1
Print #1, fn, Date, Time
Close #1
Exit Sub
DiskErr:
MsgBox Err.Description & "!" & vbCrLf & "Error Number: " & Err.Number, vbCritical, "Error Message"
Exit Sub
End Sub


Отговор