Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Лицензия FastReport за багрепорты и багофиксы

Автор: gpi
Дата сообщения: 08.10.2005 10:44
Не то просто особенность, не то баг:
Скрипт в отчёте:

Код:
procedure MasterData2OnBeforePrint(Sender: TfrxComponent);
begin
if IsFirstLine then
begin
Memo164.Frame.Typ:=[ftleft,ftRight,ftTop]; //ошибка
Memo164.Text:='I';
IsFirstLine:=False;
end
else
begin
Memo164.Frame.Typ:=[ftleft,ftRight]; //ошибка
Memo164.Text:='';
end;
end;
Автор: DroN_S
Дата сообщения: 09.10.2005 11:49
Не знаю, нужна ли эта функция для фаста, но лично я использую её часто и при написании программ для любых расчётов для бухгалтерии она очень часто пригождается...
Название функции: ConvertSumToPropis - преобразование числа к прописным

Код:
модуль fs_isysrtti.pas
{сама функция преообразования}
//begin fix
function ConvertSumToPropis(Number:real):string;
var
PartNum, TruncNum, NumTMP, D: integer;
NumStr : string;
i, R : byte;
Flag11 : boolean;
begin
D:=1000000;
R:=4;
TruncNum:=Trunc(Number);
if TruncNum<>0
then
repeat
PartNum:=TruncNum div D;
Dec(R);
D:=D div 1000;
until PartNum<>0
else
R:=0;

for i:=R downto 1 do
begin
Flag11:=False;
NumTMP:=PartNum div 100;
case NumTMP of
1: NumStr:=NumStr+'сто ';
2: NumStr:=NumStr+'двести ';
3: NumStr:=NumStr+'триста ';
4: NumStr:=NumStr+'четыреста ';
5: NumStr:=NumStr+'пятьсот ';
6: NumStr:=NumStr+'шестьсот ';
7: NumStr:=NumStr+'семьсот ';
8: NumStr:=NumStr+'восемьсот ';
9: NumStr:=NumStr+'девятьсот ';
end;
NumTMP:=(PartNum mod 100) div 10;
case NumTMP of
1: begin
NumTMP:=PartNum mod 100;
case NumTMP of
10: NumStr:=NumStr+'десять ';
11: NumStr:=NumStr+'одиннадцать ';
12: NumStr:=NumStr+'двенадцать ';
13: NumStr:=NumStr+'тринадцать ';
14: NumStr:=NumStr+'четырнадцать ';
15: NumStr:=NumStr+'пятнадцать ';
16: NumStr:=NumStr+'шестнадцать ';
17: NumStr:=NumStr+'семнадцать ';
18: NumStr:=NumStr+'восемнадцать ';
19: NumStr:=NumStr+'девятнадцать ';
end;
case i of
3: NumStr:=NumStr+'миллионов ';
2: NumStr:=NumStr+'тысяч ';
1: NumStr:=NumStr+'рублей ';
end;
Flag11:=True;
end;
2: NumStr:=NumStr+'двадцать ';
3: NumStr:=NumStr+'тридцать ';
4: NumStr:=NumStr+'сорок ';
5: NumStr:=NumStr+'пятьдесят ';
6: NumStr:=NumStr+'шестьдесят ';
7: NumStr:=NumStr+'семьдесят ';
8: NumStr:=NumStr+'восемьдесят ';
9: NumStr:=NumStr+'девяносто ';
end;
NumTMP:=PartNum mod 10;
if not Flag11 then
begin
case NumTMP of
1: if i=2 then
NumStr:=NumStr+'одна '
else NumStr:=NumStr+'один ';
2: if i=2 then
NumStr:=NumStr+'две '
else NumStr:=NumStr+'два ';
3: NumStr:=NumStr+'три ';
4: NumStr:=NumStr+'четыре ';
5: NumStr:=NumStr+'пять ';
6: NumStr:=NumStr+'шесть ';
7: NumStr:=NumStr+'семь ';
8: NumStr:=NumStr+'восемь ';
9: NumStr:=NumStr+'девять ';
end;
case i of
3: case NumTMP of
1 : NumStr:=NumStr+'миллион ';
2,3,4: NumStr:=NumStr+'миллиона ';
else
NumStr:=NumStr+'миллионов ';
end;
2: case NumTMP of
1 : NumStr:=NumStr+'тысяча ';
2,3,4: NumStr:=NumStr+'тысячи ';
else
if PartNum<>0 then
NumStr:=NumStr+'тысяч ';
end;
1: case NumTMP of
1 : NumStr:=NumStr+'рубль ';
2,3,4: NumStr:=NumStr+'рубля ';
else NumStr:=NumStr+'рублей ';
end;
end;
end;
if i>1 then
begin
PartNum:=(TruncNum mod (D*1000)) div D;
D:=D div 1000;
end;
end;

