Je suis en train de faire une visionneuse hexadécimale de base d'un TMemo, je sais que ce n'est probablement pas idéal, mais ce sera moi personnellement l'utiliser, donc cela n'a pas vraiment d'importance.Blocs de mots dans TMemo
(1)
Tout d'abord, supposons un mémo est rempli d'informations Hex comme ceci:
Comment pourrais-je obtenir un compte de tous les blocs de texte affiché, en ignorant la espace blanc? Donc, en utilisant l'image, le résultat dans ce cas serait 28.
C'est ce que j'ai essayé et je sais que c'est complètement faux car j'accède aux lignes Mémo mais je ne sais pas comment accéder à chaque caractère.
Je ne peux pas semble résoudre ce problème simple :(
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;
Voici le code que je utilise pour afficher les valeurs Hex dans le mémo:
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)
Si je clique sur le mémo et qu'un bloc de texte est sous le curseur, comment pourrais-je savoir quel est le numéro du bloc sélectionné parmi tous les autres?
Donc, en utilisant la même première image, le caret est à la première ligne à côté de 68, de sorte que le résultat serait 3 comme il est le troisième bloc de texte sur 28.
Cela devrait être si facile mais je Je ne peux pas penser clairement, je n'ai pas encore le bon esprit de programmation et je me bats vraiment avec la logique de base et la résolution de problèmes!
(3)
Enfin, je voudrais sélectionner un bloc à l'exécution en passant une valeur de numéro de bloc. J'ai essayé sans grand succès:
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;
Qu'est-ce que Character.IsWhiteSpace? Je reçois une erreur d'identificateur non déclarée. Je ne connais pas le nombre de blocs sur chaque ligne, ça va par la largeur du TMemo. Je vais éditer la question pour inclure le code d'obtention du code hexadécimal. –
@Blobby: Ajoutez 'Character' à votre clause' uses'. –
+1 Je ne savais même pas d'une telle unité :) –