unit fprincipal;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.Menus, Vcl.ImgList,
  Vcl.StdCtrls, Vcl.ComCtrls, Vcl.Grids, Vcl.DBGrids,
  Vcl.Mask, Vcl.DBCtrls, Vcl.ExtDlgs, Data.Win.ADODB, Data.DB, frxClass,
  frxDBSet, frxExportPDF, frxExportCSV;

type
  Tprincipal = class(TForm)
    Panel4: TPanel;
    Panel5: TPanel;
    Label1: TLabel;
    buscarfichas: TEdit;
    DBGrid1: TDBGrid;
    Panel1: TPanel;
    pclientesdatos: TPanel;
    Panel7: TPanel;
    Label35: TLabel;
    btCcancelar: TButton;
    btCmodificar: TButton;
    btcborrar: TButton;
    btCnuevo: TButton;
    btcguardar: TButton;
    btAsalir: TButton;
    ImageList1: TImageList;
    FICHAS: TADOConnection;
    tclientes: TADOTable;
    qclientes: TADOQuery;
    qclientesId: TAutoIncField;
    qclientesNOMBRE: TWideStringField;
    qclientesMATRICULA: TWideStringField;
    dsqclientes: TDataSource;
    dstclientes: TDataSource;
    tclientesId: TAutoIncField;
    tclientesNOMBRE: TWideStringField;
    tclientesMATRICULA: TWideStringField;
    Panel3: TPanel;
    Panel6: TPanel;
    Label2: TLabel;
    btTcancelar: TButton;
    btTmodificar: TButton;
    btTborrar: TButton;
    btTnuevo: TButton;
    btTguardar: TButton;
    Panel9: TPanel;
    Label10: TLabel;
    Label11: TLabel;
    Label12: TLabel;
    Label13: TLabel;
    Label14: TLabel;
    Label15: TLabel;
    Label16: TLabel;
    DBEdit8: TDBEdit;
    DBEdit9: TDBEdit;
    DBEdit10: TDBEdit;
    DBEdit11: TDBEdit;
    DBEdit12: TDBEdit;
    DBEdit13: TDBEdit;
    DBEdit14: TDBEdit;
    tclientesDIRECCION: TWideStringField;
    tclientesCOD_POST: TWideStringField;
    tclientesPOBLACION: TWideStringField;
    tclientesPROVINCIA: TWideStringField;
    tclientesTELEFONO: TWideStringField;
    tclientesMARCA: TWideStringField;
    tclientesMOTOR: TWideStringField;
    tclientesTIPO_MOTOR: TWideStringField;
    tclientesBASTIDOR: TWideStringField;
    Label4: TLabel;
    DBEdit2: TDBEdit;
    DBEdit4: TDBEdit;
    Label5: TLabel;
    DBEdit3: TDBEdit;
    Label6: TLabel;
    DBEdit5: TDBEdit;
    Label7: TLabel;
    Label9: TLabel;
    DBEdit7: TDBEdit;
    ptrabajosdatos: TPanel;
    Label3: TLabel;
    DBEdit1: TDBEdit;
    Label8: TLabel;
    DBEdit6: TDBEdit;
    Label17: TLabel;
    DBEdit15: TDBEdit;
    Label18: TLabel;
    DBEdit16: TDBEdit;
    Label19: TLabel;
    DBEdit17: TDBEdit;
    Label20: TLabel;
    DBEdit18: TDBEdit;
    Label21: TLabel;
    DBEdit19: TDBEdit;
    DBGrid2: TDBGrid;
    ttrabajos: TADOTable;
    dsttrabajos: TDataSource;
    ttrabajosId: TAutoIncField;
    ttrabajosFECHA: TDateTimeField;
    ttrabajosKM: TIntegerField;
    ttrabajosDESCRIPCION: TWideStringField;
    ttrabajosINFO1: TWideStringField;
    ttrabajosINFO2: TWideStringField;
    ttrabajosINFO3: TWideStringField;
    ttrabajosINFO4: TWideStringField;
    ttrabajosidc: TIntegerField;
    informedb1: TfrxDBDataset;
    informes: TfrxReport;
    qinformes: TADOQuery;
    dsqinformes: TDataSource;
    informedb2: TfrxDBDataset;
    btImprimir: TButton;
    qinformesId: TAutoIncField;
    qinformesidc: TIntegerField;
    qinformesFECHA: TDateTimeField;
    qinformesKM: TIntegerField;
    qinformesDESCRIPCION: TWideStringField;
    qinformesINFO1: TWideStringField;
    qinformesINFO2: TWideStringField;
    qinformesINFO3: TWideStringField;
    qinformesINFO4: TWideStringField;
    frxPDFExport1: TfrxPDFExport;
    frxCSVExport1: TfrxCSVExport;
    procedure buscarfichasExit(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure qclientesAfterClose(DataSet: TDataSet);
    procedure btAsalirClick(Sender: TObject);
    procedure dstclientesStateChange(Sender: TObject);
    procedure dsttrabajosStateChange(Sender: TObject);
    procedure btCnuevoClick(Sender: TObject);
    procedure tclientesAfterPost(DataSet: TDataSet);
    procedure tclientesAfterDelete(DataSet: TDataSet);
    procedure btcborrarClick(Sender: TObject);
    procedure btCmodificarClick(Sender: TObject);
    procedure btcguardarClick(Sender: TObject);
    procedure btCcancelarClick(Sender: TObject);
    procedure buscarfichasEnter(Sender: TObject);
    procedure btTnuevoClick(Sender: TObject);
    procedure ttrabajosAfterPost(DataSet: TDataSet);
    procedure btTborrarClick(Sender: TObject);
    procedure btTmodificarClick(Sender: TObject);
    procedure btTguardarClick(Sender: TObject);
    procedure btTcancelarClick(Sender: TObject);
    procedure btImprimirClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
     procedure AppMessage(var Msg: Tmsg; var Handled:Boolean);
  end;

var
  principal: Tprincipal;
  vertodos:integer;
  filtro:string;

implementation

{$R *.dfm}

procedure Tprincipal.btAsalirClick(Sender: TObject);
begin
    fichas.Connected:=false;
    ExitProcess(0);
end;

procedure Tprincipal.btcborrarClick(Sender: TObject);
begin
//    tclientes.MasterSource:=nil;

    qclientes.Delete;
    buscarfichas.Text:='';
    buscarfichas.SetFocus;
    dbgrid1.SetFocus;
//    qclientes.Close;
//    qclientes.Open;
//    tclientes.MasterSource:=dsqclientes;
end;

procedure Tprincipal.btCcancelarClick(Sender: TObject);
begin
   tclientes.Cancel;
end;

procedure Tprincipal.btcguardarClick(Sender: TObject);
begin
    if not qclientes.active then qclientes.open;
    tclientes.Post;
    tclientes.Close;
    tclientes.MasterSource:=dsqclientes;
    tclientes.Open;
    pclientesdatos.Enabled:=false;
    qclientes.Refresh;
end;

procedure Tprincipal.btCmodificarClick(Sender: TObject);
begin
    tclientes.Edit;
    pclientesdatos.Enabled:=true;
    dbedit9.SetFocus;
end;

procedure Tprincipal.btCnuevoClick(Sender: TObject);
begin
    tclientes.MasterSource:=nil;
    tclientes.Append;
    pclientesdatos.Enabled:=true;
    dbedit9.SetFocus;
end;

procedure Tprincipal.btImprimirClick(Sender: TObject);
begin

    informedb1.Datasource:=dstclientes;
    informedb2.DataSource:=dsqinformes;
    qinformes.SQL.Clear;
    qinformes.SQL.Add('select * from trabajos where idc='+qclientesid.AsString+' order by fecha');
    qinformes.Open;

    informes.Report.Clear;
    informes.LoadFromFile('c:\fichas\informe.fr3');
    informes.Variables.Variables['TITULO']:=QUOTEDSTR('Informe del vehículo');

//    informes.Report.FileName:=TMES.Text+' ' + qjornalestrabajador.asstring;
    informes.ShowReport();
    informes.Clear

end;

procedure Tprincipal.btTborrarClick(Sender: TObject);
begin
    ttrabajos.Delete;
end;

procedure Tprincipal.btTcancelarClick(Sender: TObject);
begin
   ttrabajos.Cancel;
   ptrabajosdatos.visible:=false;
    ttrabajos.close;
    ttrabajos.MasterSource:=dsqclientes;
    ttrabajos.Open;
    dbgrid2.Visible:=true;
end;

procedure Tprincipal.btTguardarClick(Sender: TObject);
begin
    ttrabajos.Post;
    ptrabajosdatos.visible:=false;
    ttrabajos.close;
    ttrabajos.MasterSource:=dsqclientes;
    ttrabajos.Open;
    dbgrid2.Visible:=true;
end;

procedure Tprincipal.btTmodificarClick(Sender: TObject);
begin
    ptrabajosdatos.visible:=true;
    ttrabajos.Edit;
    dbedit1.SetFocus;
    dbgrid2.Visible:=false;
end;

procedure Tprincipal.btTnuevoClick(Sender: TObject);
begin
    dbgrid2.Visible:=false;
    ttrabajos.MasterSource:=nil;
    ttrabajos.Append;
    ttrabajosidc.Value:=tclientesid.AsInteger;
    ptrabajosdatos.visible:=true;
    dbedit1.SetFocus;

end;

procedure Tprincipal.buscarfichasEnter(Sender: TObject);
begin
    buscarfichas.Text:='';
end;

procedure Tprincipal.buscarfichasExit(Sender: TObject);
begin
    if buscarfichas.text<>'' then
    begin
        filtro:='%'+buscarfichas.Text+'%';
        qclientes.Close;
        qclientes.open;
    end else
       begin
         filtro:='';
        qclientes.Close;
        qclientes.open;
       end;
end;
procedure Tprincipal.dstclientesStateChange(Sender: TObject);
begin
   if tclientes.State in [dsedit,dsinsert] then
   begin
       btcnuevo.Enabled:=false;
       btcborrar.Enabled:=false;
       btcmodificar.Enabled:=false;
       btcguardar.Enabled:=true;
       btccancelar.Enabled:=true;
       Pclientesdatos.Enabled:=true;
   end else
   begin
       btcnuevo.Enabled:=true;
       btcborrar.Enabled:=true;
       btcmodificar.Enabled:=true;
       btcguardar.Enabled:=false;
       btccancelar.Enabled:=false;
       Pclientesdatos.Enabled:=false;
   end;
end;

procedure Tprincipal.dsttrabajosStateChange(Sender: TObject);
begin
   if ttrabajos.State in [dsedit,dsinsert] then
   begin
       bttnuevo.Enabled:=false;
       bttborrar.Enabled:=false;
       bttmodificar.Enabled:=false;
       bttguardar.Enabled:=true;
       bttcancelar.Enabled:=true;
       Ptrabajosdatos.visible:=true;
   end else
   begin
       bttnuevo.Enabled:=true;
       bttborrar.Enabled:=true;
       bttmodificar.Enabled:=true;
       bttguardar.Enabled:=false;
       bttcancelar.Enabled:=false;
       Ptrabajosdatos.visible:=false;
   end;
end;

procedure Tprincipal.FormCreate(Sender: TObject);
begin
    Application.OnMessage :=  AppMessage;
end;

procedure Tprincipal.FormShow(Sender: TObject);
begin
    buscarfichas.SetFocus;
    qclientes.Open;
    tclientes.Open;
    ttrabajos.Open;
end;

procedure Tprincipal.qclientesAfterClose(DataSet: TDataSet);
var filtrolocal:string;
begin
    if filtro<>'' then
    begin
         filtrolocal:=' where nombre like('+''''+filtro+''''+') or matricula like('+''''+filtro+''''+') ';
    end;

    if filtro='' then
    begin
      filtrolocal:='';
    end;


    qclientes.SQL.Clear;
    qclientes.SQL.Add('select id,nombre,matricula from clientes ' + filtrolocal +' order by nombre,matricula')



end;

procedure Tprincipal.tclientesAfterDelete(DataSet: TDataSet);
begin
   qclientes.Refresh;
end;

procedure Tprincipal.tclientesAfterPost(DataSet: TDataSet);
begin
   pclientesdatos.Enabled:=false;
   qclientes.Close;
   qclientes.Open;
   qclientes.Locate('id',tclientesid.AsString,[locaseinsensitive,lopartialkey]);
   tclientes.MasterSource:=dsqclientes;
end;

procedure Tprincipal.ttrabajosAfterPost(DataSet: TDataSet);
begin
   ptrabajosdatos.visible:=false;
end;

Procedure Tprincipal.AppMessage(var Msg: TMSg; Var Handled:Boolean);
 var
  actual : TWincontrol;
 begin
 if Msg.message = WM_KEYDOWN then
    begin

    // esto es para controlar que con la flecha abajo se desplegen las
    // listas

    if Msg.wParam = VK_DOWN then
      begin
      Actual := Screen.ActiveControl;
      if Actual is TDBLookupComboBox then
            if not TDBLookupComboBox(Screen.ActiveForm.ActiveControl).listVisible then
               TDBLookupComboBox(Screen.ActiveForm.ActiveControl).DropDown;

      // si utilizas las RX
   {   if Actual is TRxDBLookupCombo then
            if not TRxDBLookupCombo(Screen.ActiveForm.ActiveControl).listVisible then
               TRxDBLookupCombo(Screen.ActiveForm.ActiveControl).DropDown;

    }
      if Actual is TComboBox then
         SendMessage(TComboBox(Screen.ActiveForm.ActiveControl).Handle,CB_SHOWDROPDOWN,-1,0);

      if (Actual is TCustomEdit) then
          Msg.wParam := VK_TAB;
      // se pueden añadir mas controles....

      end;

    // y aqui es el control del intro.
    if Msg.wParam = VK_RETURN THEN
       begin
       Actual := Screen.ActiveControl;
       // para los edit.
       if (Actual is TCustomEdit) and
          not (Actual is TCustomMemo) then
          Msg.wParam := VK_TAB;

       // para los memo. Con ctrl + enter se salta de linea dentro del
       // memo, si solo es intro salta al siguiente control
       if (Actual is TCustomMemo) and
          (HiWord(GetKeyState(VK_CONTROL)) = 0)then
          Msg.wParam := VK_TAB;

       // para los lookup
       if Actual is TDBLookupComboBox then
          if not TDBLookupComboBox(Actual).listVisible then
             Msg.wParam := VK_TAB;

       // Si utilizas las RX
{       if Actual is TRxDBLookupCombo then
          if not TRxDBLookupCombo(Actual).listVisible then
             Msg.wParam := VK_TAB;
 }
       // Los combobox
       if Actual is TCustomComboBox then
          if not TCustomComboBox(Actual).DroppedDown then
             Msg.wParam := VK_TAB;

       // el radiobutton
       if Actual is TRadioButton then
          Msg.wParam := VK_TAB;

       // en el grid
       if Actual is TDBGrid then
          if (TDBGrid(Actual).ReadOnly) or
             (HiWord(GetKeyState(VK_CONTROL)) = 1)then
             Msg.wParam := VK_TAB;

       // o esto otro Con Ctrl + intro siguiente celda con
       // ctrl + shift + intro celda anterior
       // es complicado pero es por no liar con el intro solo
       // que siempre pasa de un control a otro.
       if Actual is TDBGrid then
          begin
          if (TDBGrid(Actual).ReadOnly) or
             (HiWord(GetKeyState(VK_CONTROL)) = 0) then
             Msg.wParam := VK_TAB
          else
             if not(HiWord(GetKeyState(VK_SHIFT)) = 0) then
                begin
                if TDBGrid(Actual).selectedindex > 0 then             { increment the field }
                   TDBGrid(Actual).selectedindex := TDBGrid(Actual).selectedindex -1
                else
                   TDBGrid(Actual).selectedindex := TDBGrid(Actual).fieldcount -1;
                end
             else
                begin
                if TDBGrid(Actual).selectedindex < (TDBGrid(Actual).fieldcount -1) then             { increment the field }
                   TDBGrid(Actual).selectedindex := TDBGrid(Actual).selectedindex +1
                else
                   TDBGrid(Actual).selectedindex := 0;
                end;
          end;


       // ListBox
       if Actual is TCustomListBox then
          Msg.wParam := VK_TAB;

       // TabControl
       if Actual is TCustomTabControl then
          Msg.wParam := VK_TAB;

       // Aqui se pondrían todos los controles que usamos en la
       // aplicación y necesitamos cambiar el tab por intro.
       // de esta forma te despreocupas de cuantos añades y es más
       // limpio el código

       end;
    end;
 end;


end.
