Я пытаюсь сделать из Hemo обычного средства просмотра Hex, я знаю, что это, вероятно, не идеально, но только я лично использую его, так что это не имеет значения.
(1)
Во-первых, предположим, что записка заполнена шестнадцатеричной информацией, например, так:
Как можно получить счетчик всех текстовых блоковпоказано, игнорируя пустое пространство?Таким образом, при использовании изображения результат в этом случае будет 28.
Это то, что я пробовал, и я знаю, что это совершенно неправильно, так как я получаю доступ к строкам Memo, но я не знаю, как получить доступ к каждому символу.
Кажется, я не могу решить эту простую проблему: (
function CountWordBlocks(Memo: TMemo): Integer;
var
i: Integer;
vCount: Integer;
begin
for i := 0 to Memo.Lines.Count - 1 do
begin
if Length(Memo.Lines.Strings[i]) = 2 then
begin
Inc(vCount);
end;
end;
Result := vCount;
end;
Вот код, который я использую для отображения значений шестнадцатеричных значений в памятке:
procedure ReadFileAsHex(const AFileName: string; ADestination: TStrings);
var
fs: TFileStream;
buff: Byte;
linecount: Byte;
line: string;
begin
linecount := 0;
line := '';
fs := TFileStream.Create(AFileName, fmOpenRead);
try
ADestination.BeginUpdate;
try
while fs.Position < fs.Size do
begin
fs.Read(buff, 1);
line := line + IntToHex(buff, 2) + ' ';
Inc(linecount);
if linecount = 16 then
begin
ADestination.Add(line);
line := '';
linecount := 0;
end;
end;
if Length(line) <> 0 then
ADestination.Add(line);
finally
ADestination.EndUpdate;
end;
finally
fs.Free;
end;
end;
(2)
Если я нажимаю на заметку и текстовый блок находится под курсором, как я могу узнать, какой номер у выбранного блока из всех остальных?
Таким образом, используя то же первое изображение, каретка находится в верхней строке рядом с 68, поэтому результат будет равен 3, поскольку это третий текстовый блок из 28.
Это должно быть так просто, но яне могу мыслить ясно, у меня пока нет правильного умения программирования, и поэтому я действительно борюсь с базовой логикой и решением проблем!
(3)
Наконец-то я бы хотелвыбрать блок во время выполнения, передав значение номера блока. Я попытался это без особогоccess:
procedure FindBlock(Memo: TMemo; BlockNumber: Integer);
var
i: Integer;
txt: string;
ThisWhite, PrevWhite: boolean;
vRead: Integer;
begin
txt := Memo.Text;
vRead:= 0;
PrevWhite := True;
for i := 1 to Length(txt) do
begin
ThisWhite := Character.IsWhiteSpace(txt[i]);
if PrevWhite and not ThisWhite then
begin
Inc(vRead);
PrevWhite := False;
end;
PrevWhite := ThisWhite;
if vRead = BlockNumber then
begin
Memo.SelStart := vRead;
Memo.SetFocus;
Exit;
end;
end;
end;