Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Даже не знаю с чего начать

2.0K
28 февраля 2004 года
Andi_SPAWN
69 / / 28.02.2004
Я новичок, теорию подчитал практики очень мало, среди всех моих знакомых не скем посоветоватся кто может помочь стать на ноги? Даже не знаю с чего начать!
Страницы:
266
28 февраля 2004 года
mhaturov
901 / / 23.10.2003
Цитата:
Originally posted by Andi_SPAWN
Я новичок, теорию подчитал практики очень мало, среди всех моих знакомых не скем посоветоватся кто может помочь стать на ноги? Даже не знаю с чего начать!


На чём собираешься начать писать? На VB6, VBA, VB.Net, VBE (енто для Excel'я)? Как определишься, подкину задачку, чтобы силы свои попробовал. Ну а там тебе тут (извиняюсь за каламбур) помогут.;)

1.2K
28 февраля 2004 года
Штурман
147 / / 01.08.2003
Если собираешься попробовать свои силы в VBA, то можешь начать отсюда http://www.firststeps.ru/vba/excel/vbaexcel1.html
но без бумажных учебников все равно не обойдешься.
2.0K
29 февраля 2004 года
Andi_SPAWN
69 / / 28.02.2004
Цитата:
Originally posted by mhaturov

На чём собираешься начать писать? На VB6, VBA, VB.Net, VBE (енто для Excel'я)? Как определишься, подкину задачку, чтобы силы свои попробовал. Ну а там тебе тут (извиняюсь за каламбур) помогут.;)





Спасибо за поддержку, вобщето на VB6! Жду с нетерпением!!!

266
01 марта 2004 года
mhaturov
901 / / 23.10.2003
Цитата:
Originally posted by Andi_SPAWN




Спасибо за поддержку, вобщето на VB6! Жду с нетерпением!!!


Вот те задачка. Её решение тебе потом пригодится при реальном программировании, поэтому, как решишь её, не выкидывай коды.
Создай форму, на которой будут 3 поля. При вводе символа (нажатии клавиши) в 1 поле во 2 должен возникать Ascii - код буквы (цифры) с клавиши, а в 3 KeyCode клавиши. Причём, если нажимаются служебные клавиши (Delete, BackSpase и т.п.) то во 2 поле пусть выводится подпись с названием клавиши, а в 3, её KeyCode.
Как возникнут вопросы - спрашивай - поможем :)
Если же задачка покажется слишком простой - пиши - подкину посложнее.;)

2.0K
02 марта 2004 года
Andi_SPAWN
69 / / 28.02.2004
Цитата:
Originally posted by mhaturov

Вот те задачка. Её решение тебе потом пригодится при реальном программировании, поэтому, как решишь её, не выкидывай коды.
Создай форму, на которой будут 3 поля. При вводе символа (нажатии клавиши) в 1 поле во 2 должен возникать Ascii - код буквы (цифры) с клавиши, а в 3 KeyCode клавиши. Причём, если нажимаются служебные клавиши (Delete, BackSpase и т.п.) то во 2 поле пусть выводится подпись с названием клавиши, а в 3, её KeyCode.
Как возникнут вопросы - спрашивай - поможем :)
Если же задачка покажется слишком простой - пиши - подкину посложнее.;)




Спасибо!!!

266
02 марта 2004 года
mhaturov
901 / / 23.10.2003
Цитата:
Originally posted by Andi_SPAWN



Спасибо!!!



Только, как будешь писать, сюда весь код не выкладывай - делай на своей машине, а сюда вопросы задавай. ОК?

2.0K
04 марта 2004 года
Andi_SPAWN
69 / / 28.02.2004
Цитата:
Originally posted by mhaturov


Только, как будешь писать, сюда весь код не выкладывай - делай на своей машине, а сюда вопросы задавай. ОК?





Задачка мне понравилась! Несколько раз менял концепцию кода и наконец получилось реализовать програму и максимально оптимизировать(я так счетаю). Код не большой и я хотел бы услышать твое мнение!:


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

2.0K
04 марта 2004 года
Andi_SPAWN
69 / / 28.02.2004
Цитата:
Originally posted by mhaturov


Только, как будешь писать, сюда весь код не выкладывай - делай на своей машине, а сюда вопросы задавай. ОК?





Если есть новая задачка буду рад! Спасибо за поддержку!

266
04 марта 2004 года
mhaturov
901 / / 23.10.2003
Цитата:
Originally posted by Andi_SPAWN




Если есть новая задачка буду рад! Спасибо за поддержку!


[QUOTE]Originally posted by Andi_SPAWN

Блин, просто очень хорошо! Очень.
Только лучше (это чисто моё субъективное мнение) intKeyCode объявлять не на уровне формы, а в процедурах, откуда эта переменная передаётся. Считается, что VB быстрее работает с локальными переменными. Ну и, по возможности, лучше вместо Integer использовать Long - занимает, дла VB в пямяти столько же места, а хранить может большие числа.
Сохрани этот проект. Он дальше очень даже пригодится, когда будешь работать с текстом и понадобится определять коды клавиш и символов.
Теперь задачка.
Эта гораздо интереснее, но, если решишь её, сможешь использовать во всех своих программах.
Значит так.
Как ты знаешь, VB позволяет перехватывать события возникновения многих ошибок при выполнении программы при помощи диррективы On Error.
Тебе очень даже пригодится процедура, которая ведёт лог-файл возникающих ошибок.
Суть в следующем. Например, есть процедура следующего вида:

 
Код:
Private Sub MySub()
On Error Goto ErrHng
  код процедуры
Exit Sub
ErrHng:
  Обращение к процедуре ведения лога ошибок
  Err.Clear
End Sub

Здесь в момент "Обращение к процедуре ведения лога ошибок" вызывается процедура, которой передаются:
- Код ошибки (Err.Number)
- Описание ошибки (Err.Description)
- Имя процедурв, ы которой возникла ошибка (просто строку передаёшь, например "MyForm.MySub" + "параметры процедуры, если есть, ну и т.д., что может тебе пригодиться")
- Имя файла, в который писать лог.
Вот пример вызова такой процедуры у меня, чтобы понятно всё было:
Код:
Private Sub CbCntHtl_KeyPress(Index As Integer, KeyAscii As Integer)
'МАХ отлавливаем нажатие кнопки пользователем (для подстановки)
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
__________________________________________________

2.0K
05 марта 2004 года
Andi_SPAWN
69 / / 28.02.2004
Цитата:
Originally posted by mhaturov

[QUOTE]Originally posted by Andi_SPAWN

Блин, просто очень хорошо! Очень.
Только лучше (это чисто моё субъективное мнение) intKeyCode объявлять не на уровне формы, а в процедурах, откуда эта переменная передаётся. Считается, что VB быстрее работает с локальными переменными. Ну и, по возможности, лучше вместо Integer использовать Long - занимает, дла VB в пямяти столько же места, а хранить может большие числа.
Сохрани этот проект. Он дальше очень даже пригодится, когда будешь работать с текстом и понадобится определять коды клавиш и символов.
Теперь задачка.
Эта гораздо интереснее, но, если решишь её, сможешь использовать во всех своих программах.
Значит так.
Как ты знаешь, VB позволяет перехватывать события возникновения многих ошибок при выполнении программы при помощи диррективы On Error.
Тебе очень даже пригодится процедура, которая ведёт лог-файл возникающих ошибок.
Суть в следующем. Например, есть процедура следующего вида:
 
Код:
Private Sub MySub()
On Error Goto ErrHng
  код процедуры
Exit Sub
ErrHng:
  Обращение к процедуре ведения лога ошибок
  Err.Clear
End Sub

Здесь в момент "Обращение к процедуре ведения лога ошибок" вызывается процедура, которой передаются:
- Код ошибки (Err.Number)
- Описание ошибки (Err.Description)
- Имя процедурв, ы которой возникла ошибка (просто строку передаёшь, например "MyForm.MySub" + "параметры процедуры, если есть, ну и т.д., что может тебе пригодиться")
- Имя файла, в который писать лог.
Вот пример вызова такой процедуры у меня, чтобы понятно всё было:
Код:
Private Sub CbCntHtl_KeyPress(Index As Integer, KeyAscii As Integer)
'МАХ отлавливаем нажатие кнопки пользователем (для подстановки)
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, но тем неменее это стимул, думаю, що здесь будет много вопросов, но я люблю трудности. Побробую!
__________________________________________________

266
05 марта 2004 года
mhaturov
901 / / 23.10.2003
Цитата:
Originally posted by Andi_SPAWN


А этот форум начто?;) Задавай вопросы - всегда поможем!:)

258
05 марта 2004 года
SergeySV
1.5K / / 19.03.2003
Цитата:
Originally posted by mhaturov

А этот форум начто?;) Задавай вопросы - всегда поможем!:)



Если ты уже пишешь такие сложные программы, то без обработчика ошибок обойтись никак нельзя, это не прихоть, а норма программирование. Советую разобраться, тем более что там абсолютно ничего сложного нет.

2.0K
08 марта 2004 года
Andi_SPAWN
69 / / 28.02.2004
Цитата:
Originally posted by mhaturov

А этот форум начто?;) Задавай вопросы - всегда поможем!:)




Вроде сделал, но хочу услышать мнение професиоанла. Единственное, что не удалось реализовать - это добавление записи в 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

258
09 марта 2004 года
SergeySV
1.5K / / 19.03.2003
Цитата:
Originally posted by Andi_SPAWN

Вроде сделал, но хочу услышать мнение професиоанла. Единственное, что не удалось реализовать - это добавление записи в log-файл в начало и при этом сохранить первые строки файла, подскажи???



Над этой задачей не один ты зубы обломал...

Тут как-то на одном форуме обсуждали эту проблему. Чисто технически это сделать невозможно, ведь если файл уже записан, то система может токо дописать его. Поэтому остается токо переписать его уже с новыми данными.

266
09 марта 2004 года
mhaturov
901 / / 23.10.2003
К сожалению, не могу сейчас подробно писать.
Вобщем, я сам это делаю следующим образом:
получаю весь текст из файла, отсекаю от него заголовок. Потом формирую переменную:
Заголовок + Новое сообщение от ошибки + Весь остальной текст.
Его и пишу по-новой в файл.
Кстати, у меня в процедуре. дабы лог-файл не раздувать, предусмотрен параметр, который отвечает за удаление устаревшей информации (например, если его активировать, можно удалять автоматом все записи, которые старше полугода). Правда, я этот параметр никогда ещё (кроме тестов) не активировал.
2.0K
10 марта 2004 года
Andi_SPAWN
69 / / 28.02.2004
Цитата:
Originally posted by mhaturov
К сожалению, не могу сейчас подробно писать.
Вобщем, я сам это делаю следующим образом:
получаю весь текст из файла, отсекаю от него заголовок. Потом формирую переменную:
Заголовок + Новое сообщение от ошибки + Весь остальной текст.
Его и пишу по-новой в файл.
Кстати, у меня в процедуре. дабы лог-файл не раздувать, предусмотрен параметр, который отвечает за удаление устаревшей информации (например, если его активировать, можно удалять автоматом все записи, которые старше полугода). Правда, я этот параметр никогда ещё (кроме тестов) не активировал.



Вчера мне пришла в голову эта мысль, но я столкнулся с другой проблемой. Я делал таким образом:
- откривал файл в режиме чтения;
- считывал из него даные в переменную;
- считывал в отдельную перменную заглавные строки;

В результате я имел три переменных, в первой - заголовок, во второй - новая запись, в третей - весь старый файл. Проблема заключалась в том, что старий файл тоже имел заглавные строки и я не знал как мне их удалить? Каким образом ты отсекаеш заголовок?

P.S. Может есть задачка?

2.0K
10 марта 2004 года
Andi_SPAWN
69 / / 28.02.2004
Цитата:
Originally posted by SergeySV


Над этой задачей не один ты зубы обломал...

Тут как-то на одном форуме обсуждали эту проблему. Чисто технически это сделать невозможно, ведь если файл уже записан, то система может токо дописать его. Поэтому остается токо переписать его уже с новыми данными.




Спасибо за совет! Я бы еще поупражнялся если есть какие-нибуть задачки присылай, буду благодарин!!!

258
10 марта 2004 года
SergeySV
1.5K / / 19.03.2003
Цитата:
Originally posted by Andi_SPAWN

Спасибо за совет! Я бы еще поупражнялся если есть какие-нибуть задачки присылай, буду благодарин!!!



Да, не часто можно встретить чтобы на форум приходили за новыми задачками и знаниями, обычно все больше приходят за готовыми рецептами, так что такое участие вдвойне приятно :)

266
10 марта 2004 года
mhaturov
901 / / 23.10.2003
Цитата:
Originally posted by Andi_SPAWN


Вчера мне пришла в голову эта мысль, но я столкнулся с другой проблемой. Я делал таким образом:
- откривал файл в режиме чтения;
- считывал из него даные в переменную;
- считывал в отдельную перменную заглавные строки;

В результате я имел три переменных, в первой - заголовок, во второй - новая запись, в третей - весь старый файл. Проблема заключалась в том, что старий файл тоже имел заглавные строки и я не знал как мне их удалить? Каким образом ты отсекаеш заголовок?

P.S. Может есть задачка?


У тебя же заголовок фиксированный - константа. На этой основе его и можно отсечь (либо по длинне, либо по тексту)

266
10 марта 2004 года
mhaturov
901 / / 23.10.2003
Цитата:
Originally posted by Andi_SPAWN



Спасибо за совет! Я бы еще поупражнялся если есть какие-нибуть задачки присылай, буду благодарин!!!


К вечеру придумаю что-нибудь ещё полезное для тебя. Ты, кстати, с ревайзом форм работал?

319
10 марта 2004 года
xelos
577 / / 27.02.2003
Цитата:
Originally posted by mhaturov

К вечеру придумаю что-нибудь ещё полезное для тебя. Ты, кстати, с ревайзом форм работал?


в продолжение об ошибках - попробуйте подкинуть задачу с отлавливанием исключений разных категорий. Не помню, правда, в VB6.0 есть ли он, но имхо, механизм исключений более гибкий, чем OnError.

258
10 марта 2004 года
SergeySV
1.5K / / 19.03.2003
Цитата:
Originally posted by xelos

в продолжение об ошибках - попробуйте подкинуть задачу с отлавливанием исключений разных категорий. Не помню, правда, в VB6.0 есть ли он, но имхо, механизм исключений более гибкий, чем OnError.



Это как?

266
10 марта 2004 года
mhaturov
901 / / 23.10.2003
Цитата:
Originally posted by xelos

в продолжение об ошибках - попробуйте подкинуть задачу с отлавливанием исключений разных категорий. Не помню, правда, в VB6.0 есть ли он, но имхо, механизм исключений более гибкий, чем OnError.


О, кстати, мысля. Часто возникает ситуация, когда с определённой вероятностью в программе может возникнуть ошибка, которую либо нужно игнорировать. либо нужно сделать так, чтобы пользователь не заметил её возникновения. Обычто начинающие программисты пишут так:

 
Код:
On Error Resume Next
   проблеммный блок кода
On Error GoTo 0

Но это не есть хорошо, так как в проблемном участке могут возникать различные ошибки, которые не должны такм возникать и которые нельзя игнорировать. Поэтому, конечно. хорошо этот случай как-то обрабатывать.
Подумай, как это можно обработать.
Подсказываю. Для решения этой задачи я, например, пользуюсь создаваемой областью обработки ошибок (метка ErrHng после диррективы Exit Sub).
266
10 марта 2004 года
mhaturov
901 / / 23.10.2003
да, сейчас повнимательнеее посмотрел твой код. Очень хорошо. Но для сравнения хочу предложить всой вариант. Ты их сравни. Возможно, твой в чём-то даже лучше окажется.
Единтственное, у меня под рукой только старый вариант моей процедуры, поэтому она дописывает ошибки в конец лог-файла, ну и ещё кое-какие мелочи не делает (новый я оформил в видк dll и сейчас неохота искать исходники):
Код:
Public Sub ErrDescr(Optional ErrNumb As Long, Optional ErrDescript As String, Optional ProcName As String)
'МАХ процедура пишет в 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
266
10 марта 2004 года
mhaturov
901 / / 23.10.2003
Я тут перечитал твой пост, ну и решил, что лучше сменить задачку.
Задачка такая:
Создай форму, на которой положи какие-либо элементы. Например, массив кнопок, текстбокс,и обязательно комбобокс. Сделай так, чтобы при ресайзе формы, расстояние между элементами пропорционально изменялось. Если же расстояние можду элементами слишком мало, пусть сжимаются сами элементы ;-) (это по поводу комбобокса - предупреждаю сразу). При увеличении размеров формы, соответственно, до определённой границы пусть "растут" элементы.
НО! Пускай при закрытии формы сведения о размерах сохраняются в ini-файл. Если прога его при запуске не находит, пусть открывается с какми-либо определёнными размерами, иначе пусть считывает из инишника свои размеры и ресайзится в соответствии с ними.
Работу с инишником оформи в виде отдельной процедуры в отдельном модуле.
Будут вопросы - обращайся.
Удачи!
Вот что значит, человеку интересно! Чувствую, скоро я у него буду советы спрашивать по многим вопросам. И это - не шутка.:!!!:
319
11 марта 2004 года
xelos
577 / / 27.02.2003
Цитата:
Originally posted by mhaturov
Я тут перечитал твой пост, ну и решил, что лучше сменить задачку.
Задачка такая:
Создай форму, на которой положи какие-либо элементы. Например, массив кнопок, текстбокс,и обязательно комбобокс. Сделай так, чтобы при ресайзе формы, расстояние между элементами пропорционально изменялось. Если же расстояние можду элементами слишком мало, пусть сжимаются сами элементы ;-) (это по поводу комбобокса - предупреждаю сразу). При увеличении размеров формы, соответственно, до определённой границы пусть "растут" элементы.
НО! Пускай при закрытии формы сведения о размерах сохраняются в ini-файл. Если прога его при запуске не находит, пусть открывается с какми-либо определёнными размерами, иначе пусть считывает из инишника свои размеры и ресайзится в соответствии с ними.
Работу с инишником оформи в виде отдельной процедуры в отдельном модуле.
Будут вопросы - обращайся.
Удачи!
Вот что значит, человеку интересно! Чувствую, скоро я у него буду советы спрашивать по многим вопросам. И это - не шутка.:!!!:


научили бы сначала человека Anchor и Dock использовать для контролов... или я опять не из той оперы??? я VS.NET пользую - все что я предлагаю - оттуда.

319
11 марта 2004 года
xelos
577 / / 27.02.2003
Цитата:
Originally posted by SergeySV


Это как?


через объект Exception.

2.0K
11 марта 2004 года
Andi_SPAWN
69 / / 28.02.2004
Цитата:
Originally posted by mhaturov

К вечеру придумаю что-нибудь ещё полезное для тебя. Ты, кстати, с ревайзом форм работал?





Нет не работал и даже не знаю что это! А за новое задание спасибо, буду думать, код твой сравню и напишу свое мнение.

2.0K
11 марта 2004 года
Andi_SPAWN
69 / / 28.02.2004
Цитата:
Originally posted by xelos

научили бы сначала человека Anchor и Dock использовать для контролов... или я опять не из той оперы??? я VS.NET пользую - все что я предлагаю - оттуда.





Я благодарен за внимание, но пока что я практикуюсь на VB6 но походу изучаю VB.NET, я думаю скоро я и к тебе за советом обращусь!

