Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Разбираемся с Получением Диапазонов Unicode глифов в Delphi 6

Delphi , Графика и Игры , Шрифты

Вопрос, поднятый пользователем, касается работы с функцией GetFontUnicodeRanges в среде разработки Delphi 6. Эта функция предназначена для получения информации о поддерживаемых диапазонах Unicode глифов в шрифте. В процессе работы с этой функцией возникла проблема, связанная с неправильным восприятием размера массива диапазонов глифов.

Описание проблемы

Пользователь пытается получить информацию о глифах Unicode, используя функцию GetFontUnicodeRanges. Он выделяет память для структуры TGlyphSet, которая содержит, среди прочего, массив ranges для хранения диапазонов глифов. Однако, несмотря на то что GS.cRanges возвращает значение 309, длина массива GS.ranges равна 1, что приводит к ошибке при попытке доступа ко второму элементу массива.

Анализ проблемы

Структура TGlyphSet включает в себя переменную длины массив ranges, который размещается внутри структуры. Однако в типизации C такой подход не может быть корректно закодирован, и поэтому функция вызывается для определения необходимого размера памяти, после чего выделяется память в куче.

Подтвержденный ответ

Чтобы решить проблему, можно отключить проверку диапазонов для кода, который работает с массивом ranges. В противном случае, можно использовать арифметику указателей для последовательного доступа к элементам массива:

var
  rng: PWCRange;
begin
  rng := @GS.ranges[0];
  for i:=0 to GS.cRanges-1 do begin
    // работа с rng^
    inc(rng);
  end;
end;

Для случайного доступа и с включенной проверкой диапазонов, можно объявить дополнительные типы для обхода проверки:

type
  TWCRangeArray = array [0..(MaxInt div SizeOf(TWCRange))-1] of TWCRange;
  PWCRangeArray = ^TWCRangeArray;

var
  rng: TWCRange;
begin
  // ...
  rng := PWCRangeArray(@GS.ranges)[i];
end;

Пример кода

Для получения диапазонов глифов Unicode в Delphi 6, можно использовать следующий код:

var
  GS: PGlyphSet;
  GSSize: LongWord;
begin
  GSSize := GetFontUnicodeRanges(Canvas.Handle, nil);
  GetMem(GS, GSSize);
  try
    GS.cbThis := GSSize;
    GS.flAccel := 0;
    GS.cGlyphsSupported := 0;
    GS.cRanges := 0;
    if GetFontUnicodeRanges(Canvas.Handle, GS) <> 0 then
    begin
      type
        TWCRangeArray = array [0..(GS.cRanges - 1)] of TWCRange;
        PWCRangeArray = ^TWCRangeArray;
      var
        rng: PWCRangeArray;
      begin
        SetLength(TWCRangeArray(GS.ranges), GS.cRanges);
        rng := PWCRangeArray(@GS.ranges);
        for i := 0 to GS.cRanges - 1 do
        begin
          // здесь можно работать с диапазонами глифов
          Writeln('Диапазон: ', rng^[i].wcLow, ' - ', rng^[i].cGlyphs);
          Inc(rng);
        end;
      end;
    end;
  finally
    SetLength(GS, 0);
    Dispose(GS);
  end;
end;

Этот код выделяет память для структуры TGlyphSet и затем заполняет динамический массив ranges с учетом реального количества диапазонов глифов. После завершения работы с данными, память освобождается. Это позволяет корректно работать с Unicode глифами в шрифтах без ошибок, связанных с неправильной обработкой массива диапазонов.

Заключение

При работе с GetFontUnicodeRanges важно правильно обработать возвращаемый массив диапазонов глифов, учитывая его переменную длину. Использование арифметики указателей или дополнительных типов позволяет корректно работать с данными, не отключая при этом проверку диапазонов.

Создано по материалам из источника по ссылке.

Пользователь сталкивается с проблемой корректного доступа к массиву диапазонов глифов Unicode после вызова функции `GetFontUnicodeRanges` в среде разработки Delphi 6.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Шрифты ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-02-05 14:45:58/0.0037598609924316/0