{Permette il posizionamento ad una particolare riga di un TMemo}
procedure VaiAllaRigaMemo(WrkMemo:TMemo; Riga:Integer; VFSetFocus:Boolean = True);
var Posx, Idx, LenLineEnding:Integer;
begin
if (WrkMemo.Lines.Count > 0) then begin
LenLineEnding:=UTF8Length(LineEnding);
Posx:=0;
for Idx:=0 to Riga - 1 do begin
Posx:=Posx +
UTF8Length(WrkMemo.Lines[Idx]) +
LenLineEnding;
end;
WrkMemo.SelStart:=Posx;
end;
//Porto la memo in primo piano
if VFSetFocus then begin
WrkMemo.SetFocus
end;
end;
Ciao, Mario
ho trovato quello che mi serve nel wiki di freepascal solo che mi da un errore UTF8Length non dichiarato... come risolvo?
Search text
Contrary to the previous example, you can also looking for a text (String) in a TMemo and return the place where it is: Position:=Memo1.SelStart;
The following example shows how you can search and search further for a text in a memo:
Create a new application with a TEdit Edit1, a TMemo Memo1 and two TButton Button1 and Button2.
Complete the uses clause to LCLProc and strutils.
In the event handler OnClick of Button1 fill the memo with any text, as in the example Insert lines directly.
In the source text editor add following function (based on the example from the German Lazarusforum):
// FindInMemo: Returns the position where the string to search was found
function FindInMemo(AMemo: TMemo; AString: String; StartPos: Integer): Integer;
begin
Result := PosEx(AString, AMemo.Text, StartPos);
if Result > 0 then
begin
AMemo.SelStart := UTF8Length(PChar(AMemo.Text), Result - 1);
AMemo.SelLength := Length(AString);
AMemo.SetFocus;
end;
end;
Now, add following code in the event handler OnClick from Button2:
procedure TForm1.Button2Click(Sender: TObject);
const
SearchStr: String = ''; // The string to search for
SearchStart: Integer = 0; // Last position of the string to search for
begin
if SearchStr <> Edit1.Text then begin // Falls sich der zu suchende String geändert hat
SearchStart := 0;
SearchStr := Edit1.Text;
end;
SearchStart := FindInMemo(Memo1, SearchStr, SearchStart + 1);
if SearchStart > 0 then
Caption := 'Found at position['+IntToStr(SearchStart)+']!'
else
Caption := 'No further finds!';
end;
Rispondo a tutti e 2:
- per usare UTF8length, devi aggiungere "LazUTF8" alla uses
- Length e UTF8length danno risultati differenti con le stringhe che contengono caratteri accentati. Per come la vedo io, in base a cosa devi fare con la stringa, devi usare una o l'altra. nessuna delle 2 è deprecata.
Se vuoi un semplice esempio, crea un progetto nuovo e, nella FormCreate metti questo:
ShowMessage(IntToStr(Length('à')) +
LineEnding +
IntToStr(Utf8Length('à')));
Ciao, Mario
Sfrutta la posizione del cursore.function getLineaCorrente(const aMemo : TMemo): integer;
Begin
result := aMemo.CaretPos.X + 1;
End;
UNa cosa del genere (l'ho scritto a memoria :) )
Stilgar
unit testmemo.mainview;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls;
type
{ TForm1 }
TForm1 = class(TForm)
published
Button1: TButton;
edtSearch: TEdit;
Label1: TLabel;
Memo1: TMemo;
published
procedure Button2Click(Sender: TObject);
public
end;
var
Form1: TForm1;
implementation
uses
strutils, lazutf8;
function FindInMemo(AMemo: TMemo; AString: string; StartPos: integer): integer;
begin
Result := PosEx(AString, AMemo.Text, StartPos);
if Result > 0 then
begin
AMemo.SelStart := UTF8Length(PChar(AMemo.Text), Result - 1);
AMemo.SelLength := Length(AString);
AMemo.SetFocus;
end;
end;
//Now, add following code in the event handler OnClick from Button2:
procedure TForm1.Button2Click(Sender: TObject);
const
SearchStr: string = ''; // The string to search for
SearchStart: integer = 0; // Last position of the string to search for
begin
Label1.Caption := '';
if SearchStr <> edtSearch.Text then
begin // Falls sich der zu suchende String geändert hat
SearchStart := 0;
SearchStr := edtSearch.Text;
end;
SearchStart := FindInMemo(Memo1, SearchStr, SearchStart + 1);
if SearchStart > 0 then
begin
Caption := 'Found at position[' + IntToStr(SearchStart) + ']!';
Label1.Caption := Memo1.CaretPos.Y.ToString();
end
else
begin
Caption := 'No further finds!';
end;
end;
{$R *.lfm}
end.
Funziona?