266
11 марта 2004 года
mhaturov
901 / / 23.10.2003
Цитата:
Originally posted by Andi_SPAWN




Нет не работал и даже не знаю что это! А за новое задание спасибо, буду думать, код твой сравню и напишу свое мнение.


Ресайз - это изменение положения и размеров формы и её элементов. В VB6 это работает не так, как в VB.Net. Если честно, то я застрял пока на 6 Студии и по Net мало что могу сказать. Ресайз в Net можно организовать автоматический и не заморачиваться кодом в 90% случаях. Но, чтобы понимать, как это происходит, стоит поиграть с этим в другой среде, например, VB6.
Поэтому погляди вышеописанную задачку про ресайз. Заодно попробуешь свои силы в работе с инишником (рекомендую поискать для этого соответствующие API - функции и написать свои процедуры и функции на их основе для чтения и записи инициализации).

319
11 марта 2004 года
xelos
577 / / 27.02.2003
Цитата:
Originally posted by mhaturov

Ресайз - это изменение положения и размеров формы и её элементов. В VB6 это работает не так, как в VB.Net. Если честно, то я застрял пока на 6 Студии и по Net мало что могу сказать. Ресайз в Net можно организовать автоматический и не заморачиваться кодом в 90% случаях. Но, чтобы понимать, как это происходит, стоит поиграть с этим в другой среде, например, VB6.
Поэтому погляди вышеописанную задачку про ресайз. Заодно попробуешь свои силы в работе с инишником (рекомендую поискать для этого соответствующие API - функции и написать свои процедуры и функции на их основе для чтения и записи инициализации).


Параллельно с ini файлами стоит посмотреть работу с базой регистров, т.к. по новой идеолгии мелкософта - ини файлы уже в прошлом :( вся конфигурация идет через базу регистров. Две темы параллельные, поэтому советую пользуясь случаем посмотреть обе концепции.

266
11 марта 2004 года
mhaturov
901 / / 23.10.2003
Цитата:
Originally posted by xelos

Параллельно с ini файлами стоит посмотреть работу с базой регистров, т.к. по новой идеолгии мелкософта - ини файлы уже в прошлом :( вся конфигурация идет через базу регистров. Две темы параллельные, поэтому советую пользуясь случаем посмотреть обе концепции.


Тоже дело. Но, на мой взгляд, пока можно только с инишником разобраться - это гораздо проще, да и надёжнее. Хотя, енто тоже посмотреть стоит...

266
16 марта 2004 года
mhaturov
901 / / 23.10.2003
Цитата:
Originally posted by mhaturov

Тоже дело. Но, на мой взгляд, пока можно только с инишником разобраться - это гораздо проще, да и надёжнее. Хотя, енто тоже посмотреть стоит...


Возникли проблемы с задачкой?
Задавай вопросы, а то скоро пост потеряется ;)

2.0K
21 марта 2004 года
Andi_SPAWN
69 / / 28.02.2004
Цитата:
Originally posted by mhaturov

Возникли проблемы с задачкой?
Задавай вопросы, а то скоро пост потеряется ;)





Немного со временен проблемы, работа! Вопросов пару есть,
во-первых: ты рекомендуеш API функции, я что-то слишал но точно не знаю, какие именно ф-и к ним относятся?

2.0K
21 марта 2004 года
Andi_SPAWN
69 / / 28.02.2004
Цитата:
Originally posted by mhaturov

Возникли проблемы с задачкой?
Задавай вопросы, а то скоро пост потеряется ;)



Как работать с ини-файлом? Я свою литературу поднял там и слова не написано, может для этого есть специальный компонент или функция, если да то напиши? Что такое база регистров и где ее можна посмотреть?

266
22 марта 2004 года
mhaturov
901 / / 23.10.2003
Цитата:
Originally posted by Andi_SPAWN


Как работать с ини-файлом? Я свою литературу поднял там и слова не написано, может для этого есть специальный компонент или функция, если да то напиши? Что такое база регистров и где ее можна посмотреть?


ну начнём с инишника...
Я сам использую функции

