доступ к Tfrxmemoview после присвоения переменных
Pablo
Рязань
Имеется абсолютно стандартный отчет обрабатываемый компонентом 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;
Содержимое представлено компонентами 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;
Комментарии
{ }
{ 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;
...........
Что-то я совсем подзабыл как строка может быть процедурой...
Честно говоря, обработка формы пользователем с двойным кликом представляется наиболее удачным решением, ибо я его могу даже проинформировать о наличии неуместившихся по ширине текстов в мемо...
Дополнительные глобальные переменные
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
Обработчик TfrxReport.OnAfterPrint=type provedure of object (Sender: TfrxReportComponent);
if (Sender is TfrxMemoView) then
Всем, кто пытался помочь большое спасибо.
P.S. про функцию CalcWidth узнал по наводке, отдельное спасибо