ПОМОГНЕТЕ
8 отговора
245 прегледа
ПОМОГНЕТЕ
Как мога при създаване на текстов файл на дискета да проверявам - поставена ли е дискета или е защитена.Написал съм го така ,когато има дискета файла се създава но ако няма или е защитена Е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:
ПОМОГНЕТЕ.
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:
Re: ПОМОГНЕТЕ
Извинявай, ама кода ти е отвратителен. Ако го види някой от големите С++ талибани ще се издрайфа отгоре му ище каже: "Ето защо не трябва да се пише на Бейсик. Глей к'ви простотии пишат." И може би ще бъде прав.
Първо, вземи сложи един Select Case и разглеждай всички кодове за грешки в него - много по-добре се чете.
По въпроса защо гърми ми е трудно да ти дам отговор. Може пък да се получава друга грешка, която не си прихванал. Ти дебъгвал ли си го step by step?
Първо, вземи сложи един Select Case и разглеждай всички кодове за грешки в него - много по-добре се чете.
По въпроса защо гърми ми е трудно да ти дам отговор. Може пък да се получава друга грешка, която не си прихванал. Ти дебъгвал ли си го step by step?
Re: ПОМОГНЕТЕ
Сори, и колегата не е чел, въпреки, че твърдението му за отвратителен код е напълно вярно.
Първия ред трябва да е: On Error Goto Label
Успех в дебъгването.
Щирлиц
Първия ред трябва да е: On Error Goto Label
Успех в дебъгването.
Щирлиц
Re: ПОМОГНЕТЕ
Ето малка част от код, който ми върши добра работа на Excel.
С малко съкращения, защото кода е дълъг. Исках просто да отбележа, че обработката на грешките би трябвало да е отделена от същинската част на програмата. Възможно е за една определена грешка да не се спира изпълнението на процедурата, и в обработката на грешките да се пише Resume Next, и т.н., или при дадена грешка да се спре на въпросното място в кода, и да се цикли, докато премине успешно без грешка. Това става само с Resume в обработката на грешките. Всичко е според случая. В моите програми процедурите, в които има вероятност да възникне грешка приличат на тази. Така ги пиша още от самото начало на писане на кода. По въпроса имаше един спор с друг участник, задето за два реда код съм отделил лейбъл и част за обработка на грешките, но може ли човек да знае след месец докъде ще е стигнал проекта му, за да се съобрази с нещо такова минимално. А ако не бъде предвиден от самото начало - след това и бате Били няма да може да му помогне да преправи програмата си както трябва.
Никой свестен програмист не би се навил да поправя калпаво написана програма. В най-добрия случай ще препише необходимите процедури и функции, и програмата ще стане още по-трудна за разчитане. ...
Хайде, пиши после до къде си стигнал.
Щирлиц
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 в обработката на грешките. Всичко е според случая. В моите програми процедурите, в които има вероятност да възникне грешка приличат на тази. Така ги пиша още от самото начало на писане на кода. По въпроса имаше един спор с друг участник, задето за два реда код съм отделил лейбъл и част за обработка на грешките, но може ли човек да знае след месец докъде ще е стигнал проекта му, за да се съобрази с нещо такова минимално. А ако не бъде предвиден от самото начало - след това и бате Били няма да може да му помогне да преправи програмата си както трябва.
Никой свестен програмист не би се навил да поправя калпаво написана програма. В най-добрия случай ще препише необходимите процедури и функции, и програмата ще стане още по-трудна за разчитане. ...
Хайде, пиши после до къде си стигнал.
Щирлиц
Re: ПОМОГНЕТЕ
Не разбрах какво не съм чел, но по принцип съм съгласен с теб. Просто исках да му кажа, че кодът му е много парцалив и трудно се чете, което прави дебъгването още по-тежко.
Re: ПОМОГНЕТЕ
Че кода е калпав калпав.Но ,че грешката е била в първия ред е вярно.
Благадаря и на двамата.
Благадаря и на двамата.
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. ;о)
Щирлиц
А за Стоян. Както беше написал първия ред, той не е грешен. В Бейсик имаше едно такова, че 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. ;о)
Щирлиц
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