📄 fr_utils.pas
字号:
{******************************************}
{ }
{ FastReport v2.5 }
{ Various routines }
{ }
{Copyright(c) 1998-2003 by FastReports Inc.}
{ }
{******************************************}
unit FR_Utils;
interface
{$I FR.inc}
uses
SysUtils, Windows, Messages, Classes, Graphics, Controls,
FR_DBRel, Forms, StdCtrls, Menus, FR_Class;
procedure frReadMemo(Stream: TStream; l: TStrings);
procedure frReadMemo22(Stream: TStream; l: TStrings);
procedure frWriteMemo(Stream: TStream; l: TStrings);
function frReadString(Stream: TStream): String;
function frReadString22(Stream: TStream): String;
procedure frWriteString(Stream: TStream; s: String);
function frReadBoolean(Stream: TStream): Boolean;
function frReadByte(Stream: TStream): Byte;
function frReadWord(Stream: TStream): Word;
function frReadInteger(Stream: TStream): Integer;
procedure frReadFont(Stream: TStream; Font: TFont);
procedure frWriteBoolean(Stream: TStream; Value: Boolean);
procedure frWriteByte(Stream: TStream; Value: Byte);
procedure frWriteWord(Stream: TStream; Value: Word);
procedure frWriteInteger(Stream: TStream; Value: Integer);
procedure frWriteFont(Stream: TStream; Font: TFont);
procedure frEnableControls(c: Array of TControl; e: Boolean);
function frControlAtPos(Win: TWinControl; p: TPoint): TControl;
function frGetDataSet(ComplexName: String): TfrTDataSet;
function frGetFieldValue(F: TfrTField): Variant;
procedure frGetDataSetAndField(ComplexName: String;
var DataSet: TfrTDataSet; var Field: String);
function frGetFontStyle(Style: TFontStyles): Integer;
function frSetFontStyle(Style: Integer): TFontStyles;
function frFindComponent(Owner: TComponent; Name: String): TComponent;
procedure frGetComponents(Owner: TComponent; ClassRef: TClass;
List: TStrings; Skip: TComponent);
function frGetWindowsVersion: String;
function frStrToFloat(s: String): Double;
function frRemoveQuotes(const s: String): String;
procedure frSetCommaText(Text: String; sl: TStringList);
function frLoadStr(ID: Integer): String;
procedure SaveToFR3Stream(Report: TfrReport; Stream: TStream);
function StrToXML(const s: String): String;
function frStreamToString(Stream: TStream): String;
function frFieldIsNull(FieldName: String): Boolean;
implementation
uses FR_DSet, Printers
{$IFDEF IBO}
, IB_Components, IB_Header
{$ELSE}
, DB
{$ENDIF}
{$IFDEF Delphi6}
, Variants
{$ENDIF};
//--------------------------------------------------------------------------
function frSetFontStyle(Style: Integer): TFontStyles;
begin
Result := [];
if (Style and $1) <> 0 then Result := Result + [fsItalic];
if (Style and $2) <> 0 then Result := Result + [fsBold];
if (Style and $4) <> 0 then Result := Result + [fsUnderLine];
if (Style and $8) <> 0 then Result := Result + [fsStrikeOut];
end;
function frGetFontStyle(Style: TFontStyles): Integer;
begin
Result := 0;
if fsItalic in Style then Result := Result or $1;
if fsBold in Style then Result := Result or $2;
if fsUnderline in Style then Result := Result or $4;
if fsStrikeOut in Style then Result := Result or $8;
end;
procedure frReadMemo(Stream: TStream; l: TStrings);
var
s: String;
b: Byte;
n: Word;
begin
l.Clear;
Stream.Read(n, 2);
if n > 0 then
repeat
Stream.Read(n, 2);
SetLength(s, n);
if n > 0 then
Stream.Read(s[1], n);
l.Add(s);
Stream.Read(b, 1);
until b = 0
else
Stream.Read(b, 1);
end;
procedure frWriteMemo(Stream: TStream; l: TStrings);
var
s: String;
i: Integer;
n: Word;
b: Byte;
begin
n := l.Count;
Stream.Write(n, 2);
for i := 0 to l.Count - 1 do
begin
s := l[i];
n := Length(s);
Stream.Write(n, 2);
if n > 0 then
Stream.Write(s[1], n);
b := 13;
if i <> l.Count - 1 then Stream.Write(b, 1);
end;
b := 0;
Stream.Write(b, 1);
end;
function frReadString(Stream: TStream): String;
var
s: String;
n: Word;
b: Byte;
begin
Stream.Read(n, 2);
SetLength(s, n);
if n > 0 then
Stream.Read(s[1], n);
Stream.Read(b, 1);
Result := s;
end;
procedure frWriteString(Stream: TStream; s: String);
var
b: Byte;
n: Word;
begin
n := Length(s);
Stream.Write(n, 2);
if n > 0 then
Stream.Write(s[1], n);
b := 0;
Stream.Write(b, 1);
end;
procedure frReadMemo22(Stream: TStream; l: TStrings);
var
s: String;
i: Integer;
b: Byte;
begin
SetLength(s, 4096);
l.Clear;
i := 1;
repeat
Stream.Read(b,1);
if (b = 13) or (b = 0) then
begin
SetLength(s, i - 1);
if not ((b = 0) and (i = 1)) then l.Add(s);
SetLength(s, 4096);
i := 1;
end
else if b <> 0 then
begin
s[i] := Chr(b);
Inc(i);
if i > 4096 then
SetLength(s, Length(s) + 4096);
end;
until b = 0;
end;
function frReadString22(Stream: TStream): String;
var
s: String;
i: Integer;
b: Byte;
begin
SetLength(s, 4096);
i := 1;
repeat
Stream.Read(b, 1);
if b = 0 then
SetLength(s, i - 1)
else
begin
s[i] := Chr(b);
Inc(i);
if i > 4096 then
SetLength(s, Length(s) + 4096);
end;
until b = 0;
Result := s;
end;
function frReadBoolean(Stream: TStream): Boolean;
begin
Stream.Read(Result, 1);
end;
function frReadByte(Stream: TStream): Byte;
begin
Stream.Read(Result, 1);
end;
function frReadWord(Stream: TStream): Word;
begin
Stream.Read(Result, 2);
end;
function frReadInteger(Stream: TStream): Integer;
begin
Stream.Read(Result, 4);
end;
{$HINTS OFF}
procedure frReadFont(Stream: TStream; Font: TFont);
var
w: Word;
begin
Font.Name := frReadString(Stream);
Font.Size := frReadInteger(Stream);
Font.Style := frSetFontStyle(frReadWord(Stream));
Font.Color := frReadInteger(Stream);
w := frReadWord(Stream);
{$IFNDEF Delphi2}
Font.Charset := w;
{$ENDIF}
end;
{$HINTS ON}
procedure frWriteBoolean(Stream: TStream; Value: Boolean);
begin
Stream.Write(Value, 1);
end;
procedure frWriteByte(Stream: TStream; Value: Byte);
begin
Stream.Write(Value, 1);
end;
procedure frWriteWord(Stream: TStream; Value: Word);
begin
Stream.Write(Value, 2);
end;
procedure frWriteInteger(Stream: TStream; Value: Integer);
begin
Stream.Write(Value, 4);
end;
{$HINTS OFF}
procedure frWriteFont(Stream: TStream; Font: TFont);
var
w: Word;
begin
frWriteString(Stream, Font.Name);
frWriteInteger(Stream, Font.Size);
frWriteWord(Stream, frGetFontStyle(Font.Style));
frWriteInteger(Stream, Font.Color);
w := frCharset;
{$IFNDEF Delphi2}
w := Font.Charset;
{$ENDIF}
frWriteWord(Stream, w);
end;
{$HINTS ON}
type
THackWinControl = class(TWinControl)
end;
procedure frEnableControls(c: Array of TControl; e: Boolean);
const
Clr1: Array[Boolean] of TColor = (clGrayText, clWindowText);
Clr2: Array[Boolean] of TColor = (clBtnFace, clWindow);
var
i: Integer;
begin
for i := Low(c) to High(c) do
if c[i] is TLabel then
with c[i] as TLabel do
begin
Font.Color := Clr1[e];
Enabled := e;
end
else if c[i] is TWinControl then
with THackWinControl(c[i]) do
begin
Color := Clr2[e];
Enabled := e;
end
else
c[i].Enabled := e;
end;
function frControlAtPos(Win: TWinControl; p: TPoint): TControl;
var
i: Integer;
c: TControl;
p1: TPoint;
begin
Result := nil;
with Win do
begin
for i := ControlCount - 1 downto 0 do
begin
c := Controls[i];
if c.Visible and PtInRect(Rect(c.Left, c.Top, c.Left + c.Width, c.Top + c.Height), p) then
if (c is TWinControl) and (csAcceptsControls in c.ControlStyle) and
(TWinControl(c).ControlCount > 0) then
begin
p1 := p;
Dec(p1.X, c.Left); Dec(p1.Y, c.Top);
c := frControlAtPos(TWinControl(c), p1);
if c <> nil then
begin
Result := c;
Exit;
end;
end
else
begin
Result := c;
Exit;
end;
end;
end;
end;
function frGetDataSet(ComplexName: String): TfrTDataSet;
begin
Result := TfrTDataSet(frFindComponent(CurReport.Owner, ComplexName));
end;
function frGetFieldValue(F: TfrTField): Variant;
begin
{$IFDEF IBO}
if F.IsNull then
begin
case F.SqlType of
SQL_TEXT, SQL_TEXT_,
SQL_BLOB, SQL_BLOB_,
SQL_ARRAY, SQL_ARRAY_,
SQL_VARYING, SQL_VARYING_: Result := '';
SQL_DOUBLE, SQL_DOUBLE_,
SQL_FLOAT, SQL_FLOAT_,
SQL_LONG, SQL_LONG_,
SQL_D_FLOAT, SQL_D_FLOAT_,
SQL_QUAD, SQL_QUAD_,
SQL_SHORT, SQL_SHORT_,
SQL_INT64, SQL_INT64_,
// Dieter Tremel 18.04.2002 begin
SQL_TYPE_TIME, SQL_TYPE_TIME_,
SQL_TYPE_DATE, SQL_TYPE_DATE_,
// Dieter Tremel 18.04.2002 end
SQL_DATE, SQL_DATE_: Result := 0;
end;
end else // not null
{$IFDEF Delphi4}
if (F.SQLType = SQL_INT64) or (F.SQLType = SQL_INT64_) and (F.SQLScale = 0) then
Result := F.DisplayText
else
{$ENDIF}
if (F.IsBoolean) and not ((F.SqlType=SQL_Text) or (F.SqlType=SQL_Text_)) then
Result := F.AsBoolean
else
Result := F.AsVariant;
{$ELSE} // not IBO
if not F.DataSet.Active then
F.DataSet.Open;
if Assigned(F.OnGetText) then
Result := F.DisplayText else
{$IFDEF Delphi4}
if F.DataType in [ftLargeint] then
Result := F.DisplayText
else
{$ENDIF}
Result := F.AsVariant;
if Result = Null then
if F.DataType = ftString then
Result := ''
{$IFDEF Delphi4}
else if F.DataType = ftWideString then
Result := ''
{$ENDIF}
else if F.DataType = ftBoolean then
Result := False
else
Result := 0;
{$ENDIF}
end;
procedure frGetDataSetAndField(ComplexName: String; var DataSet: TfrTDataSet;
var Field: String);
var
i, j, n: Integer;
f: TComponent;
sl: TStringList;
s: String;
c: Char;
cn: TControl;
function FindField(ds: TfrTDataSet; FName: String): String;
var
sl: TStringList;
begin
Result := '';
if ds <> nil then
begin
sl := TStringList.Create;
frGetFieldNames(ds, sl);
if sl.IndexOf(FName) <> -1 then
Result := FName;
sl.Free;
end;
end;
begin
Field := '';
f := CurReport.Owner;
sl := TStringList.Create;
n := 0; j := 1;
for i := 1 to Length(ComplexName) do
begin
c := ComplexName[i];
if c = '"' then
begin
sl.Add(Copy(ComplexName, i, 255));
j := i;
break;
end
else if c = '.' then
begin
sl.Add(Copy(ComplexName, j, i - j));
j := i + 1;
Inc(n);
end;
end;
if j <> i then
sl.Add(Copy(ComplexName, j, 255));
case n of
0: // field name only
begin
if DataSet <> nil then
begin
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -