Скрыть Memo в подвале отчета

отредактировано 16:28 Раздел: FastReport 4.0
В подвале отчета выводится информация в виде этикетки (две колонки Memo):
Поле1: ЗначениеПоля1
Поле2: ЗначениеПоля2
Поле3: ЗначениеПоля3
Поле4: ЗначениеПоля4
Поле5: ЗначениеПоля5

Если значение какого-либо поля равно 0, то это поле и заголовок поля слева надо скрыть. При этом нужно, чтобы нижележащие поля поднялись вверх.
Например, ЗначениеПоля2=0 и ЗначениеПоля4=0, тогда отчет должен выглядеть так:

Поле1: ЗначениеПоля1
Поле3: ЗначениеПоля3
Поле5: ЗначениеПоля5

В скрипте в событии ReportSummary1OnBeforePrint я прописал код для сокрытия Мемо (свойство HideZeros скрывает только Мемо со значением, а надо скрыть еще и заголовок слева поля):
if <Таблица1."ЗначениеПоля2">=0 then begin
Memo3.Visible:=false;
Memo4.Visible:=false;
end;
if <Таблица1."ЗначениеПоля4">=0 then begin
Memo7.Visible:=false;
Memo8.Visible:=false;
end;

Поля скрываются, но остаются пустые строки:
Поле1: ЗначениеПоля1

Поле3: ЗначениеПоля3

Поле5: ЗначениеПоля5

Пробовал банд сделать растягиваемым и цеплять Child на каждое поле, но все равно промежутки. Child и вообще band работают только на "растягивание" вниз? Т.е. увеличиваться по высоте могут, а уменьшаться нет?
Вопрос: как можно сделать без пустых строк без лишнего кода?

Комментарии

  • отредактировано 16:28
    Получилось сделать только воткнув на каждое поле по Child и скрывать Child, а не Memo (у каждого Child нужно поставить PrintChildifInvisible в True) :

    if <Таблица1."ЗначениеПоля2">=0 then
    Child2.Visible:=false;

    if <Таблица1."ЗначениеПоля4">=0 then
    Child4.Visible:=false;

    Проще то уже никак не сделать? Без Child, а то у меня шаблоны отчетов редактируются юзерами и устанешь их обучать так делать.
  • gpigpi
    отредактировано 16:28
    написал:
    Проще то уже никак не сделать? Без Child, а то у меня шаблоны отчетов редактируются юзерами и устанешь их обучать так делать.
    Проще не получится. Можно только упростить код:

    Child2.Visible := <Таблица1."ЗначениеПоля2"> <> 0;

  • отредактировано 16:28
    Жалко, что нельзя. Ранее работал с PReport, там связи между текстовыми полями гибче реализовывались. И многовариантность отображения была шире. Правда там свои минусы были, так что будем привыкать к fastreport.
  • отредактировано 16:28
    Нашел такой косячок: если много detalband с headerband и они в режиме дизайнера не влазят на страницу, то логично попытаться создать второю страницу и перенести некоторые detalband туда, однако при выполнении отчета будет ошибка, типа неправильно расположен detalband.
    Приходится в дизайнере делать высоту страницу больше, чтобы разместить все detalband на одной странице, а потом возвращать нормальную высоту страницы.
  • gpigpi
    отредактировано 16:28
    написал:
    Нашел такой косячок: если много detalband с headerband и они в режиме дизайнера не влазят на страницу, то логично попытаться создать второю страницу и перенести некоторые detalband туда, однако при выполнении отчета будет ошибка, типа неправильно расположен detalband.
    Приходится в дизайнере делать высоту страницу больше, чтобы разместить все detalband на одной странице, а потом возвращать нормальную высоту страницы.
    Установите TfrxReportPage.LargeDesignHeight в True
    написал:
    Жалко, что нельзя. Ранее работал с PReport, там связи между текстовыми полями гибче реализовывались. И многовариантность отображения была шире. Правда там свои минусы были, так что будем привыкать к fastreport.
    Если можно выводить данные в одном мемо, то можно написать свою функцию
    написал:
    El 9/20/2010 12:22 PM, Mike Long escribio:
    I'm using FastReport 4.8 and I've forgotten how to suppress a blank line when printing an address.
    For example, I have fields: FirstName, LastName, Company, Street1, Street2, City, State, Country, Zip

    Company& Street2 may be blank and I don't want them to occupy a blank line in the address part of the report. What is the easiest way to suppress the blank line(s)?

    add these funtion to fastreportscripting:

    Function HLTrim(const Data : string; const IfDataAddReturn : Boolean) :
    string;
    begin
    result := '';
    If Trim(Data) <> '' Then begin
    result := Data;
    If IfDataAddReturn Then result := result + Chr(13);
    End;
    End;

    class for add the function :

    THLMyFunctions = class(TfsRTTIModule)
    private
    function CallMethod(Instance: TObject; ClassType: TClass; const
    MethodName: String; params: TfsMethodHelper): Variant;
    public
    constructor Create(AScript: TfsScript); override;
    end;

    implementation :

    constructor THLMyFunctions.Create(AScript: TfsScript);
    begin

    inherited Create(AScript);
    with AScript do begin
    AddMethod('Function HLTrim(Data : String; IfDataAddReturn :
    Boolean) : String',CallMethod, '');
    end;
    end;

    function THLMyFunctions.CallMethod(Instance: TObject; ClassType: TClass;
    const MethodName: String; params: TfsMethodHelper): Variant;
    begin
    if methodname = 'HLTRIM' then result := HLTrim(params[0], params[1]);
    end;

    now, inside the memo yo can write

    <hltrim(<you address line1>,true)><hltrim(<address line
    2>,true)><hltrim(<city>,false)> <hltrim(<zip>,false)>

    the second parameter put a new line (true) when the data field is not
    null. if the parameter is false the new line is not inserted this is why
    i put the space between city and zip

    Note : the job is one time (creating the unit) and add the unit for each
    new proyect.

    Please refer to the fastreport documentation to check how create new
    script functions and can complete my example.

    also excuse my poor english

    regards
  • отредактировано 16:28
    gpi написал: »
    Установите TfrxReportPage.LargeDesignHeight в True
    Спасибо, не знал. В принципе вполне автоматизирует ручное изменение высоты страницы "туда-сюда" :) .
    Кстати, и в документации не встречал такого параметра, хотя может невнимательно читал.
    gpi написал: »
    Если можно выводить данные в одном мемо, то можно написать свою функцию
    Посмотрел этот пример, он без надписей полей, простое идет перечисление значений полей. С надписями код немного усложнится, хотя это и непринципиально конечно. В целом код функции может пригодится в случае, если невозможно воткнуть childband, например если слева объект какой-нибудь, хотя тут поможет суботчет. Так что возьмем идею на заметку, спасибо.

    На будущее раработчикам fastreport стоило бы предусмотреть скрывать неспользуемые строки и как-то улучшить работу смещения мемо без использования child и скриптов.

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

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