Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi (до версии 2009) - часть 6

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125

Открыть новую тему     Написать ответ в эту тему

ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Продолжение темы Вопросы по Delphi (до версии 2009) - часть 5

Познаем сами, помогаем другим...
Обсуждаем вопросы, не связанные с юникоидными версиями Delphi - для этого есть соответствующая тема (см. ссылки ниже).


 
Правила топика:
    Прежде чем спрашивать:
  1. Желательно изучить вопрос, попытаться найти ответ в прилагаемых мануалах, хелпах и анализируя исходники.
  2. Выполнить поиск по топику (открыть "Версия для печати" и поискать ответ там).
  3. Применить фильтр по разделу "Прикладное программирование". Ответы на многие старые вопросы могли быть даны в отдельных темах.
  4. Продумайте вопрос. На поверхностные вопросы вы получите поверхностные ответы, или вообще ответов не получите.
  5. Желательно указывать версии используемого компилятора и операционной системы.
    Прежде чем отвечать:
  1. Если не можете помочь, не мешайте.
  2. Если уж вы отвечаете на вопрос, давайте ответ по сути.
  3. Если вы не уверены, так и говорите! Ошибочный, но авторитетно звучащий ответ хуже, чем отсутствие ответа.
  4. Задавайте дополнительные вопросы, чтобы получить больше информации.
  • Отсутствие ответа не равносильно игнорированию - иногда участники форума просто не знают ответ. Повторная посылка вопроса не приветствуется. Посты типа "неужели никто не знает ответа..." или "может мне все-таки кто-нибудь ответит" недопустимы.  
  • Все большие куски кода (более 5 строк) оформляем в тег [morе] дабы уменьшить размер поста. FAQ по тегу [morе].


    Некоторые "родственные" топики:
     
  • Вопросы по Delphi (версии 2009-2010 Weaver)
  • Вопросы по компонентам для Delphi, C++ Builder
  • Использование DevExpress
  • Вопросы по Ehlib
  • Компоненты и утилиты для Delphi/BCB/FreePascal/Lazarus - только Open Source
  • Коммерческие компоненты и утилиты для Delphi/BCB
  • кабак программистов :)
     
    См. также: Некоторые полезные ресурсы о Delphi
     
    И старайтесь, чтобы ваш код не попал сюда :)

  • Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 05:13 19-05-2010 | Исправлено: akaGM, 02:33 15-07-2020
    Maks150988



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Привет. Извлекаю сведения из биллинговой системы своего интернет провайдера. необходимо узнать оставшиеся дни до окончания тарифа. Отправляю soap запрос и получаю xml файл. Значение дата/время выглядит как 2011-06-10T12:26:18+04:00 например. Это что за формат представления даты и может быть есть под такую хрень парсеры или куски кода? Ну +4 это походу прибавляют время от гринвича. Но у нас тут регион на московское время перешел и надо +3. Смотрю в их официальнойй программе там вообще не учитывается эта прибавка при вычислении. Так вот может это другое значение или их косяк? Как бы правильно перевести это все в дни и тупо отнять от текущего количества натикавших дней? Наверняка есть велосипеды только найти не могу.

    Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 22:18 28-06-2011
    extasy



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Maks150988

    Цитата:
    2011-06-10T12:26:18+04:00


    Цитата:
    Это что за формат представления даты

     
    В MS это назвали UniversalSortableDateTimePattern
    yyyy'-'MM'-'dd HH':'mm':'ss'Z'
     
    yyyy     The year in four digits, including the century.
    MM     The numeric month. Single-digit months will have a leading zero.
    dd     The day of the month. Single-digit days will have a leading zero.
    HH     The hour in a 24-hour clock. Single-digit hours will have a leading zero.
    mm     The minute. Single-digit minutes will have a leading zero.
    ss     The second. Single-digit seconds will have a leading zero.
    zzz     The full time zone offset ("+" or "-" followed by the hour and minutes). Single-digit hours and minutes will have leading zeros. For example, Pacific Standard Time is "-08:00".
     
    http://msdn.microsoft.com/en-us/library/system.globalization.datetimeformatinfo%28v=VS.100%29.aspx
    http://msdn.microsoft.com/ru-ru/library/system.globalization.datetimeformatinfo%28v=VS.100%29.aspx

    Всего записей: 429 | Зарегистр. 18-05-2006 | Отправлено: 23:43 28-06-2011 | Исправлено: extasy, 23:44 28-06-2011
    Maks150988



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    extasy
    На запрос "Universal Sortable Date delphi" жожель выдает про Delphi.NET классы и методы. Хм, есть что-нибудь простецкое паскалевское? Я ничего тупее копирования в лоб по позициям текста с переводом в интегер для последующего переумножения не придумал.

    Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 00:58 29-06-2011
    ShIvADeSt



    Moderator
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Maks150988

    Цитата:
     Я ничего тупее копирования в лоб по позициям текста с переводом в интегер для последующего переумножения не придумал.

    Вам шашечки или ехать? По очереди отпарсиваете все параметры (благо все фиксированно), если смещение по часовому поясу не нужно, то нафиг, если нужно, то прибавляем (отнимаем), а потом куда надо (TDateTime, TSystemTime) загоняем и работаем. Есть куча способов (от StrToDate до всяких конверт) чтобы потом получить дату, время и тп.

    ----------
    И создал Бог женщину... Существо получилось злобное, но забавное...

    Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 01:54 29-06-2011
    Maks150988



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ShIvADeSt
     

    Код:
    function UniversalToDateTime(pszUSDP: AnsiString): TSystemTime;
    begin
      Result.wYear   := StrToInt(Copy(pszUSDP, 1, 4));
      Result.wMonth  := StrToInt(Copy(pszUSDP, 6, 2));
      Result.wDay    := StrToInt(Copy(pszUSDP, 9, 2));
      Result.wHour   := StrToInt(Copy(pszUSDP, 12, 2));
      Result.wMinute := StrToInt(Copy(pszUSDP, 15, 2));
      Result.wSecond := StrToInt(Copy(pszUSDP, 18, 2));
    end;

     
    Дальше прогоняю через SystemTimeToDateTime и сравниваю функцией DaysBetween. Может можно проще сравнить? Мне кажется тут много лишнего и наверняка без перегона в TDateTime.

    Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 14:22 29-06-2011
    ShIvADeSt



    Moderator
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Maks150988

    Цитата:
    Дальше прогоняю через SystemTimeToDateTime и сравниваю функцией DaysBetween. Может можно проще сравнить? Мне кажется тут много лишнего и наверняка без перегона в TDateTime.

    Если нужно просто сравнить две даты (больше, меньше, равно) то подойдет строковое сравнение
    2011-06-30 < 2011-07-01
    так же можно в одну строку сравнить и время
    09:44 < 10:23
    поэтому просто для сравнения вообще ничего переводить не надо, сравнивайте как строки. Главное порядок должен быть ГГГГ-ММ-ДД

    ----------
    И создал Бог женщину... Существо получилось злобное, но забавное...

    Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 00:02 30-06-2011
    Maks150988



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ShIvADeSt
    Мне нужно узнать остаток дней до окончания тарифного плана. Через GetSystemTime узнаю текущую время и дату, теперь надо перевести в дни это значение и значение после парсиннга xml и ну и узнать разницу. Как проще?

    Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 00:42 30-06-2011
    ShIvADeSt



    Moderator
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Maks150988

    Цитата:
    Мне нужно узнать остаток дней до окончания тарифного плана. Через GetSystemTime узнаю текущую время и дату, теперь надо перевести в дни это значение и значение после парсиннга xml и ну и узнать разницу. Как проще?

    Напрямую никак, либо конвертация в TDateTime, либо в TFileTime. При втором случае нужно еще бубен использовать
    http://forum.vingrad.ru/forum/topic-274640.html
    Поэтому твой способ лучше.

    ----------
    И создал Бог женщину... Существо получилось злобное, но забавное...

    Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 02:08 30-06-2011
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Maks150988
    Я бы использовал  EncodeDateTime чтобы дальше уже ничего не конвертировать. И потом с помощью DateUtils делал вычисления.

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 08:14 30-06-2011 | Исправлено: Frodo_Torbins, 08:16 30-06-2011
    Czechoslovak



    Junior Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

    Цитата:
    Мне нужно узнать остаток дней до окончания тарифного плана. Через GetSystemTime узнаю текущую время и дату, теперь надо перевести в дни это значение и значение после парсиннга xml и ну и узнать разницу. Как проще?

     
    И в чем тут проблема? Это то же самое что вычислить стаж? так решений в инете мама-негорюй...Парсишь дату и вычисляешь разницу....
    А если тебе всего лишь количество дней так....А вообще модуль DateUtils предоставляет очень хорошие функции для твоих вечислений: YearsBetween, MonthsBetween, DaysBetween, еще пригодится DaysInYear. Все может быть гораздо проще.
     
    В общем тут обсуждать нечего, любые решения будут по производительности приблизительно одинаковые!

    Всего записей: 175 | Зарегистр. 27-06-2007 | Отправлено: 09:36 30-06-2011
    ShIvADeSt



    Moderator
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Czechoslovak

    Цитата:
    И в чем тут проблема? Это то же самое что вычислить стаж? так решений в инете мама-негорюй...Парсишь дату и вычисляешь разницу....
    А если тебе всего лишь количество дней так....А вообще модуль DateUtils предоставляет очень хорошие функции для твоих вечислений: YearsBetween, MonthsBetween, DaysBetween, еще пригодится DaysInYear. Все может быть гораздо проще.  

    Чукча не читатель, чукча писатель? Он ИМЕННО ТАК И ДЕЛАЕТ. И спрашивает, есть ли другие способы, без преобразований в TDateTime.

    ----------
    И создал Бог женщину... Существо получилось злобное, но забавное...

    Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 10:00 30-06-2011
    yanus69



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Есть dcu файлы, можно ли их подключить к управляемому коду или скомпилировать в управляемый код?? Версия delphi не существенная. Спасибо.

    Всего записей: 750 | Зарегистр. 14-12-2006 | Отправлено: 14:11 05-07-2011
    akaGM

    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    yanus69

    Цитата:
    Есть dcu файлы, можно ли их подключить к управляемому коду или скомпилировать в управляемый код??

    *.dcu и так "скомпилированные" бинарники, можешь прояснить что ты хочешь конкретно?
    хотя ответ очевиден:
     
    имеющиеся dcu можно подключить и использовать только с той версией дельфей, которой они были созданы, больше с ними ничего сделать нельзя...
    ну только если не учитывать дизассм...

    Всего записей: 24107 | Зарегистр. 06-12-2002 | Отправлено: 14:56 05-07-2011 | Исправлено: akaGM, 14:57 05-07-2011
    yanus69



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    akaGM
    Спасибо. Уже сам понял.

    Всего записей: 750 | Зарегистр. 14-12-2006 | Отправлено: 17:15 05-07-2011
    akaGM

    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    yanus69
    не за что, Виталий,
    ю а велком...

    Всего записей: 24107 | Зарегистр. 06-12-2002 | Отправлено: 17:26 05-07-2011
    Maks150988



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Происходит что-то непонятное, по крайней мере для меня. Использую Delphi 7. Есть следующий код:
     

    Код:
    function SendSoapRequest(hResourceHandle: HINTERNET; pszSoap: Utf8String): AnsiString;
    var
      dwStatus      : DWORD;
      dwStatusSize  : DWORD;
      dwReserved    : DWORD;
      bRet          : Boolean;
      pszText       : Utf8String;
      dwBytesToWrite: DWORD;
      dwBytesRead   : DWORD;
    begin
     
      Result := '';
     
      bRet := HttpSendRequest(hResourceHandle, nil, 0, LPTSTR(pszSoap), lstrlen(LPTSTR(pszSoap)));
      if bRet then
      begin
     
        dwStatus := 0;
        dwStatusSize := SizeOf(dwStatus);
        dwReserved := 0;
        bRet := HttpQueryInfo(
          hResourceHandle,
          HTTP_QUERY_FLAG_NUMBER or HTTP_QUERY_STATUS_CODE,
          @dwStatus,
          dwStatusSize,
          dwReserved
        );
     
        if (bRet and (dwStatus = HTTP_STATUS_OK)) then
        begin
     
          bRet := InternetQueryDataAvailable(hResourceHandle, dwBytesToWrite, 0, 0);
          if (bRet and (dwBytesToWrite > 0)) then
          begin
     
            SetLength(pszText, dwBytesToWrite);
     
            repeat
              bRet := InternetReadFile(hResourceHandle, LPTSTR(pszText), dwBytesToWrite, dwBytesRead);
              if (bRet and (dwBytesRead > 0)) then
              begin
     
                SetLength(pszText, dwBytesRead);
                Result := Result + Utf8ToAnsi(pszText);
     
              end;
     
            until
              dwBytesRead = 0;
     
          end;
     
        end;
     
      end;
     
    end;

     
    Так как делаю приложение под Windows 7, то проблем не было. Решил протестировать на виртуальных машинах с предыдущими Windows вплоть до 2000. Бах и программа вылетает с ошибклй что где-то память не может быть записана по такому-то адресу. Я подумал ну ладно хрен с ним мне главное добиться рабочести кода на семерке чем на этих, а дальше можно и улучшить после доработки. Компилирую уже на Windows XP x64 и такая же хрень. Вообще брал примерный код из другого своего проекта где все работает как часы. Запускаю под отладчиком и ошибка. Решил пересобрать проект с отладчоными DCU файлами. Запускаю и вылезает вкладка GETMEM.INC с процедурой DeleteFree на строке n.prev := p; это получается косяк в системом модуле Delphi? Код отрабатывает только под Windows 7 а в других системах нарушение доступа. Помогите советом.

    Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 22:56 08-07-2011
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Maks150988
    В системном модуле подобный косяк очень маловероятен. Скорее всего ваш код затирает данные менеджера памяти. Советы стандартные:
    • включить отладочные опции компилятора;
    • заменить менеджер памяти отладочным;
    • вырезать из проекта все лишнее, пока не останется минимум кода, приводящий к ошибке.

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 23:08 08-07-2011
    Maks150988



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Frodo_Torbins
    Код
     
    Ошибка в третьем SendSoapRequest что за дела не пойму в коде ничего лишнего.

    Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 23:38 08-07-2011
    extasy



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Maks150988
    Если проблема с памятью, то можно попробовать подключить менеджер памяти FastMM и включить FullDebugMode. Может там что-нибудь увидите.
     
    Настройку FastMM, например, можно посмотреть тут: http://www.gunsmoker.ru/2009/05/blog-post_24.html

    Всего записей: 429 | Зарегистр. 18-05-2006 | Отправлено: 09:40 11-07-2011
    R3Pa4eK



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Как создать поток, и загрузить в него какой-нибудь файл, например картинку? И потом загружать не с файла, а с потока?

    Всего записей: 963 | Зарегистр. 15-01-2011 | Отправлено: 10:00 11-07-2011
    Открыть новую тему     Написать ответ в эту тему

    Страницы: 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 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125

    Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi (до версии 2009) - часть 6


    Реклама на форуме Ru.Board.

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.B0ard
    © Ru.B0ard 2000-2024

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru