Как отследить перекрытие текста

отредактировано 01:33 Раздел: FastReport 4.0
В коде программы создается страница и динамически создаются текст. Будет понятнее если я скажу что эта прога для заполнения бланков дипломов.

Как отследить событие перекрытия одного текста другим.

Мне кажется, я когда-то видел эту тему на форуме, но не нашел..

Комментарии

  • gpigpi
    отредактировано 01:33
    procedure Memo2OnBeforePrint(Sender: TfrxComponent);
    begin
         if Memo2.Top < Memo1.Height + Memo1.Top then ShowMessage('Перекрытие');                                                                                                                                      
    end;
    
  • отредактировано October 2010
    хм... :) . Ну да, какой вопрос, такой ответ...
    Это если мемо 2 штуки.
    А у меня на странице может быть более 50...
    Придется все перебрать и сравнить друг с другом, по предложенному методу...?
    Честно говоря рассчитывал на другой способ, не знаю на какой, правда...
    Другого способа нет, даже в теории?

    Я решил сделать немного по другому...
    var List:array of array of Boolean;
        t,l,h,w,i,j,x,y,m,n:integer;
        memo:TfrxMemoView;
    
    begin
      //Создаем двумерный массив (чистый лист) и заполняем его нулями (ложью  :)
      SetLength(List,0);
      x:=Trunc(Report.Pages[0].Width);
      y:=Trunc(Report.Pages[0].Height);
      SetLength(List,X);
      for I := 0 to x - 1 do begin
          SetLength(List[i],y);
        for J := 0 to y do
            List[i,j]:=false;
      end;
    
      //Обходим все элементы отчета
      for I := 0 to Report.ComponentCount - 1 do begin
        //работаем с TfrxMemoView
        if Report.Components[i] is TfrxMemoView then begin
            memo:=(Report.Components[i] as TfrxMemoView);
                //Определяем положение и размер компонента...
            t:=Trunc(Memo.Top);
            l:=Trunc(Memo.Left);
            h:=Trunc(Memo.CalcHeight);
            w:=Trunc(Memo.CalcWidth);
            //Каждый TfrxMemoView (в соответствии с моей математической моделью)
            //является группой элементов массива чистого листа (как бы занимаемая площадь)
            //Для определения пресечения необходимо проверить все элементы это площади, если часть площади занято,
            //то  List[x,y]:=true
            for m := l to l+w-1 do
               for n := t to t+h - 1 do begin
                  if List[m,n] then //ShowMessage('Пересечение! ');
               end;
               //Если часть не заполнена другим компонентом, то помечаем как заполненную 
               List[m,n]:=true;
            end;
        end;
      end;
    end;
    
    Надеюсь ястно выразил свою мысль...

    Это все хорошо! и даже работает!

    Но! Размеры у Мемо, немного больше шрифта
    Я добавил в код "обрисовку каждого компонента"

    Это видно на скрине...
    Если нижняя граница еще как-то соответствует..., то верхняя на много выше!
    Из-за этого происходит "ложное срабатывание" моего метода! (да и предложенного выше тоже).
    Как добится совпадения высоты Мемо и и размера шрифта?

    Во время создания Мемо высота определялась... Memo.Height:= Memo.CalcHeight

    И еще обратите внимание на колонки с оценками и часами, выравнивание в этих строках по центру...
    Т.е. left указывает не на начало, а на середину!
    Но это решается....

    Iosben51SQ.jpg
  • отредактировано 01:33
    up

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

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