Код:
'МАХ чтение INI
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


Их вызовы:

Код:
Public Function ReadINI(AppName As String, KeyName As String, PuthIni As String) As String
'МАХ Функция чтения 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

Эти процедуры я написал для облегчения работы с инишником...
Но, чтобы не делать всё за тебя, попробуй, разберись, как они работают, и лишь потом внедри их использование в свой проект.
Если будут вопросы - я всегда готов ответить. Обращайся.:)
Очень жду постов от тебя:)
2.0K
25 марта 2004 года
Andi_SPAWN
69 / / 28.02.2004
Цитата:
Originally posted by mhaturov

ну начнём с инишника...
Я сам использую функции
Код:
'МАХ чтение INI
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


Их вызовы:

Код:
Public Function ReadINI(AppName As String, KeyName As String, PuthIni As String) As String
'МАХ Функция чтения 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. Задачка сложная и меня это подстегивает, кстати всегда хотел тебя спросить, ты програмист или это как и для меня хобби?

266
25 марта 2004 года
mhaturov
901 / / 23.10.2003
Цитата:
Originally posted by Andi_SPAWN




Я докупил професиональную литературу, где описано API функции и работа с инишником. Хочу САМ разобратся!!! У меня час штопор в другом...
Никак не получаеться написать код под событие Resize.
Я делал так:
-после расстановки елементов управления, фиксировал их координаты и размеры при инициализации;
-объявил две константы (минимальное и максимальное растояние между елементами);
-затем в процедуре Resize ставил условие:
разница координат между елементами дожна быть больше минимального значения и меньше макимального;

Но при запуске програмная сред=а просто зависала. Я больше чем уверен, что это полная лажа! но никакого другого альтернативного решения в голову не приходит, подскажи за что зацепится!?


P.S. Задачка сложная и меня это подстегивает, кстати всегда хотел тебя спросить, ты програмист или это как и для меня хобби?


Знать так...
Для отлова ошибки уобно пользоваться брейкпоинтами.
В начале процедуры кликаешь по левому полю напротив значащего оператора. При этом он начинает подсвечиваться. Можно так же поставить курсор на значащий оператор, например на название процедёры и в меню Debug выбоать пункт Toggle Breackpoint. после этого программа приостанови своё выполнение на выделенной строке. Затем по нажатию на F8 можно добиться того, чтобы программа перешла к следующей строке. По Shift+F8 программа перейдёт к строке текущей процедуры, скрыто выполнив инструкции из других процедур. По F5 программа продолжит выполнение в обычном режиме (поэкспериментируй с этим). Таким образом ты сможешь найти место, где программа зацикливается.
Ресайз же я реализую обычно так:
Задаю константы иаксимальных и минимальных размеров элементов и минимальных расстояний мажду ними. Кроме того, вычисляю коэфициенты расстояний междё элементами в привязке к размерам формы. Например, расстояние по горизонтали от элемента 1 до элемента 2 должно быть 1/3 ширины формы.
Так же создаю коэфициенты для малых расстояний, исходя из которых в случае, если расстояние можду элементами равно минимальному, будут изменяться размеры элементов.
При ресайзе смотрю расстояние между элементами. Если оно меньше минимально допустимого, изменяю размеры элементов. Если уменьшать некуда, делаю досрочный выход из ресайза через Exit Sub.
Если расстояние достигло максимального, при котором изменяются размеры элементов, начинаю растягивать элементы. Если элементы растянуты, начинаю опять увеличивать расстояние.
Если а не ясно выразился, ты напиши сюда - я выложу какой - нибудь маленький примерчик.
А по поводу работы... Сначала программирование было увлечением. В школе в УПК получил специальность несуществующую "оператор-программист".
Учился в Серпуховском Военном Институте РВСН по специальности инжинер СУ беспилотных летательных аппаратов, командир группы подготовки и пуска. Сейчас заканчиваю Московскую Государственную Академику Приборостроения и Информатики. Специальность информационные системы и сети. Работаю программистом. Так что хобби переросло в профессию.:D В любимую профессию... В этом смысле мне повезло... И даже очень...

