04. maj 2000 - 20:11Der er
6 kommentarer og 2 løsninger
Indsætte tekst i TMemo felt
Hej.
Jeg har for ca. 10 min siden tilmeldt mig eksperten.dk, og nu vil jeg gerne se, om det dur til noget... ;o)
Jeg vil gerne lave en funktion, som indsætter en tekststreng i et TMemo felt på det sted, hvor cursor'en tilfældigvis står. Tekststrengen er genereret af programmet og er altså ikke en del af f.eks. et TEdit felt, men indsættes vha. et tryk på en knap.
Jeg har lavet et en funktion der kan gøre det du ønsker, den eneste måde jeg kunne se det kunne lade sig gøre ved var ved at benytte Selstart der angiver hvor mange tegn nede i memo'en cursoren er placeret og så udregne hvor mange linier nede det er.
Jeg har samtidigt lavet det som en lille demonstrationsprogram sådan at du kan se hvordan det virker.
Det eneste eksempelprogrammet kræver er at du indsætter en Button og et memofelt og tildeler dem den kode er er angivet herunder
type TForm1 = class(TForm) Memo1: TMemo; Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } procedure instextatcursorpos(text: string); end;
var Form1: TForm1; tal: integer;
implementation
{$R *.DFM}
procedure Tform1.instextatcursorpos(text: string); var I,l, cnt: integer; begin L:=0; I:=length(memo1.lines[l])+1; while (I < memo1.selstart) and (I <> memo1.SelStart) do begin if l=memo1.lines.count-1 then begin inc(l); memo1.lines.insert(l,text); exit; end; inc(l); I:=I+length(memo1.lines[l])+2; end; memo1.lines.Insert(l,text); end;
procedure TForm1.Button1Click(Sender: TObject); begin inc(tal); //Dette er kun til at demonstrere at det virker instextatcursorpos(inttostr(tal)); //du kan istedet for kalde funktionen med den string som skal indsættes på linien hvor cursoren står. end;
I windows findes der nogle funktioner der kan fortælle dig nøjagtigt i hvilken linie og i hvilken kolonne i linien markøren er. De hedder hhv.:
function GetRow: Longint; { The EM_LINEFROMCHAR returns the line in which the character specified by wParam sits. If $FFFF is passed as wParam, the line number at which the caret sits is returned. } begin Result := Perform(EM_LINEFROMCHAR, $FFFF, 0); end;
og
function GetColumn: Longint; begin { The EM_LINEINDEX message returns the line index of a specified character passed in as wParam. When wParam is $FFFF then it retuns the index of the curent line. Subtracting SelStart from this value returns the column position } Result := SelStart - Perform(EM_LINEINDEX, $FFFF, 0); end;
Så hvis du bruger disse funktioner til hele tiden atholde styr på hvilken linie og kolonne markøren befinder sig, f.eks i variable y for linie og x for kolonne, burde du kunne bruge
insert(memo.lines[y],dintekst,memo.linies[y][x]);
Du skal selvfølgeligt bruge de 2 linier fra ovenstående i memoens OnChange event:
procedure Memo1onchange(sender : tobject); begin y := Result := Perform(EM_LINEFROMCHAR, $FFFF, 0); x := Result := SelStart - Perform(EM_LINEINDEX, $FFFF, 0); end;
Sjensen >> Desuden synes jeg egentlig ikke jeg kan få det du siger der til at virke ..
Kan du ikke lige prøve at lave et eksempel der er testet i delphi, for det ser da umiddelbart ud til at være noget der kan bruges i andre sammenhænge også?
Der var nogle mindre fejl (jeg har brugt D3 til dette men det bør virke i både 4 og 5 også).
her er et eks:
Lav en form, smid et memo på (navn memo1) og 2 labels (label1 og label2)
Sæt memoens OnChange og OnKeyDown til at indeholde nedenstående. Så vil du se label1 vise linienr og label2 vise kolonne, både når du ændrer teksten (opretter, skubber, sletter) og når du bare flytter rundt på markøren med pilene.
procedure TForm1.Memo1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin Memo1Change(Sender); end;
Og det virker fint nok hos mig, men bemærk at jeg har sat "Memo1." foran hhv. selstrat og perform og har udskiftet $FFFF med -1. Eller er det stort set som beskrevet tidligere.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.