1

Тема: QVCLua, элемент DataEdit и как его использовать

Есть в библиотеке VCLua удобный элемент для ввода даты: DataEdit.
Вводить дату можно как вручную, так и выбором из календаря:

https://quik2dde.ru/static-img/191/dateedit-form.png


[+]Тестовый код
VCL=require "qvcl"

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,
    { Top=20, Left=30 }
)

mainForm:Show()

is_run = true    
function main()
  while is_run do
    sleep(50)
  end
end

function OnStop()
 is_run = false
 mainForm:Release()
end

2

Re: QVCLua, элемент DataEdit и как его использовать

Для элемента DateEdit:
1) При задании свойства DefaultToday=true почему-то не отображается текущая дата, хотя параметр Date меняется.
2) При выборе даты почему-то не закрывается календарь. Более того, при перемещении окна календарь остаётся на месте, т.е. он, как бы, сам по себе. Какой параметр отвечает за это поведение?

3

Re: QVCLua, элемент DataEdit и как его использовать

Добрый день!
Подскажите пожалуйста, как результат компонента DateEdit.Date превратить в нормальный posix формат os.time?

4

Re: QVCLua, элемент DataEdit и как его использовать

Добрый день!

masalexven пишет:

в нормальный posix формат os.time?

В нормальный ли ) Но хотя бы в Lua c ним можно работать.

DateEdit.Date - это тип TDateTime, который является Double. В нём целая часть есть "число дней с 30 декабря 1899; 01 января 1900 имеет значение 2".
Но вот беда, из этой теории не понятно как из этого сделать os.time, а функции, которые есть в для работы с типом TDateTime не доступны из Lua.

Похоже проще всего добавить к DateEdit свойство, которое бы возвращало дату в пригодном для Lua формате (например, таблица год/месяц/день или готовое в формате os.time). Да ведь?

5

Re: QVCLua, элемент DataEdit и как его использовать

masalexven пишет:

Добрый день!
Подскажите пожалуйста, как результат компонента DateEdit.Date превратить в нормальный posix формат os.time?

[url]http://bot4sale.ru/blog-menu/qlua/spisok-statej/368-lua-time.html[/url]

6 (2016-02-03 06:45:27 отредактировано korovin)

Re: QVCLua, элемент DataEdit и как его использовать

kalikazandr,
ссылка хорошая. Но как она отвечает на вопрос masalexven'а? алгоритм перевода из одного формата в другой предложить сможете?

7

Re: QVCLua, элемент DataEdit и как его использовать

korovin пишет:

kalikazandr,
ссылка хорошая. Но как она отвечает на вопрос masalexven'а? алгоритм перевода из одного формата в другой предложить сможете?

Смогу, пример дайте с DateEdit - не пользуюсь QVCLua нет рабочих примеров.

8

Re: QVCLua, элемент DataEdit и как его использовать

swerg пишет:

Добрый день!

masalexven пишет:

в нормальный posix формат os.time?

В нормальный ли ) Но хотя бы в Lua c ним можно работать.

DateEdit.Date - это тип TDateTime, который является Double. В нём целая часть есть "число дней с 30 декабря 1899; 01 января 1900 имеет значение 2".
Но вот беда, из этой теории не понятно как из этого сделать os.time, а функции, которые есть в для работы с типом TDateTime не доступны из Lua.

Похоже проще всего добавить к DateEdit свойство, которое бы возвращало дату в пригодном для Lua формате (например, таблица год/месяц/день или готовое в формате os.time). Да ведь?

Да, но это наверное уже к разработчику, который эту чудесную библиотеку доводит до ума, за что ему огромное спасибо.
А данный компонент может вернуть значение просто в текстовом виде формата "ДД.ММ.ГГГГ"?, дальше я бы его сам пребразовал как надо.

9

Re: QVCLua, элемент DataEdit и как его использовать

kalikazandr пишет:
korovin пишет:

kalikazandr,
ссылка хорошая. Но как она отвечает на вопрос masalexven'а? алгоритм перевода из одного формата в другой предложить сможете?

Смогу, пример дайте с DateEdit - не пользуюсь QVCLua нет рабочих примеров.

Сегодня 3 февраля 2016 года, компонент выдает цифру 42403 на выходе DateEdit.Date.

10 (2016-02-03 19:15:47 отредактировано swerg)

Re: QVCLua, элемент DataEdit и как его использовать

Блин, а чего-то я тупанул, всё ведь просто.

   Время (дата) в 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)) -- покажет текущую дату

11 (2016-02-03 15:18:16 отредактировано masalexven)

Re: QVCLua, элемент DataEdit и как его использовать

swerg пишет:

Блин, а чего-то я тупанул, всё ведь просто.

   Время (дата) в 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 часов).
Из-за чего это может быть?

12

Re: QVCLua, элемент DataEdit и как его использовать

masalexven пишет:

Из-за чего это может быть?

-- Возвращает смещение часового пояса в секундах
function os.offset()
   local currenttime = os.time()
   local datetime = os.date("!*t",currenttime)
   datetime.isdst = true -- Флаг дневного времени суток
   return currenttime - os.time(datetime)
end

13 (2016-02-03 17:28:28 отредактировано swerg)

Re: QVCLua, элемент DataEdit и как его использовать

Как любитель магических констант, поправил [url=https://quik2dde.ru/viewtopic.php?pid=1930#p1930]свой пост выше[/url], уточнив формулу для TIME_ZONE_SEC_SHIFT.

kalikazandr, красиво! спасибо
Можно и так вычислять значение TIME_ZONE_SEC_SHIFT, чтобы без магических констант )

14

Re: QVCLua, элемент DataEdit и как его использовать

kalikazandr пишет:
masalexven пишет:

Из-за чего это может быть?

-- Возвращает смещение часового пояса в секундах
function os.offset()
   local currenttime = os.time()
   local datetime = os.date("!*t",currenttime)
   datetime.isdst = true -- Флаг дневного времени суток
   return currenttime - os.time(datetime)
end

Красиво, большое человеческое спасибо.

15

Re: QVCLua, элемент DataEdit и как его использовать

swerg пишет:

Как любитель магических констант, поправил [url=https://quik2dde.ru/viewtopic.php?pid=1930#p1930]свой пост выше[/url], уточнив формулу для TIME_ZONE_SEC_SHIFT.

kalikazandr, красиво! спасибо
Можно и так вычислять значение TIME_ZONE_SEC_SHIFT, чтобы без магических констант )

Большое человеческое спасибо за формулу. Константа по часовому поясу у kalikazandr красивее вышла.

В общем обобщил.

16

Re: QVCLua, элемент DataEdit и как его использовать

masalexven пишет:

Большое человеческое спасибо за формулу. Константа по часовому поясу у kalikazandr красивее вышла.

В общем обобщил.

Нзч, красивее - не значит быстрее ))
Хотя тут время исполнения не критично - разово в начале кода.

17

Re: QVCLua, элемент DataEdit и как его использовать

CyberTrader пишет:

2) При выборе даты почему-то не закрывается календарь. Более того, при перемещении окна календарь остаётся на месте, т.е. он, как бы, сам по себе. Какой параметр отвечает за это поведение?

Тоже столкнулся с такой проблемой. И нет никакого свойства, закрываться должно само автоматически. Опять надо разбираться.

masalexven, а у вас есть такая проблема при использовании DataEdit?

18

Re: QVCLua, элемент DataEdit и как его использовать

swerg пишет:

Тоже столкнулся с такой проблемой. И нет никакого свойства, закрываться должно само автоматически. Опять надо разбираться.

Убирается нажатием ПКМ

19

Re: QVCLua, элемент DataEdit и как его использовать

kalikazandr пишет:

Убирается нажатием ПКМ

Я, конечно, дико извиняюсь, но подскажите, пожалуйста, магазин, где продаётся такая кнопка?

Вообще-то, убираться должна при выборе или при любой потере фокуса DataEdit'ом или формой, на котором календарь открыт. Если просто в Lazarus сделать приложение - то именно так и происходит.

20

Re: QVCLua, элемент DataEdit и как его использовать

swerg пишет:
kalikazandr пишет:

Убирается нажатием ПКМ

Я, конечно, дико извиняюсь, но подскажите, пожалуйста, магазин, где продаётся такая кнопка?

Вообще-то, убираться должна при выборе или при любой потере фокуса DataEdit'ом или формой, на котором календарь открыт. Если просто в Lazarus сделать приложение - то именно так и происходит.

ПКМ = правая кнопка мыши ))

21

Re: QVCLua, элемент DataEdit и как его использовать

masalexven пишет:

Добрый день!
Подскажите пожалуйста, как результат компонента 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

22 (2016-02-11 16:47:01 отредактировано GREEN_X5)

Re: QVCLua, элемент DataEdit и как его использовать

swerg пишет:
kalikazandr пишет:

Убирается нажатием ПКМ

Я, конечно, дико извиняюсь, но подскажите, пожалуйста, магазин, где продаётся такая кнопка?

Вообще-то, убираться должна при выборе или при любой потере фокуса DataEdit'ом или формой, на котором календарь открыт. Если просто в Lazarus сделать приложение - то именно так и происходит.

Странное поведение у этого календарика. В одном скрипте убирается при потере фокуса, в другом - нет. И никак не могу отловить причины и закономерности. Обшарил все доступные контролы элемента, не нашел отвечающий за исчезание окошка. Остались неизведанными Action и PopupMenu, но что и в каком виде на них можно передать чтобы окошко схлопнулось после например даблклик - никаких инструкций не нашел.
Календарик этот очевидно popup окошко, и никаких имен и органов управления не видно.
Да и кнопок Ok и Cancel нет, хотя на соотв. контролах по-умолч. true. Высвечивался бы OK - окошко бы схлапывалось при нажатии, такое управление стандартно вшито в умолчаниях Popup.
Очень похоже недоделанная библиотека в части этого элемента. Начали разработчики, да бросили как есть...

23 (2016-02-11 17:13:27 отредактировано swerg)

Re: QVCLua, элемент DataEdit и как его использовать

GREEN_X5 пишет:

Странное поведение у этого календарика. В одном скрипте убирается при потере фокуса, в другом - нет. И никак не могу отловить причины и закономерности. Обшарил все доступные контролы элемента,

Не тратьте время, свойства никакого нет. Календарик должен исчезать при выборе (дабл-кликом) или потере фокуса. Это видно из исходного кода календарика.
Если собрать просто exe из Lazarus с этим же календариком - всё работает как надо.
Видимо есть какой-то нюанс хитрый в dll'ке библиотеки. Причем не в том, что код в ней неправильный (он правильный), а видимо в том, как она в принципе функционирует, почему-то не срабатывает толи потеря фокуса, толи еще что.

Удивительно, что клик правой кнопкой мыши в самом деле отлично работает (закрывает) календарь. Значит не всё безнадёжно smile