PartNum:=Round(Frac(Number)*100);
if PartNum=0 then
begin
ConvertSumToPropis:=NumStr+'00 копеек';
Exit;
end;
NumTMP:=PartNum div 10;
if NumTMP=0 then
NumStr:=NumStr+'0'+IntToStr(PartNum)+' '
else
NumStr:=NumStr+IntToStr(PartNum)+' ';
NumTMP:=PartNum mod 10;
case NumTMP of
1: if PartNum<>11 then
NumStr:=NumStr+'копейка'
else
NumStr:=NumStr+'копеек';
2,3,4: if (PartNum<5) or (PartNum>14) then
NumStr:=NumStr+'копейки'
else
NumStr:=NumStr+'копеек';
else NumStr:=NumStr+'копеек';
end;
ConvertSumToPropis:=NumStr;
end;
//end fix
constructor TFunctions.Create;
begin
FCatStr := 'ctString';
FCatDate := 'ctDate';
FCatConv := 'ctConv';
FCatFormat := 'ctFormat';
FCatMath := 'ctMath';
FCatOther := 'ctOther';
//.....
//begin fix
AddMethod('function ConvertSumToPropis(Number:real):string', CallMethod1, FCatConv);
//end fix
//.....
function TFunctions.CallMethod1(Instance: TObject; ClassType: TClass;
const MethodName: String; var Params: Variant): Variant;
var
{$IFDEF Delphi6}
i: Int64;
{$ELSE}
i: Integer;
{$ENDIF}
begin
if MethodName = 'INTTOSTR' then
begin
i := Params[0];
Result := IntToStr(i)
end
else if MethodName = 'FLOATTOSTR' then
Result := FloatToStr(Params[0])
else if MethodName = 'DATETOSTR' then
Result := DateToStr(Params[0])
else if MethodName = 'TIMETOSTR' then
Result := TimeToStr(Params[0])
else if MethodName = 'DATETIMETOSTR' then
Result := DateTimeToStr(Params[0])
//begin fix
else if MethodName = 'CONVERTSUMTOPROPIS' then
Result := ConvertSumToPropis(Params[0])
//end fix
end;
Автор: gpi
Дата сообщения: 09.10.2005 14:21
DroN_S

Цитата:
не знаю, станут ли разработчики это воспринимать как фикс или дополнение, но для меня это очень удобно...

Не думаю, что разработчики включат такую функцию в модуль fs_isysrtti.pas, т.к. ФастРепорт создаётся с локализациями для многих языков. Я тоже использую подобные функции для русского и украинского языков. А подобные функции можно подключать способом, описанным в Руководстве разработчика (стр. 40-42):

Цитата:

Если вы собираетесь подключать большое количество функций, имеет
смысл вынести всю логику в отдельный модуль. Вот пример такого модуля:

unit myfunctions;

interface

implementation

uses SysUtils, Classes, fs_iinterpreter;

type
TFunctions = class(TObject)
private
function CallMethod(Instance: TObject; ClassType: TClass; const
MethodName: String; var Params: Variant): Variant;
public
constructor Create;
destructor Destroy; override;
end;

var
Functions: TFunctions;
....................

Такими модулями можно значительно расширить возможности Фаста. Неплохо было бы, если кто-то взялся собирать новые функции в отдельный модуль, а FR Team выкладывала этот модуль у себя на сайте.
Автор: DroN_S
Дата сообщения: 09.10.2005 21:46
Вот функция которая преобразует дату вида "10.10.2005" к виду "10 октября 2005 года"
тоже очень нужная вещь...

Код:
модуль fs_isysrtti.pas
{сама функция преобразования даты}
//begin function
function DateToPropis(e: Extended):string;
var
den, mes, god : word;
mess:string;
begin
DecodeDate(e,god,mes,den);

case mes of
1: mess:='Января';
2: mess:='Февраля';
3: mess:='Марта';
4: mess:='Апреля';
5: mess:='Мая';
6: mess:='Июня';
7: mess:='Июля';
8: mess:='Августа';
9: mess:='Сентября';
10: mess:='Октября';
11: mess:='Ноября';
12: mess:='Декабря';
end;

Result := IntToStr(den) + ' ' + mess + ' ' +IntToStr(god) + ' года';
end;
//end function
constructor TFunctions.Create;
begin
FCatStr := 'ctString';
FCatDate := 'ctDate';
FCatConv := 'ctConv';
FCatFormat := 'ctFormat';
FCatMath := 'ctMath';
FCatOther := 'ctOther';

with fsGlobalUnit do
begin
AddedBy := Self;
AddMethod('function IntToStr(i: Integer): String', CallMethod1, FCatConv);
AddMethod('function FloatToStr(e: Extended): String', CallMethod1, FCatConv);
AddMethod('function DateToStr(e: Extended): String', CallMethod1, FCatConv);
//begin method
AddMethod('function DateToPropis(e: Extended): String', CallMethod1, FCatConv);
//end method
AddMethod('function TimeToStr(e: Extended): String', CallMethod1, FCatConv);
AddMethod('function DateTimeToStr(e: Extended): String', CallMethod1, FCatConv);
//...........
function TFunctions.CallMethod1(Instance: TObject; ClassType: TClass;
const MethodName: String; var Params: Variant): Variant;
var
{$IFDEF Delphi6}
i: Int64;
{$ELSE}
i: Integer;
{$ENDIF}
begin
if MethodName = 'INTTOSTR' then
begin
i := Params[0];
Result := IntToStr(i)
end
else if MethodName = 'FLOATTOSTR' then
Result := FloatToStr(Params[0])
else if MethodName = 'DATETOSTR' then
Result := DateToStr(Params[0])
//begin method
else if MethodName = 'DATETOPROPIS' then
Result := DateToPropis(Params[0])
//end method
else if MethodName = 'TIMETOSTR' then
Result := TimeToStr(Params[0])
else if MethodName = 'DATETIMETOSTR' then
Result := DateTimeToStr(Params[0])
//*********************************************************
else if MethodName = 'CONVERTSUMTOPROPIS' then
Result := ConvertSumToPropis(Params[0])
//*********************************************************
end;
Автор: GloThin
Дата сообщения: 10.10.2005 05:39
DroN_S

Цитата:
Вот функция которая преобразует дату вида "10.10.2005" к виду "10 октября 2005 года"

Функция то конечно полезная, но как было сказано:
Цитата:
Не думаю, что разработчики включат такую функцию в модуль fs_isysrtti.pas, т.к. ФастРепорт создаётся с локализациями для многих языков.

Такие функции специфичны для группы славянских языков и в комплект продукта вряд ли будут включены.
Единственный разумный вариант для функций такого рода выделить их в отдельный модуль и размещать его в News-groups. Как в принципе реализованы многие специфические вещи для использования совместно с ФастРепортом.По-моему,там даже пробегала функция

Цитата:
преобразование числа к прописным
.
Автор: DroN_S
Дата сообщения: 10.10.2005 09:09
GloThin

Цитата:
Единственный разумный вариант для функций такого рода выделить их в отдельный модуль и размещать его в News-groups. Как в принципе реализованы многие специфические вещи для использования совместно с ФастРепортом.

Такая идея уже была предложена gpi

На счёт всех этих функций, это все те функции которые требуются людям в их работе. Здесь предложено решение проблемы многих пользователей, а локализацию сделать уже не проблема
Автор: stalker780
Дата сообщения: 10.10.2005 09:33
QBuilder в Фаст 3.15 не видит вьюхи и отказывается с ними работать, даже если ручками написать запрос.
использую TfrxFIBQuery... может это конечно их баг. Но все равно.
Как лечить пока не разобрался, но пытаюсь
Автор: martyanov
Дата сообщения: 10.10.2005 11:50
баг 1:
Запускаем FRDemo. В дизайнере открываем любой отчёт. Смещаем любой Мемо. Становятся активными кнопки Undo и Save. Сохраняем отчёт. Кнопка Save становится неактивной, Undo - активна. Жмём Undo - никаких изменений, но Redo - становится тоже активной. Жмём Undo ещё раз - объект возвращается на прежнее место, Save - неактивна.
баг 2:
Запускаем FRDemo. В дизайнере открываем любой отчёт. Переходим в редактор кода, ничего не меняя.Undo - активна. Нажимаем пробел. Save - активна. Сохраняем отчёт. Undo - активна. Жмём Undo - сообщение об ошибке.
фикс с багу 2:


Цитата:
//frxSynMemo.pas
public
...
procedure ClearUndo; // fix
function GetUndoCount: Integer; // fix
...

//begin of fix
procedure TfrxSyntaxMemo.ClearUndo;
begin
FUndo.Clear;
end;

function TfrxSyntaxMemo.GetUndoCount: Integer;
begin
Result := FUndo.Count;
end;
//end of fix

//frxDsgn.pas
procedure TfrxDesignerForm.UpdateControls;
...
N15cpiMI.Checked := fsx15cpi in DMPFontStyle;

UndoCmd.Enabled := (FUndoBuffer.UndoCount > 1) or ((FPage = nil) and (CodeWindow.GetUndoCount > 0));// fix
RedoCmd.Enabled := (FUndoBuffer.RedoCount > 0) and (FPage <> nil);
...

procedure TfrxDesignerForm.OnCodeChanged(Sender: TObject);
begin
if FPage = nil then
begin
FModified := True;
SaveCmd.Enabled := True;
UndoCmd.Enabled := True; // fix
end;
end;

procedure TfrxDesignerForm.UndoCmdExecute(Sender: TObject);
var
i: Integer;
begin
if IsPreviewDesigner then Exit;

if FPage = nil then
begin
CodeWindow.Undo;
UndoCmd.Enabled := CodeWindow.GetUndoCount > 0; // fix
Exit;
end;

procedure TfrxDesignerForm.SaveFile(SaveAs: Boolean; UseOnSaveEvent: Boolean);
...
if Saved then
begin
Modified := False;
CodeWindow.ClearUndo; // fix
UpdateControls; // fix
end;
...

Автор: stalker780
Дата сообщения: 10.10.2005 15:46
В общем выкладываю нормальный фикс для frxFIB из FR 3.15

Теперь он отображает и таблицы и вьюхи и процедуры, пришлось написать свою процедуру, ибо штатными средствами фибов оказалось это сделать невозможно.

unit frxFIBComponents


Код:
uses
Graphics, Windows, Classes, SysUtils, frxClass, frxCustomDB, DB,
FIBDatabase, pFIBDatabase, FIBDataSet, pFIBDataSet, pFIBProps, pFIBCacheQueries,
FIBQuery
{$IFDEF Delphi6}

...

type
...
TfrxEngineFIB = class(TfqbEngine)
...
public
...
procedure GetTableNames(TableNames: TStrings; WithSystem: Boolean);
...

procedure TfrxEngineFIB.ReadTableList(ATableList: TStrings);
begin
ATableList.Clear;
GetTableNames(ATableList, ShowSystemTables);
end;

procedure TfrxEngineFIB.GetTableNames(TableNames: TStrings; WithSystem: Boolean);
const
TablesSQL='SELECT RDB$RELATION_NAME as TABLENAME FROM RDB$RELATIONS WHERE @SYS '+
'UNION ALL '+
'SELECT RDB$PROCEDURE_NAME as TABLENAME FROM RDB$PROCEDURES WHERE @SYS '+
'ORDER BY 1 ';
var qry :TFIBQuery;
begin
qry := GetQueryForUse(FQuery.Transaction,TablesSQL);
try
with qry do begin
Close;
TableNames.BeginUpdate;
Options:=[qoStartTransaction,qoTrimCharFields];
if not WithSystem then
Params[0].asString:='RDB$SYSTEM_FLAG = 0';
ExecQuery;
while not Eof do begin
TableNames.Add(Fields[0].asString);
Next;
end;
end;
finally
if FQuery.Transaction.Active then FQuery.Transaction.Commit;
TableNames.EndUpdate;
FreeQueryForUse(qry);
end;
end;
...

Автор: Vic26
Дата сообщения: 18.10.2005 22:00
Баг при использовании в отчете frxCheckBoxObject, возникает если поле в БД имеет значение NULL.
Мое решение в frxChBox.pas правим TfrxCheckBoxView.GetData

было

Код:
procedure TfrxCheckBoxView.GetData;
begin
inherited;
if IsDataField then
begin
FChecked := DataSet.Value[DataField]
end
else if FExpression <> '' then
FChecked := Report.Calc(FExpression);
end;
Автор: Alex_Yagolnik
Дата сообщения: 19.10.2005 12:40
Это не баг, а скорее пожелание разработчикам. Есть тип TfrxPreviewForm с проработанной логикой событий нажатия на кнопки, загрузкой PopupMenu и выпадающих списков и прочими проверенными алгоритмами. Однако, если пользователь решил создать своё окно предосмотра, то вынужден сам рисовать свои кнопки, придумывать обработчики и прочее. Т.е. повторять работу разработчиков.

Моё предложение такое. Добавить новый компонент TfrxPreviewToolBar, который будет загружать на форму ToolBar со всеми стандартными кнопками (Print, NextPage, etc.). При этом должна быть возможность использовать как стандартные обработчики каждой кнопки, так и добавлять свои.
Характерный пример такого компонента: TDBNavigator

Есть ещё более простой вариант: добавлять FR набор в Standart Actions.

Кстати, знания стандартного Help явно недостаточно для того, чтобы написать "стандартный" обработчик кнопки Print :

Код:

if not frxPrinters.HasPhysicalPrinters then
frxErrorMsg(frxResources.Get('clNoPrinters'))
else
frxPreview1.Print;
Enabled := True;

Автор: gpi
Дата сообщения: 19.10.2005 15:52
Что-то My_Way сюда вообще не заглядывает
Автор: Alex_Yagolnik
Дата сообщения: 19.10.2005 16:21
Нашёл БАГ!
версия 3.18 триал

В стандартном окне Preview изменяем масштаб так, чтобы страница вышла за горизонтальные границы (например, 200%). Двигаем "рукой" страницу влево. Переходим к масштабу "страница целиком". Страница "убегает" влево, т.е. становится невидна. Любое движение "Hand" центрует страницу.

Добавлено:
Ещё одно пожелание.

TfrxPreview наследник TControl. Почему бы не сделать Published следующие свойства: OnMouseDown, OnMouseMove, OnMouseUp, OnMouseWheel, OnMouseWheelDown, OnMouseWheelUp ?
            
            

Добавлено:

Цитата:
Что-то My_Way сюда вообще не заглядывает


Лицензии кончились
Автор: gpi
Дата сообщения: 19.10.2005 19:31
Alex_Yagolnik

Цитата:
Нашёл БАГ!

А версию для печати почитать?
Автор: DroN_S
Дата сообщения: 19.10.2005 21:46
Alex_Yagolnik

Цитата:
Нашёл БАГ!

даже в шапке написано

Цитата:
Информация для новичков
Для вновь прибывших, внимательно читать вот ЭТО, чтобы не повторять уже исправленные баги

читайте внимательно
Автор: Alex_Yagolnik
Дата сообщения: 20.10.2005 12:27
Интересное кино! Ошибка найдена полтора месяца назад!
В новой версии - всё то же.

У меня предложение: если баг был найден в старой версии и сохранился в новой, то засчитывать его обнаружения как новый баг

PS: читаю в changes_rus.txt

Цитата:


Текущая
-------------
...
"- исправлен баг в превью (отображение страницы при смене масштаба)"
...

Версия 3.18
-------------
...


Это как понимать?
Автор: GloThin
Дата сообщения: 20.10.2005 14:18
Alex_Yagolnik

Цитата:
У меня предложение: если баг был найден в старой версии и сохранился в новой, то засчитывать его обнаружения как новый баг

Ну на это разработчики врядли пойдут. Уних так лицензии точно закончатся.
Автор: DroN_S
Дата сообщения: 20.10.2005 14:25
Alex_Yagolnik

Цитата:
У меня предложение: если баг был найден в старой версии и сохранился в новой, то засчитывать его обнаружения как новый баг

Ну ты гений
с такими предложения, можно смело открывать ветку на странице семь и зароботать себе лицензию в пару минут
Автор: GloThin
Дата сообщения: 20.10.2005 14:49

Цитата:
и зароботать себе лицензию в пару минут

И не только на Энт, но и на старшую версию Студио, их ведь теперь четыре.
Автор: Alex_Yagolnik
Дата сообщения: 20.10.2005 15:56

Цитата:
с такими предложения, можно ... зароботать себе лицензию в пару минут


Угу. Только почему разработчики пишут, что проблема решена, а она не решена?
В чём заключается работа тестера? Наступать на одни и те же грабли до тех пор, пока программист не удосужится их убрать .
А всякий труд должен оплачиватся. Например, лицензией

И ещё, можно ли считать багом явную недоработку?
Есть в стандартном Preview такая фишка: пользуемся инструментом Zoom, и в соответствующем окошке меняется значение процентов.
Если посмотреть исходники, то событие TfrxPreview.UpdateZoom глубоко зарыто под private в трёх классах TfrxPreviewWorkspace, TfrxPreview и TfrxPreviewForm.
Если бы у TfrxPreview было событие OnAfterZoom, то и вопроса бы не было. А так - класс TfrxPreview носит чисто декоративный, а не прикладной характер.


Автор: DroN_S
Дата сообщения: 20.10.2005 16:49
Alex_Yagolnik

Цитата:
В чём заключается работа тестера? Наступать на одни и те же грабли до тех пор, пока программист не удосужится их убрать

все те исправления которые были сделаны и предоставлены в этой ветке, войдут в продукт, и будут исправлены, просто пока разработчики не сочли их критичными к исправлению, но взяли на усмотрение...

Цитата:
Например, лицензией

находи баги, которые небыли представлены в этой ветке и... будет тебе лицензия
Автор: gpi
Дата сообщения: 20.10.2005 18:21

Цитата:
находи баги, которые небыли представлены в этой ветке и... будет тебе лицензия

Ага, если My_Way объявится. А то вы тут всё спорите, спорите...
Автор: My_Way
Дата сообщения: 21.10.2005 18:13

Цитата:
если My_Way объявится
Объявится, ни куда он не денется

Garrett
+6, но засчитываем финиш, т.к. твое продвижене к финишу было приторможено по нашей вине (по поводу проекта с докой)

Nicka_Grey
+2 багрепорта, все ближе к FR Studio

Alex_Yagolnik
предложения засчитаем за багрепорты +2

Цитата:
У меня предложение: если баг был найден в старой версии и сохранился в новой, то засчитывать его обнаружения как новый баг

засчитаем это за баг в нашей службе исправления багов +1
но предложение не принимается

Цитата:
можно ли считать багом явную недоработку
можно, считаем +1


Далее:
JustAMaaan
1:0 - FR Basic

martyanov
4:2 - FR Pro

stalker780
1:1 - FR Standard

Vic26
1:1 - FR Standard



Цитата:

Цитата: Что-то My_Way сюда вообще не заглядывает
Лицензии кончились
Автор: gpi
Дата сообщения: 21.10.2005 19:46
My_Way

Цитата:
martyanov
4:2 - FR Pro

4+2*3=10=FR Ent+1 в остатке, а в шапке топика остаток почему-то равен 10.
Автор: My_Way
Дата сообщения: 21.10.2005 20:53

Цитата:
4+2*3=10=FR Ent+1 в остатке, а в шапке топика остаток почему-то равен 10.

упс, проглючил я
спасибо, что поправил
Автор: gpi
Дата сообщения: 22.10.2005 23:14
Баг с буфером обмена:
В дизайнере бросаем на страницу Мемо. В редакторе текста пишем в Мемо что-нибудь по-русски. Переключаем раскладку клавиатуры на английский, выделяем русский текст и копируем его в буфер обмена. Затем переходим в редактор кода и делаем туда вставку из буфера - наблюдаем вопросительные знаки.
Автор: Garrett
Дата сообщения: 23.10.2005 00:28
gpi
Это баг XP.
Запиши нижеследующие строки в cp.reg и выполни, проверь свой баг

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage]
@="c_1251.nls"
"1250"="c_1251.nls"
"1252"="c_1251.nls"
Автор: gpi
Дата сообщения: 23.10.2005 08:38
Garrett
Действительно, внёс изменения в реестр, перезагрузил систему - всё ОК. Спасибо за совет!
Автор: DroN_S
Дата сообщения: 24.10.2005 08:46
Вот такое вот явление:
в дизайнере использую компонент BDETable, в DatabaseName указываю базу, в TableName выбираю таблицу, бросаю MasterData, в Select DataSet выбираю BDETable, кладу на него поля из базы, запускаю просмотр, и вот что получается, в конец отчёта, появляется одна пустая лишняя страница, в базе нет ничего подобного(пустых строк нет), да и если подключать через frxDBDataset то такого не наблюдается...
Автор: Nicka_Grey
Дата сообщения: 26.10.2005 11:07
Режим «Просмотр»:
1. Рисуем на странице любой объект (Мемо или любую графическую объемную фигуру), выставляем у нее свойство Align:=baClient; переходим в режим «Просмотр», изменяем верхнее поле страницы допустим на 3,объект изменил высоту, что вроде бы правильно; изменяем верхнее поле страницы обратно и опа – объект, не изменяя размеров переместился к верхней границе страницы, а нижняя соответственно изменилась.
2. Для объекта из пункта 1, выставляем свойство Align:=baLeft(baRight,baWidth,baCenter), и что самое удивительное при baNone, при изменении в режиме «Просмотр» верхнее поле страницы на величину, больше чем положение крайней верхней границы фигуры, то что мы видим – Объект побежал вниз, за пределы страницы.
3. Не знаю, баг это или нет, но зачем в окне «Параметры страницы» в полях границ можно вводить цифры, превышающие размеры страницы, например для для А4 можно выставить поля хоть 100 см, хоть 10000 см
Для решения проблемы из пункта 1 можно использовать следующую модификацию фикса от gpi со стр. №8:

Код:
//frxClass.pas
procedure TfrxReportPage.AlignChildren;
var
i: Integer;
c: TfrxComponent;
begin
Width := (FPaperWidth - FLeftMargin - FRightMargin) * fr01cm;
Height := (FPaperHeight - FTopMargin - FBottomMargin) * fr01cm;
inherited;
for i := 0 to Objects.Count - 1 do
begin
c := Objects[i];
if c is TfrxBand then
begin
if TfrxBand(c).Vertical then
c.Height := (FPaperHeight - FTopMargin - FBottomMargin) * fr01cm - c.Top
else
c.Width := Width - c.Left;
if c.Width > Width then
c.Width := Width;
c.Height := Height; //new_fix
c.AlignChildren;
end;
end;
UpdateDimensions;
end;

Страницы: 12345678910111213141516

Предыдущая тема: Числовой формат даты


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.