Avatar billede jes_petersen Nybegynder
21. august 2000 - 15:08 Der er 12 kommentarer og
2 løsninger

Funktion ved linieskift

Jeg har en funktion, der skal udføres, hver gang man skifter linie i et richedit-felt, dvs. ikke kun når man trykker enter, men også ved pil ned osv.
Avatar billede borrisholt Novice
21. august 2000 - 15:12 #1
Du skal lave et onKeyDownEvent Der i skal du teste på om der er trykket enter (key 13) eller pil ned (key 40 mener jeg) også er det bare at skrive det kode du vil have udført ...

Jens B
Avatar billede pellelil Nybegynder
21. august 2000 - 15:15 #2
Du kan vel altid kigge på hvilken tast der er blevet trykket på, men man kunne også lade en TTimer undersøge hvilken linie der er aktiv (jeg har ikke arbejdet meget med richedit, men mon ikke den kan oplyse dig dette). Hvis denne værdi skifter så er der skiftet line og dette vil således også virker hvis musen bruges.

Det kan således optimeres at timeren først sættes aktiv når din Richedit får focus og denne frigives når din richedit mister focus.
Avatar billede borrisholt Novice
21. august 2000 - 15:29 #3
Hmmmn.  Glem det sidste svar ...

Istedet laves en onKeyDownEvent og et OnKeyUpEvnt på din RichEdit og så skrives det følgende kode ...

var
  LastY : Integer;
procedure TForm1.RichEdit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  LastY := RichEdit1.CaretPos.y;
end;

procedure TForm1.RichEdit1KeyUp(Sender: TObject; var Key: Word;  Shift: TShiftState);
begin
  With RichEdit1.CaretPos do
    if y <> LastY then
      Caption := TimeToStr(Now);
end;

Jens B

Avatar billede borrisholt Novice
21. august 2000 - 15:30 #4
pellelil > Hvad har du lært om Busy waiting ?
Avatar billede borrisholt Novice
21. august 2000 - 15:33 #5
kan eventuelt udvides med et OnMuoseUp event:

procedure TForm1.RichEdit1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
    if RichEdit1.CaretPos.y <> LastY then
      Caption := TimeToStr(Now);
end;
Avatar billede pellelil Nybegynder
21. august 2000 - 15:33 #6
Hva siger du? Venter bussen?

Nej, desværre så har jeg en fritids interesse der går med at flyve virtuelle fly. I denne forbindelse har jeg bygget en skosk Lufthavn (Prestwick) og jeg fik lige en \"røvfuld billeder\" så min forlængede weekend gik med at bygge bygninger  :-)
Avatar billede borrisholt Novice
21. august 2000 - 15:37 #7
pellelil > det var din timer jeg angreb, jeg synes ikke det var en speciel elegant løsning, når nu det kan løses med events så mener jeg efter bedste overbevisning at det er den bedste løsning ....

Om (anta?)bussen venter på dig, det må du snakke med dem on :o)
Avatar billede pellelil Nybegynder
21. august 2000 - 15:40 #8
Vi kan kun være enig, men jeg kender ikke RichEdit så jeg ved ikke hvad du kan, og det kunne være man var interesseret i andet end bare keyboard !?
Avatar billede borrisholt Novice
21. august 2000 - 15:44 #9
Yeps .... Derfor ændere CaretPos sig aligevel, også selv om du bruger musen ... æ\' og ? Eller hva ?

Jens B
Avatar billede pellelil Nybegynder
21. august 2000 - 15:47 #10
Tjaee det ved du  :-)
Avatar billede borrisholt Novice
21. august 2000 - 15:51 #11
Samme trick kan iævrigt udføres i et memo felt ....


Jens B
Avatar billede jes_petersen Nybegynder
21. august 2000 - 16:27 #12
Lige to ting, jeg glemte at sige før: Min Delphi-version er kun 3.0, så jeg kan vist ikke bruge CaretPos. Og så skal jeg også bruge linienummeret på den linie, man er flyttet fra. Dvs. jeg skal referere og muligvis også ændre et bestemt linienummer. Hvordan gør jeg det?
Avatar billede sjensen Nybegynder
21. august 2000 - 17:48 #13
jes....

Du skal i øvrigt huske at afslutte dine spørgsmål. Vi er mange der har svaret og venter på at du accepterer/afviser svarene.

Jeg ved godt du er \"busy\" med at programmere i og lære om delphi, men husk lige at lukke ledene efter dig. På den måde vil du også få bedre hjælp i fremtiden.
Avatar billede borrisholt Novice
21. august 2000 - 18:20 #14
Jammen så mu du selv implementere en function der kan klare ærterne for dig. Fordelen ved den implemtering jeg vider her er at der i kan du også stoppe et memo felt ind i parameter listen, og få CaretPos som svar ....


Nå men prøv det her :

function GetCaretPos (Control : TCustomMemo) : TPoint;
begin
  Result.X := LongRec(SendMessage(Control.Handle, EM_GETSEL, 0, 0)).Hi;
  Result.Y := SendMessage(Control.Handle, EM_LINEFROMCHAR, Result.X, 0);
  Result.X := Result.X - SendMessage(Control.Handle, EM_LINEINDEX, -1, 0);
end;

var
  LastY : Integer;

procedure TForm1.RichEdit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  LastY := RichEdit1.CaretPos.y;
end;

procedure TForm1.RichEdit1KeyUp(Sender: TObject; var Key: Word;  Shift: TShiftState);
begin
  With GetCaretPos(RichEdit1) do
    if y <> LastY then
    begin
      Caption := Format(\'Linje nummer ændret fra %d til %d\', [LastY,y]);
      LastY := y;
    end;
end;

procedure TForm1.RichEdit1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
    if GetCaretPos(RichEdit1).y <> LastY then
    begin
      Caption := Format(\'Linje nummer ændret fra %d til %d\', [LastY,y]);
      LastY := y;
    end;
end;


Bemærk jeg har rettet en bug i de to events.
Jens B
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