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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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
    delover

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Gnom3
    Я думаю PostMessage(HWND, WM_MYCOLOR, Color, 0);

    Всего записей: 1395 | Зарегистр. 25-06-2007 | Отправлено: 08:28 21-07-2011
    ShIvADeSt



    Moderator
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    delover
    Я думаю
    WM_CTLCOLORDLG
    более подходит

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

    Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 12:09 21-07-2011
    Gnom3



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Забыл сказать (точнее. на тот момент не знал ) окно VCL'ное - это както влияет на способ закрашивания?
    ShIvADeSt, delover, спасибо за помощ

    Всего записей: 864 | Зарегистр. 14-11-2010 | Отправлено: 23:18 21-07-2011 | Исправлено: Gnom3, 11:14 23-07-2011
    delover

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ShIvADeSt
    Спасибо за уточнение я хотел сказать что Post а не Send.

    Всего записей: 1395 | Зарегистр. 25-06-2007 | Отправлено: 00:50 22-07-2011
    Gnom3



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

    Цитата:
    PostMessage(HWND, WM_MYCOLOR, Color, 0);

    В общем, ситуация такая, на Windows 7 данное сообщение не принимается окном, видимо, в семействе 6 изменились какието условия. Закрашивать окна мне нужно именно на Windows Vista-7. Есть еще какаято возможность?

    Всего записей: 864 | Зарегистр. 14-11-2010 | Отправлено: 10:50 27-07-2011
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Gnom3
    Окно должно быть специально "обучено" принимать такие сообщения. То есть оно должно содаржать код, реагирующий на WM_MYCOLOR.
    Если же у вас нет возможности изменить исходный код нужного приложения, то придется искать другие пути. Вы хоть в его адресном пространстве работаете?

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 12:02 27-07-2011
    Gnom3



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Frodo_Torbins
    Ээ, приложение, окно которого я хочу закрасить, умеет принимать сообщения, например такое:

    Код:
      hM:= GetSystemMenu(WizardForm.Handle, false);
      DeleteMenu(hM, $F060, 0);

    оно принимает нормально.

    Код:
    PostMessage(HWND, WM_CTLCOLORDLG, Color, 0);
    не приняла даже изнутри, хотя на ХР сработало из длл. Но засада в том, что на хр мне это не нужно, там не сработают остальные функции, для которых пишется длл-ка.

    Всего записей: 864 | Зарегистр. 14-11-2010 | Отправлено: 14:06 27-07-2011 | Исправлено: Gnom3, 14:07 27-07-2011
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Gnom3
    Цитата:
    Ээ, приложение, окно которого я хочу закрасить, умеет принимать сообщения
    Стандартные конечно, а WM_MYCOLOR - не стандартное.
     
    В вашем случае еще можно попробовать провернуть все это дело через RTTI, если приложение делфевое. Для этого нужна только ссылка на объект, которую можно получить с помощью FindControl.

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 14:36 27-07-2011 | Исправлено: Frodo_Torbins, 14:36 27-07-2011
    Gnom3



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

    Цитата:
    которую можно получить с помощью FindControl.

    а на прямую подать не получится? В моем случае, это будет WizardForm.Handle, либо WizardForm - аналог Applucation. Окно дельфовое, VCL'ное.
    Сразу оговорюсь - я только учусь, и без примеров плохо понимаю ...

    Всего записей: 864 | Зарегистр. 14-11-2010 | Отправлено: 15:04 27-07-2011 | Исправлено: Gnom3, 15:07 27-07-2011
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Gnom3
    Если у вас уже есть ссылка на объект нужного класса, то конечно FindControl не нужен. А если вы еще и компилируете в той же самой версии делфи, что и целевое приложение, то можно и без RTTI обойтись. Особенно, если рантайм пакеты включены.

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 15:11 27-07-2011
    Gnom3



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

    Цитата:
     А если вы еще и компилируете в той же самой версии делфи, что и целевое приложение

    Целевое приложение компилируется в одном из интерпретаторов дельфи, с сильно урезанным языком, от того и заморочки такие. Можно и в этом интерпретаторе сделать основную функцию (у меня это получалось) но тормоза великие. Есть еще вариант - сразу закрашивать окно - у него есть свойство -Color - на данный момент так и делаю, но в моем случае это не самое элегантное решение.

    Всего записей: 864 | Зарегистр. 14-11-2010 | Отправлено: 15:27 27-07-2011 | Исправлено: Gnom3, 15:28 27-07-2011
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Gnom3
    То есть вы пишете скрипт, выполняющийся интерпретатором нужного приложения? Тогда чем вас не устраивает работа со свойством Color?

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 15:45 27-07-2011
    Gnom3



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Frodo_Torbins
    По порядку - основное приложение - не может быть написано в дельфи (точнее, может, но слишком геморно, да и нет смысла, поскольку есть удобный интерпретатор, специально для этого созданный).
    Но, в этом интерпретаторе(Inno Setup) сильно урезанный язык, и сложная процедура экспорта системных функций.
     
    Вот моя функция в дельфи:
    код

    Цитата:
    Тогда чем вас не устраивает работа со свойством Color?

    Эээ... Может, упрямством? Я знаю, что это было решено, похожая длл-ка есть, но меня не устраивает функционал версии, которая в паблике доступна, отчего и затеял все это дело. Плюс, функции, поданные в Inno Setup из внешних длл-ок, работают значительно быстрее, чем написанные в Inno Setup, что очень благотворно сказывается на нервах конечных пользователей.

    Всего записей: 864 | Зарегистр. 14-11-2010 | Отправлено: 16:00 27-07-2011 | Исправлено: Gnom3, 16:26 27-07-2011
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Gnom3
    Получается, вам нужно закрасить черным окошко инносетюпа? Можно попробовать повесить хук на сообщения отрисовки окна. Но по хорошему поддержка Аэро должна реализовываться самим приложением. Извне ее нормально прикрутить не получится. Я бы на вашем месте уже давно взялся править исходники инно.

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 16:34 27-07-2011
    Gnom3



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

    Цитата:
    Я бы на вашем месте уже давно взялся править исходники инно.

    Не дорос еще я до этого. Плюс - уже сделано это уважаемым товарищем Vo1t. В личной беседе, он дал ссылку на исходник, в котором не нужно бороться с цветом окна, но я так и не смог осилить экспорт - там функция применяется не к хендлу, а к форме, переделка на хендл результата не дала, поскольку часть параметров применяется только к форме, обойти через TCanvas не удалось.
    Вот эта функция, может, знающие товарищи подскажут, где может быть ошибка?
    код
     

    Цитата:
    Сконвертить хендл в объект можно с помощью все той же FindControl.

    Можно пример использования?
    В моем случае, както так?

    Код:
      var
         frmCtrl:Tform;
    ...................
    frmCtrl:=FindControl(AHandle);

     
    P.S. Ругается на FindControl - неизвестный идентификатор. Я так понял, подключать чтото нужно?

    Всего записей: 864 | Зарегистр. 14-11-2010 | Отправлено: 16:53 27-07-2011 | Исправлено: Gnom3, 20:15 27-07-2011
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Gnom3
    Сконвертить хендл в объект можно с помощью все той же FindControl.

    Цитата:
    Не дорос еще я до этого.
    Это вы зря. Взяв в помощь надежного проводника типа MM CodeExplorer, вы все сделаете меньше чем за час.

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 17:02 27-07-2011
    Gnom3



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Возник следующий вопрос - возможно-ли локально, для VCL-окна отключить сглаживание шрифтов (Cleartype)? доступ к окну, опять-же, только по хендлу, хендл известен.

    Всего записей: 864 | Зарегистр. 14-11-2010 | Отправлено: 22:37 03-08-2011 | Исправлено: Gnom3, 22:40 03-08-2011
    Maks150988



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Подскажите как преобразовать время time_t в TSystemTime.
    Статья от Майкрософт
    Сделал так собственно:
     
    function Int32x32To64(const a, b: Integer): Int64;
    begin
      Result := a * b;
    end;
     
    procedure UnixTimeToFileTime(const t: time_t; var pft: TFileTime);
    var
      ll: Int64;
    begin
      ll := Int32x32To64(t, 10000000) + 116444736000000000;
      pft.dwLowDateTime := DWORD(ll);
      pft.dwHighDateTime := ll shr 32;
    end;
     
    procedure UnixTimeToSystemTime(const t: time_t; var pst: TSystemTime);
    var
      pft: TFileTime;
    begin
      UnixTimeToFileTime(t, pft);
      FileTimeToSystemTime(pft, pst);
    end;

     
    Имею на входе 2301245 и в результате получаю структуру где время и дата равны 00:00:00 01.01.1970 по вычислениям.

    Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 12:20 07-08-2011 | Исправлено: Maks150988, 12:21 07-08-2011
    ShIvADeSt



    Moderator
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Maks150988
    Вот преобразование обычного времени в Unix формат

    Код:
     
    function DateToUnixDate(Value:TDateTime):integer;
    const
        SecPerDay = 86400;
        Offset1970 = 25569;
    begin
        Result := Trunc((Value - Offset1970) * SecPerDay) * 1000;
    end;
     

    проделай действия в обратно порядке и получишь обычный TDateTime. Только Trunc не нужен, так как он отрасывает часы и минуты.

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

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



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ShIvADeSt
    Блин у меня тип time_t был обозначен как Int64 а нужно было Integer.
    Поэтому не работал и код.
     
    procedure DateTimeToSystemTime(const pdt: TDateTime; var pst: TSystemTime);
    var
      dt: TDateTime;
      ft: TFileTime;
    begin
      dt := (pdt + 109205.0) * 864000000000.0;
      ft := TFileTime(Round(dt));
      FileTimeToSystemTime(ft, pst);
    end;
     
    function FormatTimeDate(t: time_t): AnsiString;
    const  
      UnixDateDelta = 25569;
      MinPerDay     = 24 * 60;
      SecPerDay     = 24 * 60 * 60;
    var
      pdt  : TDateTime;
      tzi  : TTimeZoneInformation;
      pst  : TSystemTime;
      bias : Integer;
      dwRet: DWORD;
    begin
      Result := '';
      if (t <> 0) then
      begin
        pdt := UnixDateDelta + (t / SecPerDay);
        bias := 0;
        dwRet := GetTimeZoneInformation(tzi);
        if (dwRet <> TIME_ZONE_ID_INVALID) then
        begin
          if (dwRet = TIME_ZONE_ID_STANDARD) then
            bias := tzi.Bias + tzi.StandardBias
          else
            bias := tzi.Bias + tzi.DaylightBias;
        end;
        pdt := pdt - (bias / MinPerDay);
        DateTimeToSystemTime(pdt, pst);
        Result := Format('%2.2d.%2.2d.%4.4d %2.2d:%2.2d:%2.2d', [pst.wDay, pst.wMonth, pst.wYear, pst.wHour, pst.wMinute, pst.wSecond]);
      end;
    end;

     
    Кстати, я тут перебаламутил всех пару дней назад с WinInet функцией закачки файлов. Проблема решилась тем что я выставил указатель в начало через InternetSetFilePointer перед чтением. И сразу размер скачанных данных совпал со значением что сервер с заголовке отсылал.
     
    Вопрос к знающим. Мне нужно определить разницу в TSystemTime. Проблема что откуда то берутся 7 минут и 9 секунд.
     
    function AistTimeToSystemTime(pszTime: AnsiString): TSystemTime;
    begin
      ZeroMemory(@Result, SizeOf(TSystemTime));
      Result.wYear      := StrToInt(Copy(pszTime, 1, 4));
      Result.wMonth     := StrToInt(Copy(pszTime, 6, 2));
      Result.wDay       := StrToInt(Copy(pszTime, 9, 2));
      Result.wHour      := StrToInt(Copy(pszTime, 12, 2));
      Result.wMinute    := StrToInt(Copy(pszTime, 15, 2));
      Result.wSecond    := StrToInt(Copy(pszTime, 18, 2));
    end;
     
    var
      pszText: AnsiString;
      time1  : TSystemTime;
      time2  : TSystemTime;
      date1  : TFileTime;
      date2  : TFileTime;
      df     : TFileTime;
      st     : TSystemTime;
    begin
      time1 := AistTimeToSystemTime('2011-01-01T16:35:00+04:00');
      time2 := AistTimeToSystemTime('2011-01-15T16:35:00+04:00');
      SystemTimeToFileTime(time1, date1);
      SystemTimeToFileTime(time2, date2);
      df.dwHighDateTime := date2.dwHighDateTime - date1.dwHighDateTime;
      df.dwLowDateTime  := date2.dwLowDateTime - date1.dwLowDateTime;
      FileTimeToSystemTime(df, st);
      Dec(st.wYear, 1601);
      Dec(st.wMonth, 1);
      Dec(st.wDay, 1);
      pszText := Format('%d ч %d мин %d сек %d дн %d мес %d лет', [st.wHour, st.wMinute, st.wSecond, st.wDay, st.wMonth, st.wYear]);
      MessageBox(0, LPCSTR(pszText), nil, MB_OK);
    end.

    Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 16:38 08-08-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