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 

TTreeview como el outlook

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: TTreeview como el outlook Responder citando

Hola compañeros,

Alguien sabe como hacer para indicar en mi nodo de un TTreeView se indique cuantos elementos tengos y poner el número en otro color ??? como lo hace el outlook cuando tienes nuevos correos.

Saludos !!!
Edwin
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

¿Algo así?:


- Para el ejemplo creamos un proyecto nuevo vacio al que añadimos un TTreeView (TreeView1).

En el constructor del Form lo rellenamos:
Código:
TTreeNode* raiz = TreeView1->Items->Add(0, "Mis carpetas");
TreeView1->Items->AddChildObject(raiz, "Bandeja de entrada", (PINT)123);
TreeView1->Items->AddChildObject(raiz, "Bandeja de salida", (PINT)0);
TreeView1->Items->AddChildObject(raiz, "Elementos enviados", (PINT)10);
TreeView1->Items->AddChildObject(raiz, "Borrador", (PINT)0);
TreeView1->FullExpand();

Y en el evento OnAdvancedCustomDrawItem lo pintamos con el siguiente código:
Código:
    TTreeView* tv = static_cast<TTreeView*>(Sender);

    if (!Node->Data)
        return;

    switch (Stage)
    {
        case cdPrePaint:
            tv->Canvas->Font->Style = TFontStyles() << fsBold;
            break;
        case cdPostPaint:
            String num = String().sprintf("(%d)", Node->Data);
            tv->Canvas->Font->Style = TFontStyles();
            tv->Canvas->Font->Color = clBlue;
            tv->Canvas->Brush->Color = tv->Color;
            TRect r = Node->DisplayRect(true);
            r.Left = r.Right + 4;
            r.Right = r.Left + tv->Canvas->TextWidth(num);
            tv->Canvas->TextOut(r.Left, r.Top, num);
    }

Lo que hacemos es usar el puntero para datos opcional de cada nodo para poner ahí el numero que queremos que se dibuje entre paréntesis. Si este número es mayor de 0 pintara el texto en negrita y el numero al lado, en caso contrario no pintara el numero y el texto será normal.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

_Leo:

No hay dia que pase en que agradezca a Dios por una persona tan brillante y que no sea ruso o Hindú y hable español !!!!!

Mil gracias por tu ayuda San _Leo, es exáctamente lo que buscaba.

Saludos !!!
Edwin
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

hola he estado tratando de pasar este mismo codigo para c++ 2009 pero me da error
Código:
[BCC32 Error] Unit1.cpp(39): E2034 Cannot convert 'const char *' to 'const wchar_t *'

en la linea String num = String().sprintf("(%d)", Node->Data);
he intantado poner al fianl t_str() pero aun no caigo en los cambios que hay que hacer con estos tipos de errores?
me pudieran ayudar por favor
_________________
Todos somos ignorantes, lo que no todos ignoramos lo mismo...
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Puedes usar:

    // Manteniendo compatibilidad con las versiones anteriores
    String num = AnsiString().sprintf("(%d)", Node->Data);

o bien:

    // Sin mantener la compatibilidad con las versiones anteriores
    String num = String().sprintf(L"(%d)", Node->Data);

__________________

Otra opción, es cambiar en las opciones del proyecto:

    MENU: Project -> TREEVIEW: "Directories and Conditionals" ->
    -> "_TCHAR maps to" -> Cambiar el valor a: "wchat_t"

Y luego usaríamos:

    String num = String().sprintf(TEXT("(%d)"), Node->Data);

Esta opción que parece un poco mas liosa creo que es la más coherente cuando necesitamos mantener la compatibilidad entre un proyecto UNICODE o ANSI
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Razz muchas gracias _Leo sabia que el foro me ayudaria , de todo s modos logre imaginarme que era algo sobre eso y lo he arreglado como bien me indicas con AsnSiting en vez de String
ahora lo unico que me queda por saber es como le hago para las imagenes de los nodos , por ejemplo yo asocio el treeview con un imagelist pero solo me carga la primera imagen de este imagenlist, mi pregunta es como le haria para en cada nodo cargar una imagen diferente del imagenlist?
gracias _Leo
_________________
Todos somos ignorantes, lo que no todos ignoramos lo mismo...
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Tienes las propiedades "ImageIndex" y "SelectedIndex" entre otras:
Código:
TTreeNode* raiz = TreeView1->Items->Add(0, "Mis carpetas");
raiz->ImageIndex = 1;
raiz->SelectedIndex = 1;

TTreeNode* node = TreeView1->Items->AddChildObject(raiz, "Prueba", (PINT)123);
// La imagen normal:
node->ImageIndex = 1;
// La imagen cuando esta seleccionado:
node->SelectedIndex = 0;

    // Si solo quieres una imagen fija puedes ahorrar un poco de
    // código usando lo siguiente en vez de las dos líneas anteriores
    // node->StateIndex = 1;

