Даже не знаю с чего начать
Я новичок, теорию подчитал практики очень мало, среди всех моих знакомых не скем посоветоватся кто может помочь стать на ноги? Даже не знаю с чего начать!
На чём собираешься начать писать? На VB6, VBA, VB.Net, VBE (енто для Excel'я)? Как определишься, подкину задачку, чтобы силы свои попробовал. Ну а там тебе тут (извиняюсь за каламбур) помогут.;)
но без бумажных учебников все равно не обойдешься.
На чём собираешься начать писать? На VB6, VBA, VB.Net, VBE (енто для Excel'я)? Как определишься, подкину задачку, чтобы силы свои попробовал. Ну а там тебе тут (извиняюсь за каламбур) помогут.;)
Спасибо за поддержку, вобщето на VB6! Жду с нетерпением!!!
Спасибо за поддержку, вобщето на VB6! Жду с нетерпением!!!
Вот те задачка. Её решение тебе потом пригодится при реальном программировании, поэтому, как решишь её, не выкидывай коды.
Создай форму, на которой будут 3 поля. При вводе символа (нажатии клавиши) в 1 поле во 2 должен возникать Ascii - код буквы (цифры) с клавиши, а в 3 KeyCode клавиши. Причём, если нажимаются служебные клавиши (Delete, BackSpase и т.п.) то во 2 поле пусть выводится подпись с названием клавиши, а в 3, её KeyCode.
Как возникнут вопросы - спрашивай - поможем :)
Если же задачка покажется слишком простой - пиши - подкину посложнее.;)
Вот те задачка. Её решение тебе потом пригодится при реальном программировании, поэтому, как решишь её, не выкидывай коды.
Создай форму, на которой будут 3 поля. При вводе символа (нажатии клавиши) в 1 поле во 2 должен возникать Ascii - код буквы (цифры) с клавиши, а в 3 KeyCode клавиши. Причём, если нажимаются служебные клавиши (Delete, BackSpase и т.п.) то во 2 поле пусть выводится подпись с названием клавиши, а в 3, её KeyCode.
Как возникнут вопросы - спрашивай - поможем :)
Если же задачка покажется слишком простой - пиши - подкину посложнее.;)
Спасибо!!!
Спасибо!!!
Только, как будешь писать, сюда весь код не выкладывай - делай на своей машине, а сюда вопросы задавай. ОК?
Только, как будешь писать, сюда весь код не выкладывай - делай на своей машине, а сюда вопросы задавай. ОК?
Задачка мне понравилась! Несколько раз менял концепцию кода и наконец получилось реализовать програму и максимально оптимизировать(я так счетаю). Код не большой и я хотел бы услышать твое мнение!:
Private intKeyCode As Integer
Option Explicit
Private Sub txtSymbol_KeyDown(KeyCode As Integer, Shift As Integer)
txtSymbol.Text = ""
txtAscii.Text = ""
txtKeyCode.Text = ""
txtSymbol.SetFocus
txtKeyCode.Text = KeyCode
intKeyCode = KeyCode
Call Name_Button(intKeyCode)
End Sub
Private Sub txtSymbol_KeyPress(KeyAscii As Integer)
txtAscii.Text = KeyAscii
Select Case KeyAscii
Case Is = 27: txtAscii.Text = "Escape"
Case Is = 9: txtAscii.Text = "Tab"
Case Is = 32: txtAscii.Text = "Space"
Case Is = 13: txtAscii.Text = "Enter"
Case Is = 8: txtAscii.Text = "Backspace"
End Select
End Sub
Private Sub Name_Button(intKeyCode As Integer)
Select Case intKeyCode
Case Is = 17: txtAscii.Text = "Control"
Case Is = 46: txtAscii.Text = "Delete"
Case Is = 40: txtAscii.Text = "KeyDown"
Case Is = 35: txtAscii.Text = "End"
Case Is = 36: txtAscii.Text = "Home"
Case Is = 45: txtAscii.Text = "Insert"
Case Is = 37: txtAscii.Text = "Left"
Case Is = 34: txtAscii.Text = "PageDown"
Case Is = 33: txtAscii.Text = "PageUp"
Case Is = 39: txtAscii.Text = "Right"
Case Is = 16: txtAscii.Text = "Shift"
Case Is = 38: txtAscii.Text = "KeyUp"
Case Is = 20: txtAscii.Text = "CapsLock"
Case Is = 18: txtAscii.Text = "Alt"
Case Is = 144: txtAscii.Text = "NumLock"
Case Is = 19: txtAscii.Text = "Pause"
Case Is = 42: txtAscii.Text = "PrintScreen"
Case Is = 145: txtAscii.Text = "ScrollLock"
Case Is = 112: txtAscii.Text = "F1"
Case Is = 121: txtAscii.Text = "F10"
Case Is = 122: txtAscii.Text = "F11"
Case Is = 123: txtAscii.Text = "F12"
Case Is = 124: txtAscii.Text = "F13"
Case Is = 125: txtAscii.Text = "F14"
Case Is = 126: txtAscii.Text = "F15"
Case Is = 127: txtAscii.Text = "F16"
Case Is = 113: txtAscii.Text = "F2"
Case Is = 114: txtAscii.Text = "F3"
Case Is = 115: txtAscii.Text = "F4"
Case Is = 116: txtAscii.Text = "F5"
Case Is = 117: txtAscii.Text = "F6"
Case Is = 118: txtAscii.Text = "F7"
Case Is = 119: txtAscii.Text = "F8"
Case Is = 120: txtAscii.Text = "F9"
End Select
End Sub
Только, как будешь писать, сюда весь код не выкладывай - делай на своей машине, а сюда вопросы задавай. ОК?
Если есть новая задачка буду рад! Спасибо за поддержку!
Если есть новая задачка буду рад! Спасибо за поддержку!
[QUOTE]Originally posted by Andi_SPAWN
Блин, просто очень хорошо! Очень.
Только лучше (это чисто моё субъективное мнение) intKeyCode объявлять не на уровне формы, а в процедурах, откуда эта переменная передаётся. Считается, что VB быстрее работает с локальными переменными. Ну и, по возможности, лучше вместо Integer использовать Long - занимает, дла VB в пямяти столько же места, а хранить может большие числа.
Сохрани этот проект. Он дальше очень даже пригодится, когда будешь работать с текстом и понадобится определять коды клавиш и символов.
Теперь задачка.
Эта гораздо интереснее, но, если решишь её, сможешь использовать во всех своих программах.
Значит так.
Как ты знаешь, VB позволяет перехватывать события возникновения многих ошибок при выполнении программы при помощи диррективы On Error.
Тебе очень даже пригодится процедура, которая ведёт лог-файл возникающих ошибок.
Суть в следующем. Например, есть процедура следующего вида:
On Error Goto ErrHng
код процедуры
Exit Sub
ErrHng:
Обращение к процедуре ведения лога ошибок
Err.Clear
End Sub
Здесь в момент "Обращение к процедуре ведения лога ошибок" вызывается процедура, которой передаются:
- Код ошибки (Err.Number)
- Описание ошибки (Err.Description)
- Имя процедурв, ы которой возникла ошибка (просто строку передаёшь, например "MyForm.MySub" + "параметры процедуры, если есть, ну и т.д., что может тебе пригодиться")
- Имя файла, в который писать лог.
Вот пример вызова такой процедуры у меня, чтобы понятно всё было:
'МАХ отлавливаем нажатие кнопки пользователем (для подстановки)
On Error GoTo ErrHnd 'МАХ в случае ошибки передаём управление обработчику
If KeyAscii <> 9 And KeyAscii <> 8 And KeyAscii <> 27 And KeyAscii <> 13 Then
SelectCbx CbCntHtl(Index), Chr$(KeyAscii), CbCntHtl(Index).ListIndex, False
End If
KeyAscii = 0 'МАХ стираем символ
Exit Sub
ErrHnd: 'МАХ область обработки ошибок
'МАХ передача управления процедуры ведения лога
ErrDescr Err.Number, Err.Description, "FrmMenu.CbCntHtl_KeyPress Комбобокс с индексом № " & Index & " Код клсвиши " & KeyAscii, ConstNameLog
End Sub
Тебе нужно написать процедуру, которая при получении перечисленных выше переметров открывает указанный лог-файл и дописывает в него с новой строки (дописывает в начало для дальнейшего удобвства) всю передаваемую информацию (чтобы в случае чего можно было определить, что за ошибка и где возникла) плюс дату и время возникновения ошибки.
После этого процедура должна выдавать мессагу для пользователя о возникновении ошибки (ну, тоесть msgBox), чтобы он знал о сбое.
Если лог-файл не найден по указанному пути, процедура должна его создать.
Если лог-файл пустой, процедура должна вписать в него информацию о том, когда он начал вестись, чтобы ты знал, когда возник первый пецедент ошибки даже в случае, если сотрёшь их него всё, кроме этой записи.
Процедура должна иметь какую-либо свою обработку ошибок, которая не даст программе "вывалиться" в случае возникновения ошибки в самой процедуре, но сообщит пользователю о срочной необходимости связаться с разработчиком (так как в этом случае ты тераяшь возможность адекватно анализировать лог-файл).
Вот пример записи из такого лог-файла:
Создан: 23.12.2003 12:44:09
Начало
==================================================
Ошибка № 91;
Описание: Object variable or With block variable not set;
Процедура: FrmAnketa.ReloadAnket Запрос: EXECUTE Anketa_SelHtlInfoFrCntry 3
Дата: 12-23-2003 16:50:15
__________________________________________________
Ошибка № 424;
Описание: Object required;
Процедура: FrmAnketa.RestoreText
Дата: 12-23-2003 12:44:09
__________________________________________________
[QUOTE]Originally posted by Andi_SPAWN
Блин, просто очень хорошо! Очень.
Только лучше (это чисто моё субъективное мнение) intKeyCode объявлять не на уровне формы, а в процедурах, откуда эта переменная передаётся. Считается, что VB быстрее работает с локальными переменными. Ну и, по возможности, лучше вместо Integer использовать Long - занимает, дла VB в пямяти столько же места, а хранить может большие числа.
Сохрани этот проект. Он дальше очень даже пригодится, когда будешь работать с текстом и понадобится определять коды клавиш и символов.
Теперь задачка.
Эта гораздо интереснее, но, если решишь её, сможешь использовать во всех своих программах.
Значит так.
Как ты знаешь, VB позволяет перехватывать события возникновения многих ошибок при выполнении программы при помощи диррективы On Error.
Тебе очень даже пригодится процедура, которая ведёт лог-файл возникающих ошибок.
Суть в следующем. Например, есть процедура следующего вида:
On Error Goto ErrHng
код процедуры
Exit Sub
ErrHng:
Обращение к процедуре ведения лога ошибок
Err.Clear
End Sub
Здесь в момент "Обращение к процедуре ведения лога ошибок" вызывается процедура, которой передаются:
- Код ошибки (Err.Number)
- Описание ошибки (Err.Description)
- Имя процедурв, ы которой возникла ошибка (просто строку передаёшь, например "MyForm.MySub" + "параметры процедуры, если есть, ну и т.д., что может тебе пригодиться")
- Имя файла, в который писать лог.
Вот пример вызова такой процедуры у меня, чтобы понятно всё было:
'МАХ отлавливаем нажатие кнопки пользователем (для подстановки)
On Error GoTo ErrHnd 'МАХ в случае ошибки передаём управление обработчику
If KeyAscii <> 9 And KeyAscii <> 8 And KeyAscii <> 27 And KeyAscii <> 13 Then
SelectCbx CbCntHtl(Index), Chr$(KeyAscii), CbCntHtl(Index).ListIndex, False
End If
KeyAscii = 0 'МАХ стираем символ
Exit Sub
ErrHnd: 'МАХ область обработки ошибок
'МАХ передача управления процедуры ведения лога
ErrDescr Err.Number, Err.Description, "FrmMenu.CbCntHtl_KeyPress Комбобокс с индексом № " & Index & " Код клсвиши " & KeyAscii, ConstNameLog
End Sub
Тебе нужно написать процедуру, которая при получении перечисленных выше переметров открывает указанный лог-файл и дописывает в него с новой строки (дописывает в начало для дальнейшего удобвства) всю передаваемую информацию (чтобы в случае чего можно было определить, что за ошибка и где возникла) плюс дату и время возникновения ошибки.
После этого процедура должна выдавать мессагу для пользователя о возникновении ошибки (ну, тоесть msgBox), чтобы он знал о сбое.
Если лог-файл не найден по указанному пути, процедура должна его создать.
Если лог-файл пустой, процедура должна вписать в него информацию о том, когда он начал вестись, чтобы ты знал, когда возник первый пецедент ошибки даже в случае, если сотрёшь их него всё, кроме этой записи.
Процедура должна иметь какую-либо свою обработку ошибок, которая не даст программе "вывалиться" в случае возникновения ошибки в самой процедуре, но сообщит пользователю о срочной необходимости связаться с разработчиком (так как в этом случае ты тераяшь возможность адекватно анализировать лог-файл).
Вот пример записи из такого лог-файла:
Создан: 23.12.2003 12:44:09
Начало
==================================================
Ошибка № 91;
Описание: Object variable or With block variable not set;
Процедура: FrmAnketa.ReloadAnket Запрос: EXECUTE Anketa_SelHtlInfoFrCntry 3
Дата: 12-23-2003 16:50:15
__________________________________________________
Ошибка № 424;
Описание: Object required;
Процедура: FrmAnketa.RestoreText
Дата: 12-23-2003 12:44:09
Спасибо за задачку, но даже не знаю справлюсь ли. Я впринципе мутновато себе представляю ообработку ошибок в VB6, но тем неменее это стимул, думаю, що здесь будет много вопросов, но я люблю трудности. Побробую!
__________________________________________________
А этот форум начто?;) Задавай вопросы - всегда поможем!:)
А этот форум начто?;) Задавай вопросы - всегда поможем!:)
Если ты уже пишешь такие сложные программы, то без обработчика ошибок обойтись никак нельзя, это не прихоть, а норма программирование. Советую разобраться, тем более что там абсолютно ничего сложного нет.
А этот форум начто?;) Задавай вопросы - всегда поможем!:)
Вроде сделал, но хочу услышать мнение професиоанла. Единственное, что не удалось реализовать - это добавление записи в log-файл в начало и при этом сохранить первые строки файла, подскажи??? Если что не в порядке то укажи я буду переделовать, если же наоборот то буду благодарин за новою задачу!!!
Private lngRes As Long
Option Explicit
Private Sub cmdStart_Click()
Dim x As Long
Dim y As Long
Dim strValue As String
On Error GoTo NumErr
Retry:
strValue = InputBox("Введите число, на которое необходимо разделить число 100 ", "Ввод числа")
x = strValue
y = 100 / x
MsgBox "100 разделить на" & Space(1) & x & Space(1) & "будет" & Space(1) & y, vbOKOnly, "Результат"
Exit Sub
NumErr:
If Err.Number = 11 Then
Call Write_Log(Err.Number, Error, "cmdStart_Click()", Now)
ElseIf Err.Number <> 11 Then
Call Write_Log(Err.Number, Error, "cmdStart_Click()", Now)
End If
Select Case lngRes
Case Is = vbAbort: End
Case Is = vbRetry: Resume Retry
Case Is = vbIgnore: Resume
End Select
End Sub
Private Sub Write_Log(strErr_Number As Long, strError, strnameSub As String, datDate As Date)
Dim fso As New FileSystemObject
Dim fil As File
Dim txtstr As TextStream
Dim strMsg As String
Dim strErrInfo As String
Dim strWrite As String
On Error GoTo ErrorLable
strWrite = "Ошыбка №" & Space(1) & CStr(strErr_Number) & vbCrLf
strWrite = strWrite + "Описание:" & Space(1) & strError & vbCrLf
strWrite = strWrite + "Процедура:" & Space(1) & strnameSub & vbCrLf
strWrite = strWrite + "Дата:" & Space(1) & datDate & vbCrLf
strErrInfo = strError & Space(1) & "#" & strErr_Number
strMsg = "Деление на ноль невозможно!" & Chr(13) & Chr(10)
If fso.FileExists(CurDir & "\" & "error.log") = True Then
Set fil = fso.GetFile(CurDir & "\" & "error.log")
Set txtstr = fil.OpenAsTextStream(ForAppending)
txtstr.WriteLine (""): txtstr.WriteLine (""): txtstr.WriteLine ("")
txtstr.Write (strWrite)
txtstr.WriteLine ("----------------------------")
txtstr.Close
Else
datDate = Now
fso.CreateTextFile (CurDir & "\" & "error.log")
Set fil = fso.GetFile(CurDir & "\" & "error.log")
Set txtstr = fil.OpenAsTextStream(ForWriting)
txtstr.WriteLine ("Создан:" & Space(1) & datDate)
txtstr.WriteLine ("=============================")
txtstr.WriteBlankLines (3)
txtstr.Write (strWrite)
txtstr.WriteLine ("-----------------------------")
txtstr.Close
End If
lngRes = MsgBox(strMsg + strErrInfo, vbAbortRetryIgnore + vbExclamation, "Ошибка!")
Exit Sub
ErrorLable:
MsgBox "Свяжитесь с разработчиком!" & vbCrLf & Error & Space(1) & "#" & Space(1) & Err.Number, vbOKOnly + vbCritical, "ошибка!"
End
End Sub
Вроде сделал, но хочу услышать мнение професиоанла. Единственное, что не удалось реализовать - это добавление записи в log-файл в начало и при этом сохранить первые строки файла, подскажи???
Над этой задачей не один ты зубы обломал...
Тут как-то на одном форуме обсуждали эту проблему. Чисто технически это сделать невозможно, ведь если файл уже записан, то система может токо дописать его. Поэтому остается токо переписать его уже с новыми данными.
Вобщем, я сам это делаю следующим образом:
получаю весь текст из файла, отсекаю от него заголовок. Потом формирую переменную:
Заголовок + Новое сообщение от ошибки + Весь остальной текст.
Его и пишу по-новой в файл.
Кстати, у меня в процедуре. дабы лог-файл не раздувать, предусмотрен параметр, который отвечает за удаление устаревшей информации (например, если его активировать, можно удалять автоматом все записи, которые старше полугода). Правда, я этот параметр никогда ещё (кроме тестов) не активировал.
К сожалению, не могу сейчас подробно писать.
Вобщем, я сам это делаю следующим образом:
получаю весь текст из файла, отсекаю от него заголовок. Потом формирую переменную:
Заголовок + Новое сообщение от ошибки + Весь остальной текст.
Его и пишу по-новой в файл.
Кстати, у меня в процедуре. дабы лог-файл не раздувать, предусмотрен параметр, который отвечает за удаление устаревшей информации (например, если его активировать, можно удалять автоматом все записи, которые старше полугода). Правда, я этот параметр никогда ещё (кроме тестов) не активировал.
Вчера мне пришла в голову эта мысль, но я столкнулся с другой проблемой. Я делал таким образом:
- откривал файл в режиме чтения;
- считывал из него даные в переменную;
- считывал в отдельную перменную заглавные строки;
В результате я имел три переменных, в первой - заголовок, во второй - новая запись, в третей - весь старый файл. Проблема заключалась в том, что старий файл тоже имел заглавные строки и я не знал как мне их удалить? Каким образом ты отсекаеш заголовок?
P.S. Может есть задачка?
Над этой задачей не один ты зубы обломал...
Тут как-то на одном форуме обсуждали эту проблему. Чисто технически это сделать невозможно, ведь если файл уже записан, то система может токо дописать его. Поэтому остается токо переписать его уже с новыми данными.
Спасибо за совет! Я бы еще поупражнялся если есть какие-нибуть задачки присылай, буду благодарин!!!
Спасибо за совет! Я бы еще поупражнялся если есть какие-нибуть задачки присылай, буду благодарин!!!
Да, не часто можно встретить чтобы на форум приходили за новыми задачками и знаниями, обычно все больше приходят за готовыми рецептами, так что такое участие вдвойне приятно :)
Вчера мне пришла в голову эта мысль, но я столкнулся с другой проблемой. Я делал таким образом:
- откривал файл в режиме чтения;
- считывал из него даные в переменную;
- считывал в отдельную перменную заглавные строки;
В результате я имел три переменных, в первой - заголовок, во второй - новая запись, в третей - весь старый файл. Проблема заключалась в том, что старий файл тоже имел заглавные строки и я не знал как мне их удалить? Каким образом ты отсекаеш заголовок?
P.S. Может есть задачка?
У тебя же заголовок фиксированный - константа. На этой основе его и можно отсечь (либо по длинне, либо по тексту)
Спасибо за совет! Я бы еще поупражнялся если есть какие-нибуть задачки присылай, буду благодарин!!!
К вечеру придумаю что-нибудь ещё полезное для тебя. Ты, кстати, с ревайзом форм работал?
К вечеру придумаю что-нибудь ещё полезное для тебя. Ты, кстати, с ревайзом форм работал?
в продолжение об ошибках - попробуйте подкинуть задачу с отлавливанием исключений разных категорий. Не помню, правда, в VB6.0 есть ли он, но имхо, механизм исключений более гибкий, чем OnError.
в продолжение об ошибках - попробуйте подкинуть задачу с отлавливанием исключений разных категорий. Не помню, правда, в VB6.0 есть ли он, но имхо, механизм исключений более гибкий, чем OnError.
Это как?
в продолжение об ошибках - попробуйте подкинуть задачу с отлавливанием исключений разных категорий. Не помню, правда, в VB6.0 есть ли он, но имхо, механизм исключений более гибкий, чем OnError.
О, кстати, мысля. Часто возникает ситуация, когда с определённой вероятностью в программе может возникнуть ошибка, которую либо нужно игнорировать. либо нужно сделать так, чтобы пользователь не заметил её возникновения. Обычто начинающие программисты пишут так:
проблеммный блок кода
On Error GoTo 0
Но это не есть хорошо, так как в проблемном участке могут возникать различные ошибки, которые не должны такм возникать и которые нельзя игнорировать. Поэтому, конечно. хорошо этот случай как-то обрабатывать.
Подумай, как это можно обработать.
Подсказываю. Для решения этой задачи я, например, пользуюсь создаваемой областью обработки ошибок (метка ErrHng после диррективы Exit Sub).
Единтственное, у меня под рукой только старый вариант моей процедуры, поэтому она дописывает ошибки в конец лог-файла, ну и ещё кое-какие мелочи не делает (новый я оформил в видк dll и сейчас неохота искать исходники):
'МАХ процедура пишет в LOG-файл сообщения об ошибках _
получает код ошибки, описание, имя процедуры, вызвавшей ошибку
Dim LogFile As File 'МАХ файл лога
Dim FsO As New FileSystemObject 'МАХ ссылка на объект системной области файлов
Dim TxtStr As TextStream 'МАХ потолтк данных к/из файла(у)
Dim TextIn As String 'МАХ строка, которая будет писаться в лог-файл
Dim PathFile As String 'МАХ путь к файлу
On Error GoTo ErrHnd 'МАХ в случае ошибки переходим к собственному обработчику ошибок
Const NmeFil = "AnketaLog.log" 'МАХ имя лог-файла
'МАХ выводим сообщение об ошибке
MsgBox "Ошибка в модуле " & ProcName & vbCrLf & _
"Номер ошибки: " & ErrNumb & _
vbCrLf & "Описание:" & ErrDescript, vbCritical, "Ошибка в выполнении кода! Сообщите отделу IT!"
PathFile = App.Path & "\" & Trim(NmeFil) 'МАХ полный путь к файлу
'МАХ ищем файл
If FsO.FileExists(PathFile) = False Then 'МАХ если файла нет, то создадим его
FsO.CreateTextFile (PathFile)
Set LogFile = FsO.GetFile(PathFile) 'МАХ указываем файл
Set TxtStr = LogFile.OpenAsTextStream(ForWriting) 'МАХ открываем файл на запись
TxtStr.Write "Создан: " & Date & " " & Time & vbCrLf & _
"Начало======================================================================== " & _
vbCrLf & vbCrLf & vbCrLf
TxtStr.Close
End If
Set LogFile = FsO.GetFile(PathFile) 'МАХ указываем файл
Set TxtStr = LogFile.OpenAsTextStream(ForReading) 'МАХ открываем файл на запись
TextIn = TxtStr.ReadAll 'МАХ получаем содержимое файла
'МАХ закрываем файл
TxtStr.Close
Set TxtStr = LogFile.OpenAsTextStream(ForWriting) 'МАХ открываем файл на запись
'МАХ отслеживаем полученные переменные
If IsNull(ErrNumb) Then ErrNumb = 0
If IsNull(ErrDescript) Then ErrDescript = " "
If IsNull(ProcName) Then ProcName = " "
'МАХ формируем строку записи
TextIn = TextIn & _
"Ошибка № " & Trim(Str(ErrNumb)) & ";" & vbCrLf & "Описание: " & _
ErrDescript & ";" & vbCrLf & _
"Процедура: " & ProcName & vbCrLf & _
"Дата: " & Date$ & " " & Time$ & vbCrLf & _
"_______________________________________________________________________________" & _
vbCrLf & vbCrLf
'МАХ пишем текст в файл
TxtStr.Write TextIn
'МАХ закрываем файл
TxtStr.Close
Exit Sub 'МАХ конец процедуры в случае нормальной её работы
ErrHnd: 'МАХ область внутреннего обработчика ошибок
MsgBox "Внимание!" & vbCrLf & _
"Произошла ошибка в модуле обработчика сбоев!" & vbCrLf & _
"Срочно сообщите о ней сотрудникам IT отдела" & vbCrLf & _
"с описание того, в какой момент и " & vbCrLf & _
"при каких действиях она возникла!", vbCritical, _
"КРИТИЧНАЯ ОШИБКА В РАБОТЕ ПРОРАММЫ!!!!"
Resume Next 'МАХ предпринимаем попытку продолжить выполнение прцедуры
End Sub
Задачка такая:
Создай форму, на которой положи какие-либо элементы. Например, массив кнопок, текстбокс,и обязательно комбобокс. Сделай так, чтобы при ресайзе формы, расстояние между элементами пропорционально изменялось. Если же расстояние можду элементами слишком мало, пусть сжимаются сами элементы ;-) (это по поводу комбобокса - предупреждаю сразу). При увеличении размеров формы, соответственно, до определённой границы пусть "растут" элементы.
НО! Пускай при закрытии формы сведения о размерах сохраняются в ini-файл. Если прога его при запуске не находит, пусть открывается с какми-либо определёнными размерами, иначе пусть считывает из инишника свои размеры и ресайзится в соответствии с ними.
Работу с инишником оформи в виде отдельной процедуры в отдельном модуле.
Будут вопросы - обращайся.
Удачи!
Вот что значит, человеку интересно! Чувствую, скоро я у него буду советы спрашивать по многим вопросам. И это - не шутка.:!!!:
Я тут перечитал твой пост, ну и решил, что лучше сменить задачку.
Задачка такая:
Создай форму, на которой положи какие-либо элементы. Например, массив кнопок, текстбокс,и обязательно комбобокс. Сделай так, чтобы при ресайзе формы, расстояние между элементами пропорционально изменялось. Если же расстояние можду элементами слишком мало, пусть сжимаются сами элементы ;-) (это по поводу комбобокса - предупреждаю сразу). При увеличении размеров формы, соответственно, до определённой границы пусть "растут" элементы.
НО! Пускай при закрытии формы сведения о размерах сохраняются в ini-файл. Если прога его при запуске не находит, пусть открывается с какми-либо определёнными размерами, иначе пусть считывает из инишника свои размеры и ресайзится в соответствии с ними.
Работу с инишником оформи в виде отдельной процедуры в отдельном модуле.
Будут вопросы - обращайся.
Удачи!
Вот что значит, человеку интересно! Чувствую, скоро я у него буду советы спрашивать по многим вопросам. И это - не шутка.:!!!:
научили бы сначала человека Anchor и Dock использовать для контролов... или я опять не из той оперы??? я VS.NET пользую - все что я предлагаю - оттуда.
Это как?
через объект Exception.
К вечеру придумаю что-нибудь ещё полезное для тебя. Ты, кстати, с ревайзом форм работал?
Нет не работал и даже не знаю что это! А за новое задание спасибо, буду думать, код твой сравню и напишу свое мнение.
научили бы сначала человека Anchor и Dock использовать для контролов... или я опять не из той оперы??? я VS.NET пользую - все что я предлагаю - оттуда.
Я благодарен за внимание, но пока что я практикуюсь на VB6 но походу изучаю VB.NET, я думаю скоро я и к тебе за советом обращусь!
Нет не работал и даже не знаю что это! А за новое задание спасибо, буду думать, код твой сравню и напишу свое мнение.
Ресайз - это изменение положения и размеров формы и её элементов. В VB6 это работает не так, как в VB.Net. Если честно, то я застрял пока на 6 Студии и по Net мало что могу сказать. Ресайз в Net можно организовать автоматический и не заморачиваться кодом в 90% случаях. Но, чтобы понимать, как это происходит, стоит поиграть с этим в другой среде, например, VB6.
Поэтому погляди вышеописанную задачку про ресайз. Заодно попробуешь свои силы в работе с инишником (рекомендую поискать для этого соответствующие API - функции и написать свои процедуры и функции на их основе для чтения и записи инициализации).
Ресайз - это изменение положения и размеров формы и её элементов. В VB6 это работает не так, как в VB.Net. Если честно, то я застрял пока на 6 Студии и по Net мало что могу сказать. Ресайз в Net можно организовать автоматический и не заморачиваться кодом в 90% случаях. Но, чтобы понимать, как это происходит, стоит поиграть с этим в другой среде, например, VB6.
Поэтому погляди вышеописанную задачку про ресайз. Заодно попробуешь свои силы в работе с инишником (рекомендую поискать для этого соответствующие API - функции и написать свои процедуры и функции на их основе для чтения и записи инициализации).
Параллельно с ini файлами стоит посмотреть работу с базой регистров, т.к. по новой идеолгии мелкософта - ини файлы уже в прошлом :( вся конфигурация идет через базу регистров. Две темы параллельные, поэтому советую пользуясь случаем посмотреть обе концепции.
Параллельно с ini файлами стоит посмотреть работу с базой регистров, т.к. по новой идеолгии мелкософта - ини файлы уже в прошлом :( вся конфигурация идет через базу регистров. Две темы параллельные, поэтому советую пользуясь случаем посмотреть обе концепции.
Тоже дело. Но, на мой взгляд, пока можно только с инишником разобраться - это гораздо проще, да и надёжнее. Хотя, енто тоже посмотреть стоит...
Тоже дело. Но, на мой взгляд, пока можно только с инишником разобраться - это гораздо проще, да и надёжнее. Хотя, енто тоже посмотреть стоит...
Возникли проблемы с задачкой?
Задавай вопросы, а то скоро пост потеряется ;)
Возникли проблемы с задачкой?
Задавай вопросы, а то скоро пост потеряется ;)
Немного со временен проблемы, работа! Вопросов пару есть,
во-первых: ты рекомендуеш API функции, я что-то слишал но точно не знаю, какие именно ф-и к ним относятся?
Возникли проблемы с задачкой?
Задавай вопросы, а то скоро пост потеряется ;)
Как работать с ини-файлом? Я свою литературу поднял там и слова не написано, может для этого есть специальный компонент или функция, если да то напиши? Что такое база регистров и где ее можна посмотреть?
Как работать с ини-файлом? Я свою литературу поднял там и слова не написано, может для этого есть специальный компонент или функция, если да то напиши? Что такое база регистров и где ее можна посмотреть?
ну начнём с инишника...
Я сам использую функции
Public Declare Function GetPrivateProfileString Lib "kernel32" _
Alias "GetPrivateProfileStringA" _
(ByVal lpApplicationName As String, _
ByVal lpKeyName As Any, _
ByVal lpDefault As String, _
ByVal lpReturnedString As String, _
ByVal nSize As Long, ByVal lpFileName As String) As Long
'МАХ Запимсь ini
Public Declare Function WritePrivateProfileString Lib "kernel32" _
Alias "WritePrivateProfileStringA" _
(ByVal lpApplicationName As String, _
ByVal lpKeyName As Any, _
ByVal lpString As Any, _
ByVal lpFileName As String) As Long
Их вызовы:
'МАХ Функция чтения INI - файла
On Error GoTo ErrHnd 'МАХ в случае ошибки переходим к собственному обработчику ошибок
Dim FsO As New FileSystemObject
If FsO.FileExists(PuthIni) = False Then
ReadINI = vbNullString
Exit Function
End If
ReadINI = vbNullString
ReadINI = Space$(255)
GetPrivateProfileString AppName, KeyName, vbNullString, ReadINI, Len(ReadINI), PuthIni
ReadINI = Trim(ReadINI)
Exit Function
ErrHnd:
ErrDescr Err.Number, Err.Description, "ModMain.ReadIni"
End Function
Public Sub WriteIni(AppName As String, KeyName As String, PuthIni As String, Value As String)
'МАХ Функция записи в ини
On Error GoTo ErrHnd 'МАХ в случае ошибки переходим к собственному обработчику ошибок
Dim FsO As New FileSystemObject
If FsO.FileExists(PuthIni) = False Then
FsO.CreateTextFile (PuthIni)
End If
WritePrivateProfileString AppName, KeyName, Value, PuthIni
Exit Sub
ErrHnd:
ErrDescr Err.Number, Err.Description, "ModMain.WriteIni"
End Sub
Эти процедуры я написал для облегчения работы с инишником...
Но, чтобы не делать всё за тебя, попробуй, разберись, как они работают, и лишь потом внедри их использование в свой проект.
Если будут вопросы - я всегда готов ответить. Обращайся.:)
Очень жду постов от тебя:)
ну начнём с инишника...
Я сам использую функции
Public Declare Function GetPrivateProfileString Lib "kernel32" _
Alias "GetPrivateProfileStringA" _
(ByVal lpApplicationName As String, _
ByVal lpKeyName As Any, _
ByVal lpDefault As String, _
ByVal lpReturnedString As String, _
ByVal nSize As Long, ByVal lpFileName As String) As Long
'МАХ Запимсь ini
Public Declare Function WritePrivateProfileString Lib "kernel32" _
Alias "WritePrivateProfileStringA" _
(ByVal lpApplicationName As String, _
ByVal lpKeyName As Any, _
ByVal lpString As Any, _
ByVal lpFileName As String) As Long
Их вызовы:
'МАХ Функция чтения INI - файла
On Error GoTo ErrHnd 'МАХ в случае ошибки переходим к собственному обработчику ошибок
Dim FsO As New FileSystemObject
If FsO.FileExists(PuthIni) = False Then
ReadINI = vbNullString
Exit Function
End If
ReadINI = vbNullString
ReadINI = Space$(255)
GetPrivateProfileString AppName, KeyName, vbNullString, ReadINI, Len(ReadINI), PuthIni
ReadINI = Trim(ReadINI)
Exit Function
ErrHnd:
ErrDescr Err.Number, Err.Description, "ModMain.ReadIni"
End Function
Public Sub WriteIni(AppName As String, KeyName As String, PuthIni As String, Value As String)
'МАХ Функция записи в ини
On Error GoTo ErrHnd 'МАХ в случае ошибки переходим к собственному обработчику ошибок
Dim FsO As New FileSystemObject
If FsO.FileExists(PuthIni) = False Then
FsO.CreateTextFile (PuthIni)
End If
WritePrivateProfileString AppName, KeyName, Value, PuthIni
Exit Sub
ErrHnd:
ErrDescr Err.Number, Err.Description, "ModMain.WriteIni"
End Sub
Эти процедуры я написал для облегчения работы с инишником...
Но, чтобы не делать всё за тебя, попробуй, разберись, как они работают, и лишь потом внедри их использование в свой проект.
Если будут вопросы - я всегда готов ответить. Обращайся.:)
Очень жду постов от тебя:)
Я докупил професиональную литературу, где описано API функции и работа с инишником. Хочу САМ разобратся!!! У меня час штопор в другом...
Никак не получаеться написать код под событие Resize.
Я делал так:
-после расстановки елементов управления, фиксировал их координаты и размеры при инициализации;
-объявил две константы (минимальное и максимальное растояние между елементами);
-затем в процедуре Resize ставил условие:
разница координат между елементами дожна быть больше минимального значения и меньше макимального;
Но при запуске програмная сред=а просто зависала. Я больше чем уверен, что это полная лажа! но никакого другого альтернативного решения в голову не приходит, подскажи за что зацепится!?
P.S. Задачка сложная и меня это подстегивает, кстати всегда хотел тебя спросить, ты програмист или это как и для меня хобби?
Я докупил професиональную литературу, где описано API функции и работа с инишником. Хочу САМ разобратся!!! У меня час штопор в другом...
Никак не получаеться написать код под событие Resize.
Я делал так:
-после расстановки елементов управления, фиксировал их координаты и размеры при инициализации;
-объявил две константы (минимальное и максимальное растояние между елементами);
-затем в процедуре Resize ставил условие:
разница координат между елементами дожна быть больше минимального значения и меньше макимального;
Но при запуске програмная сред=а просто зависала. Я больше чем уверен, что это полная лажа! но никакого другого альтернативного решения в голову не приходит, подскажи за что зацепится!?
P.S. Задачка сложная и меня это подстегивает, кстати всегда хотел тебя спросить, ты програмист или это как и для меня хобби?
Знать так...
Для отлова ошибки уобно пользоваться брейкпоинтами.
В начале процедуры кликаешь по левому полю напротив значащего оператора. При этом он начинает подсвечиваться. Можно так же поставить курсор на значащий оператор, например на название процедёры и в меню Debug выбоать пункт Toggle Breackpoint. после этого программа приостанови своё выполнение на выделенной строке. Затем по нажатию на F8 можно добиться того, чтобы программа перешла к следующей строке. По Shift+F8 программа перейдёт к строке текущей процедуры, скрыто выполнив инструкции из других процедур. По F5 программа продолжит выполнение в обычном режиме (поэкспериментируй с этим). Таким образом ты сможешь найти место, где программа зацикливается.
Ресайз же я реализую обычно так:
Задаю константы иаксимальных и минимальных размеров элементов и минимальных расстояний мажду ними. Кроме того, вычисляю коэфициенты расстояний междё элементами в привязке к размерам формы. Например, расстояние по горизонтали от элемента 1 до элемента 2 должно быть 1/3 ширины формы.
Так же создаю коэфициенты для малых расстояний, исходя из которых в случае, если расстояние можду элементами равно минимальному, будут изменяться размеры элементов.
При ресайзе смотрю расстояние между элементами. Если оно меньше минимально допустимого, изменяю размеры элементов. Если уменьшать некуда, делаю досрочный выход из ресайза через Exit Sub.
Если расстояние достигло максимального, при котором изменяются размеры элементов, начинаю растягивать элементы. Если элементы растянуты, начинаю опять увеличивать расстояние.
Если а не ясно выразился, ты напиши сюда - я выложу какой - нибудь маленький примерчик.
А по поводу работы... Сначала программирование было увлечением. В школе в УПК получил специальность несуществующую "оператор-программист".
Учился в Серпуховском Военном Институте РВСН по специальности инжинер СУ беспилотных летательных аппаратов, командир группы подготовки и пуска. Сейчас заканчиваю Московскую Государственную Академику Приборостроения и Информатики. Специальность информационные системы и сети. Работаю программистом. Так что хобби переросло в профессию.:D В любимую профессию... В этом смысле мне повезло... И даже очень...
Знать так...
Для отлова ошибки уобно пользоваться брейкпоинтами.
В начале процедуры кликаешь по левому полю напротив значащего оператора. При этом он начинает подсвечиваться. Можно так же поставить курсор на значащий оператор, например на название процедёры и в меню Debug выбоать пункт Toggle Breackpoint. после этого программа приостанови своё выполнение на выделенной строке. Затем по нажатию на F8 можно добиться того, чтобы программа перешла к следующей строке. По Shift+F8 программа перейдёт к строке текущей процедуры, скрыто выполнив инструкции из других процедур. По F5 программа продолжит выполнение в обычном режиме (поэкспериментируй с этим). Таким образом ты сможешь найти место, где программа зацикливается.
Ресайз же я реализую обычно так:
Задаю константы иаксимальных и минимальных размеров элементов и минимальных расстояний мажду ними. Кроме того, вычисляю коэфициенты расстояний междё элементами в привязке к размерам формы. Например, расстояние по горизонтали от элемента 1 до элемента 2 должно быть 1/3 ширины формы.
Так же создаю коэфициенты для малых расстояний, исходя из которых в случае, если расстояние можду элементами равно минимальному, будут изменяться размеры элементов.
При ресайзе смотрю расстояние между элементами. Если оно меньше минимально допустимого, изменяю размеры элементов. Если уменьшать некуда, делаю досрочный выход из ресайза через Exit Sub.
Если расстояние достигло максимального, при котором изменяются размеры элементов, начинаю растягивать элементы. Если элементы растянуты, начинаю опять увеличивать расстояние.
Если а не ясно выразился, ты напиши сюда - я выложу какой - нибудь маленький примерчик.
А по поводу работы... Сначала программирование было увлечением. В школе в УПК получил специальность несуществующую "оператор-программист".
Учился в Серпуховском Военном Институте РВСН по специальности инжинер СУ беспилотных летательных аппаратов, командир группы подготовки и пуска. Сейчас заканчиваю Московскую Государственную Академику Приборостроения и Информатики. Специальность информационные системы и сети. Работаю программистом. Так что хобби переросло в профессию.:D В любимую профессию... В этом смысле мне повезло... И даже очень...
Спасибо за подсказку, но все же ход моих мыслей был правильным! У меня была такая мысль использовать коефициенты, но что-то зятормозил...
Думаю теперь проблем не должно быть, единственное со временем сейчас трудно но постараюсь как можно быстрее.
Я тоже очень люблю програмирование, хоть работа чуть другого плана. Я работаю в банке в отделе обслужевания физ. лиц, заразил меня этим хобби мой сотрудник, который програмирует на Delphi, но я почемуто как-то интуетивно потянулся в VB. Сразу видно почерк настоящего профи, я догадывался что для тебя это не просто хобби. Надеюсь на дальнейшее сотрудничестиво и буду очень признателен если ты мне поможеш стать профи!!!
Спасибо за подсказку, но все же ход моих мыслей был правильным! У меня была такая мысль использовать коефициенты, но что-то зятормозил...
Думаю теперь проблем не должно быть, единственное со временем сейчас трудно но постараюсь как можно быстрее.
Я тоже очень люблю програмирование, хоть работа чуть другого плана. Я работаю в банке в отделе обслужевания физ. лиц, заразил меня этим хобби мой сотрудник, который програмирует на Delphi, но я почемуто как-то интуетивно потянулся в VB. Сразу видно почерк настоящего профи, я догадывался что для тебя это не просто хобби. Надеюсь на дальнейшее сотрудничестиво и буду очень признателен если ты мне поможеш стать профи!!!
ОК:)