Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.59/27: Рейтинг темы: голосов - 27, средняя оценка - 4.59
3 / 3 / 0
Регистрация: 20.07.2012
Сообщений: 50
1

Как наложить на форму количество лейблов, соответствующих количеству дней в месяце?

31.07.2012, 11:01. Показов 5336. Ответов 22
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте!
Продолжаю писать прогу "график работы" и возник вопрос...
Как не вручную, а программно положить на форму лейблов, число которых будет соответствовать числу дней в месяце?
Предыдущий вариант моей программы использовал заготовленную форму с 31 лейблом, что не очень удобно, так как в разных месяцах, разное количество дней(что сбивает с понтолыги юзера))...

P.S. как программно убирать с формы её элементы(лейблы, текстбоксы, кнопки и т.д...) ?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.07.2012, 11:01
Ответы с готовыми решениями:

Обращение к количеству дней в месяце
Добрый день, нужно сделать подобие Exсel-ливского автозаполнения. Есть какой-нибудь способ...

Множества.Месяц 1..30 Описать функцию число дней (m), определяющую количество дней в месяце (n) не високосного года.
Месяц 1..30 Описать функцию число дней (m), определяющую количество дней в месяце (n) не...

Как обуздать дату? Вычислить количество дней в месяце?
Я создаю <select> тоесть список дней (1, 2....до 30). Вопрос так как в каждем месяце количество дне...

Как учесть в программе, что в месяце может быть разное количество дней?
Как учесть в программе что может быть и 28 и 29 и 30 и 31 день в месяце. Помогите пожалуйста ...

22
369 / 78 / 6
Регистрация: 23.05.2012
Сообщений: 232
31.07.2012, 12:03 2
Ну вот например для текстбокса
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Dim ctlText As VB.TextBox
 
Private Sub Command1_Click()
    Set ctlText = Controls.Add("VB.TextBox", "tb1", Form1) ' создаем текстбокс
    ctlText.Move 100, 100, 2500, 100                       ' изменяем размеры
    ctlText.Visible = True                                 ' делаем видимым
    
End Sub
 
Private Sub Command2_Click()
    Controls.Remove "tb1"                   'удалить контрол
End Sub
Добавлено через 21 минуту
P.S. программно убрать можно только программно же созданные контролы.
Попытка удалить контрол созданный в конструкторе приведет к еррору
P.P.S. - а зачем вам изменять количество лейблов? Не проще ли делать некоторые из них скрытыми согласно количеству дней?
1
3 / 3 / 0
Регистрация: 20.07.2012
Сообщений: 50
31.07.2012, 12:03  [ТС] 3
Это не совсем то, что я просил, но тем не менее похоже на правду))
Только выводится всего один текстбокс, а не количество соответствующее количеству дней в месяце..
А можно расписать подробно строку №4(каждое слово в ней) ?
Как сделать заготовленные на форме лейблы скрытыми?
И как тоже самое сделать с лейблами?))
0
Заблокирован
31.07.2012, 12:22 4
Цитата Сообщение от vfalex Посмотреть сообщение
Как сделать заготовленные на форме лейблы скрытыми?
Visual Basic
1
Label1.Visible = False
1
369 / 78 / 6
Регистрация: 23.05.2012
Сообщений: 232
31.07.2012, 12:34 5
пример с лабелем

Visual Basic
1
2
3
4
5
6
Private Sub Command3_Click()
    Set ctlLabel = Controls.Add("VB.Label", "Label1", Form1) ' создаем лейбл
    ctlLabel.Move 100, 100, 700, 300                         ' изменяем размеры и местоположение
    ctlLabel.Caption = "Лабель1"
    ctlLabel.Visible = True                                  ' делаем видимым
End Sub
по строке 4:
Set - присваивает переменной ссылку на объект
Controls.Add - добавляет новый элемент управления в форму
его параметры:
VB.Label - тип элемента управления
Label1 - имя элемента управления
Form1 - где размещать

Далее вы можете делать с элементом все что хотите в рамках его свойств.

