Заголовки Строк В Ravereport

Тема в разделе "Delphi - Компоненты", создана пользователем novachok, 28 сен 2012.

  1. novachok

    novachok New Member

    Регистрация:
    16 авг 2012
    Сообщения:
    1
    Симпатии:
    0
    В отчёте RaveReport строю отчёт с 2 полей. При создании нужно проверить второй столбец, если значение пустое - нужно первый столбец сделать ЖИРНЫМ.
    Примерно так:

    1111111
    2222222 2222222
    3333333 3333333
    4444444
    5555555 5555555

    написал код

    Код (Delphi):
    function DataText1_OnGetText(Self: TRaveDataText; var Value: string);
    begin
    if DataText2.text = ''
    then
    DataText2.Font:='Arial,12,Bold';
    end;
    end OnGetText;
    но он не работает!
    Подскажите что нужно написать?
     
  2. sinkopa

    sinkopa Well-Known Member

    Регистрация:
    17 июн 2009
    Сообщения:
    344
    Симпатии:
    9
    Ну... во-первых сама конструкция if весьма странная... Получается: если DataText2 не имеет текста, то он (пустой текст) должен быть жирным... :)
    А во-вторых, динамическое изменение параметров шрифта в Ravereport делается обычно так:
    1. Запускаем Rave Visual Designer
    2. Переходим на закладку Standard
    3. Находим компонент FontMaster и добавляем два экземпляра в RaveProject (FontMaster1, FontMaster2).
    4. FontMaster1 переобзываем (свойство Name) в FontNormal. Настраиваем параметры шрифта (свойство Font).
    5. FontMaster2 переобзываем (свойство Name) в FontBold. Настраиваем параметры шрифта (свойство Font).
    6. В коде (обработчик OnGetText у DataText1) пишем
    Код (Delphi):
    function DataText1_OnGetText(Self: TRaveDataText; var Value: string);
    begin
    if DataText2.text = '' then
    Self.FontMirror := FontBold;
    else
    Self.FontMirror := FontNormal;
    end if;
    end OnGetText;
    7. Сохраняем проект, компилируем, радуемся... :)
     
  3. novachok

    novachok New Member

    Регистрация:
    16 авг 2012
    Сообщения:
    1
    Симпатии:
    0
    Всё получилос так как мне нужно. Огромное спасибо!!!
     
  4. novachok

    novachok New Member

    Регистрация:
    16 авг 2012
    Сообщения:
    1
    Симпатии:
    0
    Ещё такой вопрос: Почему при сохранении в rtf созраняет примерно так -
    { \ r t f 1 \ a n s i { \ f o n t t b l { \ f 0 \ f c h a r s e t 1 \ f p r q 0 A r i a l ; } } { \ c o l o r t b l ; \ r e d 0 \ g r e e n 0 \ b l u e 0 ; \ r e d 2 5 5 \ g r e e n 2 5 5 \ b l u e 2 5 5 } \ p a p e r w 1 1 9 0 6 \ p a p e r h 1 6 8 3 8 \ l y t p r t m e t \ v i e w k i n d 1

    ...... и так дальше
    У меня офис 2010.
    сохраняю вот так:
    Код (Delphi):
    var
    NdrStream: TMemoryStream;
    OutStream: TMemoryStream;
    begin
    RvProject1.ProjectFile := DirReport;
    NdrStream := TMemoryStream.Create;
    OutStream := TMemoryStream.Create;
    try
    RvProject1.Open;
    RvProject1.Engine := RvNDRWriter1;
    RvNDRWriter1.StreamMode := smUser;
    RvNDRWriter1.Stream := NdrStream;
    RvProject1.Execute;
    RvRenderRTF1.PrintRender(NdrStream, FileNameRTF + '.rtf');
    finally
    FreeAndNil(NdrStream);
    FreeAndNil(OutStream);
    end;
    может настроить надо где-то? Помогите!
    Нужно сохранить всё так как в отчёте(с сеткой, форматом строк(Ж,обычный))
     
  5. sinkopa

    sinkopa Well-Known Member

    Регистрация:
    17 июн 2009
    Сообщения:
    344
    Симпатии:
    9
    Ооо... Так сразу не скажу... тут несколько вариантов может быть...
    Суть в том что RTF похоже неправильно "вылился". Должен был быть либо в однобайтовой кодировке (ANSI):
    Либо в двухбайтовой UNICODE (Как Вы продемонстрировали). Но тогда в начале файла должен стоять BOM заголовок ($FFFE)
    Тут либо глюк RvNDRWriter, либо глюг RvRenderRTF, либо Delphi (у Вас небось XE2?)
    В полне возможно нужно какие то новые свойства в проекте Ravereport выставить. Давно с Ravereport не работал, так что точно сказать точно не могу...
    В качестве заглушки могу предложить попробовать следующую функцию для исправления полученного файла...
    Код (Delphi):
    function FixBadRTF(Filename: string): Boolean;
    const
    BOML = $FEFF;
    BOMB = $FFFE;
    var
    fStream: TMemoryStream;
    PW: PWideChar;
    EOF: Word;
    S: AnsiString;
    begin
    Result := FileExists(Filename);
    if not Result then Exit;
    EOF := 0;
    fStream := TMemoryStream.Create;
    try
    try
    fStream.LoadFromFile(Filename); // грузим в стрим
    fStream.Position := fStream.Size;
    fStream.WriteBuffer(EOF,SizeOf(EOF));
    PW := fStream.Memory;  // ставим указатель на начало памяти стрима

    if (PWord(PW)^ = BOML) or (PWord(PW)^ = BOMB) then // если есть UNICODE заголовок, пропускаем
    Inc(PW);

    S := WideString(PW)+''; // приводим UNICODE к ANSI
    fStream.Clear;
    if (Length(S) > 0) then
    begin
    fStream.WriteBuffer(S[1],Length(S)); // сохраняем в стрим
    fStream.Position := 0;
    fStream.SaveToFile(Filename);
    end;
    except
    Result := False;
    end;
    finally
    fStream.Free;
    end;
    end;
     
  6. novachok

    novachok New Member

    Регистрация:
    16 авг 2012
    Сообщения:
    1
    Симпатии:
    0
    Да! Использую XE2.
    Ваша функция отлично работает! НО! Почему-то некоторые слова обрезает! Точнее они переносятся на следующий рядок. Может можна их как-то не переносить?

    P.S.
    Спасибо за функцию!
     
  7. sinkopa

    sinkopa Well-Known Member

    Регистрация:
    17 июн 2009
    Сообщения:
    344
    Симпатии:
    9
    Пришлите мне (sinkopa_im<собака>mail<точка>ru) RTF (!!НЕ ФИКСЕННЫЙ!!) файл с "обрезанными словами", я посмотрю что можно сделать...
    "обрезанные слова" укажите (на всякий случай) в теле письма.
     
  8. Гость

    А что спасибо что все тут обьяснили дуракам)
     
Загрузка...

Поделиться этой страницей