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) Panel1: TPanel; rbCombo: TRadioButton; cbEMail: TComboBox; rbEdit: TRadioButton; edtEMail: TcxHyperLinkEdit; 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; procedure SetListaDirecciones(ALista : TStringList); public property EMailElegido: String read GetEMailElegido; property ListaDirecciones : TStringList read FListaDirecciones write SetListaDirecciones; 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 rbCombo.Checked := False; cbEMail.Enabled := False; edtEMail.Enabled := True; edtEMail.SetFocus; end else begin if rbCombo.Enabled then begin edtEMail.Enabled := False; rbEdit.Checked := False; cbEMail.Enabled := True; cbEMail.ItemIndex := 0; cbEMail.SetFocus; 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 IsValidEmail(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 := True end else rbCombo.Checked := True; 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; procedure TfDialogElegirEMail.SetListaDirecciones(ALista: TStringList); var i : integer; begin FListaDirecciones := ALista; for i := FListaDirecciones.count - 1 downto 0 do begin if Trim(FListaDirecciones[i]) = '' then FListaDirecciones.Delete(i); end; end; end.