home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 September / Chip_2001-09_cd1.bin / zkuste / delphi / kolekce / d6 / RX275D6.ZIP / Units / Qbnddlg.pas < prev    next >
Pascal/Delphi Source File  |  1999-10-12  |  8KB  |  294 lines

  1. {*******************************************************}
  2. {                                                       }
  3. {       Delphi Visual Component Library                 }
  4. {                                                       }
  5. {       Copyright (c) 1995 Borland International        }
  6. {       Portions copyright (c) 1997 Master-Bank         }
  7. {                                                       }
  8. {*******************************************************}
  9.  
  10. unit QBndDlg;
  11.  
  12. interface
  13.  
  14. {$I RX.INC}
  15.  
  16. uses
  17.   SysUtils, {$IFDEF WIN32} Windows, {$ELSE} WinTypes, WinProcs, {$ENDIF}
  18.   Messages, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, DB
  19.   {$IFNDEF RX_D4}, DBTables {$ENDIF};
  20.  
  21. type
  22.   TQueryParamsDialog = class(TForm)
  23.     GroupBox1: TGroupBox;
  24.     Label1: TLabel;
  25.     ParamValue: TEdit;
  26.     Label2: TLabel;
  27.     NullValue: TCheckBox;
  28.     OkBtn: TButton;
  29.     CancelBtn: TButton;
  30.     Label3: TLabel;
  31.     TypeList: TComboBox;
  32.     ParamList: TListBox;
  33.     HelpBtn: TButton;
  34.     procedure ParamListChange(Sender: TObject);
  35.     procedure TypeListChange(Sender: TObject);
  36.     procedure ParamValueExit(Sender: TObject);
  37.     procedure NullValueClick(Sender: TObject);
  38.     procedure FormCreate(Sender: TObject);
  39.     procedure OkBtnClick(Sender: TObject);
  40.     procedure HelpBtnClick(Sender: TObject);
  41.   private
  42.     InitList: TParams;
  43.     PressedOK: Boolean;
  44.     InValueExit: Boolean;
  45.     InParamChange: Boolean;
  46.     procedure CheckValue;
  47.     procedure Edit;
  48.     procedure Unbind;
  49.   end;
  50.  
  51. function EditQueryParams(DataSet: TDataSet; List: TParams;
  52.   AHelpContext: THelpContext {$IFDEF RX_D4} = 0 {$ENDIF}): Boolean;
  53.  
  54. implementation
  55.  
  56. uses DbConsts, {$IFDEF RX_D3} BdeConst, {$ENDIF} VclUtils;
  57.  
  58. {$R *.DFM}
  59.  
  60. var
  61.   FieldTypes: array[TFieldType] of PString;
  62.  
  63. procedure FillFieldTypes;
  64. var
  65.   ParamString: string;
  66.   I: Integer;
  67.   J: TFieldType;
  68. begin
  69.   for J := Low(TFieldType) to High(TFieldType) do
  70.     FieldTypes[J] := nil;
  71.   ParamString := ResStr(SDataTypes);
  72.   J := Low(TFieldType);
  73.   I := 1;
  74.   while I <= Length(ParamString) do begin
  75.     AssignStr(FieldTypes[J], ExtractFieldName(ParamString, I));
  76.     Inc(J);
  77.   end;
  78. end;
  79.  
  80. function GetFieldType(const Value: string): TFieldType;
  81. begin
  82.   for Result := Low(TFieldType) to High(TFieldType) do
  83.     if Assigned(FieldTypes[Result]) and (FieldTypes[Result]^ = Value) then
  84.       Exit;
  85.   Result := ftUnknown;
  86. end;
  87.  
  88. procedure ClearFieldTypes;
  89. var
  90.   I: TFieldType;
  91. begin
  92.   for I := Low(TFieldType) to High(TFieldType) do begin
  93.     DisposeStr(FieldTypes[I]);
  94.     FieldTypes[I] := nil;
  95.   end;
  96. end;
  97.  
  98. procedure DoneQBind; far;
  99. begin
  100.   ClearFieldTypes;
  101. end;
  102.  
  103. function EditQueryParams(DataSet: TDataSet; List: TParams;
  104.   AHelpContext: THelpContext {$IFDEF RX_D4} = 0 {$ENDIF}): Boolean;
  105. begin
  106.   with TQueryParamsDialog.Create(Application) do
  107.   try
  108.     HelpContext := AHelpContext;
  109.     if HelpContext = 0 then begin
  110.       HelpBtn.Visible := False;
  111.       OkBtn.Left := OkBtn.Left + HelpBtn.Width div 2;
  112.       CancelBtn.Left := CancelBtn.Left + HelpBtn.Width div 2;
  113.     end;
  114.     if (csDesigning in DataSet.ComponentState) then
  115.       Caption := Format(ResStr(SParamEditor),
  116. {$IFDEF RX_D3}
  117.   {$IFDEF CBUILDER}
  118.         [DataSet.Owner.Name, '->', DataSet.Name]);
  119.   {$ELSE}
  120.     {$IFDEF RX_D4}
  121.         [DataSet.Owner.Name, '.', DataSet.Name]);
  122.     {$ELSE}
  123.         [DataSet.Owner.Name, DataSet.Name]);
  124.     {$ENDIF}
  125.   {$ENDIF}
  126. {$ELSE}
  127.         [DataSet.Owner.Name, DataSet.Name]);
  128. {$ENDIF}
  129.     InitList := List;
  130.     Edit;
  131.     Result := PressedOk;
  132.   finally
  133.     Free;
  134.   end;
  135. end;
  136.  
  137. procedure TQueryParamsDialog.Edit;
  138. var
  139.   I: Integer;
  140.   J: TFieldType;
  141. begin
  142.   for J := Low(TFieldType) to High(TFieldType) do
  143.     if Assigned(FieldTypes[J]) and (FieldTypes[J]^ <> '') then
  144.       TypeList.Items.Add(FieldTypes[J]^);
  145.   if InitList.Count = 0 then begin
  146.     ParamValue.Enabled := False;
  147.     NullValue.Enabled := False;
  148.     TypeList.Enabled := False;
  149.     ParamList.Enabled := False;
  150.   end
  151.   else begin
  152.     for I := 0 to InitList.Count - 1 do
  153.       if ParamList.Items.IndexOf(InitList[I].Name) = -1 then
  154.         ParamList.Items.Add(InitList[I].Name);
  155.     ParamList.ItemIndex := 0;
  156.     ParamListChange(Self);
  157.     ActiveControl := OkBtn;
  158.   end;
  159.   PressedOk := ShowModal = mrOK;
  160. end;
  161.  
  162. procedure TQueryParamsDialog.ParamListChange(Sender: TObject);
  163. begin
  164.   InParamChange := True;
  165.   try
  166.     with InitList.ParamByName(ParamList.Items[ParamList.ItemIndex]) do
  167.     begin
  168.       if Assigned(FieldTypes[DataType]) and (FieldTypes[DataType]^ <> '') then
  169.       begin
  170.         with TypeList do ItemIndex := Items.IndexOf(FieldTypes[DataType]^);
  171.         if Bound then ParamValue.Text := AsString
  172.         else ParamValue.Text := '';
  173.       end
  174.       else begin
  175.         TypeList.ItemIndex := -1;
  176.         ParamValue.Text := '';
  177.       end;
  178.       NullValue.Checked := IsNull;
  179.     end;
  180.   finally
  181.     InParamChange := False;
  182.   end;
  183. end;
  184.  
  185. procedure TQueryParamsDialog.TypeListChange(Sender: TObject);
  186. begin
  187.   with InitList.ParamByName(ParamList.Items[ParamList.ItemIndex]) do
  188.   begin
  189.     DataType := GetFieldType(TypeList.Text);
  190.     ParamValue.Text := '';
  191.     NullValue.Checked := IsNull;
  192.   end;
  193. end;
  194.  
  195. procedure TQueryParamsDialog.ParamValueExit(Sender: TObject);
  196. begin
  197.   if InValueExit or (ActiveControl = CancelBtn) then Exit;
  198.   InValueExit := True;
  199.   try
  200.     if ParamValue.Text <> '' then NullValue.Checked := False;
  201.     if (TypeList.Text = '') and TypeList.CanFocus then begin
  202.       TypeList.SetFocus;
  203.       raise Exception.Create(ResStr(SInvalidParamFieldType));
  204.     end;
  205.     if ParamValue.Text = '' then
  206.       with InitList.ParamByName(ParamList.Items[ParamList.ItemIndex]) do
  207.       begin
  208.         if NullValue.Checked then Clear
  209.         else Unbind;
  210.       end
  211.     else CheckValue;
  212.   finally
  213.     InValueExit := False;
  214.   end;
  215. end;
  216.  
  217. procedure TQueryParamsDialog.CheckValue;
  218. begin
  219.   try
  220.     with InitList.ParamByName(ParamList.Items[ParamList.ItemIndex]) do begin
  221.       if (DataType in [ftDate, ftTime, ftDateTime]) and
  222.         (CompareText(ParamValue.Text, 'Now') = 0) then
  223.       begin
  224.         case DataType of
  225.           ftDate: Text := DateToStr(SysUtils.Date);
  226.           ftTime: Text := TimeToStr(SysUtils.Time);
  227.           ftDateTime: Text := DateTimeToStr(SysUtils.Now);
  228.         end;
  229.       end
  230.       else Text := ParamValue.Text;
  231.     end;
  232.   except
  233.     with ParamValue do begin
  234.       if CanFocus then SetFocus;
  235.       SelectAll;
  236.     end;
  237.     raise;
  238.   end;
  239. end;
  240.  
  241. procedure TQueryParamsDialog.Unbind;
  242. begin
  243.   with InitList.ParamByName(ParamList.Items[ParamList.ItemIndex]) do
  244.   begin
  245.     AsInteger := 1;
  246.     DataType := GetFieldType(TypeList.Text);
  247.     Bound := False;
  248.   end;
  249. end;
  250.  
  251. procedure TQueryParamsDialog.NullValueClick(Sender: TObject);
  252. begin
  253.   if InParamChange then Exit;
  254.   if NullValue.Checked then
  255.     with InitList.ParamByName(ParamList.Items[ParamList.ItemIndex]) do
  256.     begin
  257.       Clear;
  258.       ParamValue.Text := '';
  259.     end
  260.   else Unbind;
  261. end;
  262.  
  263. procedure TQueryParamsDialog.OkBtnClick(Sender: TObject);
  264. begin
  265.   if not TypeList.Enabled then Exit;
  266.   try
  267.     ParamValueExit(Sender);
  268.   except
  269.     ModalResult := 0;
  270.     raise;
  271.   end;
  272. end;
  273.  
  274. procedure TQueryParamsDialog.HelpBtnClick(Sender: TObject);
  275. begin
  276.   Application.HelpContext(HelpContext);
  277. end;
  278.  
  279. procedure TQueryParamsDialog.FormCreate(Sender: TObject);
  280. begin
  281. {$IFNDEF WIN32}
  282.   Font.Style := [fsBold];
  283. {$ENDIF}
  284. end;
  285.  
  286. initialization
  287.   FillFieldTypes;
  288. {$IFDEF WIN32}
  289. finalization
  290.   DoneQBind;
  291. {$ELSE}
  292.   AddExitProc(DoneQBind);
  293. {$ENDIF}
  294. end.