[delphi] prosty edytor hex

0

chce zrobic prosty edytor hex umozliwiajacy edycje w hex i normalnego tekstu. niestety przy niektorych plikach nie wczytuje mi calosci :/ czy moze ktos zajmowal sie czyms podobnym lub ma jakies informacje ktore mogly by mi pomoc? z gory dziekuje i pozdrawiam

ponizej dziwny wytwor mojej pracy ;)
http://www.12medium.goracer.de/hex.rar

0
procedure TForm1.OpenInHex(FileName:String;Memo:TMemo);
var
Memory:TMemoryStream;
Buffer:Byte;
begin
Memo.Clear;
Memory:=TMemoryStream.Create;        // Tworze zmienną
Memory.LoadFromFile(FileName);     // wczytuje plik
Memory.Position:=0;       //Ustawiam wskaźnik na początek pliku
repeat
Memory.ReadBuffer(Buffer,1);      // czytam bajt
Memo.SelText :=IntToHex(Buffer,2); //Konwertuje na Hex i Dopisuje
until Memory.Position =Memory.Size ;
Memory.Free;
end;

Do zapisywania Bajtu Korzystasz z

Memory.WriteBuffer(Buffer,1);  

A teraz o przyczynach dlaczego ci tamto nie działa
1.Memo nie wczytuje wszystkich znaków ASCII tylko te widzialne jako text.
2.Gdy Memo Wczyta znak ASCII o kodzie 0 uzna że to koniec pliku który powinien być tekstem bo właśnie
tekst jest zakończony znakiem ASCII o kodzie 0
Funkcja Konwertująca Hex na Byte

type THexValue =String[2];

function HexToByte(HexValue:THexValue):Byte;
begin
Result:=StrToInt('$'+HexValue);
end;

Oczywiście to powyżej jest mało wydajne jeśli chcesz szybko wczytać plik
to stwórz sobie drugie MemoryStream i Wpisuj do niego wartości Hex
Uwaga praktyczna
Zamiast Wywoływać funkcję InttoHex przy każdym bajcie lepiej

stwórz tablicę

type THexValue =String[2];
var 
TablicaHex: array [0..255] of THexValue ;

i wypełnij ją wartościami Hexowymi 0..255
W tenSposób Zamiastwywoływać czasochłonne InTToHex pobierasz wartość tak

WartoscHex:=TablicaHex[Buffer];

czyli linijka

Memo.SelText :=IntToHex(Buffer,2); //Konwertuje na Hex i Dopisuje

Zamienia się w

Memo.SelText :=TablicaHex[Buffer];
0

Dziekuje za wszystkie wskazowki bardzo sie przydaly. Faktycznie roznica w predkosci przy utworzeniu tablicy jest OGROMNA w doslownym slowa znaczeniu (testowane przypadkiem na kilku megowym pliku =D). Na chwile obecna program po paru zmianach wyglada tak:
http://www.12medium.goracer.de/Project1.rar

Chcialbym zapytac o pare rzeczy odnosnie:

  1. w jaki sposob wyswietlic w komorce po prawej normalny tekst tak aby zurzyc jak najmniej pamieci?
  2. czy jest mozliwe alby zmiana po stronie hex zmieniala jednoczesnie wartosci tekstowe i na odwrot?
  3. chcialbym w pasku stanu wyswietlic pozycje komorki ktora jest wyswietlona np(1 wiersz 16 kolumna wyswietla "pozycja: 0000F")
  4. czy przy edycji komorek jest mozliwosc zablokowania ich rozmiarow tylko do 2 znakow o wartosciach z przedzialu liczb hex?

z gory dziekuje za wszystkie odpowiedzi. do wszystkiego staram sie dochodzic samemu takze prosze wszystkich o wyrozumialosc i pozdrawiam

0

a która to komórka po lewej :)
2. zamiana Hex na text Od razu się nie opłaca (możesz zrobić z hexa int i wtedy...
w pasku belce wyświtlasz tak
w on create dodajesz panel

Statusbar1.Panels.Add;

Statusbar1.Panels[0].Text :='Tralalala ;)' ;

co do blokady klawiszy i rozmiarów
zadeklaruj stałe

const Allowed = [48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70];
const Operators = [8,13,46,37,38,39 ]     ;

Oraz zmienne

Pisz :Boolean;
Edytowana :TPoint;

W onSel SelEditStringgrida

 
 Edytowana.X :=ACol;
Edytowana.Y :=Arow;

W OnKey Press Stringgrida

IF (Not pisz)then
KEY:=#0;

W onKey down Stringgrida

if not( Key in  Allowed) and not( Key in  Operators)  then
Pisz :=False else pisz:=true;
if( length (StringGrid1.Cells[Edytowana.X ,Edytowana.Y ] ) =2 )
and  not( Key in  Operators) then pisz:=false;

0

ostatnia kolumna ma byc na tekst.. ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1