Каждая буква в квадратике

отредактировано 19:01 Раздел: FastReport 4.0
Здравствуйте!

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

Заранее спасибо.

Комментарии

  • sunsaysunsay Самара
    отредактировано 19:01
    vitzol написал: »
    Подскажите, пожалуйста, можно ли в отчете выводить некоторые слова, чтобы каждая буква была обведена в квадрате...
    Насколько я знаю стандартными средствами нельзя (разве что со шрифтами поэкспериментировать).
    Первое адекватное, что приходит на ум, — это написать собственный компонент с соответствующим Draw методом.
  • отредактировано 19:01
    Настройте CharSpacing и LineSpacing у объекта Текст. Квадратики рисуйте отдельно.
  • отредактировано 19:01
    Спасибо, попробую
  • FokewolfFokewolf Киев
    отредактировано 19:01
    vitzol написал: »
    Здравствуйте!

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

    Заранее спасибо.
    Как я подозреваю, в основном это требуется в неких регламентированных формах отчетности. Причем, в большинстве случаев , это реквизиты с заранее известной длиной, например, ОКПО . И тогда Copy() вам в помощь, либо работа со строкой как с массивом.
  • xlaalaaxlaalaa Минск
    отредактировано February 2009
    Для нас этот вопрос тоже актуален. Думаю как и для всех налогоплательщиков россии :)

    Может кто то продвинулся в направлении
    написал:
    написать собственный компонент с соответствующим Draw методом
    для FastReport4? Поделитесь опытом.

    Примеры форм с массой фрагментов, где каждая буква должна быть обведена в квадратом, есть на сайте налоговой инспекции России Формы налоговой отчетности
  • xlaalaaxlaalaa Минск
    отредактировано 19:01
    Вопрос снимается.
    Подумали и пришли к выводу, что специальный компонент не нужен. Помог могучий и великий язык FastScript.
    { Функция для заполнения клеточек по буквам. 
    
      Назначение функции - дополняет переданный Text смволом-заполнителем 
      ch и выводит текст посимвольно в группу последовательно расположенных 
      квадратов. Перечень квадратов задается в параметрам FirstNum, LastNum, 
      здесь нужно указать номер первого и последнего квадрата.
        
      Единственно требование  к форме отчета, чтобы последовательно 
      распложенные клеточки имели последовательные имена 
      (например Memo5 Memo6 Memo7 … Memo16). 
    
      Результат функция возвращает символ для первого квадрата. 
      Для получения нужного результата - достаточно в первом квадрате указать формулу вида;    
    
        [DistributeTextCh(5, 16, <DocDataStream."INN">, '-')]
    
      Второй и последующие квадраты будут заполнены автоматом.
    }          
    
    function DistributeTextCh(FirstNum, LastNum : integer; Text : string; ch : char) : string;
    var
      i : integer;
      s : string;
      memo : TFrxMemoView;                                                
    begin
      result := '';
    
      // проверка на некорректные параметры  
      if FirstNum > LastNum then
        exit;
          
      // дополнить строку символом заполнителем справа
      s := PadCh(Text, ch, FirstNum - LastNum + 1);
    
      for i := FirstNum+1 to LastNum do
      begin
        // найти вторую и последующие ячейки в отчете отчета по шаблону 'Memo' + номер
        memo := TFrxMemoView(Report.FindObject('Memo'+IntToStr(i)));
    
        // Заполнить буквы
        if memo <> nil then
          memo.text := s[i - FirstNum + 1];                                                         
      end;
    
      // вернуть первую букву для вывода в первую ячейку
      result := s[1];                                    
    end;          
    
    // Аналог функции с заполнением пробелом
    function DistributeText(FirstNum, LastNum : integer; Text : string) : string;
    begin
      result := DistributeTextCh(FirstNum, LastNum, Text, ' ');                                                                                       
    end;
    
  • FokewolfFokewolf Киев
    отредактировано 19:01
    xlaalaa написал: »
    Вопрос снимается.
    Подумали и пришли к выводу, что специальный компонент не нужен. Помог могучий и великий язык FastScript.
    { Функция для заполнения клеточек по буквам. 
    
      Назначение функции - дополняет переданный Text смволом-заполнителем 
      ch и выводит текст посимвольно в группу последовательно расположенных 
      квадратов. Перечень квадратов задается в параметрам FirstNum, LastNum, 
      здесь нужно указать номер первого и последнего квадрата.
        
      Единственно требование  к форме отчета, чтобы последовательно 
      распложенные клеточки имели последовательные имена 
      (например Memo5 Memo6 Memo7 … Memo16). 
    
      Результат функция возвращает символ для первого квадрата. 
      Для получения нужного результата - достаточно в первом квадрате указать формулу вида;    
    
        [DistributeTextCh(5, 16, <DocDataStream."INN">, '-')]
    
      Второй и последующие квадраты будут заполнены автоматом.
    }          
    
    function DistributeTextCh(FirstNum, LastNum : integer; Text : string; ch : char) : string;
    var
      i : integer;
      s : string;
      memo : TFrxMemoView;                                                
    begin
      result := '';
    
      // проверка на некорректные параметры  
      if FirstNum > LastNum then
        exit;
          
      // дополнить строку символом заполнителем справа
      s := PadCh(Text, ch, FirstNum - LastNum + 1);
    
      for i := FirstNum+1 to LastNum do
      begin
        // найти вторую и последующие ячейки в отчете отчета по шаблону 'Memo' + номер
        memo := TFrxMemoView(Report.FindObject('Memo'+IntToStr(i)));
    
        // Заполнить буквы
        if memo <> nil then
          memo.text := s[i - FirstNum + 1];                                                         
      end;
    
      // вернуть первую букву для вывода в первую ячейку
      result := s[1];                                    
    end;          
    
    // Аналог функции с заполнением пробелом
    function DistributeText(FirstNum, LastNum : integer; Text : string) : string;
    begin
      result := DistributeTextCh(FirstNum, LastNum, Text, ' ');                                                                                       
    end;
    

    К сожалению, ваша функция автоматом заполнит второй и последующие квадраты только в случае последовательной нумерации мемок.Если же по каким-либо причинам они будут названы, например, Memo1,Memo234,Memo45,Memo9 - будет осуществляться некорректное заполнение.
  • xlaalaaxlaalaa Минск
    отредактировано 19:01
    Fokewolf написал: »
    К сожалению, ваша функция автоматом заполнит второй и последующие квадраты только в случае последовательной нумерации мемок.Если же по каким-либо причинам они будут названы, например, Memo1,Memo234,Memo45,Memo9 - будет осуществляться некорректное заполнение.

    Да совершенно верно, в нашем случае это оказалось не проблема. Поскольку формы мы импортировали из EXCEL. Алгоритм импорта я тут в форуме публиковал.
  • FokewolfFokewolf Киев
    отредактировано 19:01
    Кстати, что за функция PadCh - что-то я ее не наблюдаю я себя в FastReport - е на PascalScript .
  • xlaalaaxlaalaa Минск
    отредактировано 19:01
    Fokewolf написал: »
    Кстати, что за функция PadCh - что-то я ее не наблюдаю я себя в FastReport - е на PascalScript .

    Дополнить строку символами, тоже мы сами писали ее.
  • FokewolfFokewolf Киев
    отредактировано 19:01
    xlaalaa написал: »
    Дополнить строку символами, тоже мы сами писали ее.
    Ну раз выложили одну функцию, то могли бы уже и вторую выложить, так сказать, для полноты картины .... :)

Оставить комментарий

Многофункциональный текстовый редактор. Чтобы отредактировать стиль параграфа, нажмите TAB, чтобы перейти к меню абзаца. Там вы можете выбрать стиль. По умолчанию не выбран ни один стиль. Когда вы выберете текст, появится встроенное меню форматирования. Нажмите TAB, чтобы войти в него. Некоторые элементы, такие как многофункциональные вставки ссылок, картинок, индикаторов загрузки и сообщений об ошибок могут быть вставлены в редактор. Вы можете перемещаться по ним, используя стрелки внутри редактора и удалять с помощью клавиш delete или backspace.