Помощь в VBA

Нужна помощь в написании комментариев к коду в VBA

Option Explicit ‘ Оператор, используемый чтобы обеспечить обязательное объявление всех используемых переменных

Public shp() As Shape, i As Long, j As Long, POLEWidth As Long, POLEHeight As Long, CellColor(1 To 5) As Long, numColor As Long ‘ оператор, используемый чтобы делать переменную доступной во всех процедурах всех модулей VBA в проекте

Private Const INF As Double = 1E+100 'значение бесконечности

Private Const maxEdge As Long = 8 'максимальное кол-во ребер для каждой вершины

Private Type Vertex 'тип для описания вершин

name As String 'наименование вершины

d As Double 'дистанция до текущей вершины

p As Long '"предок" до текущей вершины

u As Boolean 'метка о прохождении вершины, используется в алгоритме Дейкстры

edgeCount As Long 'количество ребер

nGraph(1 To maxEdge) As Long 'массив смежных вершин

dGraph(1 To maxEdge) As Double 'массив дистанций до смежных вершин

End Type

Public Sub Initialize ColorArray()

CellColor(1) = Навигатор.BackColor

CellColor(2) = vbGreen

CellColor(3) = vbRed

CellColor(4) = vbBlue

CellColor(5) = vbMagenta

SetColorLabel

End Sub

Public Sub SetPole()

POLEWidth = Val(Навигатор.txtPOLEWidth.Text): POLEHeight = Val(Навигатор.txtPOLEHeight.Text)

If POLEWidth < 10 Then POLEWidth = 10: Навигатор.txtPOLEWidth.Text = POLEWidth

If POLEHeight < 10 Then POLEHeight = 10: Навигатор.txtPOLEHeight.Text = POLEHeight

If POLEWidth > 100 Then POLEWidth = 100: Навигатор.txtPOLEWidth.Text = POLEWidth

If POLEHeight > 100 Then POLEHeight = 100: Навигатор.txtPOLEHeight.Text = POLEHeight

Dim ind As Long

ReDim shp(1 To POLEHeight, 1 To POLEWidth)

SetColorLabel

For i = 1 To POLEHeight

For j = 1 To POLEWidth

ind = ind + 1

On Local Error Resume Next

Load Навигатор.shpCell(ind)

Навигатор.shpCell(ind).Visible = True

Навигатор.shpCell(ind).Left = Навигатор.shpCell(ind).Width * (j - 1)

Навигатор.shpCell(ind).Top = Навигатор.shpCell(ind).Height * (i - 1)

Навигатор.shpCell(ind).FillColor = CellColor(1) ' CellColor(1)

Навигатор.shpCell(ind).FillStyle = 0

Set shp(i, j) = Навигатор.shpCell(ind)

Next j, i

Навигатор.frPOLE.Visible = True: Навигатор.frPOLE.Width = POLEWidth * Навигатор.shpCell(0).Width: Навигатор.frPOLE.Height = POLEHeight * Навигатор.shpCell(0).Height: 'Command2.Enabled = False

Навигатор.btnSTART.Enabled = True: Навигатор.btnSTOP.Enabled = True: Навигатор.btnFindPath.Enabled = True

End Sub

Public Sub SetColorLabel()

Навигатор.lblColor(2).BackColor = CellColor(2): Навигатор.lblColor(3).BackColor = CellColor(3): Навигатор.lblColor(4).BackColor = CellColor(4): Навигатор.lblColor(5).BackColor = CellColor(5):

End Sub

Public Sub SetCell(ByVal s As String)

Dim c As Long, k As Long, iter As Long, rn As Long, f As Boolean

Select Case s

Case "start": c = CellColor(2)

Case "stop": c = CellColor(3)

End Select

Do

iter = iter + 1

rn = Int(Rnd * POLEWidth * POLEHeight + 1)

If Навигатор.shpCell(rn).FillColor = CellColor(1) Then Навигатор.shpCell(rn).FillColor = c: f = True: Exit Do

Loop Until iter > 1000

Select Case s

Case "start": INFO "Старт" & IIf(f, " ", " не ") & "установлен ", IIf(f, vbBlue, vbRed)

Case "stop": INFO "Финиш" & IIf(f, " ", " не ") & "установлен ", IIf(f, vbBlue, vbRed)

End Select

End Sub

Public Sub ClearCell(ByVal s As String)

Select Case s

Case "start"

For i = 1 To POLEHeight

For j = 1 To POLEWidth

If shp(i, j).FillColor = CellColor(2) Then shp(i, j).FillColor = CellColor(1): Exit Sub

Next: Next

Case "stop"

For i = 1 To POLEHeight

For j = 1 To POLEWidth

If shp(i, j).FillColor = CellColor(3) Then shp(i, j).FillColor = CellColor(1): Exit Sub

Next: Next

Case "path"

For i = 1 To POLEHeight

For j = 1 To POLEWidth

If shp(i, j).FillColor = CellColor(5) Then shp(i, j).FillColor = CellColor(1)

Next: Next

Case "wall"

For i = 1 To POLEHeight

For j = 1 To POLEWidth

If shp(i, j).FillColor = CellColor(4) Then shp(i, j).FillColor = CellColor(1)

Next: Next

End Select

Call INFO

End Sub

Public Sub SetWall()

Навигатор.btnSTOP.Enabled = True: Навигатор.btnSTART.Enabled = True: Навигатор.btnFindPath.Enabled = True

If POLEHeight < 10 Then Exit Sub

ClearCell "path"