P.S. - ctlLabel объявить не забудьте
1
3 / 3 / 0
Регистрация: 20.07.2012
Сообщений: 50
31.07.2012, 12:35  [ТС] 6
А как узнать количество дней в месяце?))
Вот текущая дата Day(Date)
А нет ли чего-то типа LastDay(Date) ? :-)
0
Заблокирован
31.07.2012, 12:39 7
Цитата Сообщение от vfalex Посмотреть сообщение
А как узнать количество дней в месяце?))
Visual Basic
1
msgbox DateSerial(Year(Date), Month(Date) + 1, 1) - DateSerial(Year(Date), Month(Date), 1)
0
3 / 3 / 0
Регистрация: 20.07.2012
Сообщений: 50
31.07.2012, 12:45  [ТС] 8
Цитата Сообщение от Апострофф Посмотреть сообщение
Visual Basic
1
msgbox DateSerial(Year(Date), Month(Date) + 1, 1) - DateSerial(Year(Date), Month(Date), 1)
Не понял как это работает и к чему привязать...
При запуске этой строки, прога выдает ошибку...((
0
369 / 78 / 6
Регистрация: 23.05.2012
Сообщений: 232
31.07.2012, 12:49 9
Цитата Сообщение от vfalex Посмотреть сообщение
При запуске этой строки, прога выдает ошибку...((

Не по теме:

у-у-у.... батенька! Вам бы сначала наверно стоило последовать завету Владимира Ильича :)
Который говорил про учиться, учиться и еще раз учиться :)


в процедуру клика кнопки ее запихайте хотя бы
0
Заблокирован
31.07.2012, 12:51 10
Visual Basic
1
к_во_дней_в_текущем_месяце=DateSerial(Year(Date), Month(Date) + 1, 1) - DateSerial(Year(Date), Month(Date), 1) ' а-ля Ципихович:D
Вставь это туда, где определяешь к-во дней в месяце
1
3 / 3 / 0
Регистрация: 20.07.2012
Сообщений: 50
31.07.2012, 13:00  [ТС] 11
Цитата Сообщение от skol13 Посмотреть сообщение

Не по теме:

у-у-у.... батенька! Вам бы сначала наверно стоило последовать завету Владимира Ильича :)
Который говорил про учиться, учиться и еще раз учиться :)


в процедуру клика кнопки ее запихайте хотя бы
Так я и учусь))
Если бы я все знал, тогда бы не спрашивал Вас))

Добавлено через 5 минут
Цитата Сообщение от Апострофф Посмотреть сообщение
Visual Basic
1
к_во_дней_в_текущем_месяце=DateSerial(Year(Date), Month(Date) + 1, 1) - DateSerial(Year(Date), Month(Date), 1) ' а-ля Ципихович:D
Вставь это туда, где определяешь к-во дней в месяце
Ура)
Работает))
Осталось разобраться по какому принципу))
Всем спасибо))
0
369 / 78 / 6
Регистрация: 23.05.2012
Сообщений: 232
31.07.2012, 13:21 12
вот вам еще примерчик создания лабелей в цикле по количеству дней:
и в цикле же удаление с проверкой существования объекта
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Option Explicit
Dim i, days
 
Private Sub Command1_Click()
    days = DateSerial(Year(Date), Month(Date) + 1, 1) - DateSerial(Year(Date), Month(Date), 1)
    
    For i = 1 To days
        Controls.Add "VB.Label", "Label" & i, Form1                               ' создаем лейбл
        Controls("Label" & i).Move 100, (100 + 300) * i, 700, 300                 ' изменяем размеры и местоположение
        Controls("Label" & i).Caption = "Лабель" & i
        Controls("Label" & i).Visible = True
    Next i
 
 
End Sub
 
Private Sub Command2_Click()
    On Error Resume Next
    For i = 1 To 100
        If Not Controls("Label" & i) Is Nothing Then
           Controls.Remove "Label" & i
        End If
    Next i
End Sub
2
Заблокирован
31.07.2012, 13:22 13
Но можно и динамически добавить нужные элементы в предварительно созданный массив.
Например, на форме Label1 с Index=0 (задать в свойствах контрола)
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Private Sub Form_Load()
Dim i%
Label1(0).Visible = False
For i = 1 To DateSerial(Year(Date), Month(Date) + 1, 1) - DateSerial(Year(Date), Month(Date), 1)
  Load Label1(i)
    With Label1(i)
    .Visible = True
    .BorderStyle = 1
    .Caption = i
    .Width = 390
    .Height = 390
    .Top = 390
    .Left = i * 400
   End With
Next i
End Sub
Преимущество перед вариантом от skol13 в том, что не надо изобретать события для добавленных объектов
2
369 / 78 / 6
Регистрация: 23.05.2012
Сообщений: 232
31.07.2012, 13:29 14
Цитата Сообщение от Апострофф Посмотреть сообщение
Преимущество перед вариантом от skol13 в том, что не надо изобретать события для добавленных объектов
ну особого то преимущества как бы и нет - все равно все в цикле делается
а вот забить ему мозг массивом контролов когда он еще в азах не разобрался - это реально

Добавлено через 4 минуты
ну и моим способом можно добавить на форму активХ-компоненты, не входящие в стандартный комплект VB.
Правда сложнее, чем стандартные
0
Заблокирован
31.07.2012, 13:43 15
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от vfalex Посмотреть сообщение
Осталось разобраться по какому принципу))
А это совсем просто!
Из первого числа следующего месяца вычитаем первое число текущего.
Получаем разницу в днях

Цитата Сообщение от skol13 Посмотреть сообщение
ну особого то преимущества как бы и нет - все равно все в цикле делается
А вот и есть!
Для твоего Label30 нет ещё события _Click (и не скоро будет), а у моего Label1(30) уже есть
1
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,641
Записей в блоге: 13
01.08.2012, 10:07 16
Мне кажется, чем запоминать все премудрости действия с датами, проще поступить так:

Visual Basic
1
2
3
4
5
6
7
8
9
Function Ndays(Y as integer, m as integer) as integer
 
            ND=Array(0,31,28,31,30,31,30,31,31,30,31,30,31)
 
            Ndays=Cint(ND(m))
 
            if (Y mod 4)=0 then Ndays=29
               
End Function
Замечание для педантов: я в курсе, что годы, кратные 4 и 100 невисокосные... Но не думаю, что программа доживет до следующей "точки актуальности"...
1
skol13
01.08.2012, 10:32
  #17

Не по теме:

Цитата Сообщение от Catstail Посмотреть сообщение
Но не думаю, что программа доживет до следующей "точки актуальности"...
надо надеяться на лучшее :)

0
Заблокирован
01.08.2012, 10:40 18
Цитата Сообщение от Catstail Посмотреть сообщение
Visual Basic
1
if (Y mod 4)=0 then Ndays=29
Все месяцы в високосный год по 29 дней?
Так правильнее, кажется?
Visual Basic
1
if (Y mod 4)=0 and m=2 then Ndays=29
А для педантов и оптимистов -
Visual Basic
1
if (Y mod 4)=0 and ((y mod 100)<>0 or (y mod 400)=0) and m=2 then Ndays=29
1
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,641
Записей в блоге: 13
01.08.2012, 12:27 19
Вот, сделал календарь на лэйблах. Может, пригодится (и педантам и разгильдяям...). VB-проект прилагаю:
Изображения
 
Вложения
Тип файла: zip t008.zip (8.7 Кб, 18 просмотров)
1
Заблокирован
01.08.2012, 13:28 20
Что то здесь не то
Изображения
 
0
01.08.2012, 13:28
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.08.2012, 13:28
Помогаю со студенческими работами здесь

Напечатать на экране "календарь" на один месяц (по дню недели 1-го числа и количеству дней в месяце)
Cоставить алгоритм и программу, которая печатает на экране «календарь» на один месяц, если...

Количество дней в месяце
Есть программа, но работает она не очень точно, суть в том, что она должна отсчитать ровно год...

Количество дней в месяце
Таск 1 Пользователь вводит номер месяца . Надо вывести количество дней в этом месяце ...

Количество дней в месяце
Вывести количество дней в текущем месяце можно так: perl -MTime::Piece -E '$t=localtime;say...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru