Avatar billede sskova Nybegynder
04. maj 2000 - 20:11 Der 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.

Gode forslag modtages meget gerne.

På forhånd tak.

Søren Skov Andersen
Avatar billede dj Nybegynder
04. maj 2000 - 21:42 #1
hej

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

------------------------------------------------------



unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

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;

end.


-----------------------------------------------

Mvh. _DJ_ /#delphi Undernet
Avatar billede dj Nybegynder
04. maj 2000 - 21:43 #2
ehm.. ups, nu skrev jeg det var en funktion men det er faktisk en procedure :)
Avatar billede dj Nybegynder
04. maj 2000 - 21:53 #3
uhm.. du kan også godt fjerne variablen "cnt" fra listen

var
  I,l, cnt: integer;

Den bliver alligevel ikke brugt til noget :)

men så skulle der vist også være ryddet op efter mig :P
Avatar billede sjensen Nybegynder
04. maj 2000 - 22:31 #4
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;

Det burde kunne virke uden problemer.
Avatar billede dj Nybegynder
04. maj 2000 - 22:49 #5
Sjensen >> heh, du kommer da også altid med nogle underlige functioner der kan en masse smarte ting :)

Nu synes jeg ellers lige at min fine matematiske udregning var ret fix :)
Avatar billede dj Nybegynder
04. maj 2000 - 22:53 #6
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å?
Avatar billede sjensen Nybegynder
04. maj 2000 - 22:54 #7
ja, den er ikke dum din udregning. Jeg ville ikke blive forundret om det er nogenlunde på samme måde windows selv holder styr på det <:o)
Avatar billede sjensen Nybegynder
04. maj 2000 - 23:42 #8
dj,

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.Memo1Change(Sender: TObject);
begin
  label2.caption := inttostr(memo1.selstart - memo1.perform(EM_LINEINDEX, -1, 0));
  label1.caption := inttostr(memo1.Perform(EM_LINEFROMCHAR, -1, 0));
end;

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.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester