доступ к Tfrxmemoview после присвоения переменных

PabloPablo Рязань
отредактировано 20:18 Раздел: FastReport 4.0
Имеется абсолютно стандартный отчет обрабатываемый компонентом TfrxReport
Содержимое представлено компонентами TfrxMemoView с содержимым типа [FAM], [NAM], [ROZ], [LIV] и прочими.
1. Происходит загрузка данного отчета из потока.
2. Присвоение значений всех переменных.
3. Вывод на экран с последующей печатью.

Для корректировки шрифта компонента TfrxMemoView требуется получить доступ к содержимому не первоначального ([FAM], [NAM]) отчета, а уже заполненного ('Иванов', 'Петр') и прочее. При обработке хочется, чтобы смог оказывать влияние на размер шрифта компонента.

Что пробовал:

1. В качестве возможных вариантов рассматривал обращение к TfrxReport.Components в случае принадлежности к типу TfrxMemoView.
Но содержимое MEMO этих компонент содержит первоначальные значения ([FAM], [NAM).

2. Пытался влиять на обработку следующих событий отчета
OnBeforePrint (первоначальные значения, но можно влиять на результат: изменять шрифт и положение TfrxMemoView)
OnAfterPrint (нужные значения, но на результат манипуляции с размером шрифта не влияют(((
OnClickObject и OnDblClickObject (все работает, но юзер должен щелкнуть на каждый "нужный" квадратик)

Подскажите как можно обратиться к данным TfrxMemoView и повлиять на результат (preview отчета)???
Очень хочется прогнать процедуру в посткриптуме для всех TfrxMemoView отчета.

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

P.S. Процедура уменьшения шрифта до нужного значения, чтобы умещался весь текст (подходит только для однострочных TfrxMemoView)

procedure TfmfReport.ReportDblClickObject(Sender: TfrxView; Button: TMouseButton; Shift: TShiftState; var Modified: Boolean);
var c:TBitMap; txt:string;
begin
if Sender is TfrxMemoView then
begin
txt:=Trim(string((Sender as TfrxMemoView).Memo.GetText)); //получение содержимого компонента
c:=TBitmap.Create; //тестовый графический объект с TCanvas
c.Canvas.Font:=(Sender as TfrxMemoView).Font; //"выравнивание" шрифтов
while c.Canvas.TextWidth(txt)>(Sender as TfrxMemoView).Width do //сравнение ширины содержимого и ширины компонента
c.Canvas.Font.Size:=c.Canvas.Font.Size-1; //пробуем уменьшить на единичку
Modified:=((Sender as TfrxMemoView).Font.Size<>c.Canvas.Font.Size); //компонент был модифицирован
(Sender as TfrxMemoView).Font.Size:=c.Canvas.Font.Size; //изменение шрифта компонента
c.Destroy;
end;
end;

Комментарии

  • PabloPablo Рязань
    отредактировано 20:18
    {******************************************}
    { }
    { FastReport v4.0 }
    { Report classes }
    { }
    { Copyright © 1998-2008 }
    { by Alexander Tzyganenko, }
    { Fast Reports Inc. }
    { }
    {******************************************}

    unit frxClass;

    interface

    {$I frx.inc}
    .......
    type
    TfrxReport = class;
    ......
    TfrxNotifyEvent = type String;
    ...........


    Что-то я совсем подзабыл как строка может быть процедурой...

  • gpigpi
    отредактировано 20:18
    TfrxMemoView(frxReport1.FindObject('Memo1')).OnBeforePrint := 'Memo1OnBeforePrint';
  • PabloPablo Рязань
    отредактировано 20:18
    А без модернизации ВСЕХ отчетов никак не получится перехватить доступ к содержимому сформированного отчета с возможностью его редактирования?

    Честно говоря, обработка формы пользователем с двойным кликом представляется наиболее удачным решением, ибо я его могу даже проинформировать о наличии неуместившихся по ширине текстов в мемо...
  • PabloPablo Рязань
    отредактировано September 2012
    Разобрался, но приходится 2 раза делать отчету Prepare, а потом ShowPreparedReport

    Дополнительные глобальные переменные
    Ring:integer – какой идет прогон
    MemoNameSize:TStringList – список наименований компонент TfrxMemoView отчета с неправильным шрифтом, а в Objects записываю «правильный» шрифт
    ReportMakingErrors:TstrringList – перечень ошибок (для самоконтроля)

    Схема действий
    1-е Prepare:
    OnBeforePrint – ничего не делать
    OnAfterPrint – проверка всех заполненных полей и заполнение MemoNameSize по итогам
    2-е Prepare:
    OnBeforePrint – корректировка неправильных TfrxMemoView на основании MemoNameSize
    OnAfterPrint – ничего не делать
    ShowPreparedReport в финале

    //основные действия при печати

    Ring:=1; //первый прогон
    MemoNameSize.Clear; //очищаем список Memo, в которых надо уменьшить шрифт
    fmfReport.Report.PrepareReport; //первый прогон подготовки
    ReportMakingErrors.Clear; //ошибки с него нам не нужны
    Ring:=2; //второй прогон
    fmfReport.Report.PrepareReport; //второй прогон подготовки
    if ReportMakingErrors.Count>0 then
    MessageDlg('Общее число ошибок подготовки бланка свидетельства '+IntToStr(ReportMakingErrors.Count)+#13+ReportMakingErrors.GetText,mtError,[mbOK],0); //если все-таки ошибки остались, то на экран
    fmfReport.Report.ShowPreparedReport; //показать вторую редакцию

    Обработчик TfrxReport.OnBeforePrint=type provedure of object (Sender: TfrxReportComponent);
    begin
    if (Sender is TfrxMemoView) then
    case Ring of // какой проход выполняется
    1:begin
    end;
    2:begin
    if MemoNameSize.IndexOf((Sender as TfrxMemoView).Name)>=0 then
    begin
    (Sender as TfrxMemoView).Font.Size:=integer(MemoNameSize.Objects[MemoNameSize.IndexOf((Sender as TfrxMemoView).Name)]);
    end;
    end;
    end;


    Обработчик TfrxReport.OnAfterPrint=type provedure of object (Sender: TfrxReportComponent);
    if (Sender is TfrxMemoView) then
    case Ring of // какой проход выполняется
    1:begin
    if (Sender as TfrxMemoView).CalcWidth>(Sender as TfrxMemoView).Width-(Sender as TfrxMemoView).GapX*2
    then
    begin
    MemoNameSize.AddObject((Sender as TfrxMemoView).Name,
    TObject(Trunc((Sender as TfrxMemoView).Font.Size*(((Sender as TfrxMemoView).Width-(Sender as TfrxMemoView).GapX*2)/(Sender as TfrxMemoView).CalcWidth))));
    end;
    end;
    2:begin
    if (Sender as TfrxMemoView).CalcWidth>(Sender as TfrxMemoView).Width-(Sender as TfrxMemoView).GapX*2
    then
    ReportMakingErrors.Add('Не уместилось поле, содержащее '+(Sender as TfrxMemoView).Memo.GetText);
    end;
    end;

    Всем, кто пытался помочь большое спасибо.

    P.S. про функцию CalcWidth узнал по наводке, отдельное спасибо

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

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