Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Validar en TValueListEditor (https://www.clubdelphi.com/foros/showthread.php?t=92781)

strelok 31-01-2018 12:32:49

Validar en TValueListEditor
 
Hola a todos,

tengo un TValueListEditor, en la primer columna puse los nombres de colores, y a la derecha dejo asinar al usuario
el código hexadecimal que desee, pero tengo problemas al validarlo. Intenté con el OnValidate(), pero solo me deja
poner un mensaje de error (raramente no puedo cambiar el valor, es de solo lectura ¿me explican que lógica tiene esto?), y posteriormente me aparece otro error interno, lo que busco lograr es que me aparezca
"Color no válido" y posteriormente se vuelva a poner el color anterior.

¿Me dan una manito?
Código:

  if(ACol=1) and (ARow>1) then
  begin
    if(TryStringToColor(KeyValue) = False) then
        ShowMessage('Color no válido');
        //keyValue:='$0000ff';
  end;

Donde TryStringToColor la implementé yo (por las dudas)
Desde ya gracias.

ecfisa 31-01-2018 21:42:06

Hola.

A ver si entendí la idea...

Código Delphi [-]
...
implementation

var
  PrevValues: TStrings; // Valores iniciales

function TryStringToColor(v: string): Boolean;
begin
  ...
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  i: Integer;
begin
  ValueListEditor1.FixedCols := 1;
  // Salvar los valores iniciales
  PrevValues := TStringList.Create;
  for i := 1 to ValueListEditor1.VisibleRowCount do
    PrevValues.Add(ValueListEditor1.Cells[1, i]);
end;

procedure TForm1.ValueListEditor1Validate(Sender: TObject; ACol,
  ARow: Integer; const KeyName, KeyValue: string);
begin
  if not TryStringToColor(KeyValue) then
  begin
    ShowMessage('Color no válido');
    // Restaurar valor inicial
    ValueListEditor1.Cells[ACol, ARow] := PrevValues[ARow-1];
  end;
end;

...

procedure TForm1.FormDestroy(Sender: TObject);
begin
  PrevValues.Free;  // liberar lista
end;
No conozco la situación, pero ¿ No te sirve usar un componente especializado como TColorDialog o TColorBox ?

Saludos :)

strelok 01-02-2018 12:56:23

Entendiste perfecto, pues lo resolví de la misma forma, la diferencia es que usé una variable global, y guardo el valor que se prende modificar, en caso de error, lo vuelvo a setear con la variable global.
Lo que no me gusta es que chequea cuando hago foco en otro ítem, es decir, si doy enter no me lo valida, ¿como puedo forzar eso?

Muchas gracias :)

ecfisa 01-02-2018 19:13:17

Hola.

Una posibilidad es aprovechar el evento OnKeyPressed del TValueListEditor, por ejemplo:
Código Delphi [-]
procedure TForm1.ValueListEditor1KeyPress(Sender: TObject; var Key: Char);
var
  ve : TValueListEditor;
begin
  ve := TValueListEditor(Sender);

  if (Key = #13) and not TryStringToColor(ve.Cells[2, ve.Row]) then
  begin
    ShowMessage('Color no válido');
    ve.Cells[2, ve.Row] := PrevValues[ve.Row-1];
  end;
end;

Saludos :)

strelok 02-02-2018 18:07:47

Muchas gracias :)


La franja horaria es GMT +2. Ahora son las 10:30:54.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi