Страницы: 1 2 След.
RSS
Изменение всех Label на форме, написать вложенный цикл
 
Доброго времени суток.

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

Необходимо сравнивать текущее системное время и подсвечивать соответствующий лейбл.
Написал функцию, в которой возвращаем системное время в часах, и сравниваем ее с названием лейбла. Нужна именно функция, потому что в конечном счете будет таблица из 552 лейблов.(23х24, где ряды это часы, а строки A-W как в Excel ) Поэтому два вложенных цикла, один проходит по всем лейблам, второй по каждому из 24. (например А0-А23)
Код
Private Sub HourReload()
CurrentHour = Hour(Now)
Dim lblHour As Integer
Dim lblname As Control

For Each lblname In ChartFrame 'название рамки объединяющей все лейблы
 If TypeOf lblname Is Label Then
        For i = 0 To 23
        If lblname Like "*i" Then lblHour = i
        Next i
 End If
Next lblname


If lblHour <> CurrentHour Then
   lbl.BackColor = &H80000004
Else
   lbl.BackColor = &HC0E0FF
End If
End Sub  
 
В текущем виде ошибка *438 (lblname = Nothing)
 
Видел как то на форуме форму . где ТС не понимал, почему ошибка вылетает при ее активации, так там столько элементов ActiveX было что по моему даже с 8гб памяти комп не потянул, не боитесь с таким количеством лейблов , что будет немного притормаживать?
"Все гениальное просто, а все простое гениально!!!"
 
Цитата
Nordheim написал:
не боитесь с таким количеством лейблов , что будет немного притормаживать
Ну попробовать же интересно))) Но к конкретной задаче это не относится)
 
только сейчас понял, что видимо сравнение с передачей в маску "*i" итератора работать не будет. А как тогда можно сделать?
 
Doctorbol, приложили бы форму (с 24-мя хотя бы) лэйблами и рамкой в виде файла.
Отсюда виден косяк (и даже не один) в строке
Код
If lblname Like "*i" Then lblHour = i

Но гадать, что у Вас на самом деле делается в форме нет желания.
 
.Пока писал, просветление случилось.
Попробуйте так-
Код
If lblname.name = "A" & i Then lblHour = i
Изменено: Апострофф - 04.12.2018 21:11:14
 
"*i" Это у Вас как текст идет, а не как переменная
Вот этот цикл
Код
       For i = 0 To 23
        If lblname Like "*i" Then lblHour = i
        Next i

для меня загадка, зачем он вообще нужен?
Изменено: Nordheim - 04.12.2018 21:11:20
"Все гениальное просто, а все простое гениально!!!"
 
Вот форма
 
Цитата
Doctorbol написал:
(например А0-А23)
Это имена лейблов или значения? Если имя то смысл в цикле вообще?
Изменено: Nordheim - 04.12.2018 21:13:39
"Все гениальное просто, а все простое гениально!!!"
 
Код
Me.Controls("A" & Hour(Now)).BackColor = &HC0E0FF
"Все гениальное просто, а все простое гениально!!!"
 
Цитата
Nordheim написал:
Это имена лейблов или значения? Если имя то смысл в цикле вообще?
Смысл вот в чем. Делаю функцию с универсальным циклом в котором проходим по всем значениям от 0 до 23, а значение индекса (A,B,C и т.д.) передается из имени конкретного лейбла. Первый цикл берет лейбл с формы, второй прогоняет его по 24 часам.
 
Ну прогнали вы все лейблы все равно переменная i будет ориентирована по последнему лейблу, так зачем все это гонять то?
Изменено: Nordheim - 04.12.2018 21:21:31
"Все гениальное просто, а все простое гениально!!!"
 
Цитата
Doctorbol написал:
Первый цикл берет лейбл с формы, второй прогоняет его по 24 часам.
В чем фишка, что вы с этим дальше делаете, в коде так ничего.
Изменено: Nordheim - 04.12.2018 21:24:39
"Все гениальное просто, а все простое гениально!!!"
 