2.0K
26 марта 2004 года
Andi_SPAWN
69 / / 28.02.2004
Цитата:
Originally posted by mhaturov

Знать так...
Для отлова ошибки уобно пользоваться брейкпоинтами.
В начале процедуры кликаешь по левому полю напротив значащего оператора. При этом он начинает подсвечиваться. Можно так же поставить курсор на значащий оператор, например на название процедёры и в меню Debug выбоать пункт Toggle Breackpoint. после этого программа приостанови своё выполнение на выделенной строке. Затем по нажатию на F8 можно добиться того, чтобы программа перешла к следующей строке. По Shift+F8 программа перейдёт к строке текущей процедуры, скрыто выполнив инструкции из других процедур. По F5 программа продолжит выполнение в обычном режиме (поэкспериментируй с этим). Таким образом ты сможешь найти место, где программа зацикливается.

Ресайз же я реализую обычно так:
Задаю константы иаксимальных и минимальных размеров элементов и минимальных расстояний мажду ними. Кроме того, вычисляю коэфициенты расстояний междё элементами в привязке к размерам формы. Например, расстояние по горизонтали от элемента 1 до элемента 2 должно быть 1/3 ширины формы.
Так же создаю коэфициенты для малых расстояний, исходя из которых в случае, если расстояние можду элементами равно минимальному, будут изменяться размеры элементов.
При ресайзе смотрю расстояние между элементами. Если оно меньше минимально допустимого, изменяю размеры элементов. Если уменьшать некуда, делаю досрочный выход из ресайза через Exit Sub.
Если расстояние достигло максимального, при котором изменяются размеры элементов, начинаю растягивать элементы. Если элементы растянуты, начинаю опять увеличивать расстояние.
Если а не ясно выразился, ты напиши сюда - я выложу какой - нибудь маленький примерчик.
А по поводу работы... Сначала программирование было увлечением. В школе в УПК получил специальность несуществующую "оператор-программист".
Учился в Серпуховском Военном Институте РВСН по специальности инжинер СУ беспилотных летательных аппаратов, командир группы подготовки и пуска. Сейчас заканчиваю Московскую Государственную Академику Приборостроения и Информатики. Специальность информационные системы и сети. Работаю программистом. Так что хобби переросло в профессию.:D В любимую профессию... В этом смысле мне повезло... И даже очень...






Спасибо за подсказку, но все же ход моих мыслей был правильным! У меня была такая мысль использовать коефициенты, но что-то зятормозил...
Думаю теперь проблем не должно быть, единственное со временем сейчас трудно но постараюсь как можно быстрее.
Я тоже очень люблю програмирование, хоть работа чуть другого плана. Я работаю в банке в отделе обслужевания физ. лиц, заразил меня этим хобби мой сотрудник, который програмирует на Delphi, но я почемуто как-то интуетивно потянулся в VB. Сразу видно почерк настоящего профи, я догадывался что для тебя это не просто хобби. Надеюсь на дальнейшее сотрудничестиво и буду очень признателен если ты мне поможеш стать профи!!!

266
26 марта 2004 года
mhaturov
901 / / 23.10.2003
Цитата:
Originally posted by Andi_SPAWN





Спасибо за подсказку, но все же ход моих мыслей был правильным! У меня была такая мысль использовать коефициенты, но что-то зятормозил...
Думаю теперь проблем не должно быть, единственное со временем сейчас трудно но постараюсь как можно быстрее.
Я тоже очень люблю програмирование, хоть работа чуть другого плана. Я работаю в банке в отделе обслужевания физ. лиц, заразил меня этим хобби мой сотрудник, который програмирует на Delphi, но я почемуто как-то интуетивно потянулся в VB. Сразу видно почерк настоящего профи, я догадывался что для тебя это не просто хобби. Надеюсь на дальнейшее сотрудничестиво и буду очень признателен если ты мне поможеш стать профи!!!



ОК:)

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог