unit uEditorDireccionEntregaPedidoCliente; interface uses Windows, SysUtils, Classes, Graphics, Forms, Controls, StdCtrls, Buttons, ExtCtrls, Mask, DBCtrls, DB, uDADataTable, cxControls, cxContainer, cxEdit, cxTextEdit, cxDBEdit, uIEditorDireccionEntregaPedidoCliente, uBizPedidosCliente, uDAInterfaces, cxGraphics, cxMaskEdit, cxDropDownEdit; type TfEditorDireccionEntregaPedidoCliente = class(TForm, IEditorDireccionEntregaPedidoCliente) OKBtn: TButton; CancelBtn: TButton; Bevel1: TBevel; eDireccion: TDBEdit; eCodigoPostal: TDBEdit; Label1: TLabel; Label3: TLabel; Label4: TLabel; dsDireccion: TDADataSource; cbProvincia: TcxDBComboBox; Label2: TLabel; cbPoblacion: TcxDBComboBox; procedure FormShow(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure cbProvinciaPropertiesInitPopup(Sender: TObject); procedure cbPoblacionPropertiesInitPopup(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private pDireccion: String; pPoblacion: String; pProvincia: String; FIDProvincia : Integer; //Almacenará la provincia que hay seleccionada para no cargar las poblaciones si no es necesario pCodigoPostal: String; FProvincias : TStringList; FPoblaciones : TStringList; FPedido : IBizPedidoCliente; procedure CargarProvincias; procedure CargarPoblaciones; function GetPedido: IBizPedidoCliente; procedure SetPedido(const Value: IBizPedidoCliente); public property Pedido: IBizPedidoCliente read GetPedido write SetPedido; end; implementation {$R *.dfm} uses uProvinciasPoblacionesController, uStringsUtils; { TfEditorDireccionEntrega } procedure TfEditorDireccionEntregaPedidoCliente.CargarPoblaciones; var i : integer; begin if (FIDProvincia <> StrToInt(FProvincias.Values[cbProvincia.Text])) then Begin FIDProvincia := StrToInt(FProvincias.Values[cbProvincia.Text]); with TProvinciasPoblacionesController.Create do try FPoblaciones := DarListaPoblaciones(FIDProvincia); with cbPoblacion.Properties.Items do begin BeginUpdate; try Clear; for i := 0 to FPoblaciones.Count - 1 do Add(FPoblaciones.Names[i]); finally EndUpdate; end; end; finally Free; end; End; end; procedure TfEditorDireccionEntregaPedidoCliente.CargarProvincias; var i : integer; begin with TProvinciasPoblacionesController.Create do try FProvincias := DarListaProvincias; with cbProvincia.Properties.Items do begin BeginUpdate; try Clear; for i := 0 to FProvincias.Count - 1 do Add(FProvincias.Names[i]); finally EndUpdate; end; end; finally Free; end; end; procedure TfEditorDireccionEntregaPedidoCliente.cbPoblacionPropertiesInitPopup( Sender: TObject); begin ShowHourglassCursor; try FreeANDNIL(FPoblaciones); if not Assigned(FProvincias) then CargarProvincias; if not EsCadenaVacia(cbProvincia.Text) and (FProvincias.IndexOfName(cbProvincia.Text) <> -1) then CargarPoblaciones finally HideHourglassCursor; end; end; procedure TfEditorDireccionEntregaPedidoCliente.cbProvinciaPropertiesInitPopup( Sender: TObject); begin ShowHourglassCursor; try if not Assigned(FProvincias) then CargarProvincias; finally HideHourglassCursor; end; end; procedure TfEditorDireccionEntregaPedidoCliente.FormClose(Sender: TObject; var Action: TCloseAction); begin //En el caso de cancelar se recuperan los valores iniciales if (Self.ModalResult <> mrOk) and (dsDireccion.DataTable.State in dsEditModes) then begin eDireccion.Field.Value := pDireccion; cbPoblacion.DataBinding.Field.Value := pPoblacion; cbProvincia.DataBinding.Field.Value := pProvincia; eCodigoPostal.Field.Value := pCodigoPostal; end; end; procedure TfEditorDireccionEntregaPedidoCliente.FormCreate(Sender: TObject); begin FIDProvincia := 0; FProvincias := NIL; FPoblaciones := NIL; end; procedure TfEditorDireccionEntregaPedidoCliente.FormDestroy(Sender: TObject); begin if Assigned(FProvincias) then FreeANDNIL(FProvincias); if Assigned(FPoblaciones) then FreeANDNIL(FPoblaciones); end; procedure TfEditorDireccionEntregaPedidoCliente.FormShow(Sender: TObject); begin //Guardamos los valores iniciales por si al final el usuario cancela pDireccion := eDireccion.Text; pPoblacion := cbPoblacion.Text; pProvincia := cbProvincia.Text; pCodigoPostal := eCodigoPostal.Text; end; function TfEditorDireccionEntregaPedidoCliente.GetPedido: IBizPedidoCliente; begin Result := FPedido; end; procedure TfEditorDireccionEntregaPedidoCliente.SetPedido( const Value: IBizPedidoCliente); begin FPedido := Value; if Assigned(FPedido) then dsDireccion.DataTable := FPedido.DataTable else dsDireccion.DataTable := NIL; end; end.