Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Evitar que se "repinte" un componente (https://www.clubdelphi.com/foros/showthread.php?t=61586)

NEG1414 13-11-2008 13:17:11

Evitar que se "repinte" un componente
 
Mi Pregunta es si es posible evitar que un elemento "refresque" su imagen (Supongo que sera evitar que se ejecute el evento Paint)
Por ejemplo creo que al salir del evento KeyDown se repinta la Imagen del componente y me gustaria evitarlo.

Gracias.

Neftali [Germán.Estévez] 13-11-2008 14:00:44

Puedes derivar el componente y sobreescribir el método Paint o capturar el mensaje WMPaint; En ambos casos si eliminas el inherited, posiblemente evites el repintado, aunque no se si los resultados van a ser los deseados.

¿Puedes explicar exactamente para qué necesitas esto?

NEG1414 13-11-2008 14:51:56

En primer lugar gracias por contestarme..

Respecto a tu respuesta hay conceptos que aun no conozco como el inherited.

Te explico lo que pretendo:

Tengo un ListBox en el que hay una serie de componentes que pueden estar ya elegidos (incluidos en un Stringlist) , el caso es que los Elementos ya elegidos se muestran en el listbox de diferente color a los no elegidos.Los elementos estan ordenados alfabeticamente.
Supongamos que pulsamos la tecla c (Cuando el foco lo tiene el ListBox) , el foco lo tendra que recibir el primer item del ListBox que empieze por la tecla c Y NO ESTE AUN SELECCIONADO.
Para ello capturo en el evento KeyDow del Listbox la tecla pulsada, realizo las operaciones necesaria para saber cual es el item que debe tener el foco y lo selecciono

Código Delphi [-]ListHistEquip->ItemIndex = Posicion;

Hasta Aqui to correcto el problema es que al salir del evento KeyDow el ListBox se repinta y el elemento que recibe el foco es siempre el primer item que comienze por C (este elegido o no).

Nota:una solucion seria realizar las operaciones para seleccionar el item en el evento KeyUp, pero el resultado no me convence por que en primer lugar recibe el foco el primer item que comienza por C (Evento KeyDow) y despues salta al item correcto (KeyUp) pero visualmente parece una chapuza.

Gracias

Neftali [Germán.Estévez] 13-11-2008 15:51:00

En ese caso te puedo decir (asegurar) que lo que capturar/anular el repintado no te va a servir.

NEG1414 13-11-2008 16:32:38

Alguna idea???

NEG1414 13-11-2008 16:41:35

Por si sive de ayuda el evento que no quieroque se realize es el
DrawItem

Lepe 13-11-2008 17:11:20

¿ y si pones todo el código en el KeyUp?

dejando vacío el Keydown.

Saludos

NEG1414 13-11-2008 18:03:26

Lepe parece una respuesta totalmente logica pero nada, hace exactamente lo mismo..

El problema radica en que en un ListBox con una lista de items si se pulsa una tecla el item seleccionado es el primero que comienza por esa tecla.

Mi problema es que no quiero que el listbox opere de esa manera si no ser yo el que manualmente seleccione el item..

Y veo la solucion imposible...

Gracias por contestarme.

Lepe 13-11-2008 23:57:27

En el listbox:
- extendedselect := false;
- autocomplete := false
- multiselect a true

y en el evento onKeyPress:
Código Delphi [-]
procedure TForm1.ListBox1KeyPress(Sender: TObject; var Key: Char);
begin
    if Key = 'a' then
  begin
    ListBox1.itemindex := 3;
    ListBox1.Selected[3] := True;
    Key := #0;
  end;
end;
los items que tengo en la lista son:
Código:

aaaas
aaas
aass
ass
bbb
cccc

El foco lo tiene el elemento 0 de la lista. Al pulsar la tecla 'a', se selecciona el 4º elemento, cuando en realidad, no se debería mover del primero según tus pruebas.

¿es eso lo que deseas?

Saludos

NEG1414 14-11-2008 16:48:53

!!! Perfecto !!!

Muchas Gracias.


La franja horaria es GMT +2. Ahora son las 07:39:04.

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