PDA

Ver la Versión Completa : Validar en TValueListEditor


strelok
31-01-2018, 12:32:49
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?

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...


...
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:

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 :)