На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
... (продолжение следует) ...

Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...
Модераторы: jack128, D[u]fa, Shaggy, Rouse_
  
> Как нарисовать сантиметр
    Приветствую!

    Рубрика глупых вопросов продолжается. Подскажите, пожалуйста, возможно ли на TImage нарисовать линию длиною ровно одим см, чтобы этот см. соответствовал через экран реальному 1см? При этом, чтобы это был см. на любом мониторе? Как я понимаю, Windows в 100% масштабе возвращает 96 DPI и с этим ничего не поделать? Проблема ж, как я понимаю, в невозможности определить размер экрана?

    user posted image
    Сообщение отредактировано: The_Immortal -
      Кажется стоит откалибровать монитор. У меня тоже самое рисует линию строго в 1 см.

      Как по горизонтали так и по вертикали. Как на Lazarus под Linux, так и на Delphi7 под Windows 7 на VirtualBox под Linux.
      Скрытый текст

      VirtualBox Win7
      Прикреплённый файлПрикреплённый файлScreenshot_20230407_005539.png (22,27 Кбайт, скачиваний: 44)

      Скрытый текст
      Linux wine
      Прикреплённый файлПрикреплённый файлScreenshot_20230407_005716.png (5,28 Кбайт, скачиваний: 40)

      Скрытый текст
      Linux lazarus
      Прикреплённый файлПрикреплённый файлScreenshot_20230407_010547.png (45,84 Кбайт, скачиваний: 40)
        macomics, мне кажется, дело не в калибровке. Да и как на ноуте калибровать монитор?)
        Кстати, у Вас на Lazarus почему-то подлиннее вышло, но у меня все равно это не см.
          Цитата The_Immortal @
          Проблема ж, как я понимаю, в невозможности определить размер экрана?

          Все упирается в вопрос определения размеров "пикселя". Это зависит от заявленной DPI и физических размеров отображаемой области экрана. По-скольку мы имеем дело с дискретными сущностями, о строгой точности можно забыть. А если принять за экран, к примеру, рекламное табло 20м x 6м, то может и о точности можно забыть, ибо там размер "пикселя" размеру размеру светодиода (а возможно и трех).
            Majestio,
            Цитата Majestio @
            Это зависит от заявленной DPI и физических размеров отображаемой области экрана
            Ну DPI и размеры можно же узнавать? Касательно DPI, кстати, тоже проблема - Венда всегда возвращает значением 96, такой некий baseline. Как узнать это значение реальное - не ясно.
              Цитата The_Immortal @
              Ну DPI и размеры можно же узнавать?

              DPI корректны исключительно из технических характеристик матриц, а не то, что отображает венда.
              При этом следует понимать, что монитор/дисплей/панель/возможно смартфон - не обязаны работать в предопределенным оптимальном заводском видио-режиме. Андестенд?

              P.S. В свое дело я было занялся идентификацией CPU ... но вовремя бросил это неблагодарное дело, когда список CPU превысил 30шт.
              P.PS. Если тебе нужен "строгий" сантиметр сетки на экране - предусмотри свою калибровку! Самый надёжный варик - имхо.
                Цитата Majestio @
                предусмотри свою калибровку!

                Поддерживаю. Сделать это не так сложно, но придётся взаимодействовать с пользователем. Иначе не узнать истинный размер.
                  macomics, я даже не могу нагуглить как вручную откалибровать монитор свой, а уж тем паче как это делать через дельфик... :(
                  Вот, к примеру, как люди "развлекаются" с калибровкой через переустановку драйверов. О каком тут взаимодействии с пользователем может идти речь?..
                  Сообщение отредактировано: The_Immortal -
                    За 5 минут набросал примерную форму калибровки
                    ExpandedWrap disabled
                      object Form1: TForm1
                        Left = 192
                        Top = 124
                        Width = 570
                        Height = 463
                        Caption = 'Form1'
                        Color = clBtnFace
                        Font.Charset = DEFAULT_CHARSET
                        Font.Color = clWindowText
                        Font.Height = -11
                        Font.Name = 'MS Sans Serif'
                        Font.Style = []
                        OldCreateOrder = False
                        OnCreate = FormCreate
                        OnPaint = FormPaint
                        PixelsPerInch = 96
                        TextHeight = 13
                        object ScrollBar1: TScrollBar
                          Left = 160
                          Top = 8
                          Width = 385
                          Height = 17
                          LargeChange = 10
                          Max = 385
                          Min = 1
                          PageSize = 0
                          Position = 1
                          TabOrder = 0
                          TabStop = False
                          OnScroll = ScrollBar2Scroll
                        end
                        object ScrollBar2: TScrollBar
                          Left = 160
                          Top = 32
                          Width = 17
                          Height = 385
                          Kind = sbVertical
                          LargeChange = 10
                          Max = 385
                          Min = 1
                          PageSize = 0
                          Position = 10
                          TabOrder = 1
                          TabStop = False
                          OnScroll = ScrollBar2Scroll
                        end
                      end

                    ExpandedWrap disabled
                      unit Unit1;
                       
                      interface
                       
                      uses
                        Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
                        Dialogs, ScktComp, Menus, StdCtrls;
                       
                      type
                        TForm1 = class(TForm)
                          ScrollBar1: TScrollBar;
                          ScrollBar2: TScrollBar;
                          procedure FormPaint(Sender: TObject);
                          procedure FormCreate(Sender: TObject);
                        private
                          { Private declarations }
                        public
                          { Public declarations }
                        end;
                       
                      var
                        Form1: TForm1;
                       
                      implementation
                       
                      {$R *.dfm}
                       
                      procedure TForm1.FormCreate(Sender: TObject);
                      var
                         SDC: HDC;
                      begin
                         SDC := GetDC(0);
                         ScrollBar1.Position := Round(10 * GetDeviceCaps(SDC, LOGPIXELSX) / 25.4);
                         ScrollBar2.Position := Round(10 * GetDeviceCaps(SDC, LOGPIXELSY) / 25.4);
                      end;
                       
                      procedure TForm1.FormPaint(Sender: TObject);
                      begin
                         with Canvas do begin
                            MoveTo(10, 10);
                            LineTo(10 + ScrollBar1.Position, 10);
                            MoveTo(20, 20);
                            LineTo(20, 20 + ScrollBar2.Position);
                         end;
                      end;
                       
                      procedure TForm1.ScrollBar2Scroll(Sender: TObject; ScrollCode: TScrollCode;
                        var ScrollPos: Integer);
                      begin
                         Repaint;
                      end;
                       
                      end.
                    Сообщение отредактировано: macomics -
                      macomics, можно попытаться использовать
                      эти функции:
                      PhysicalToLogicalPointForPerMonitorDPI
                      LogicalToPhysicalPointForPerMonitorDPI
                      PhysicalToLogicalPoint
                      LogicalToPhysicalPoint
                      Эта книга может быть интересна для решения такой задачи:
                      Том 4
                      Сообщение отредактировано: ЫукпШ -
                        Цитата ЫукпШ @
                        Эта книга может быть интересна для решения такой задачи:
                        Том 4

                        А теперь тоже самое, но под Lazarus на Linux.
                        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                        0 пользователей:


                        Рейтинг@Mail.ru
                        [ Script execution time: 0,0368 ]   [ 18 queries used ]   [ Generated: 27.05.24, 23:10 GMT ]