home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 October / Chip_2001-10_cd1.bin / zkuste / delphi / kolekce / d6 / FRCLX.ZIP / SOURCE / FR_Utils.pas < prev    next >
Pascal/Delphi Source File  |  2001-07-03  |  14KB  |  585 lines

  1.  
  2. {******************************************}
  3. {                                          }
  4. {           FastReport CLX v2.4            }
  5. {            Various routines              }
  6. {                                          }
  7. { Copyright (c) 1998-2001 by Tzyganenko A. }
  8. {                                          }
  9. {******************************************}
  10.  
  11. unit FR_Utils;
  12.  
  13. interface
  14.  
  15. {$I FR.inc}
  16.  
  17. uses
  18.   SysUtils, Types, Classes, QGraphics, QControls, QForms, QStdCtrls, QMenus,
  19.   Variants, FR_DBRel;
  20.  
  21.  
  22. procedure frReadMemo(Stream: TStream; l: TStrings);
  23. procedure frReadMemo22(Stream: TStream; l: TStrings);
  24. procedure frWriteMemo(Stream: TStream; l: TStrings);
  25. function frReadString(Stream: TStream): String;
  26. function frReadString22(Stream: TStream): String;
  27. procedure frWriteString(Stream: TStream; s: String);
  28. function frReadBoolean(Stream: TStream): Boolean;
  29. function frReadByte(Stream: TStream): Byte;
  30. function frReadWord(Stream: TStream): Word;
  31. function frReadInteger(Stream: TStream): Integer;
  32. procedure frReadFont(Stream: TStream; Font: TFont);
  33. procedure frWriteBoolean(Stream: TStream; Value: Boolean);
  34. procedure frWriteByte(Stream: TStream; Value: Byte);
  35. procedure frWriteWord(Stream: TStream; Value: Word);
  36. procedure frWriteInteger(Stream: TStream; Value: Integer);
  37. procedure frWriteFont(Stream: TStream; Font: TFont);
  38. procedure frEnableControls(c: Array of TControl; e: Boolean);
  39. function frControlAtPos(Win: TWinControl; p: TPoint): TControl;
  40. function frGetDataSet(ComplexName: String): TfrTDataSet;
  41. function frGetFieldValue(F: TfrTField): Variant;
  42. procedure frGetDataSetAndField(ComplexName: String;
  43.   var DataSet: TfrTDataSet; var Field: String);
  44. function frGetFontStyle(Style: TFontStyles): Integer;
  45. function frSetFontStyle(Style: Integer): TFontStyles;
  46. function frFindComponent(Owner: TComponent; Name: String): TComponent;
  47. procedure frGetComponents(Owner: TComponent; ClassRef: TClass;
  48.   List: TStrings; Skip: TComponent);
  49. function frStrToFloat(s: String): Double;
  50. function frRemoveQuotes(const s: String): String;
  51. procedure frSetCommaText(Text: String; sl: TStringList);
  52.  
  53.  
  54. implementation
  55.  
  56. uses FR_Class, FR_DSet, DB;
  57.  
  58.  
  59. //--------------------------------------------------------------------------
  60. function frSetFontStyle(Style: Integer): TFontStyles;
  61. begin
  62.   Result := [];
  63.   if (Style and $1) <> 0 then Result := Result + [fsItalic];
  64.   if (Style and $2) <> 0 then Result := Result + [fsBold];
  65.   if (Style and $4) <> 0 then Result := Result + [fsUnderLine];
  66.   if (Style and $8) <> 0 then Result := Result + [fsStrikeOut];
  67. end;
  68.  
  69. function frGetFontStyle(Style: TFontStyles): Integer;
  70. begin
  71.   Result := 0;
  72.   if fsItalic in Style then Result := Result or $1;
  73.   if fsBold in Style then Result := Result or $2;
  74.   if fsUnderline in Style then Result := Result or $4;
  75.   if fsStrikeOut in Style then Result := Result or $8;
  76. end;
  77.  
  78. procedure frReadMemo(Stream: TStream; l: TStrings);
  79. var
  80.   s: String;
  81.   b: Byte;
  82.   n: Word;
  83. begin
  84.   l.Clear;
  85.   Stream.Read(n, 2);
  86.   if n > 0 then
  87.     repeat
  88.       Stream.Read(n, 2);
  89.       SetLength(s, n);
  90.       if n > 0 then
  91.         Stream.Read(s[1], n);
  92.       l.Add(s);
  93.       Stream.Read(b, 1);
  94.     until b = 0
  95.   else
  96.     Stream.Read(b, 1);
  97. end;
  98.  
  99. procedure frWriteMemo(Stream: TStream; l: TStrings);
  100. var
  101.   s: String;
  102.   i: Integer;
  103.   n: Word;
  104.   b: Byte;
  105. begin
  106.   n := l.Count;
  107.   Stream.Write(n, 2);
  108.   for i := 0 to l.Count - 1 do
  109.   begin
  110.     s := l[i];
  111.     n := Length(s);
  112.     Stream.Write(n, 2);
  113.     if n > 0 then
  114.       Stream.Write(s[1], n);
  115.     b := 13;
  116.     if i <> l.Count - 1 then Stream.Write(b, 1);
  117.   end;
  118.   b := 0;
  119.   Stream.Write(b, 1);
  120. end;
  121.  
  122. function frReadString(Stream: TStream): String;
  123. var
  124.   s: String;
  125.   n: Word;
  126.   b: Byte;
  127. begin
  128.   Stream.Read(n, 2);
  129.   SetLength(s, n);
  130.   if n > 0 then
  131.     Stream.Read(s[1], n);
  132.   Stream.Read(b, 1);
  133.   Result := s;
  134. end;
  135.  
  136. procedure frWriteString(Stream: TStream; s: String);
  137. var
  138.   b: Byte;
  139.   n: Word;
  140. begin
  141.   n := Length(s);
  142.   Stream.Write(n, 2);
  143.   if n > 0 then
  144.     Stream.Write(s[1], n);
  145.   b := 0;
  146.   Stream.Write(b, 1);
  147. end;
  148.  
  149. procedure frReadMemo22(Stream: TStream; l: TStrings);
  150. var
  151.   s: String;
  152.   i: Integer;
  153.   b: Byte;
  154. begin
  155.   SetLength(s, 4096);
  156.   l.Clear;
  157.   i := 1;
  158.   repeat
  159.     Stream.Read(b,1);
  160.     if (b = 13) or (b = 0) then
  161.     begin
  162.       SetLength(s, i - 1);
  163.       if not ((b = 0) and (i = 1)) then l.Add(s);
  164.       SetLength(s, 4096);
  165.       i := 1;
  166.     end
  167.     else if b <> 0 then
  168.     begin
  169.       s[i] := Chr(b);
  170.       Inc(i);
  171.       if i > 4096 then
  172.         SetLength(s, Length(s) + 4096);
  173.     end;
  174.   until b = 0;
  175. end;
  176.  
  177. function frReadString22(Stream: TStream): String;
  178. var
  179.   s: String;
  180.   i: Integer;
  181.   b: Byte;
  182. begin
  183.   SetLength(s, 4096);
  184.   i := 1;
  185.   repeat
  186.     Stream.Read(b, 1);
  187.     if b = 0 then
  188.       SetLength(s, i - 1)
  189.     else
  190.     begin
  191.       s[i] := Chr(b);
  192.       Inc(i);
  193.       if i > 4096 then
  194.         SetLength(s, Length(s) + 4096);
  195.     end;
  196.   until b = 0;
  197.   Result := s;
  198. end;
  199.  
  200. function frReadBoolean(Stream: TStream): Boolean;
  201. begin
  202.   Stream.Read(Result, 1);
  203. end;
  204.  
  205. function frReadByte(Stream: TStream): Byte;
  206. begin
  207.   Stream.Read(Result, 1);
  208. end;
  209.  
  210. function frReadWord(Stream: TStream): Word;
  211. begin
  212.   Stream.Read(Result, 2);
  213. end;
  214.  
  215. function frReadInteger(Stream: TStream): Integer;
  216. begin
  217.   Stream.Read(Result, 4);
  218. end;
  219.  
  220. procedure frReadFont(Stream: TStream; Font: TFont);
  221. var
  222.   w: Word;
  223. begin
  224.   Font.Name := frReadString(Stream);
  225.   Font.Size := frReadInteger(Stream);
  226.   Font.Style := frSetFontStyle(frReadWord(Stream));
  227.   Font.Color := frReadInteger(Stream);
  228.   w := frReadWord(Stream);
  229.   Font.Charset := TFontCharset(w);
  230. end;
  231.  
  232. procedure frWriteBoolean(Stream: TStream; Value: Boolean);
  233. begin
  234.   Stream.Write(Value, 1);
  235. end;
  236.  
  237. procedure frWriteByte(Stream: TStream; Value: Byte);
  238. begin
  239.   Stream.Write(Value, 1);
  240. end;
  241.  
  242. procedure frWriteWord(Stream: TStream; Value: Word);
  243. begin
  244.   Stream.Write(Value, 2);
  245. end;
  246.  
  247. procedure frWriteInteger(Stream: TStream; Value: Integer);
  248. begin
  249.   Stream.Write(Value, 4);
  250. end;
  251.  
  252. procedure frWriteFont(Stream: TStream; Font: TFont);
  253. var
  254.   w: Word;
  255. begin
  256.   frWriteString(Stream, Font.Name);
  257.   frWriteInteger(Stream, Font.Size);
  258.   frWriteWord(Stream, frGetFontStyle(Font.Style));
  259.   frWriteInteger(Stream, Font.Color);
  260.   w := Word(Font.Charset);
  261.   frWriteWord(Stream, w);
  262. end;
  263.  
  264. type
  265.   THackWinControl = class(TWinControl)
  266.   end;
  267.  
  268. procedure frEnableControls(c: Array of TControl; e: Boolean);
  269. const
  270.   Clr1: Array[Boolean] of TColor = (clGrayText, clWindowText);
  271.   Clr2: Array[Boolean] of TColor = (clBtnFace, clWindow);
  272. var
  273.   i: Integer;
  274. begin
  275.   for i := Low(c) to High(c) do
  276.     if c[i] is TLabel then
  277.       with c[i] as TLabel do
  278.       begin
  279.         Font.Color := Clr1[e];
  280.         Enabled := e;
  281.       end
  282.     else if c[i] is TWinControl then
  283.       with THackWinControl(c[i]) do
  284.       begin
  285.         Color := Clr2[e];
  286.         Enabled := e;
  287.       end
  288.     else
  289.       c[i].Enabled := e;
  290. end;
  291.  
  292. function frControlAtPos(Win: TWinControl; p: TPoint): TControl;
  293. var
  294.   i: Integer;
  295.   c: TControl;
  296.   p1: TPoint;
  297. begin
  298.   Result := nil;
  299.   with Win do
  300.   begin
  301.     for i := ControlCount - 1 downto 0 do
  302.     begin
  303.       c := Controls[i];
  304.       if c.Visible and PtInRect(Rect(c.Left, c.Top, c.Left + c.Width, c.Top + c.Height), p) then
  305.         if (c is TWinControl) and (csAcceptsControls in c.ControlStyle) and
  306.            (TWinControl(c).ControlCount > 0) then
  307.         begin
  308.           p1 := p;
  309.           Dec(p1.X, c.Left); Dec(p1.Y, c.Top);
  310.           c := frControlAtPos(TWinControl(c), p1);
  311.           if c <> nil then
  312.           begin
  313.             Result := c;
  314.             Exit;
  315.           end;
  316.         end
  317.         else
  318.         begin
  319.           Result := c;
  320.           Exit;
  321.         end;
  322.     end;
  323.   end;
  324. end;
  325.  
  326. function frGetDataSet(ComplexName: String): TfrTDataSet;
  327. begin
  328.   Result := TfrTDataSet(frFindComponent(CurReport.Owner, ComplexName));
  329. end;
  330.  
  331. function frGetFieldValue(F: TfrTField): Variant;
  332. begin
  333. {$IFDEF IBO}
  334. {  if Assigned(F.OnGetText) then
  335.     Result := F.DisplayText else}
  336.     Result := F.AsVariant;
  337.   if F.isNull then
  338.     case F.SqlType of
  339.       SQL_Text, SQL_Text_,
  340.       SQL_BLOB, SQL_BLOB_,
  341.       SQL_Array, SQL_Array_,
  342.       SQL_Varying, SQL_Varying_: Result := '';
  343.       SQL_DOUBLE, SQL_DOUBLE_,
  344.       SQL_FLOAT, SQL_FLOAT_,
  345.       SQL_LONG, SQL_LONG_,
  346.       SQL_D_FLOAT, SQL_D_FLOAT_,
  347.       SQL_QUAD, SQL_QUAD_,
  348.       SQL_SHORT, SQL_SHORT_,
  349.       SQL_INT64, SQL_INT64_,
  350.       SQL_DATE, SQL_DATE_: Result := 0;
  351.     end;
  352. {$ELSE}
  353.   if not F.DataSet.Active then
  354.     F.DataSet.Open;
  355.   if Assigned(F.OnGetText) then
  356.     Result := F.DisplayText else
  357. {$IFDEF Delphi4}
  358.   if F.DataType in [ftLargeint] then
  359.     Result := F.DisplayText
  360.   else
  361. {$ENDIF}
  362.   if F.DataType in [ftDateTime, ftDate] then
  363.     Result := F.AsDateTime else
  364.     Result := F.AsVariant;
  365.  
  366.   if Result = Null then
  367.     if F.DataType in [ftSmallint, ftInteger,
  368.       ftWord, ftFloat, ftCurrency] then
  369.       Result := 0
  370.     else if F.DataType = ftString then
  371.       Result := ''
  372.     else if F.DataType = ftBoolean then
  373.       Result := False
  374. {$ENDIF}
  375. end;
  376.  
  377. procedure frGetDataSetAndField(ComplexName: String; var DataSet: TfrTDataSet;
  378.   var Field: String);
  379. var
  380.   i, j, n: Integer;
  381.   f: TComponent;
  382.   sl: TStringList;
  383.   s: String;
  384.   c: Char;
  385.   cn: TControl;
  386.  
  387.   function FindField(ds: TfrTDataSet; FName: String): String;
  388.   var
  389.     sl: TStringList;
  390.   begin
  391.     Result := '';
  392.     if ds <> nil then
  393.     begin
  394.       sl := TStringList.Create;
  395.       frGetFieldNames(ds, sl);
  396.       if sl.IndexOf(FName) <> -1 then
  397.         Result := FName;
  398.       sl.Free;
  399.     end;
  400.   end;
  401.  
  402. begin
  403.   Field := '';
  404.   f := CurReport.Owner;
  405.   sl := TStringList.Create;
  406.  
  407.   n := 0; j := 1;
  408.   for i := 1 to Length(ComplexName) do
  409.   begin
  410.     c := ComplexName[i];
  411.     if c = '"' then
  412.     begin
  413.       sl.Add(Copy(ComplexName, i, 255));
  414.       j := i;
  415.       break;
  416.     end
  417.     else if c = '.' then
  418.     begin
  419.       sl.Add(Copy(ComplexName, j, i - j));
  420.       j := i + 1;
  421.       Inc(n);
  422.     end;
  423.   end;
  424.   if j <> i then
  425.     sl.Add(Copy(ComplexName, j, 255));
  426.  
  427.   case n of
  428.     0: // field name only
  429.       begin
  430.         if DataSet <> nil then
  431.         begin
  432.           s := frRemoveQuotes(ComplexName);
  433.           Field := FindField(DataSet, s);
  434.         end;
  435.       end;
  436.     1: // DatasetName.FieldName
  437.       begin
  438.         DataSet := TfrTDataSet(frFindComponent(f, sl[0]));
  439.         s := frRemoveQuotes(sl[1]);
  440.         Field := FindField(DataSet, s);
  441.       end;
  442.     2: // FormName.DatasetName.FieldName
  443.       begin
  444.         f := FindGlobalComponent(sl[0]);
  445.         if f <> nil then
  446.         begin
  447.           DataSet := TfrTDataSet(f.FindComponent(sl[1]));
  448.           s := frRemoveQuotes(sl[2]);
  449.           Field := FindField(DataSet, s);
  450.         end;
  451.       end;
  452.     3: // FormName.FrameName.DatasetName.FieldName - Delphi5
  453.       begin
  454.         f := FindGlobalComponent(sl[0]);
  455.         if f <> nil then
  456.         begin
  457.           cn := TControl(f.FindComponent(sl[1]));
  458.           DataSet := TfrTDataSet(cn.FindComponent(sl[2]));
  459.           s := frRemoveQuotes(sl[3]);
  460.           Field := FindField(DataSet, s);
  461.         end;
  462.       end;
  463.   end;
  464.  
  465.   sl.Free;
  466. end;
  467.  
  468. function frFindComponent(Owner: TComponent; Name: String): TComponent;
  469. var
  470.   n: Integer;
  471.   s1, s2: String;
  472. begin
  473.   Result := nil;
  474.   n := Pos('.', Name);
  475.   try
  476.     if n = 0 then
  477.       Result := Owner.FindComponent(Name)
  478.     else
  479.     begin
  480.       s1 := Copy(Name, 1, n - 1);        // module name
  481.       s2 := Copy(Name, n + 1, 255);      // component name
  482.       Owner := FindGlobalComponent(s1);
  483.       if Owner <> nil then
  484.       begin
  485.         n := Pos('.', s2);
  486.         if n <> 0 then        // frame name - Delphi5
  487.         begin
  488.           s1 := Copy(s2, 1, n - 1);
  489.           s2 := Copy(s2, n + 1, 255);
  490.           Owner := Owner.FindComponent(s1);
  491.           if Owner <> nil then
  492.             Result := Owner.FindComponent(s2);
  493.         end
  494.         else
  495.           Result := Owner.FindComponent(s2);
  496.       end;
  497.     end;
  498.   except
  499.     on Exception do
  500.       raise EClassNotFound.Create('Missing ' + Name);
  501.   end;
  502. end;
  503.  
  504. procedure frGetComponents(Owner: TComponent; ClassRef: TClass;
  505.   List: TStrings; Skip: TComponent);
  506. var
  507.   i: Integer;
  508.  
  509.   procedure EnumComponents(f: TComponent);
  510.   var
  511.     i: Integer;
  512.     c: TComponent;
  513.   begin
  514. {$IFDEF Delphi5}
  515.     if f is TForm then
  516.       for i := 0 to TForm(f).ControlCount - 1 do
  517.       begin
  518.         c := TForm(f).Controls[i];
  519.         if c is TFrame then
  520.           EnumComponents(c);
  521.       end;
  522. {$ENDIF}
  523.     for i := 0 to f.ComponentCount - 1 do
  524.     begin
  525.       c := f.Components[i];
  526.       if (c <> Skip) and (c is ClassRef) then
  527.         if f = Owner then
  528.           List.Add(c.Name)
  529.         else if ((f is TForm) or (f is TDataModule)) then
  530.           List.Add(f.Name + '.' + c.Name)
  531.         else
  532.           List.Add(TControl(f).Parent.Name + '.' + f.Name + '.' + c.Name)
  533.     end;
  534.   end;
  535.  
  536. begin
  537.   List.Clear;
  538.   for i := 0 to Screen.FormCount - 1 do
  539.     EnumComponents(Screen.Forms[i]);
  540.   for i := 0 to Screen.DataModuleCount - 1 do
  541.     EnumComponents(Screen.DataModules[i]);
  542. end;
  543.  
  544. function frStrToFloat(s: String): Double;
  545. var
  546.   i: Integer;
  547. begin
  548.   for i := 1 to Length(s) do
  549.     if s[i] in [',', '.'] then
  550.       s[i] := DecimalSeparator;
  551.   Result := StrToFloat(Trim(s));
  552. end;
  553.  
  554. function frRemoveQuotes(const s: String): String;
  555. begin
  556.   if (Length(s) > 2) and (s[1] = '"') and (s[Length(s)] = '"') then
  557.     Result := Copy(s, 2, Length(s) - 2) else
  558.     Result := s;
  559. end;
  560.  
  561. procedure frSetCommaText(Text: String; sl: TStringList);
  562. var
  563.   i: Integer;
  564.  
  565.   function ExtractCommaName(s: string; var Pos: Integer): string;
  566.   var
  567.     i: Integer;
  568.   begin
  569.     i := Pos;
  570.     while (i <= Length(s)) and (s[i] <> ';') do Inc(i);
  571.     Result := Copy(s, Pos, i - Pos);
  572.     if (i <= Length(s)) and (s[i] = ';') then Inc(i);
  573.     Pos := i;
  574.   end;
  575.  
  576. begin
  577.   i := 1;
  578.   sl.Clear;
  579.   while i <= Length(Text) do
  580.     sl.Add(ExtractCommaName(Text, i));
  581. end;
  582.  
  583.  
  584. end.
  585.