powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Поле для задания времени.
18 сообщений из 18, страница 1 из 1
Поле для задания времени.
    #37137937
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну т.е. чтоб понять чего хочу.
Делаем на часах (в трее) двойной щелчок мышью.
Появляется стандартная панель
Свойства:Дата и время
На вкладке "Дата и время" в области "Время" под часами есть этот "контрол".
Там либо 3 зоны: hh : mm : ss ( 4 : 10 : 59 )
Либо 4 зоны: 4 : 10 : 59 AM
Ну, ясно что формат от национальных настроек OS зависит.
Значение каждой зоны меняется независимо (можно стрелками, можно ручками) и застраховано от некорректного ввода.

У меня стоит задача:
1) при выводе формы отобразить тек.время (естественно тек. нац. формат)
2) предложить пользователю задать там "выберете время в промежутке следующие 24 часа" (т.е. дата сегодня-завтра подразумевается)
3) запомнить чего пользователь выбрал.

Писать чего-либо подобное самому желания ясно нет (если грамотно и красиво то умучаешься).
Есть ли готовое (стабильное на уровне OS) решение, которым можно воспользоваться из VB?
...
Рейтинг: 0 / 0
Поле для задания времени.
    #37137944
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DTPicker
но он
1) только Common Controls-6 (не дружит с манифестами и стилями)
2) (-2) а не (-1) лишняя OCX, хотя и так ясно что
посему в этом виде не приемлим.
API?
...
Рейтинг: 0 / 0
Поле для задания времени.
    #37137946
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот вроде.
Date and Time Picker
Простого примера для VB готового ни у кого нету?
...
Рейтинг: 0 / 0
Поле для задания времени.
    #37137968
Фотография VSVLAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На API версия такая
...
Рейтинг: 0 / 0
Поле для задания времени.
    #37137971
Фотография VSVLAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В виде UserControl, недоделанная версия ещё
...
Рейтинг: 0 / 0
Поле для задания времени.
    #37137973
Фотография VSVLAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SysMonth календарь, может пригодится
...
Рейтинг: 0 / 0
Поле для задания времени.
    #37138152
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VSVLADНа API версия такая
Кажется то что нужно.
С манифестами дружит (следовало ожидать).
Данный код с ходу выводит значение(я) (хоть как-то)
Код: plaintext
1.
2.
3.
Private Sub Command2_Click()
    MsgBox pTime.Data(wDay) & "." & pTime.Data(wMonth) & "." & pTime.Data(wYear) & " " & _
      pTime.Data(wHour) & "." & pTime.Data(wMinute) & "." & pTime.Data(wSecond)
End Sub
Вечером буду еще разбираться.

Пока быстрые вопросы (интересует только в DTS_TIMEFORMAT):

1) Как быстро вернуть Date-Time в формате as Date (а-ля ##) т.е. без игр с SerialDate/Time, форматами и т.п. /если возможно/
2) DTS_TIMEFORMAT всегда возвращает тек. дату?
Дима"выберете время в промежутке следующие 24 часа"
Т.е. если сейчас 15:00, а user выбрал 11:15 (AM), то оценить что now больше выбранного и ручками прибавить 1 день? Так получается?
...
Рейтинг: 0 / 0
Поле для задания времени.
    #37138213
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вот как-то так только получается:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
Private Sub Command2_Click()
    Dim NationalDT As String
    Dim AccessDT As String
    NationalDT = GetMyRegionalDateTime(pTime.Data(wDay), pTime.Data(wMonth), pTime.Data(wYear), _
      pTime.Data(wHour), pTime.Data(wMinute), pTime.Data(wSecond))
    If Now > NationalDT Then
        'прибавляем сутки
        NationalDT = DateAdd("d",  1 , CDate(NationalDT))
    End If
    AccessDT = GetMyAccessDateTime(NationalDT)
    MsgBox NationalDT & vbCrLf & AccessDT
End Sub

Public Function GetMyRegionalDateTime(wDay As Integer, wMonth As Integer, wYear As Integer, _
  wHour As Integer, wMinute As Integer, wSecond As Integer) As String
    Dim date_tempDate As String, date_tempTime As String 'дата/время в формате тек.OS
    date_tempDate = DateSerial(wYear, wMonth, wDay)
    date_tempTime = TimeSerial(wHour, wMinute, wSecond)
    GetMyRegionalDateTime = date_tempDate & " " & date_tempTime
End Function

