Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 проблема с SystemParametersInfo  [new]
LiYing
Member

Откуда:
Сообщений: 469
Вот этот код прекрасно работал на D2007:
  procedure DoIndirect;
  var NonClientMetrics: TNonClientMetrics;
      Siz: integer;
  begin
    Siz := SizeOf(NonClientMetrics);
    FillChar(NonClientMetrics, Siz, 0);
    NonClientMetrics.cbSize := Siz;
    if DefaultFont <> dTimeFont then begin
      if SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, @NonClientMetrics, 0) then
        with NonClientMetrics do
          case DefaultFont of
            dCaptionFont: result := lfCaptionFont;
            dSmCaptionFont: result := lfSmCaptionFont;
            dMenuFont: result := lfMenuFont;
            dStatusFont: result := lfStatusFont;
            dMessageFont: result := lfMessageFont;
          end
      else
        RaiseLastOSError;
    end;
  end;

Но с переходом на D2010 вызывает такую ошибку:
автор
First chance exception at $7C812AFB. Exception class EOSError with message
'System Error. Code: 2.
Не удается найти указанный файл'.
Process project123.exe (216)


Как пофиксить?
24 ноя 09, 13:43    [7970320]     Ответить | Цитировать Сообщить модератору
 Re: проблема с SystemParametersInfo  [new]
LiYing
Member

Откуда:
Сообщений: 469
Да, ошибка при выполнении SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, @NonClientMetrics, 0)...
24 ноя 09, 13:44    [7970333]     Ответить | Цитировать Сообщить модератору
 Re: проблема с SystemParametersInfo  [new]
quaid
Member [заблокирован]

Откуда: Киев
Сообщений: 6665
LiYing
Как пофиксить?


Siz := NonClientMetrics.SizeOf;
24 ноя 09, 14:01    [7970463]     Ответить | Цитировать Сообщить модератору
 Re: проблема с SystemParametersInfo  [new]
quaid
Member [заблокирован]

Откуда: Киев
Сообщений: 6665
P.S. Похоже, что у тебя Виста?

class function tagNONCLIENTMETRICSW.SizeOf: Integer;
begin
  if Win32MajorVersion >= 6 then
    // Size of complete structure
    Result := System.SizeOf(tagNONCLIENTMETRICSW)
  else
    // Platforms prior to Vista do not recognize the field iPaddedBorderWidth
    Result := System.SizeOf(tagNONCLIENTMETRICSW) - System.SizeOf(Integer);
end;
24 ноя 09, 14:02    [7970475]     Ответить | Цитировать Сообщить модератору
 Re: проблема с SystemParametersInfo  [new]
LiYing
Member

Откуда:
Сообщений: 469
quaid
P.S. Похоже, что у тебя Виста?

win xp sp3
24 ноя 09, 14:03    [7970487]     Ответить | Цитировать Сообщить модератору
 Re: проблема с SystemParametersInfo  [new]
quaid
Member [заблокирован]

Откуда: Киев
Сообщений: 6665
quaid
P.S. Похоже, что у тебя Виста?
Нет, я напутал, судя по коду - у тебя не Виста
24 ноя 09, 14:03    [7970490]     Ответить | Цитировать Сообщить модератору
 Re: проблема с SystemParametersInfo  [new]
LiYing
Member

Откуда:
Сообщений: 469
quaid,
твой совет помог, спасибо!
такие результаты:
Siz := SizeOf(NonClientMetrics); ==> 504
Siz := NonClientMetrics.SizeOf; ==> 500 !!!
24 ноя 09, 14:07    [7970523]     Ответить | Цитировать Сообщить модератору
 Re: проблема с SystemParametersInfo  [new]
Anatoly Podgoretsky
Member

Откуда:
Сообщений: 62926
Проверь описание функции по Windows.pas, может они изменили описание функции в части @NonClientMetrics, может надо без @

--
http://www.podgoretsky.com
24 ноя 09, 14:09    [7970540]     Ответить | Цитировать Сообщить модератору
 Re: проблема с SystemParametersInfo  [new]
LiYing
Member

Откуда:
Сообщений: 469
Anatoly Podgoretsky
Проверь описание функции по Windows.pas, может они изменили описание функции в части @NonClientMetrics, может надо без @

--
http://www.podgoretsky.com

Не, без @ нельзя:
[Error] E2250 There is no overloaded version of 'SystemParametersInfo' that can be called with these arguments
24 ноя 09, 14:13    [7970591]     Ответить | Цитировать Сообщить модератору
 Re: проблема с SystemParametersInfo  [new]
Anatoly Podgoretsky
Member

Откуда:
Сообщений: 62926
Я уже проверил по Windows.pas - у тебя правильно

--
http://www.podgoretsky.com
24 ноя 09, 14:19    [7970646]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: проблема с SystemParametersInfo  [new]
octamer
Member

Откуда:
Сообщений: 42
>> FillChar(NonClientMetrics, Siz, 0);

Размер CHAR:
в D2007 - 1 байт
в D2010 - 2 байта

Т.е. этот оператор затрёт не только область NonClientMetrics, но и столько же байт после неё
10 янв 18, 00:49    [21091897]     Ответить | Цитировать Сообщить модератору
 Re: проблема с SystemParametersInfo  [new]
Незваныйгость
Guest
octamer, неужели ты думаешь, что создатель темы за последние 8 лет, так и остался с этой проблемой? Пора завязывать с некромантией
10 янв 18, 07:53    [21092037]     Ответить | Цитировать Сообщить модератору
 Re: проблема с SystemParametersInfo  [new]
Tactical Nuclear Penguin
Member

Откуда: холодно тут
Сообщений: 2534
octamer
>> FillChar(NonClientMetrics, Siz, 0);

Размер CHAR:
в D2007 - 1 байт
в D2010 - 2 байта

Т.е. этот оператор затрёт не только область NonClientMetrics, но и столько же байт после неё


садись, два.
FillChar оперирует байтами.
10 янв 18, 08:28    [21092092]     Ответить | Цитировать Сообщить модератору
 Re: проблема с SystemParametersInfo  [new]
Квейд
Member

Откуда: Kyiv, Ukraine
Сообщений: 5064
LiYing
quaid,
твой совет помог, спасибо!

Через восемь лет - не за что! :)
10 янв 18, 14:16    [21093435]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить