unit uDialogElegirEMail; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, uDialogBase, ActnList, StdCtrls, ExtCtrls, cxControls, cxContainer, cxEdit, cxTextEdit, cxHyperLinkEdit; type TfDialogElegirEMail = class(TfDialogBase) rbCombo: TRadioButton; cbEMail: TComboBox; rbEdit: TRadioButton; edtEMail: TcxHyperLinkEdit; Label1: TLabel; procedure rbComboClick(Sender: TObject); procedure rbEditClick(Sender: TObject); procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure FormShow(Sender: TObject); procedure actAceptarExecute(Sender: TObject); procedure actCancelarExecute(Sender: TObject); private FListaDirecciones: TStringList; function GetEMailElegido: String; procedure ActualizarOpciones; public property EMailElegido: String read GetEMailElegido; property ListaDirecciones : TStringList read FListaDirecciones write FListaDirecciones; end; function ElegirEMail(const AListaEMails : TStringList; var AEMailElegido : String): Boolean; implementation {$R *.dfm} uses uStringsUtils, uDialogUtils, uEMailUtils; function ElegirEMail(const AListaEMails : TStringList; var AEMailElegido : String): Boolean; var AEditor : TfDialogElegirEMail; begin AEditor := TfDialogElegirEMail.Create(NIL); try AEditor.ListaDirecciones := AListaEMails; Result := (AEditor.ShowModal = mrOk); if Result then AEMailElegido := AEditor.EMailElegido; finally AEditor.Release; end; end; { TfDialogElegirEMail } procedure TfDialogElegirEMail.actAceptarExecute(Sender: TObject); begin inherited; ModalResult := mrOk end; procedure TfDialogElegirEMail.actCancelarExecute(Sender: TObject); begin inherited; ModalResult := mrCancel; end; procedure TfDialogElegirEMail.ActualizarOpciones; begin if rbEdit.Checked then begin edtEMail.Enabled := True; rbCombo.Checked := False; cbEMail.Enabled := False; end else begin if rbCombo.Enabled then begin cbEMail.Enabled := True; edtEMail.Enabled := False; rbEdit.Checked := False; end else rbEdit.Checked := True; end; end; procedure TfDialogElegirEMail.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin inherited; if (ModalResult = mrOk) and rbEdit.Checked then begin if not EsCadenaVacia(edtEMail.Text) then begin if not EsDireccionEMailValida(edtEMail.Text) then begin ShowErrorMessage('La dirección de correo electrónica no es válida', 'Para poder continuar, compruebe que ha indicado una dirección de correo y que está bien escrita.'); edtEMail.SetFocus; CanClose := False; end; end else begin ShowErrorMessage('Debe indicar una dirección de correo electrónico.', 'Para poder continuar debe elegir o indicar una dirección de correo electrónico.'); edtEMail.SetFocus; CanClose := False; end; end; end; procedure TfDialogElegirEMail.FormCreate(Sender: TObject); begin inherited; //FListaDirecciones := TStringList.Create; <- La lista se da mediante la propiedad. end; procedure TfDialogElegirEMail.FormDestroy(Sender: TObject); begin inherited; //FreeAndNIL(FListaDirecciones) <- La lista se da mediante la propiedad. end; procedure TfDialogElegirEMail.FormShow(Sender: TObject); begin inherited; cbEMail.Items.Clear; cbEMail.Items := FListaDirecciones; if cbEMail.Items.Count = 0 then begin rbCombo.Enabled := False; rbEdit.Checked; end else begin cbEMail.ItemIndex := 0; rbCombo.Checked := True; end; ActualizarOpciones; end; function TfDialogElegirEMail.GetEMailElegido: String; begin if rbCombo.Checked then Result := cbEMail.Text else Result := edtEMail.Text; end; procedure TfDialogElegirEMail.rbComboClick(Sender: TObject); begin inherited; rbEdit.Checked := False; ActualizarOpciones; end; procedure TfDialogElegirEMail.rbEditClick(Sender: TObject); begin inherited; rbEdit.Checked := True; ActualizarOpciones; end; end.