Public Function GetMyAccessDateTime(regionalDateTime As String) As String
    GetMyAccessDateTime = ""
    If IsDate(regionalDateTime) Then
        GetMyAccessDateTime = "#" & Format$(regionalDateTime, "mm\/dd\/yyyy hh:mm:ss") & "#"
    End If
End Function

NationalDT - тек. полный формат дата-время
AccessDT -для экспорта в БД Access в теле SQL-запроса.
Вроде все корректно фурычит.

Проверку на ошибки в GetMyRegionalDateTime думаю можно не делать, ибо контрол сам себя всегда проверяет на корректность ввода.
...
Рейтинг: 0 / 0
Поле для задания времени.
    #37143164
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VSVLADНа API версия такая
VSVLAD, спасибо. Пристыковываю потихоньку.
Правильно ли я понимаю, что если мне не надо отслеживать всякие change-ы, то могу

1) выкинуть WithEvents
Код: plaintext
Dim pTime As cDateTimePicker 
'WithEvents
2) выкинуть SetDTPProc/DelDTP
Код: plaintext
1.
2.
3.
4.
Public Function Create(ByVal hParent As Long, _
...
    'Call mDateTimePicker.SetDTPProc(Me)
Public Sub Destroy()                                                                    ' Закрытие
    'Call mDateTimePicker.DelDTP(Me)

3) и соответственно полностью выкинуть модуль с сабклассингом
mDateTimePicker
(который не класс а так просто модуль).

В среде VB этот сабклассинг глючит минимум при закрытии кнопкой "стоп" среды (у меня там есть еще combo).
В exe вроде не глючит, но испытателем быть не хочу, полезного толку от сабклассинга для моей задачи вроде не вижу.
...
Рейтинг: 0 / 0
Поле для задания времени.
    #37143667
Фотография VSVLAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В принципе да, если не нужны события.
Глючит в среде, так как нельзя закрыть приложение, не подменив на прошлую процедуру окна.
...
Рейтинг: 0 / 0
Поле для задания времени.
    #37144813
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вроде с этим разобрался.
А вот похожие вопросы общего характера.

Например нужен Цифровой picker.
Стрелки вниз-вверх, значение меняется от 1 до 100.
UpDown теоретически понятно, а вот готового чего-то нет?

Т.е. общая задача страхования корректности вводимой информации в том же текстовом поле.

Типичные задачи:
1) могут быть только целые цифры; от min до max (+напр. стрелки вверх/вниз)
2) длина вводимой информации не превышает N текстовых символов
3) в это поле вводится адрес e-mail
ну и т.п.

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

Т.е. о чем это я... В случае с DTPicker имеем полную защиту "от дурака", причем даже на "визуальном уровне", т.е. "дурак" даже напечатать "буквы" вместо скажем "минут" не может, или скажем сделать некорректный Copy-Paste. Вот так бы для всего остального...
...
Рейтинг: 0 / 0
Поле для задания времени.
    #37144822
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
обычно делают сови собственные usercontrols для таких дел или используют готовые платные/бесплатные
...
Рейтинг: 0 / 0
Поле для задания времени.
    #37144880
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А нет ничего готового на тему:
>UpDown
>API
>могут быть только целые цифры; от min до max ;+ стрелки вверх/вниз
>На API версия такая (как с DTPicker с модулем класса)

Ибо этот DTPicker дюже понравился, а описанную выше задачу "с циферками" решаю постоянно.
UpDown мне давно посоветовали, но ленюсь: либо просто делаю текстовое поле, а в одном случае с коротким VScrollBar извратился ("верх совершенства-изввращенства" так сказать).
...
Рейтинг: 0 / 0
Поле для задания времени.
    #37144895
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
updown вообще просто прикручивается к textbox-у. потренируйся, не забудь locked=true у texbox-а выставить, тогда только в диапазоне стрелочек будет значение меняться
...
Рейтинг: 0 / 0
Поле для задания времени.
    #37145177
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_Oneupdown вообще просто прикручивается к textbox-у. потренируйся, не забудь locked=true у texbox-а выставить, тогда только в диапазоне стрелочек будет значение меняться

Ну да, прикручивается то прикручивается.

Попробовал с Common Controls 2- 5.0
Манифесты-ДА, но Common Controls 2 - я использую только Common Controls 1 - 5.0 Лишняя ocx, неохота по стратегическим соображениям. Т.е. смотреть в сторону API...

По поводу locked=true, ну это не дает возможности редактирования "ручками". А анализ подобных конструкций наводит на след. требования:
1) User должен иметь возможность редактировать Textbox ручками;
2) Может вводить только цифры, причем если ввод приведет к выходу из диапазона то он не осуществляется
3) Ввод "букв" не осуществляется, как вариант вывод примечания типа "Unacceptable Character : You can only type a number here"
4) При нажатии стрелка вниз/вверх (на клавиатуре находясь в Textbox) значение меняется и стрелки UpDown "авто" "самонажимаются"
5) Введенное в Textbox корректное значение автосинхронизировано со значением UpDown
6) Через Copy-Past например можно вставить "слово", но длина его не более длины числа max (в UpDown), быстро "выправляется" при дергании UpDown и никоим образом не запоминается (ну запоминается понятно Value(UpDown)).

Ну т.е. видите, целая "система" по типу cDateTimePicker, лучше чтоб было реализовано как "класс" наверно. Вот такой "готовый" и хотелось бы иметь. В приведенном мной примере с "коротким VScrollBar извратился" все это худо-бедно реализовано, но как понимаете "на карачках", и каждый раз так "реализовывать" умучаешься и лениво становится, да и ошибку ляпануть на раз-два.
...
Рейтинг: 0 / 0
Поле для задания времени.
    #37145224
Фотография VSVLAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Контролы основаны на классах и юзер контролах на API, мне как бы ближе =)
Многие готовые контролы есть в этой теме здесь

А также если интересует про UpDown:
Тут
Тут
и Тут
...
Рейтинг: 0 / 0
Поле для задания времени.
    #37145679
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VSVLADА также если интересует про UpDown:
Тут
Тут
и Тут

Поигрался, немного подоводил "по понятиям" (проект приложен).
В использовании API-UpDown проблем не вижу.

Но вот к чему его привязывать?
К TextBox-VB?
Или к Edit-API.

Там у меня в проекте 2 варианта:

1. Edit-API
Минусы:
1) по умолчанию приобретает цвет родит. контрола (не белый). В одном из примеров его окрашивают в белый через сабклассинг, но это издержки извращение. Я могу задать цвет окон=красный, а этот останется "белой вороной".
2) кажись он фокуса по TAB не ловит.
3) Не могу использовать стандартные фичи VBTextbox, к которым привык, например ограничить длину поля двумя полями.
Изучать API-Textbox теорию желания нет.
Короче API-текстбокс я однозначно НЕ ХОЧУ и НЕ БУДУ.

2. VB-textbox
Что сделал:
1) запретил ввод "не цифр" Or ES_NUMBER
2) запретил ввод больше 2-х символов (VB методами)
3) стрелки в Textbox вверх-вниз приводят к "имитации нажатия на UpDown"
4) меняется значение колесиком мыши

Что не сделал и чего хотелось бы и не знаю как:
1) При привязке UpDown ширина Textbox уменьшается, UpDown располагается вне рамки справа. А хотелось бы ВПИСАТЬ В РАМКУ (как в Edit-API). Т.е. какие-то стили vb-textbox отличаются. Игрался безрезультатно.
2) При нажатии непосредственно на кнопки UpDown выделяется весь текст в Edit-API, а в VB-Textbox - не выделяется. Хочу чтоб ВЫДЕЛЯЛСЯ .

Ну собственно все "претензии".
...
Рейтинг: 0 / 0
Поле для задания времени.
    #37145700
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий772) При нажатии непосредственно на кнопки UpDown выделяется весь текст в Edit-API, а в VB-Textbox - не выделяется. Хочу чтоб ВЫДЕЛЯЛСЯ .
Это худо-бедно решается сабклассингом апдауна:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
    OldWindowProc = SetWindowLong(hWndUpDown_toTextVB, GWL_WNDPROC, _
        AddressOf NewWindowProc)

Public Function NewWindowProc(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Select Case Msg
        Case WM_LBUTTONDOWN
            'Debug.Print "WM_LBUTTONDOWN"
            Form1.TextVB.SetFocus
        Case WM_LBUTTONUP
            'Debug.Print "WM_LBUTTONUP"
            Form1.TextVB.SelStart =  0 
            Form1.TextVB.SelLength = Len(Form1.TextVB.Text)
        Case Else
    End Select

    NewWindowProc = CallWindowProc( _
        OldWindowProc, hWnd, Msg, wParam, _
        lParam)
End Function

C "вписать в рамку" в примерах есть вариант с "запихиванием всего" в Picturebox с контуром, но что-то он мне не внушает доверия. Грубо и на стилях подведет скорее всего.
Накладывать API-UpDown поверх vb-текстбокса (без автопривязки слева) удовольствие ниже среднего, тоже не прокатит.
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Поле для задания времени.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]