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

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



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Maks150988
    С точки зреня компилятора оба варианта равнозначны. Компилятор вычисляет составные булевые выражения начиная с первого (левого) подвыражения до тех пор, пока не поймет, что дальнейшие подвыражения уже не изменят результат.  
    Скажем, если в выражении (hToolTip <> 0) and IsWindowVisible(hToolTip) hToolTip будет равен нулю, то каково бы ни было значение, возвращаемое вторым подвыражением, суммарное значение всего выражения будет false: (false and IsWindowVisible(hToolTip)) всегда будет false. Для компилятора это ясно как день и он не будет заморачиваться проверкой всех остальных подвыражений.
     
    Ну а с точки зрения читабельности кода - кому как привычнее...
     
    Добавлено:
    Благодаря этому можно строить интересные конструкции, например (с потолка пример):
    repeat
    ...
    until Result or not NextRecord;
    тут будет выполняться переход на следующую запись некоего набора данных (вызов функции NextRecord) только в том случае, если в ходе выполнения тела цикла Result еще не стало истиной. Ну и переход на следующий шаг цикла произойдет, если также и сама ф-ция вернула истину.
     
    repeat
    ...
    until not NextRecord or Result;
    а тут будет выполняться переход на следующую запись некоего набора данных (вызов NextRecord)  ВСЕГДА, независимо от значения переменной Result, вычисленной в ходе выполнения тела цикла! Вызов NextRecord произойдет даже если нет необходимости переходить на следующий шаг цикла.


    ----------
    У программёра есть два состояния: "Втупляю" и "Попёрло"...

    Всего записей: 438 | Зарегистр. 08-11-2005 | Отправлено: 23:24 07-07-2010 | Исправлено: psa1974, 23:44 07-07-2010
    AlexIntegral



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Кто имел дело с регулярными выражениями подскажите пожалуйста как можно слово в кавычках найти, в одинарных кавычках " ' ", ведь в делфи строка для регулярки сама заключается в кавычки и любые лишние одинарные кавычки в pattern вызывают ошибки

    Всего записей: 245 | Зарегистр. 31-05-2008 | Отправлено: 23:41 07-07-2010
    psa1974



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    AlexIntegral
    а если так:пример с использованием TRegExpr Любая кавычка ' внутри строки заменяется парой этих кавычек.

    ----------
    У программёра есть два состояния: "Втупляю" и "Попёрло"...

    Всего записей: 438 | Зарегистр. 08-11-2005 | Отправлено: 00:14 08-07-2010 | Исправлено: psa1974, 00:14 08-07-2010
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    psa1974, Maks150988
    Это поведение полностью контролируется директивой компилятора BOOLEVAL.

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 00:43 08-07-2010
    AviDen



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Bonivur
    Цитата:
    Есть форма, на ней компонент PageControl. На первой Page - Image.  

    Попробуйте разместить имидж над PageControl'ом (но чтобы родитель и у него, и у PageControl'а был один и тот же)

    Всего записей: 316 | Зарегистр. 05-06-2007 | Отправлено: 19:13 08-07-2010
    Bonivur



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    AviDen
    Оригинально мыслите, но все равно не помогло. Без Image PageControl сам по себе не мерцает, но при отрисовке изображения мерцание появляется. Причем нерегулярно.
     
    Добавлено:
    Frodo_Torbins

    Цитата:
    На счет OnCreate не уверен, на всякий случай проверьте в рантайме вдруг сбрасывается. Вообще демку бы, так как у меня все работает без мелькания.

    Демка приложения с PageControl - http://rghost.ru/2080884 . У меня на WinXP SP3, NVidia 8800 GT 512 моргает.

    ----------
    Что будет стоить тысяча слов когда важна будет крепость руки? (В.Цой)

    Всего записей: 655 | Зарегистр. 22-06-2003 | Отправлено: 21:17 08-07-2010
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Bonivur
    Хм, в D2009 добавили обработку WM_ERASEBKGND у табшита. Ее конечно можно отключить (к примеру методом Geo), или вообще на время переключения заблокировать отрисовку через WM_SETREDRAW. Но по моему намного проще будет заменить пейджконтрол на табконтрол и во время переключения самому прятать и показывать контролы. Или в конце концов использовать скины, раз вам так важен внешний вид приложения.

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



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Frodo_Torbins
    Спасибо за помощь. А что такое "метод Geo"? Вы можете, если не трудно, выложить исправленный исходник, чтобы там не было мирцания? Честно говоря я уже и не надеюсь, что это вообще возможно - по-моему, мирцание Image это неискоренимо
     

    Цитата:
    Или в конце концов использовать скины, раз вам так важен внешний вид приложения.

    Не понял. Я не использую скины. Это XPManifest (или соответсвующая галка в опциях приложения). Без него вообще фигово-то смотрится На дворе уже 2010 год.

    ----------
    Что будет стоить тысяча слов когда важна будет крепость руки? (В.Цой)

    Всего записей: 655 | Зарегистр. 22-06-2003 | Отправлено: 23:24 08-07-2010
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Bonivur
    Шаманский метод Geo. Вам надо перекрыть обработчик сообщения:Подробнее... Для красоты тут можно еще конструктор перекрыть и в нем ControlStyle менять. Но вообще это не самое элегантное решение. По хорошему надо писать полноценный контрол с нужным функционалом, вот только зачем, когда их уже и так написана целая куча?
    Цитата:
    Не понял. Я не использую скины.
    Вот я вам и предлагаю начать

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 00:31 09-07-2010 | Исправлено: Frodo_Torbins, 00:32 09-07-2010
    Bonivur



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Frodo_Torbins
    Спасибо. Сделал точно как Вы указали. Перекрыл обработчик события класса TTabSheet, но не помогло
     
    А как скины могут здесь помочь? И какой компонент для скинов Вы можете посоветсовать? Раз уж другого способа нет - придется видимо прибегнуть к скинам...

    ----------
    Что будет стоить тысяча слов когда важна будет крепость руки? (В.Цой)

    Всего записей: 655 | Зарегистр. 22-06-2003 | Отправлено: 10:46 09-07-2010 | Исправлено: Bonivur, 10:49 09-07-2010
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Bonivur
    Лично мне очень нравятся AlphaControls. Выберите себе скин по вкусу и редактором скинов замените фоновый рисунок на свой. Должно получится как в ихнем скине "Winter 2003".

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 11:13 09-07-2010
    Bonivur



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Frodo_Torbins
    А зачем заменять фоновый рисунок? У меня Image не во весь ТабШит.

    ----------
    Что будет стоить тысяча слов когда важна будет крепость руки? (В.Цой)

    Всего записей: 655 | Зарегистр. 22-06-2003 | Отправлено: 12:28 09-07-2010
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Bonivur
    Тогда попробуйте положить рисунок под пейджконтрол, сейчас нет времени проверить, но кажется это должно работать на скинах с прозрачными элементами управления.

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 12:44 09-07-2010
    Bonivur



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Frodo_Torbins
    Это работает и без скинов - Image выводится поверх PageControl'a, но мерцание все равно остается.

    ----------
    Что будет стоить тысяча слов когда важна будет крепость руки? (В.Цой)

    Всего записей: 655 | Зарегистр. 22-06-2003 | Отправлено: 16:48 09-07-2010
    Maks150988



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Насчет пейджконтрола, не знаю как на VCL все сделано и желания нет в VCL код заглядывать, но как вариант http://rsdn.ru/forum/winapi/716573.1.aspx для буферизации.

    Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 19:29 10-07-2010
    Bonivur



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Maks150988
    В новых версиях Delphi уже есть свойство DoubleBuffered для TabSheet'ов (делает ту же самую буферизацию), только оно не помогает, как не помогает и перекрытие WM_ERASEBKGND. Без Image'a Page Control не мерцает. Проблема вывода именно Image на PageControl'e без мерцания. Выше я давал демку - сами посмотрите.

    ----------
    Что будет стоить тысяча слов когда важна будет крепость руки? (В.Цой)

    Всего записей: 655 | Зарегистр. 22-06-2003 | Отправлено: 20:58 10-07-2010
    Maks150988



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Bonivur
    Хм, решение тупо на WinApi, что сразу тупо на ум пришло. =)
     

    Код:
     
    procedure SetDoubleBuffer(hWnd: THandle);
    var
      dwStyle: DWORD;
    begin
      dwStyle := GetWindowLongW(hWnd, GWL_EXSTYLE);
      SetWindowLongW(hWnd, GWL_EXSTYLE, dwStyle or WS_EX_COMPOSITED);
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    var
      i:Integer;
    begin
      Image1.Picture.Bitmap.LoadFromResourceName(HInstance,'OIL');
      for i := 0 to PageControl1.PageCount - 1 do
      begin
        PageControl1.Pages[i].ControlStyle := PageControl1.Pages[i].ControlStyle - [csParentBackground];
        SetDoubleBuffer(PageControl1.Pages[i].Handle);
      end;
      SetDoubleBuffer(PageControl1.Handle);
      SetDoubleBuffer(Image1.Parent.Handle);
    end;
     

     
    Ну значит что-то нифига не буферизировано, или сам имейдж или табы на пейджере.

    Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 21:30 10-07-2010
    Bonivur



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Maks150988
    Опаньки!!! Работает! Огромное спасибо, смогли все-таки найти выход. WinAPI рулит! И я не могу понять тогда цель использования DoubleBuffered если толку от него ноль.

    ----------
    Что будет стоить тысяча слов когда важна будет крепость руки? (В.Цой)

    Всего записей: 655 | Зарегистр. 22-06-2003 | Отправлено: 23:24 10-07-2010
    Maks150988



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Bonivur
    Ну тут же еще есть вкладки - те же окна. Видимо стандартно буферизируется лишь сам контейнер их - пейджер. Тут мы все подряд буферизируем. Правда стиль WS_EX_COMPOSITED предназначен только для XP судя по MSDN (хотя и на младших системах он превосходно работает), если использовать старшие системы - надо вручную сабклассить.

    Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 01:43 11-07-2010
    itmagistr

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Подскажите пожалуйста компонент для Delphi 2007
    чтобы можно было отрисовать график с левой и правой осями Y
    Например левая ось отображает абсолютные значения
    а правая отображает значения в %.
     
    TChart не подходит.
     
    Спасибо.

    Всего записей: 2 | Зарегистр. 28-07-2009 | Отправлено: 03:14 11-07-2010
    Открыть новую тему     Написать ответ в эту тему

    Страницы: 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