| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
edwinhp2 Lt JG

Registrado: 19 Nov 2005Mensajes: 67
|
Publicado: Mar 10 Jul, 2007 9:34 am Asunto: TTreeview como el outlook |
|
|
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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Mar 10 Jul, 2007 2:12 pm Asunto: |
|
|
¿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 |
|
 |
edwinhp2 Lt JG

Registrado: 19 Nov 2005Mensajes: 67
|
Publicado: Mar 10 Jul, 2007 6:38 pm Asunto: |
|
|
_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 |
|
 |
ifrit Master


Registrado: 12 Jun 2007Mensajes: 509Ubicación: La Habana, Cuba
|
Publicado: Mar 17 Feb, 2009 12:54 am Asunto: |
|
|
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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Mar 17 Feb, 2009 1:53 am Asunto: |
|
|
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 |
|
 |
ifrit Master


Registrado: 12 Jun 2007Mensajes: 509Ubicación: La Habana, Cuba
|
Publicado: Mar 17 Feb, 2009 2:04 am Asunto: |
|
|
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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Mar 17 Feb, 2009 2:35 am Asunto: |
|
|
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 |
|
 |
ifrit Master


Registrado: 12 Jun 2007Mensajes: 509Ubicación: La Habana, Cuba
|
Publicado: Mar 17 Feb, 2009 3:05 am Asunto: |
|
|
_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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Mar 17 Feb, 2009 3:44 am Asunto: |
|
|
| 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 |
|
 |
ifrit Master


Registrado: 12 Jun 2007Mensajes: 509Ubicación: La Habana, Cuba
|
Publicado: Mar 17 Feb, 2009 3:53 am Asunto: |
|
|
En pocas palabras tu como siempre eres en gran parte el alma de este foro
gracias mil _________________ Todos somos ignorantes, lo que no todos ignoramos lo mismo... |
|
| Volver arriba |
|
 |
ifrit Master


Registrado: 12 Jun 2007Mensajes: 509Ubicación: La Habana, Cuba
|
Publicado: Jue 19 Feb, 2009 2:01 am Asunto: |
|
|
_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 |
|
 |
ifrit Master


Registrado: 12 Jun 2007Mensajes: 509Ubicación: La Habana, Cuba
|
Publicado: Lun 02 Mar, 2009 5:29 am Asunto: |
|
|
_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 |
|
 |
ifrit Master


Registrado: 12 Jun 2007Mensajes: 509Ubicación: La Habana, Cuba
|
Publicado: Lun 16 Mar, 2009 5:28 pm Asunto: |
|
|
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 |
|
 |
|