Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 26-05-2020
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
Crear mapa de colores en un TEdit

Buenas amigos, estoy haciendo una mi i herramienta la cual debe mostrar un valor en binario en un TEdit y además colorear el texto en varios colores. La cosa es que hay que dibujar algo así: 1010011110...
Donde cada color indica a que corresponden esos bits. La cosa es que no sé cómo pasar un número de 16 bytes a binario y mucho menos colorear SAS diferentes subcadenas del TEdit. ¿Me pueden ayudar?. Sé que para pasar a binario se puede hacer a mano dividiendo entre 2 y el resto indicado hay que poner 1 ó 0 o algo así era.
Responder Con Cita
  #2  
Antiguo 26-05-2020
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
No importa si en vez de un TEdit es un TRichEdit ya que su única función será mostrar esa información y será de solo lectura
Responder Con Cita
  #3  
Antiguo 26-05-2020
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.

Como para que uses de guía, te hice un ejemplo que pasa un numero hexadecimal a binario lo almacena en un TRichEdit y pinta de colores los dígitos:
Código PHP:
String hexToBin(String value)
{
  
String BIN[16] = {"0000","0001","0010","0011","0100",
                    
"0101","0110","0111","1000","1001",
                    
"1010","1011","1100","1101","1110","1111"};
  
int i 1;
  
String r;

  while(
value.Length())
  {
    
char ch toupper(value[i]);
    if (
ch >= '0' && ch <= '9')
      
+= BIN[ch '0'];
    else if (
ch >= 'A' && ch <= 'F')
      
+= BIN[ch 'A' 10];
    else
      throw (
"Caracter ilegal.");
    
i++;
    ;
  }
  return 
r;
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  
TColor colors[8] = {clRed,clYellow,clBlue,clGreen,clBlack,
                      
clLime,clRed,clLime};
  
RichEdit1->Text hexToBin("2C8");
  for(
int i 08i++)
  {
    
RichEdit1->SelStart  i;
    
RichEdit1->SelLength 1;
    
RichEdit1->SelAttributes->Color colors[i];
  }

Resultado:


Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #4  
Antiguo 26-05-2020
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
Juraría que ya te respondí pero no aparece mi respuesta así que lo vuelvo a hacer. Ya conseguí el tema de colorear y el de pasar a binario al igual que solucioné un problema con la conversión de WideString a DWORD64 que al ser grandes me daba una excepcion diciendo que no era un entero válido así que lo calculo a mano al igual que hago con los binarios jejeje.
El problema que tengo ahora es rarísimo, fuí a compilar y me dijo que había caracteres especiales y que tenía que activar el uso de UTF-8 o si no se perderían así que lo acepté y ahora al compilar me está dando un error que es claramente algún bug del RAD.
Mi código:
Código PHP:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"

//Definiciones para calcular la mascara de limpieza de los HBPs marcados
#define CLEAN_HBP_DR0 0xFFFFFFFFFFF0FFFE‬
#define CLEAN_HBP_DR1 0xFFFFFFFFFF0FFFFB
#define CLEAN_HBP_DR2 0xFFFFFFFFF0FFFFEF
#define CLEAN_HBP_DR3 0xFFFFFFFF0FFFFFBF‬

#define MASK  0xFFFF0055

#define HBP_ONEXECUTE 0
#define HBP_ONWRITE   1
#define HBP_ONACCESS  3

enum LENGTH{HBP_BYTE,HBP_WORD,HBP_QWORD,HBP_DWORD};

DWORD64 Dr7;

TForm1 *Form1;

WideString Hex64ToBin(DWORD64 valor);
WideString Hex64ToWString(DWORD64 valor);

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponentOwner)
    : 
TForm(Owner)
{
}
//---------------------------------------------------------------------------

void SETBITS(DWORD64 *dr7int lowBitint bitsint newValue) {

     
int mask = (<< bits) - 1;
     *
dr7 = (*dr7 & ~(mask << lowBit)) | (newValue << lowBit);

}
//---------------------------------------------------------------------------