TreeView1->FullExpand();
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

_Leo si te entendi bien deberia poner el codigo asi?
Código:
TTreeNode* raiz = TreeView1->Items->Add(0, "Mis carpetas");
raiz->StateIndex = 0;
TTreeNode* node = TreeView1->Items->AddChildObject(raiz, "Entrada", (PINT)123);
node->StateIndex = 1;
TTreeNode* node1 = TreeView1->Items->AddChildObject(raiz, "Borrador", (PINT)123);
node1->StateIndex = 2;

y asi susecivamente....?
Otra duda: _Leo este codigo se declara en el contructor del formulario, yo podria cambiar los numeros fijos como el 123 y 10 por variables. pregunto : y si deseo luego en un boton decir que las variables no valen 123 y 10 , sino otros numeros , lo podria hacer?
_________________
Todos somos ignorantes, lo que no todos ignoramos lo mismo...
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

ifrit escribió:
deberia poner el codigo asi?

Si, solo asegúrate de que si usas la propiedad "StateIndex" asigna el "TImageList" a "StateImages" en lugar de a "Images"

Y para cambiar luego el número de un elemento puedes usar:
Código:
// Cambiamos el número del segundo elemento:
TreeView1->Items->Item[1]->Data = (PINT)456;
TreeView1->Repaint();
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

En pocas palabras tu como siempre eres en gran parte el alma de este foro
Smile
gracias mil
_________________
Todos somos ignorantes, lo que no todos ignoramos lo mismo...
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

_Leo tengo un error y no se me ocurre qu epuede ser. Te explico que uso el codigo que dejas aca en el public del .h de un form donde esta el treeview . lo hago asi porque necesito llamar al codigo en otros forms, ahora cuando estoy resiviendo correos planteo esto
Código:
DM1->IdPOP31->Retrieve(j , DM1->IdMessage1);
               //actualizando la carpeta entrada
               frmMain->totalEntrada += 1;
               TV1->Items->Item[1]->Data = (PINT)frmMain->totalEntrada;
               TV1->Repaint();

el proble es que si estoy en el proceso de recibir correos y me paro en otro de los nodos del treeview el correo que estaba descargando del servidor me lo pasa a el que yo selecciono y no respeta el codigo que dice que se guarde en totalEntrada...
otro detalle es que en el evento onchenge del treeview eesta el siguiente codigo
Código:
if (btnMRecibir->Enabled) {
   int N;
   if (TV1->Selected!=NULL)
   {
      LV1->Items->Clear();
      //puntero a items del listview
      TListItem *list;
      N =TV1->Selected->AbsoluteIndex;
      //trabajo con la carpeta entrada
      if(TV1->Items->Item[N]->Text == "Entrada"){
      carpetaName = "Entrada";
      //nos paramos en entrada
      TLocateOptions valEntrada;
      valEntrada.Clear();
      valEntrada <<loCaseInsensitive>TCarpeta->Locate("Carpeta","Entrada",valEntrada);
      frmMain->totalEntrada = DM1->TCorreos->RecordCount;

      // llenamos el listview con los datos de entrada
      DM1->TCorreos->First();
      while (!DM1->TCorreos->Eof){
         list = frmMain->LV1->Items->Add();
         list->SubItems->Add(DM1->TCorreosDe->Value);
         list->SubItems->Add(DM1->TCorreosAsunto->Value);
         list->SubItems->Add(DM1->TCorreosFecha->Value);
         DM1->TCorreos->Next();
      }
      TV1->Items->Item[1]->Data = (PINT)totalEntrada;
      TV1->Repaint();
      }

si el texto dice entrada ocurre lo de arriba , pero si dice salida repito el mismo codigo pero preguntando por salida
Espero que puedas encontrarle solucion gracias

mensaje editado
esta resuelto el error todo mio perdonenme

_________________
Todos somos ignorantes, lo que no todos ignoramos lo mismo...
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

_Leo ya he probado con todo lo poco que se pero nada aun , lo que necesito es que al darle a un boton , despues que este termine su rutina el treeview marque el nodo 1 o el 2 etc
es decir termine con el boton y el treview "genera " el evento onclick sobre X nodo
se puede
gracias
_________________
Todos somos ignorantes, lo que no todos ignoramos lo mismo...
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Hola , otra sobre el tema.
Se puede crear otro nodo en tiempo de ejecucion que cuente con las mismas caracteristicas qwue los nodos ya antes cerados en elconstuctor del form?
_________________
Todos somos ignorantes, lo que no todos ignoramos lo mismo...
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
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.