Search
Write a publication
Pull to refresh
1
0
Send message

Только там не 320x240, а 352x288(?) Не припомню.

Полный размер экрана "гуляет" в зависимости от клона.

Все-таки графический режим Спекки - 256х192. А если писать на асме и немного извратиться, используя бордюр, то можно расшириться до 320х240. Рекомендую поискать в сети и посмотреть демки 64к. Там ребята вытворяли невероятное.

Делал в своё время частотомер на AT90S2313. Контроллер, дешифратор (ИД7, если не изменяет склероз), светодиодный индикатор на 8 разрядов. Программу писал на ASM'е в AVRStudio. Измерял частоту, период, длину положительного и отрицательного импульсов до 1 MHz (режим измерения переключался последовательно нажатием одной кнопки). Вроде даже плата до сих пор в кладовке где-то лежит.

А что мешает использовать двойную адресацию? Внешняя - 1-255, внутренняя - произвольная. Опрашиваются 255max адресов, слэйв в ответе пересылает свой внутренний адрес.

RS485 - это интерфейс. По спецификации поддерживает подключение до 256 устройств, т.е. в 32-битном адресе нет смысла. О протоколе, к-рый (якобы) используется в данном опусе - ни слова. И при описанном алгоритме получить 100% результат - маловероятно. Причина банальна: помехи. Именно поэтому используются кодированный запрос/кодированный ответ.

Вы уверены, что платформа идет с ОС по умолчанию?

Да, начиная с Висты.

Писать приложение на VB.NET для системы, где dotNET отсутствует... Сильно... Для WinXP? Т.к. начиная с Висты dotNET ставится с ОС по умолчанию.

Не проще ли написать надстройку на VBA, к-рая не создаст никаких проблем на ограниченном аккаунте?

У меня вопрос по fnRC2A1B2(1, 1, nn, 1) — нафига? Почему не: With CFG.Cells(1, 1).Resize(nn, 1)?

Это старая история... Как-то столкнулся с тем, что конструкция вида Sheet.Range(Cells(1, 1), Cells(2,2)) не работает на неактивном листе. В то же время Sheet.Range("A1:B2") отрабатывает без каких либо проблем. Недолго думая набросал функцию перевода координат из формата R1C1 в формат A1 и на этом успокоился. (программист ленив... :D ) Про Resize мне в то время не попалось, да и функция оказалась удобной. Висит у меня в надстройке, если надо быстро узнать диапазон в формате A1, то формула работает прямо на листе. А так да, если рассматривать с точки зрения избыточности, то без нее можно обойтись. ( и да, я в курсе, что можно записать и так: Sheet.Range(Sheet.Cells(1, 1), Sheet.Cells(2,2)) и оно будет работать, но мне такая запись не понравилась. :-) )

По сути верно, происходит конфликт форматов, что и нужно учитывать при использовании Value. Или использовать другой метод.

Поэтому ситуация «ой, мне надо еще пару строк в конфиг» — типичная.

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

Ну и, чтобы не быть голословным, вот пример функции чтения/записи по заданному ключу:

Option Explicit

Private Function fnRC2A1B2(vRow1 As Long, vCol1 As Integer, vRow2 As Long, vCol2 As Integer) As String
    fnRC2A1B2 = Split(Cells(1, vCol1).Address(True, False, xlA1), "$")(0) + CStr(vRow1) + ":" + _
        Split(Cells(1, vCol2).Address(True, False, xlA1), "$")(0) + CStr(vRow2)
End Function

Function fnDataConfig(aKey As Variant, Optional aItem As Variant = Empty) As Variant
Dim c As Object, nn As Long
    nn = CFG.Cells(Rows.Count, 1).End(xlUp).Row
    With CFG.Range(fnRC2A1B2(1, 1, nn, 1))
        Set c = .Find(What:=aKey, After:=CFG.Cells(nn, 1), LookIn:=xlValues, LookAt:=xlWhole)
        If Not c Is Nothing Then
            If aItem = Empty Then
                fnDataConfig = c.Offset(0, 1).Value
            Else
                c.Offset(0, 1).Value = aItem
                fnDataConfig = True
            End If
        Else
            If aItem = Empty Then
                fnDataConfig = "Not Found"
            Else
' ===== необходимость добавления весьма сомнительна
'                CFG.Cells(nn + 1, 1).Value = aKey
'                CFG.Cells(nn + 1, 2).Value = aItem
'                fnDataConfig = "Not Exists, Added"
' =====
                fnDataConfig = "Not Exists"
            End If
        End If
    End With
    Set c = Nothing
End Function

подозреваю, что конфиг автора не очень большой, так что разница будет неощутимой.

А качество кода в расчет уже не берется? По сути, опубликованное выше можно охарактеризовать, как "bloatware", т.к. налицо явная избыточность. К тому же Find работает значительно быстрее цикла, на списке в 1000 строк при чтении последнего ключа разница в порядок, т.е. в 10 раз.

Ну и напоследок вишенка на торт: если в вышеприведенном творчестве задать ключ "10", например (подойдет любое число в строковом формате), то при перезаписи этого ключа он будет дописываться в конец таблицы, а прочитать его значение не получится.

Для наглядности:

ConfigSheet.Config("10") = "тест"

данная конструкция при каждом вызове будет добавлять новую запись. В то же время записанное значение не читается:

aa = ConfigSheet.Config("10")

переменная получает значение Empty. (причина, надеюсь, ясна)

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

А зачем так громоздко? Да еще и циклы... (для справки: можно использовать Find) Как понял, все сводится к "прочитать/записать/добавить/удалить". Решается тремя функциями, работает на порядок быстрее.

Information

Rating
Does not participate
Location
Санкт-Петербург, Санкт-Петербург и область, Россия
Registered
Activity