У Вас Label`s a00...a23, поэтому
Код
Me.Controls("A" & FORMAT(Hour(Now),"00")).BackColor = &HC0E0FF
будет правильнее.
 
Nordheim,по моему замыслу, цикл должен прогонять лейблы и по их имени присваивать в переменную lblHour соответствующее значение, затем сравнивать переменную lblHour с СurrentHour и если совпадает, то перекрашивать леибл.
 
Цитата
Апострофф написал:
будет правильнее.
и соответственно цикл, не нужен, ну разве только для изменения цвета, у уже выделенного
"Все гениальное просто, а все простое гениально!!!"
 
Может как-то проще можно было бы сделать?
 
Цитата
Doctorbol написал:
затем сравнивать переменную lblHour с СurrentHour
Так у Вас сравнение вне цикла или я что то не понимаю.
"Все гениальное просто, а все простое гениально!!!"
 
Цитата
Doctorbol написал:
Может как-то проще можно было бы сделать?
В сообщении №15 показано как проще сделать.
"Все гениальное просто, а все простое гениально!!!"
 
Цитата
Nordheim написал:
В сообщении №15 показано как проще сделать.
Апострофф,

Спасибо огромное, заработало!
 
Doctorbol, идея была от Nordheim, ему аплодируйте.
 
Цитата
Doctorbol написал:
заработало!
Я бы циклом сначала цвет у всех лейблов сделал одинаковым, а только после этого использовал
Код
Me.Controls("A" & FORMAT(Hour(Now),"00")).BackColor = &HC0E0FF
"Все гениальное просто, а все простое гениально!!!"
 
там не все лейблы одного цвета
 
Но если какой-то уже был подсвечен его нужно вернуть к исходному состоянию иначе будет подсвечено 2 текущий и тот второй.
"Все гениальное просто, а все простое гениально!!!"
 
Еще  в продолжение этой темы. Решил сделать вокруг выделенных лейблов рамку. Рамку тоже прозрачным лейблом с красными краями.
для премещения рамки вариант с просто изменением параметра .left
Код
If Hour(Now) = 0 Then Me.lblTimeLine.Left = 270
......................... и так 24 раза
работает  все как надо
но хочу изящнее сделать и сократить код. И вот тут ничего не получается. В чем может быть ошибка?
Код
If Hour(Now) >= 0 And Hour(Now) <= 8 Then
    For j = 0 To 8
    Me.lblTimeLine.Left = 270
        If Hour(Now) = j Then Me.lblTimeLine.Left = Me.lblTimeLine.Left + 18 * j
        Next j
Else
    For y = 0 To 15
    Me.lblTimeLine.Left = 0
        For x = 9 To 23
        If Hour(Now) = x Then Me.lblTimeLine.Left = Me.lblTimeLine.Left + 18 * y
        Next x
    Next y
End If
Изменено: Doctorbol - 05.12.2018 20:23:49
 
Doctorbol, Вы в циклах двигаете один и тот же lblTimeLine.
Зачем?
 
Куча циклов, в чем смысл не совсем понятно? Может подробней опишете, что в итоге нужно?
"Все гениальное просто, а все простое гениально!!!"
 
Цитата
Doctorbol написал:
...и так 24 раза
В таком случае Вы увидите результат, который получился после 24-ой итерации. Зачем?
 
Короче так. В первом посте видна последовательность лейблов. Там с 9 до 23 и с 0 до 8. Поэтому первый цикл должен двигать рамку с 0 до 8, второй с 9 до 23. Первый цикл запускается, если условие Hour(Now) соответствует от 0 до 8. Второй цикл вложенный, первый проходит 15 итераций для продвижения с 9 часов до 23, второй вложенный цикл для значения передаваемого в расчет сдвига.  
Страницы: 1 2 След.
Наверх