Hallo
DP-ler!
Hier ist nun die aktuelle Version meiner HexControls. Anregungen, die zu besserem Programmierstil führen oder dieses Projekt
praxistauglicher machen, sind jederzeit willkommen. Aber bitte nur konstruktive Tipps, die auch wirklich weiter helfen.
HexControls -
Unit
Diese
Unit enthält die Klassen:
THexEdit Ein Eingabefeld für hexadezimale Ziffern
THexTable Ein Gitter, abgeleitet von TStringGrid -
zur Eingabe und Bearbeitung von HexCodes
TCaptions Eine Beschriftungskomponente zur Anzeige
der hexadezimalen Zeilenadresse. Siehe -
Demo.
TAscTable Eine
Ascii Tabelle, sowohl zur Anzeige -
der
Ascii Codes in Hexeditoren, als auch
für Anzeige und Gewinnung von Zeichen im
Ascii-Code.
Klasse THexEdit :
Delphi-Quellcode:
THexEdit = class(TEdit)
private
FDigits: Integer;
FCalcWidth: Boolean;
FOnChange: TNotifyEvent;
function GetLength: Integer;
procedure SetLength(value: Integer);
procedure SetCalcWidth(value: Boolean);
public
constructor Create(AOwner: TComponent); override;
procedure Change; override;
procedure DoKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
//Anzahl editierbare Bytes
property CountBytes: Integer read GetLength write SetLength;
//TRUE -> Breite passt sich der Byteanzahl an
property CalcWidth: Boolean read FCalcWidth write SetCalcWidth;
property OnChange: TNotifyEvent read FOnChange write FOnChange;
end;
Klasse THexTable:
Delphi-Quellcode:
THexTable =
class(TStringGrid)
private
FAscTable: TAscTable;
FCaptions: TCaptions;
FCount: Integer;
FCurrRow: Integer;
FFileName:
String;
FHexBuf:
String[2];
FKeyCode: word;
FOnChange: TNotifyEvent;
FRange:
array[0..1]
of Integer;
FShift: TShiftState;
function getByte(
Index: Integer):
String;
function getValue(
Index: Integer): Byte;
procedure SetCaptions(value: TCaptions);
procedure setAscTable(value: TAscTable);
procedure setByte(
Index: Integer; value:
String);
procedure setValue(
Index: Integer; value: Byte);
public
constructor Create(AOwner: TComponent);
override;
procedure Change;
virtual;
procedure KeyDown(Sender: TObject;
var Key: Word; Shift: TShiftState);
//Aus Datei laden
procedure LoadFromFile(
Name:
String);
//In Datei speichern
procedure SaveToFile(
Name:
String);
//Speicherbereich in Hextabelle
procedure LoadFromMemory(memaddr: Pointer; Size: Integer);
//Inhalt Hextabelle in Speicherbereich
procedure SaveToMemory(memaddr: Pointer; Size: Integer);
//Ereignis Zelle slektiereen verarbeiten
procedure DoSelectCell(Sender: TObject; ACol, ARow: Integer;
var CanSelect: Boolean);
//Verbundene Ascii Tabelle
property AscTable: TAscTable
read FAscTable
write setAscTable;
//Hexbytes in der Tabelle
property Bytes[
Index: Integer]:
String read getByte
write SetByte;
//Bytes in der Tabelle
property Value[
Index: Integer]: Byte
read getValue
write SetValue;
//Beschriftungsliste, Siehe Demo.
property Captions: TCaptions
read FCaptions
write SetCaptions;
property Count: Integer
read FCount
write FCount;
property OnChange: TNotifyEvent
read FOnChange
write FOnChange;
end;
Klasse TCaptions :
Delphi-Quellcode:
TCaptions = class(TPanel)
private
FCaptions: TStringList;
FLabel: array of TLabel;
FOffsets: array of Integer;
function getCount: Integer;
function GetItem(Index: Integer): String;
function GetLabel(Index: Integer): String;
function GetOffsets(Index: Integer): Integer;
procedure SetItem(Index: Integer; value: String);
procedure SetLabel(Index: Integer; value: String);
procedure SetOffsets(Index: Integer; value: Integer);
public
constructor Create(AOwner: TComponent); override;
//Adressen setzen. Siehe Demo.
procedure SetCaptionsTo(ofCaptions: Integer);
//Anzahl Beschriftungszeilen
property Count: Integer read getCount;
//Die einzelnen Beschriftungen (hier in Stringliste)
//wahrscheinlich nicht so guter Programmierstil
property Items[Index: Integer]: String read GetItem write SetItem; default;
//Die einzelnen Beschriftungen (hier von Feld Components aus TControl)
//(stilistisch wahrscheinlich besser)
property Labels[Index: Integer]: String read GetLabel write SetLabel;
//Vertikale Abstände zwischen den Beschriftungen
property Offsets[Index: Integer]: Integer read GetOffsets write SetOffsets;
end;
Klasse TAscTable:
Delphi-Quellcode:
TAscTable = class(TStringGrid)
private
FSelectable: Boolean;
function getChar(Index: Integer): Char;
procedure SetChar(Index: Integer; value: Char);
procedure SetSelectable(value: Boolean);
public
constructor Create(AOwner: TComponent); override;
procedure KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
//Interner Zeichensatz. Siehe Demo.
procedure SetChars(Language: Integer);
//aktuelle Zeichen zB. in Hex-Editoeren. Siehe Demo.
property Chars[Index: Integer]: Char read getChar write SetChar;
//--------------------------------------------------------------------------
property Selectable: Boolean read FSelectable write SetSelectable;
//In Hexeditoren auf false setzen. Nur in der Hextabelle darf die Position
//geändert werden. Siehe Demo.
end;
So, das soll als Beschreibung erst mal reichen. Alles Andere müsst Ihr aus dem Quelltext entnehmen
oder mit dem Test des Demos rausfinden. Speichert die entzippten Dateien einfach in Eurem Projekt-
ordner und übersetzt die Datei hexCtrls.dpr Konstruktive Kritik ist jederzeit willkommen. Ich kann
dabei nur lernen. Ansonsten viel Spass mit den Klassen.
AMD_Prozessor