Dim k As Long, iter As Long, X As Long, rn As Long: k = Val(Навигатор.txtCountWalls.Text)

If (k <=

0 Or k > POLEHeight * POLEWidth - 2) And Навигатор.OpSet(4).Value = True Then INFO "Задано слишком большое число препятствий.", vbRed: Exit Sub

If Навигатор.OpSet(5).Value = True Then

MsgBox "Кликайте по полю для установки преград."

Else

ClearCell "wall"

Do

iter = iter + 1

rn = Int(Rnd * POLEWidth * POLEHeight + 1)

If Навигатор.shpCell(rn).FillColor = CellColor(1) Then

X = X + 1

Навигатор.shpCell(rn).FillColor = CellColor(4)

End If

Loop Until X >= k Or iter > 100000

INFO "Установлено препятствий: " & X

End If

End Sub

Public Function GetCountWalls() As Long

Dim k As Long

For i = 1 To POLEHeight

For j = 1 To POLEWidth

If shp(i, j).FillColor = CellColor(4) Then k = k + 1

Next: Next

GetCountWalls = k

End Function

Public Function GetNumber(ByVal X As Single, Y As Single, Optional ByRef i As Long = 1, Optional ByRef j As Long = 1) As String

i = Int(1 + (Y / Навигатор.shpCell(0).Height)): j = Int((X / Навигатор.shpCell(0).Width) + 1)

GetNumber = i & " | " & j

End Function

Public Sub INFO(Optional ByVal s As String = "", Optional ByVal c As Long = vbBlue)

Навигатор.lblINFO.Caption = s: Навигатор.lblINFO.ForeColor = c

End Sub

Public Sub SoftIceFind()

'Dim nP As Long, kP As Long, a() As Long

'a = GetArray(nP, kP)

'Call MyDijkstra(a, nP, kP)

INFO "Путь не найден"

End Sub

Вы смотрите срез комментариев. Показать все
1
Автор поста оценил этот комментарий

Ээээ... что именно сделать надо?

раскрыть ветку (16)
Автор поста оценил этот комментарий

Написать комментарий к каждой строке (что обозначает каждая строка)

раскрыть ветку (15)
3
Автор поста оценил этот комментарий

Сколько предлагаешь за работу?

раскрыть ветку (14)
1
Автор поста оценил этот комментарий

Сколько хочешь? В пределах разумного

раскрыть ветку (13)
1
Автор поста оценил этот комментарий

Так, давай сначала о разумном - в принципе я разобрался что и как код делает, и даже почти всё закомментировал. Но комментировать каждую строчку? Даже объявление переменных циклов?

раскрыть ветку (4)
Автор поста оценил этот комментарий

Я на бейсике не кодил лет 15, там разве доктрину комментирования до сих пор не ввели, например для автоматической генерации api-документации?

раскрыть ветку (3)
1
Автор поста оценил этот комментарий

Это, судя по всему, VB 6.0 - там уже давно ничего нового не вводят.

раскрыть ветку (2)
1
Автор поста оценил этот комментарий
Иллюстрация к комментарию
раскрыть ветку (1)
1
Автор поста оценил этот комментарий

А сколько кода на нём до сих пор вертится. А сколько людей вынуждено всё это поддерживать.

Иллюстрация к комментарию
Автор поста оценил этот комментарий
В общем вот, бесплатно:

https://pastebin.com/9RJAmzZ9


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

раскрыть ветку (7)
1
Автор поста оценил этот комментарий

Спасибо большое, очень помогли.

раскрыть ветку (6)
Автор поста оценил этот комментарий

Кстати, если не секрет, это ведь лаба по алгоритму Дейкстры?

раскрыть ветку (5)
Автор поста оценил этот комментарий

Это не лаба, это Расчётно-графическая работа. Приложение, которое находит путь от одной точки к другой, обходя препятствия.

раскрыть ветку (4)
Автор поста оценил этот комментарий

Ясно. Это я к тому, что у меня есть несколько советов по улучшению кода, но я помню что ты просил проставить комментарии, а не обзор кода, поэтому я готов их озвучить только если ты захочешь их слушать.

раскрыть ветку (3)
Автор поста оценил этот комментарий

Давай, буду рад этому)

раскрыть ветку (2)
Автор поста оценил этот комментарий

П.С.: это всё только советы, как бы сделал я на твоём месте.

Автор поста оценил этот комментарий

Извини за такую большую задержку. Если всё ещё актуально, то вот, самих советов не так много:


- не используй индексацию массивов от 1.


- кодируй типы ячеек не цветом, а int-ами через именованные константы, а функцию отрисовки переместить в форму, чтобы в ней уже шло сопоставление типа ячейки и цвета.


- перемести весь код управляющий формой или получающий данные из формы в саму форму. Данные формы (какие кнопки нажаты, какие пункты меню отмечены) должны обрабатываться в первую очередь и уже по результатам обработки должны вызываться функции модуля, сами функции модуля должны принимать данные из формы в виде аргументов и возвращать результат, например количество заполненных ячеек или успех / неудачу выполнения функции, а реакцию на результаты выполнения (сообщения, изменения статусной строки) должна отображать уже сама форма.


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


https://pastebin.com/MQhWUPB8


Сама функция должна возвращать количество заполненных ей ячеек. При реализации можно будет сделать более общую функцию, которая будет принимать тип искомой ячейки и тип заполняющей ячейки.

Вы смотрите срез комментариев. Чтобы написать комментарий, перейдите к общему списку