Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Cambiar el Color de un Edit
Ir a página 1, 2, 3  Siguiente
 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Cambiar el Color de un Edit Responder citando

bueno la pregunta es como Cambiar el Color del Edit, que actualmente, se encuentra con el foco.. es decir, que funcion del API, me permite cambiar el Color de Edicion..

cuando NO esta en edicion.. fondo blanco/letras negras. (default)
cuando SI esta en edicion... fondo gris / letras rojas, (por decirlo asi..)

gracias.. espero sus respuestas..

esto es para que el usuario, sepa en que Edit se encuentra, al momento de navegar entre varios de ellos..
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Viendo bien.. esto, es mas como un monitoreo.. del Edit.. ahora, empieza otro problema.. casi no he utilizado BEGIN_MAP, y algo por el estilo. para enviar un tMSG, al edit.. ya que eso puede ser otra solucion..

Estimado _LEO. se que manejas, la parte del BEGIN_MAP, me podrias orientar, para darme una idea..

De lo poco, que puedo decir, esperando no equivocarme, asumó, que el BEGIN_MAP , Realiza un Monitoreo (como los viejos residentes de MS-DOS), pero esclusivamente para mi apliacion... espero que sea, asi me podrias indicar como monitorear los EDITS de la apliacion, y cuando estan "Focused", para poderle cambiar el Color?


Gracias.. desde Antes....
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Hola César. ¿No te sirve el evento OnEnter del TEdit? Cuando está activo simplemente cambias el color del edit y de la fuente.
En el evento OnExit reestableces las propiedades iniciales.

Un saludo y ya me dirás.
_________________
Nunca digas "Es imposible" sin intentarlo antes.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Realmente, ha pasao por mi cabeza realizar estas operaciones.. pero que pasa si es para todos los edits que tienes dentro de tu aplicacion.. es decir tienes como 15 ventanas, donde manejas varios edits.. redundar el codigo.. puede ser una solucion. . pero no la mas clara..

para los que vaya, por lo mismo encontre el siguiente mensaje de windows.. para el manejo de los edits.. WM_CTLCOLOREDIT, donde tiene 2 parametros. LParam y WParam..
el primero, viene del HWND y el otro es el HDC

bueno a travez de ellos y haciendo esto logre ponerle colores. a los edits. pero no he podido cambiarlo cuando entro en el..

Esto es la forma de entrar utilizando el BEGIN_MESSAGE_MAP
DENTRO DEL unit1.hpp
Código:

#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:   // IDE-managed Components
    TEdit *Edit1;
    TButton *Button1;
    TEdit *Edit2;
    TEdit *Edit3;
    void __fastcall Button1Click(TObject *Sender);
private:   // User declarations
public:      // User declarations
    __fastcall TForm1(TComponent* Owner);
    CambiaColorEdits(TMessage & Msg);
protected:
    //segun yo asi debe ser.. je je
    BEGIN_MESSAGE_MAP
        VCL_MESSAGE_HANDLER(WM_CTLCOLOREDIT, TMessage, CambiaColorEdits)
    END_MESSAGE_MAP(TForm)
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

CambiaColorEdits <-es la funcion que abajo describo para hacerlo.
Esto esta dentro del .cpp, que es el cuerpo de la funcion.. de arriba
Código:

TForm1::CambiaColorEdits(TMessage & Msg)
{
    SetTextColor( (HDC)Msg.WParam,0x00fafAf);
    SetBkMode   ( (HDC)Msg.WParam,TRANSPARENT);
    // HASTA AQUI CAMBIA LO QUE NO PUEDO ES HACER QUE AL ENTRAR
    // AL EDIT. CAMBIE DE COLOR CUANDO ES LA EDICION..
   
}


Espero que alguien me oriente.
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Asi mismo, mientras me contestan por otro lado, he visto, que existe el mensaje WM_COMMAND. que igual que el anterior mensaje, trae sus dichosos, LParam, y WParam..

de paso encontre tambien, otra Manera de hacerlo..., ahora detecto, que se encuentra dentro del Edit, sin importar cual es, pero no puedo cambiar el color, je je , voy de mal en peor..

Esto es la funcion, 1 mil veces modificada, j ej e
Código:

TForm1::CambiaColorEdits(TMessage & Msg)
{

    if(Msg.WParamHi==256){
        HDC hDc=reinterpret_cast<HDC>(Msg.WParamLo);
        //SetTextColor( hDc,RGB(200,0,255));
        if( Msg.WParamHi == EN_SETFOCUS ){
            SetTextColor( hDc,RGB(0,0,255));
            SetBkColor(hDc,TRANSPARENT);
            this->Caption = Msg.WParamHi ;
        }
        if( Msg.WParamHi == EN_KILLFOCUS){
            SetTextColor(hDc,RGB(0,100,255));
            SetBkColor(hDc, TRANSPARENT);
            this->Caption = Msg.WParamHi;
        }
    }



/*        HDC hDc=reinterpret_cast<HDC>(Msg.WParam);
        SetTextColor(hDc, RGB(255,100,0));

        if( Msg.WParamHi ==EN_KILLFOCUS){
            SetTextColor(hDc,RGB(0,255,0));
            SetBkColor(hDc,TRANSPARENT);
            this->Caption = "Fuera";
        }*/
        return (LRESULT)CreateSolidBrush(RGB(0,0,0));


}

ahora bien. dentro del Unit.hpp he cambiado el BEGIN_MESSAGE_MAP. pero sigue igual, una mano por favor..
Código:

class TForm1 : public TForm
{
__published:   // IDE-managed Components
    TEdit *Edit1;
    TEdit *Edit2;
    TEdit *Edit3;
    TButton *Button1;
    TButton *Button2;
    void __fastcall Button1Click(TObject *Sender);
    void __fastcall FormCreate(TObject *Sender);
private:   // User declarations
public:      // User declarations
    __fastcall TForm1(TComponent* Owner);
    CambiaColorEdits(TMessage & Msg);
protected:
    BEGIN_MESSAGE_MAP
//    VCL_MESSAGE_HANDLER(WM_CTLCOLOREDIT, TMessage, CambiaColorEdits)
    VCL_MESSAGE_HANDLER(WM_COMMAND, TMessage, CambiaColorEdits)
    END_MESSAGE_MAP(TForm)
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

aguien se le ocurre alguna otra idea.. amigos Masters.. please...
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Hola César.

Selecciona todos los TEDit de la ventana y asignales la misma función en el evento OnEnter() y OnExit().
Dentro de la función, a través del parámetro Sender, detectas qué edit es el que ha lanzado el evento. Y dentro pones el código para cambiar el color del edit, o del texto,...
Sería algo así:
Código:

__fastcall TForm1::TEditTODOSOnEnter(TObject *Sender){
  try{
    TEdit *Edit=(TEdit *)Sender;
    Edit->Color=clLime;
    ···
  }
  catch(...){
  }
}

No sé si te servirá, está escrito sin probarlo y sin tener el C++Builder a mano, pero te puede orientar.

Suerte y un saludo.
_________________
Nunca digas "Es imposible" sin intentarlo antes.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Gracias, te comento, que esa es la manera en que lo tenia.. pero dado el numero de ventanas.. que tengo.. es demasiado tedioso, realizarlo en cada ventana(son 17 espesificamente), y he esta intentando realizaro de manera Dinamica, es decir dejar a windows que lo haga por mi.. aun no se si afectará a las demas apliaciones.. pero creo que no..


gracias, esperaremos mas respuestas
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

MI estimado amigo Cesar, eso lo solucione creando un OBJETO tEdit que cambia de color si el tiene el foco y reacciona al ENTER , pasando el foco al siguiente

Con eso te evitar todo el rollo

EDITAR.CPP
Código:

/---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Editar.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------
// ValidCtrCheck is used to assure that the components created do not have
// any pure virtual functions.
//

static inline void ValidCtrCheck(TEditar *)
{
        new TEditar(NULL);
}
//---------------------------------------------------------------------------
__fastcall TEditar::TEditar(TComponent* Owner)
        : TEdit(Owner)
{
}
//---------------------------------------------------------------------------
namespace Editar
{
        void __fastcall PACKAGE Register()
        {
                 TComponentClass classes[1] = {__classid(TEditar)};
                 RegisterComponents("TouchSoftware", classes, 0);
        }
}
//---------------------------------------------------------------------------
 


EDITAR.H
Código:

/---------------------------------------------------------------------------

#ifndef EditarH
#define EditarH
//---------------------------------------------------------------------------
#include <SysUtils.hpp>
#include <Controls.hpp>
#include <Classes.hpp>
#include <Forms.hpp>
#include <StdCtrls.hpp>
//---------------------------------------------------------------------------
class PACKAGE TEditar : public TEdit
{
private:
protected:
public:
DYNAMIC void __fastcall DoEnter(void)
 {
 TEditar::Color=clYellow;
 TEdit::DoEnter();
 }

DYNAMIC  void __fastcall DoExit(void)
 {
 TEditar::Color=clWindow;
 TEdit::DoExit();

 }
        __fastcall TEditar(TComponent* Owner);
__published:
};
//---------------------------------------------------------------------------
#endif

_________________
Ing. Gabriel Góngora Navarrete
TouchSoftwares Inc

http://www.touchsoftwares.com
Volver arriba
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

Gracias, Gabriel. este es una de las formas sencillas de solucionarlo...


de Antemano. gracias..

(pero voy intentar tambien haber si sale con el otro, je je, ok)
si sale, tengan por seguro que en este post aparecerá.
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Código:
    void __fastcall WmCommand(TWMCommand& msg)
    {
        inherited::Dispatch(&msg);

        if (msg.NotifyCode == EN_SETFOCUS)
        {
            TEdit* edt = dynamic_cast<TEdit*>(FindControl(msg.Ctl));
            if (edt)
            {
                edt->Color = clYellow;
                edt->Font->Color = clRed;
            }
        }
        else if (msg.NotifyCode == EN_KILLFOCUS)
        {
            TEdit* edt = dynamic_cast<TEdit*>(FindControl(msg.Ctl));
            if (edt)
            {
                edt->Color = clWindow;
                edt->Font->Color = clWindowText;
            }
        }
    }

    BEGIN_MESSAGE_MAP
        MESSAGE_HANDLER(WM_COMMAND, TWMCommand, WmCommand)
    END_MESSAGE_MAP(inherited)
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Simplemente, Genial!!!,

gracias, por mostrarme el camino amarillo del Mago de Oz..

gracias..(100 reverencias) y una botella de Vino con Jamon.
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Una duda que me asalta, como identifico, cuando existen una combinacion de Edits y DBEdits, dentro del mismo form , por decir 2 y 2 alternados..

se que ellos derivan de la clase, TCustomEdit, pero no puedo acceder a las propiedades color y font->Color,

ya que no existen dentro de TCustomEdit.. de que manera puedo acceder y saber que es una caja de edicion.. sea Edit, DBEdit, MaskEdit, para identificar el Componente de edicion. que se encuentra actualmente seleccionado... y asi ponerle el Famoso color...

De antemano... Gracias.. _LEO
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Siempre que desciendan de TCustomEdit y sean propiedades comunes podemos forzarlos a trabajar como TEdit, por ejemplo:

Código:
void __fastcall WmCommand(TWMCommand& msg)
{
    inherited::Dispatch(&msg);

    if (msg.NotifyCode==EN_SETFOCUS)
    {
        TCustomEdit* edt = dynamic_cast<TCustomEdit*>(FindControl(msg.Ctl));
        if (edt)
        {
            Caption = edt->ClassName();
            reinterpret_cast<TEdit*>(edt)->Color = clYellow;
            reinterpret_cast<TEdit*>(edt)->Font->Color = clRed;

        }
    }
    else if (msg.NotifyCode == EN_KILLFOCUS)
    {
        TCustomEdit* edt = dynamic_cast<TCustomEdit*>(FindControl(msg.Ctl));
        if (edt)
        {
            reinterpret_cast<TEdit*>(edt)->Color = clWindow;
            reinterpret_cast<TEdit*>(edt)->Font->Color = clWindowText;
        }
    }
}

BEGIN_MESSAGE_MAP
    MESSAGE_HANDLER(WM_COMMAND, TWMCommand, WmCommand)
END_MESSAGE_MAP(inherited)


Esto hace que afecte a todos los descendientes de TCustomEdit.

La línea que va poniendo en la barra de titulo del Form la clase a la que pertenece el control de edición donde estamos, es para que veamos que podemos diferenciar los controles, y así usarla para descartar los que no nos interesen por ejemplo.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Gracias.. ahora si identifica los detalles. bueno como dicen, estaba medio desorientado al principio ahora, ya voy entendiendo los Mensajes de Windows..

Gracias (100 caravanas y otra botella de Vino...)

Necesitos Leer mas sobre window y su estructura.. es lo recomendable...
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Perdon por mi ignorancia pero la función de Leo donde se declararía/llamaría? Me pierdo bastante en estos temas.
Volver arriba
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.