Допустим, Field1 - одно из полей запроса m_pDataQuery. Оно строковое, и по нему надо объединять ячейки. Field1Memo, - ячейка для этого поля, находится в MasterData1.
Код на C++Script:
Допустим, Field1 - одно из полей запроса m_pDataQuery. Оно строковое, и по нему надо объединять ячейки. Field1Memo, - ячейка для этого поля, находится в MasterData1.
Код на C++Script:
- Создайте одноименные события;
- Поменяйте { на begin, } на end;
- Поменяйте знаки сравнения и присваивания;
- Замените конструкции if (...) {...} else {...} на if ... then begin...end else begin...end
- Измените инициализацию строковой константы с "" на '';
- Исправьте оставшиеся ошибки;
- Создайте одноименные события;
- Поменяйте { на begin, } на end;
- Поменяйте знаки сравнения и присваивания;
- Замените конструкции if (...) {...} else {...} на if ... then begin...end else begin...end
- Измените инициализацию строковой константы с "" на '';
- Исправьте оставшиеся ошибки;
В общем, "как вы яхту назовете, так она и поплывет", неважно как называется переменная или объект, важно, чтобы программист отличал одно от другого по названию.
Не пробовал, думаю, что это и не надо. Название в первой строчке - это более официально и больше подходит под ГОСТ.
Можно при втором проходе по отчету, сделать заранее расчитанную строчку видимой. Но это будет непросто.
написал:
большая просьба прокоментировать
String sField1; // значение поля на предыдущем шаге
// определяем окончание страницы
void MasterData1OnAfterCalcHeight(TfrxComponent Sender)
{
// Если на следущем шаге поле не поместится на страницу,
if ((Engine.freespace < 2*Field1Memo.Height) && (Engine.freespace > Field1Memo.Height))
// то отчертить нижнюю границу у мемо
Field1Memo.Frame.Typ += ftBottom;
//----------------------------------------------------------------------
}
//------------------------------------------------------------------------
void Field1MemoOnBeforePrint(TfrxComponent Sender)
{
// Если значения на текущем и на предыдущем шагах совпадают,
if (sField1 == <m_pDataQuery."Field1">)
// то границы - левая и правая
Field1Memo.Frame.Typ = ftLeft + ftRight;
else
// иначе - левая, правая, верхняя
Field1Memo.Frame.Typ = ftLeft + ftRight + ftTop;
//----------------------------------------------------------------------
// Проверяем на окончание данных.
m_pDataQuery.Next; // перемещаемся на следущую запись
// Если она указывает на окончание данных,
if (m_pDataQuery.Eof)
// то отчерчиваем нижнюю границу
Field1Memo.Frame.Typ += ftBottom;
else
// иначе возврашаемся в наборе данных на шаг назад
m_pDataQuery.Prior;
//----------------------------------------------------------------------
// Устанавливаем значение предыдущего шага текущим.
sField1 = <m_pDataQuery."Field1">;
//----------------------------------------------------------------------
}
//------------------------------------------------------------------------
{
sField1 = ""; // начальная инициализация значения на предыдущем шаге
//----------------------------------------------------------------------
}
//------------------------------------------------------------------------
Отцентровать реально. Я поступил так:
создал новое поле Flag в котором на против каждой записи ставится цифра 1 или 2 или 3 или 0
1-начало записи
2 - запись по середине
3 - конец записи
0 - обычная запись
значение записи 1,3,0 приcваевается ''
После этого с помощью FastScript'a ведется обработка и соответственно добавляются ftBottom или ftTop
procedure DozatorNameOnBeforePrint(Sender: TfrxComponent);
begin
//DozatorName - типа TfrxMemoView
DozatorName.Frame.Typ := ftLeft + ftRight;
if <frdsTechCardRaw."Flag"> = 1 then
DozatorName.Frame.Typ := DozatorName.Frame.Typ + ftTop
else if <frdsTechCardRaw."Flag"> = 3 then
DozatorName.Frame.Typ := DozatorName.Frame.Typ + ftBottom
end;
Спасибо всем кто участвовал в обсуждении данной темы.
Комментарии
Код на C++Script:
- Поменяйте { на begin, } на end;
- Поменяйте знаки сравнения и присваивания;
- Замените конструкции if (...) {...} else {...} на if ... then begin...end else begin...end
- Измените инициализацию строковой константы с "" на '';
- Исправьте оставшиеся ошибки;
И какой тип у MasterData1
У меня m_pDataQuery это
frdsTechCardRaw: TfrxDBDataSet
И тогда m_pDataQuery.Next надо писать как YourDataBand.DataSet.Next
Теперь к тебе большая просьба прокоментировать как функционирует приведенный тобой код.
И как отцентровать результат в полученной ячейке?
Почитал, прикольно!
В общем, "как вы яхту назовете, так она и поплывет", неважно как называется переменная или объект, важно, чтобы программист отличал одно от другого по названию.
Можно при втором проходе по отчету, сделать заранее расчитанную строчку видимой. Но это будет непросто.
создал новое поле Flag в котором на против каждой записи ставится цифра 1 или 2 или 3 или 0
1-начало записи
2 - запись по середине
3 - конец записи
0 - обычная запись
значение записи 1,3,0 приcваевается ''
После этого с помощью FastScript'a ведется обработка и соответственно добавляются ftBottom или ftTop Спасибо всем кто участвовал в обсуждении данной темы.