Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Hex редактор или как создать нередактируемые столбцы
Форум программистов > Системное программирование > C, С++ и С Builder > Borland C++ Builder & Kylix
EugenOS
Доброго времени суток всем.
Потребовалось иметь в своей программе окно HEX редактора, т.к. файлы не большие ( 160 байт макс. )
то сделал по-топорному, функцию заполнения TStrings

//---------------------------------------------------------------------------
void __fastcall TForm1::fillHex( TStrings* memoLines, char* buf, int length )
{
     if( !memoLines )
     {
        MessageBox( Handle, "Attemt to write to not created element!", "Warning", MB_OK);
        return;
     }
     memoLines->Clear();
     radix.LeadingZero = false;
     int datalen = (( length + 15 ) / 16 ) * 16;
     int lineCount = datalen / 16;
     char *cbuf = new char[datalen];
     // TODO: fill cbuf by 0
     memcpy( cbuf, buf, length );
     for( int l = 0; l < lineCount; l++ )
     {
        memoLines->Add( createHexString( cbuf, l*16 ) );
     }
}
//---------------------------------------------------------------------------
AnsiString __fastcall TForm1::createHexString( char *buf, int addr )
{

        radix.Value = addr;
        radix.MinDigitNumber = 8;
        AnsiString result = radix.Hex + " : ";
        radix.BytesCount = 8;
        radix.Value = *((__int64*)(buf + addr));
        result = result + radix.AsHexBytes + ":";
        radix.Value = *((__int64*)(buf + addr + 8));
        result = result + radix.AsHexBytes;
        return result;
}
//---------------------------------------------------------------------------


которая использует класс Radix, вот функции от его пропертей
AnsiString AsHexBytes и AnsiString Hex:

//---------------------------------------------------------------------------
AnsiString __fastcall Radix::rdHex(void)
{
        bool leading_zero_flag = !LeadingZero;
        AnsiString Res = "0x";
        int i;
        for(i= 0; i< 16; i++)
        {
          qword val = Value << (i*4);
          char digNum = (char)((qword)(val >> 60));
          digNum &= 0x0F;
          if ( !( leading_zero_flag && (digNum == 0) ) )
          {
             leading_zero_flag = false;
             Res+=AnsiString(digits[digNum]);
             if( (i > 0) && (i < 15) && ((15-i) & 3)==0 )
                Res+=" ";
          }
        }
        int rl = Res.Length();
        int zeroadd = hexLen - rl;
        if( ( !LeadingZero ) && ( rl < hexLen )  )
        {
                AnsiString InsStr = "";
                Res = Res.SubString(3,Res.Length()-2);
                if( Res.Length() % 5 == 4 )
                        Res = " " + Res;
                for( i = 1; i <= zeroadd; i++)
                {
                        if( ( Res.Length() + i ) % 5 == 0 && i < zeroadd )
                                InsStr = " " + InsStr;
                        else
                                InsStr = "0" + InsStr;
                }
                Res = "0x" + InsStr + Res;
        }
        return Res;
}
//---------------------------------------------------------------------------
AnsiString __fastcall Radix::rdHexB(void)
{
        AnsiString Res = "";
        
        for(int i= 0; i< bufLen; i++)
        {
          qword val = Value >> (i*8);
          char digNum = (char)(val);
          Res+=AnsiString(digits[(digNum >> 4)&0x0F]);
          Res+=AnsiString(digits[(digNum & 0x0F)]);
          if(i<bufLen-1)Res+=" ";
        }
        return Res;
}
//---------------------------------------------------------------------------
const char Radix::digits[16] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' };
//---------------------------------------------------------------------------

в общем результат выглядит следующим образом:
0x0000 0000 : 14 EC 00 03 4E 24 0D C2:27 FE 11 E2 1D 4B A1 85
0x0000 0010 : D0 86 85 96 24 1D 78 7B:84 C9 72 EA 42 14 A2 E7
0x0000 0020 : FC 0E 36 1B F0 AC B1 A4:06 87 63 35 CF 87 98 28
0x0000 0030 : 72 C3 7F 9F EA AE 21 2C:30 93 C3 8C 5F 13 7C 3B
0x0000 0040 : 37 2B CB 63 88 08 45 05:3A 19 1E BE 20 C0 EC 99
0x0000 0050 : 70 BA 6B 1D 28 BF 9E 3A:1B C4 03 89 DB E6 23 80
0x0000 0060 : F1 0F C9 1B 7A EE 18 26:9F 81 69 87 0A AC 6A 49
0x0000 0070 : B7 75 BD 7E 03 0C 5B 1E:45 30 8A 37 29 7F D7 01
0x0000 0080 : 01 01 01 B9 37 D1 81 98:3D D5 A3 D2 9B F4 42 AA
0x0000 0090 : 86 04 80 00 00 00 00 00:00 00 0E 7F FF 26 47 38

проблема в следующем: как в Memo или RichEdit запретить редактирование
адресов и областей между байтами.

Заранее спасибо.

P.S. также подойдет вариант решения - воспользоваться готовым компонентом HexEditor, наподобие как на ELRA Soft, но у них компонент шароварный, и через 30 дней говорит адью. Если кто знает где подобный фриварный компонент можно скачать, дайте плиз ссылку.
EugenOS
да, еще, в RichEdit'е использую моноширинный шрифт, так что по координатам столбцы "ровные"
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2009 IPS, Inc.