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

novachok

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

1111111
2222222 2222222
3333333 3333333
4444444
5555555 5555555

написал код

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

sinkopa

Well-known member
17.06.2009
344
4
#2
В отчёте RaveReport строю отчёт с 2 полей. При создании нужно проверить второй столбец, если значение пустое - нужно первый столбец сделать ЖИРНЫМ.
...
написал код
...
но он не работает!
Подскажите что нужно написать?
Ну... во-первых сама конструкция 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) пишем
Код:
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. Сохраняем проект, компилируем, радуемся... :)
 

novachok

New member
16.08.2012
1
0
#4
Ещё такой вопрос: Почему при сохранении в 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.
сохраняю вот так:
Код:
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;
может настроить надо где-то? Помогите!
Нужно сохранить всё так как в отчёте(с сеткой, форматом строк(Ж,обычный))
 

sinkopa

Well-known member
17.06.2009
344
4
#5
Ещё такой вопрос: Почему при сохранении в 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
Ооо... Так сразу не скажу... тут несколько вариантов может быть...
Суть в том что RTF похоже неправильно "вылился". Должен был быть либо в однобайтовой кодировке (ANSI):
{ \rtf1\ansi{\fonttbl{\f0\fcharset1\fprq0 Arial;}}{\colortbl;\red0\green0\blue0;\red255\green255\blue255}\paperw11906\paperh16838\lytprtmet\viewkind
Либо в двухбайтовой UNICODE (Как Вы продемонстрировали). Но тогда в начале файла должен стоять BOM заголовок ($FFFE)
Тут либо глюк RvNDRWriter, либо глюг RvRenderRTF, либо Delphi (у Вас небось XE2?)
В полне возможно нужно какие то новые свойства в проекте Ravereport выставить. Давно с Ravereport не работал, так что точно сказать точно не могу...
В качестве заглушки могу предложить попробовать следующую функцию для исправления полученного файла...
Код:
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;
 

novachok

New member
16.08.2012
1
0
#6
(у Вас небось XE2?)
Да! Использую XE2.
Ваша функция отлично работает! НО! Почему-то некоторые слова обрезает! Точнее они переносятся на следующий рядок. Может можна их как-то не переносить?

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

sinkopa

Well-known member
17.06.2009
344
4
#7
Да! Использую XE2.
Ваша функция отлично работает! НО! Почему-то некоторые слова обрезает! Точнее они переносятся на следующий рядок. Может можна их как-то не переносить?
Пришлите мне (sinkopa_im<собака>mail<точка>ru) RTF (!!НЕ ФИКСЕННЫЙ!!) файл с "обрезанными словами", я посмотрю что можно сделать...
"обрезанные слова" укажите (на всякий случай) в теле письма.
 
G

Guest

#8
А что спасибо что все тут обьяснили дуракам)