DWORD64 __fastcall TForm1::SetHardwareBP(void)
{
    
int Largo,Tipo;
    
Dr7=0;

    for(
int i=0;i<ComboBox1->ItemIndex+1;i++){
        
TPanel *PanelDrx = (TPanel*)Panel5->FindChildControl("PanelDr"+WideString(i));
        
TComboBox *CBTipo = (TComboBox*)PanelDrx->FindChildControl("ComboBoxTipoDr"+WideString(i));
        
TComboBox *CBLargo = (TComboBox*)PanelDrx->FindChildControl("ComboBoxLargoDr"+WideString(i));

        switch (
CBTipo->ItemIndex) {
            case 
0:
                
Tipo=HBP_ONEXECUTE;
                break;
            case 
1:
                
Tipo=HBP_ONACCESS;
                break;
            case 
2:
                
Tipo=HBP_ONWRITE;
                break;
        }

        if(
Tipo == HBP_ONEXECUTE){
            
Largo=HBP_BYTE;
        }else{
            switch (
CBLargo->ItemIndex) {
                case 
0:
                    
Largo=HBP_BYTE;
                    break;
                case 
1:
                    
Largo=HBP_WORD;
                    break;
                case 
2:
                    
Largo=HBP_DWORD;
                    break;
                case 
3:
                    
Largo=HBP_QWORD;
                    break;
            }
        }

        
SETBITS(&Dr716 42Tipo);
        
SETBITS(&Dr718 42Largo);
        
SETBITS(&Dr7211);

        
Dr7 &= MASK//Limpio la parte alta
    
}
    return 
Dr7;
}
//---------------------------------------------------------------------------

WideString Hex64ToWString(DWORD64 valor)
{
    
int restobase 16;
    
WideString salida "";
    
char hexa[]="0123456789ABCDEF";

    while(
valor >= base){ //Mientras el dividendo sea mayor o igual que el divisor, es decir, mayor o igual que 16.
        
resto valor base;
        
salida WideString(hexa[resto]) + salida//Si el resto mayor que 0 concatenamos el valor correcto del array hexa
        
valor /= base// Actualizamos el valor del dividendo dividiendolo entre 16.
    
}
    if(
valor 0)
        
salida WideString(hexa[valor]) + salida// Por último sí el valor final del dividendo es mayor que 0 concatenamos el valor que le corresponde del array hexa

    
return salida;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    
int posActivacionposTipoposLargolargo;

    
Dr7 SetHardwareBP();

    
WideString hexa Hex64ToWString(Dr7); //Obtengo el valor DWORD64 en string

    //Relleno de ceros a la izquierda hasta completar los 16 de un DWORD64
    
for(int i=hexa.Length();i<16;i++)
        
hexa "0" hexa;

    
//Le coloco el inicio de los hexadecimales
    
hexa "0x" hexa;

    
//Muestro el valor hexadecimal
    
EditDr7->Text hexa;

    
WideString bin Hex64ToBin(Dr7);  //Obtengo la cadena binaria

    //Relleno con ceros a la izquierda la cadena binaria hasta que llene los 64 bits
    
for(int i=bin.Length();i<64;i++)
        
bin "0" bin;

    
RichEditBinDr7->Lines->Clear();  //Limpio el RichEdit
    
RichEditBinDr7->Lines->Strings[0]=bin;  //Le coloco la cadena binaria

    //Obtengo el largo de la cadena binaria
    
largo WideString(RichEditBinDr7->Lines->GetText()).Length() - 1;

    
//Obtengo las posiciones iniciales de cada apartado
    
posActivacion largo 2;
    
posTipo largo 19;
    
posLargo largo 21;

    
//Doy color a todos los apartados
    
for(int i=0<= ComboBox1->ItemIndexi++){
        
RichEditBinDr7->SelStart posActivacion i*2;
        
RichEditBinDr7->SelLength 1;
        
RichEditBinDr7->SelAttributes->Color clYellow;

        
RichEditBinDr7->SelStart posTipo i*4;
        
RichEditBinDr7->SelLength 2;
        
RichEditBinDr7->SelAttributes->Color clLime;

        
RichEditBinDr7->SelStart posLargo i*4;
        
RichEditBinDr7->SelLength 2;
        
RichEditBinDr7->SelAttributes->Color clRed;
    }
}
//---------------------------------------------------------------------------

WideString Hex64ToBin(DWORD64 valor)
{
    
int restodivisor 2;
    
WideString binario "";

    while(
valor >= divisor){ //Mientras el dividendo sea mayor o igual que el divisor, es decir, mayor o igual que 2.
        
resto valor 2;
        if(
resto == 1)
            
binario "1" binario//Si el resto es igual a 1 concatenamos 1 a la variable string llamada binario
        
else
            
binario "0" binario// Sino concatemanos 0
        //Es importante este orden de concatenación (primero el bit y luego el valor de la variable) esto para que nuestro número
        //en sistema binario esté ordenado correctamente.
         
valor /= divisor// Actualizamos el valor del dividendo dividiendolo entre 2.
    
}
    if(
valor == 1)
        
binario "1" binario// Por último sí el valor final del dividendo es 1 concatenamos 1 sino concatenamos 0.
    
else
        
binario "0" binario;
    return 
binario;
}
//---------------------------------------------------------------------------


void __fastcall TForm1::Button2Click(TObject *Sender)
{
    
int posActivacionposTipoposLargolargo;

    
//Creo la mascara deseada
    
Dr7 0;
    switch(
RadioGroupMasks->ItemIndex)
    {
        case 
0:
            
Dr7 |= CLEAN_HBP_DR0;
            break;
        case 
1:
            
Dr7 |= CLEAN_HBP_DR1;
            break;
        case 
2:
            
Dr7 |= CLEAN_HBP_DR2;
            break;
        case 
3:
            
Dr7 |= CLEAN_HBP_DR3;
            break;
    }


    
WideString hexa Hex64ToWString(Dr7); //Paso la mascara de DWORD64 a string

    //Relleno con ceros a la izquierda hasta obtener los 16 de un DWORD64
    
for(int i=hexa.Length();i<16;i++)
        
hexa "0" hexa;

    
//Le coloco el inicio de los numeros hexadecimales
    
hexa "0x" hexa;

    
//Muestro el valor hexadecimal
    
EditMaskClean->Text hexa;

    
WideString bin Hex64ToBin(Dr7); //Obtengo la cadena binaria

    //Relleno con ceros a la izquierda la cadena binaria hasta que llene los 64 bits
    
for(int i=bin.Length();i<64;i++)
        
bin "0" bin;

    
RichEditBinMaskClean->Lines->Clear();  //Limpio el RichEdit
    
RichEditBinMaskClean->Lines->Strings[0]=bin;  //Le coloco la cadena binaria

    //Obtengo el largo de la cadena binaria
    
largo WideString(RichEditBinMaskClean->Lines->GetText()).Length() - 1;

    
//Obtengo las posiciones iniciales de cada apartado
    
posActivacion largo 2;
    
posTipo largo 19;
    
posLargo largo 21;

    
//Doy color a todos los apartados
    
RichEditBinMaskClean->SelStart posActivacion RadioGroupMasks->ItemIndex*2;
    
RichEditBinMaskClean->SelLength 1;
    
RichEditBinMaskClean->SelAttributes->Color clYellow;

    
RichEditBinMaskClean->SelStart posTipo RadioGroupMasks->ItemIndex*4;
    
RichEditBinMaskClean->SelLength 2;
    
RichEditBinMaskClean->SelAttributes->Color clLime;

    
RichEditBinMaskClean->SelStart posLargo RadioGroupMasks->ItemIndex*4;
    
RichEditBinMaskClean->SelLength 2;
    
RichEditBinMaskClean->SelAttributes->Color clRed;
}
//--------------------------------------------------------------------------- 
Y los errores:
Código:
[bcc32c Error] Unit1.cpp(201): invalid suffix '‬' on integer constant
[bcc32c Error] Unit1.cpp(210): invalid suffix '‬' on integer constant
El error me lo marca en el método Button2Click en las líneas:
Código PHP:
Dr7 |= CLEAN_HBP_DR0;
Dr7 |= CLEAN_HBP_DR3
Antes tambien me lo marcaba en la linea:
Código PHP:
Dr7 &= MASK//Limpio la parte alta 
Pero misteriosamente ya no lo marca ahí. Pienso que al hacer lo del UTF-8 ha metido algo que se está cargando el código pero no se que hacer para solucionarlo.
Responder Con Cita
  #5  
Antiguo 27-05-2020
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
Solucionado. Al final tenia yo razón, el RAD tiene que tener algún bug porque me metió basura entre el código. Lo abrí con un editor hexadecimal y vi que justo detrás de esas lineas había caracteres extraños así que los eliminé listo, ya funciona.
Gracias.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Crear un TEdit personalizado mcsebas Varios 12 28-01-2010 08:46:55
Crear un Degradado entre dos colores aeff Varios 3 29-11-2008 18:11:46
Como crear un bucle con TEdit's axlrafael OOP 12 08-05-2008 19:22:48
crear stringgrid a colores lucky C++ Builder 2 12-12-2006 02:31:35
Crear un TextBox que admita colores de línea SaurioNet .NET 5 17-02-2005 19:09:44


La franja horaria es GMT +2. Ahora son las 10:41: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
Copyright 1996-2007 Club Delphi