Тема: QVCLua, элемент DataEdit и как его использовать
Есть в библиотеке VCLua удобный элемент для ввода даты: DataEdit.
Вводить дату можно как вручную, так и выбором из календаря:
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
QUIK -> DDE → Lua: визуальные библиотеки → QVCLua, элемент DataEdit и как его использовать
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Есть в библиотеке VCLua удобный элемент для ввода даты: DataEdit.
Вводить дату можно как вручную, так и выбором из календаря:
Для элемента DateEdit:
1) При задании свойства DefaultToday=true почему-то не отображается текущая дата, хотя параметр Date меняется.
2) При выборе даты почему-то не закрывается календарь. Более того, при перемещении окна календарь остаётся на месте, т.е. он, как бы, сам по себе. Какой параметр отвечает за это поведение?
Добрый день!
Подскажите пожалуйста, как результат компонента DateEdit.Date превратить в нормальный posix формат os.time?
Добрый день!
в нормальный posix формат os.time?
В нормальный ли ) Но хотя бы в Lua c ним можно работать.
DateEdit.Date - это тип TDateTime, который является Double. В нём целая часть есть "число дней с 30 декабря 1899; 01 января 1900 имеет значение 2".
Но вот беда, из этой теории не понятно как из этого сделать os.time, а функции, которые есть в для работы с типом TDateTime не доступны из Lua.
Похоже проще всего добавить к DateEdit свойство, которое бы возвращало дату в пригодном для Lua формате (например, таблица год/месяц/день или готовое в формате os.time). Да ведь?
Добрый день!
Подскажите пожалуйста, как результат компонента DateEdit.Date превратить в нормальный posix формат os.time?
[url]http://bot4sale.ru/blog-menu/qlua/spisok-statej/368-lua-time.html[/url]
kalikazandr,
ссылка хорошая. Но как она отвечает на вопрос masalexven'а? алгоритм перевода из одного формата в другой предложить сможете?
kalikazandr,
ссылка хорошая. Но как она отвечает на вопрос masalexven'а? алгоритм перевода из одного формата в другой предложить сможете?
Смогу, пример дайте с DateEdit - не пользуюсь QVCLua нет рабочих примеров.
Добрый день!
masalexven пишет:в нормальный posix формат os.time?
В нормальный ли ) Но хотя бы в Lua c ним можно работать.
DateEdit.Date - это тип TDateTime, который является Double. В нём целая часть есть "число дней с 30 декабря 1899; 01 января 1900 имеет значение 2".
Но вот беда, из этой теории не понятно как из этого сделать os.time, а функции, которые есть в для работы с типом TDateTime не доступны из Lua.Похоже проще всего добавить к DateEdit свойство, которое бы возвращало дату в пригодном для Lua формате (например, таблица год/месяц/день или готовое в формате os.time). Да ведь?
Да, но это наверное уже к разработчику, который эту чудесную библиотеку доводит до ума, за что ему огромное спасибо.
А данный компонент может вернуть значение просто в текстовом виде формата "ДД.ММ.ГГГГ"?, дальше я бы его сам пребразовал как надо.
korovin пишет:kalikazandr,
ссылка хорошая. Но как она отвечает на вопрос masalexven'а? алгоритм перевода из одного формата в другой предложить сможете?Смогу, пример дайте с DateEdit - не пользуюсь QVCLua нет рабочих примеров.
Сегодня 3 февраля 2016 года, компонент выдает цифру 42403 на выходе DateEdit.Date.
Блин, а чего-то я тупанул, всё ведь просто.
Время (дата) в POSIX = (DateEdit.Date - 25569) * 86400 - TIME_ZONE_SEC_SHIFT,
где:
25569 - разница в днях между разными стартовыми датами
86400 = 24*60*60 (количество секунд в сутках)
TIME_ZONE_SEC_SHIFT - сдвиг в секундах вашего часового пояса (по настройкам Windows)
Т.е.
TIME_ZONE_SEC_SHIFT = 43200 - os.time({year=1970,month=1,day=1})
dt = (DateEdit.Date - 25569) * 86400 - TIME_ZONE_SEC_SHIFT -- дата из DateEdit.Date в POSIX-формате
message(os.date("%d.%m.%Y", dt)) -- покажет текущую дату
Блин, а чего-то я тупанул, всё ведь просто.
Время (дата) в POSIX = (DateEdit.Date - 25569) * 86400 - TIME_ZONE_SEC_SHIFT,
где:
25569 - разница в днях между разными стартовыми датами
86400 = 24*60*60 (количество секунд в сутках)
TIME_ZONE_SEC_SHIFT - сдвиг в секундах вашего часового пояса (по настройкам Windows)Т.е.
TIME_ZONE_SEC_SHIFT = os.time({year=1970,month=01,day=1}) message(os.date("%d.%m.%Y", (DateEdit.Date - 25569) * 86400 - TIME_ZONE_SEC_SHIFT )) -- покажет текущую дату
Спасибо большое за формулу. Единственно что, TIME_ZONE_SEC_SHIFT показывает 9 часов (в секундах), хотя у меня часовой пояс +3. В результате Ваш message показывает текущую дату со сдвигом в 6 часов (т е. в результате получаем предыдущую дату и время 18 часов).
Из-за чего это может быть?
Из-за чего это может быть?
-- Возвращает смещение часового пояса в секундах
function os.offset()
local currenttime = os.time()
local datetime = os.date("!*t",currenttime)
datetime.isdst = true -- Флаг дневного времени суток
return currenttime - os.time(datetime)
end
Как любитель магических констант, поправил [url=https://quik2dde.ru/viewtopic.php?pid=1930#p1930]свой пост выше[/url], уточнив формулу для TIME_ZONE_SEC_SHIFT.
kalikazandr, красиво! спасибо
Можно и так вычислять значение TIME_ZONE_SEC_SHIFT, чтобы без магических констант )
masalexven пишет:Из-за чего это может быть?
-- Возвращает смещение часового пояса в секундах function os.offset() local currenttime = os.time() local datetime = os.date("!*t",currenttime) datetime.isdst = true -- Флаг дневного времени суток return currenttime - os.time(datetime) end
Красиво, большое человеческое спасибо.
Как любитель магических констант, поправил [url=https://quik2dde.ru/viewtopic.php?pid=1930#p1930]свой пост выше[/url], уточнив формулу для TIME_ZONE_SEC_SHIFT.
kalikazandr, красиво! спасибо
Можно и так вычислять значение TIME_ZONE_SEC_SHIFT, чтобы без магических констант )
Большое человеческое спасибо за формулу. Константа по часовому поясу у kalikazandr красивее вышла.
В общем обобщил.
Большое человеческое спасибо за формулу. Константа по часовому поясу у kalikazandr красивее вышла.
В общем обобщил.
Нзч, красивее - не значит быстрее ))
Хотя тут время исполнения не критично - разово в начале кода.
2) При выборе даты почему-то не закрывается календарь. Более того, при перемещении окна календарь остаётся на месте, т.е. он, как бы, сам по себе. Какой параметр отвечает за это поведение?
Тоже столкнулся с такой проблемой. И нет никакого свойства, закрываться должно само автоматически. Опять надо разбираться.
masalexven, а у вас есть такая проблема при использовании DataEdit?
Тоже столкнулся с такой проблемой. И нет никакого свойства, закрываться должно само автоматически. Опять надо разбираться.
Убирается нажатием ПКМ
Убирается нажатием ПКМ
Я, конечно, дико извиняюсь, но подскажите, пожалуйста, магазин, где продаётся такая кнопка?
Вообще-то, убираться должна при выборе или при любой потере фокуса DataEdit'ом или формой, на котором календарь открыт. Если просто в Lazarus сделать приложение - то именно так и происходит.
kalikazandr пишет:Убирается нажатием ПКМ
Я, конечно, дико извиняюсь, но подскажите, пожалуйста, магазин, где продаётся такая кнопка?
Вообще-то, убираться должна при выборе или при любой потере фокуса DataEdit'ом или формой, на котором календарь открыт. Если просто в Lazarus сделать приложение - то именно так и происходит.
ПКМ = правая кнопка мыши ))
Добрый день!
Подскажите пожалуйста, как результат компонента DateEdit.Date превратить в нормальный posix формат os.time?
Вот еще один вариант проще, пример формы взят у swerg:
#xzxz.lua
VCL=require "qvcl"
function Handler (sender)
local SN = sender.Name
if SN == "DateEdit" then
local dt = {}
dt.day, dt.month, dt.year = string.match(sender.Text,"(%d*)\.(%d*)\.(%d*)") --sender.Text = "11.02.2016"
message (os.date("%Y%m%d",os.time(dt)))-->20160211
end
end
mainForm = VCL.Form("mainForm",
{ position="podesktopcenter", height=150, width=400, Caption="DateEdit test",
OnClose = function(sender) is_run=false mainForm:Release() end
}
)
dateEdit = VCL.DateEdit(mainForm,
{ Name = "DateEdit", Top=20, Left=30, Text="DD.MM.YYYY", DialogTitle = "Выбрать дату", OnChange = Handler, AutoSelect=true, ShowHint=true, Hint="Календарь:\nЛевый дабл-клик = выбор даты.\nПравый клик = выход из календаря"}
)
mainForm:Show()
is_run = true
function main()
while is_run do
sleep(50)
end
end
function OnStop()
is_run = false
mainForm:Release()
end
kalikazandr пишет:Убирается нажатием ПКМ
Я, конечно, дико извиняюсь, но подскажите, пожалуйста, магазин, где продаётся такая кнопка?
Вообще-то, убираться должна при выборе или при любой потере фокуса DataEdit'ом или формой, на котором календарь открыт. Если просто в Lazarus сделать приложение - то именно так и происходит.
Странное поведение у этого календарика. В одном скрипте убирается при потере фокуса, в другом - нет. И никак не могу отловить причины и закономерности. Обшарил все доступные контролы элемента, не нашел отвечающий за исчезание окошка. Остались неизведанными Action и PopupMenu, но что и в каком виде на них можно передать чтобы окошко схлопнулось после например даблклик - никаких инструкций не нашел.
Календарик этот очевидно popup окошко, и никаких имен и органов управления не видно.
Да и кнопок Ok и Cancel нет, хотя на соотв. контролах по-умолч. true. Высвечивался бы OK - окошко бы схлапывалось при нажатии, такое управление стандартно вшито в умолчаниях Popup.
Очень похоже недоделанная библиотека в части этого элемента. Начали разработчики, да бросили как есть...
Странное поведение у этого календарика. В одном скрипте убирается при потере фокуса, в другом - нет. И никак не могу отловить причины и закономерности. Обшарил все доступные контролы элемента,
Не тратьте время, свойства никакого нет. Календарик должен исчезать при выборе (дабл-кликом) или потере фокуса. Это видно из исходного кода календарика.
Если собрать просто exe из Lazarus с этим же календариком - всё работает как надо.
Видимо есть какой-то нюанс хитрый в dll'ке библиотеки. Причем не в том, что код в ней неправильный (он правильный), а видимо в том, как она в принципе функционирует, почему-то не срабатывает толи потеря фокуса, толи еще что.
Удивительно, что клик правой кнопкой мыши в самом деле отлично работает (закрывает) календарь. Значит не всё безнадёжно
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
QUIK -> DDE → Lua: визуальные библиотеки → QVCLua, элемент DataEdit и как его использовать
Форум работает на PunBB, при поддержке Informer Technologies, Inc