Memo - Cursorposition als Koordinaten für Komponente
Memo - Cursorposition als Koordinaten für Komponente
Hallo,
in einem simplen Memo möchte ich sowas wie ein Kontexmenü implementieren. Allerdings reicht mir vorerst die Anzeige eines Edits. Alles nicht die Frage. Sondern: Wie komme ich in einem Memo von der aktuellen Cursorposition auf eine Koordinate (Y), die ich als Edit1.Top setzen kann? Mit Memo1.CaretPos.Y kriege ich ja nur die aktuelle Zeilennummer. Mit SendMessage(EM_LINEFROMCHAR,....) kriege ich ebenfalls nur die aktuelle Zeilennummer. Der Versuch, über die Zeilennummer, die Größe des verwendeten Fonts (Font.Size) und dem Wert von Memo1.Top die nötige Position zu berechnen schläft ebenfalls fehl. Kennt ein Memo diese Koordinaten nicht?
Danke schon mal und Gruss
GU_Meyer
in einem simplen Memo möchte ich sowas wie ein Kontexmenü implementieren. Allerdings reicht mir vorerst die Anzeige eines Edits. Alles nicht die Frage. Sondern: Wie komme ich in einem Memo von der aktuellen Cursorposition auf eine Koordinate (Y), die ich als Edit1.Top setzen kann? Mit Memo1.CaretPos.Y kriege ich ja nur die aktuelle Zeilennummer. Mit SendMessage(EM_LINEFROMCHAR,....) kriege ich ebenfalls nur die aktuelle Zeilennummer. Der Versuch, über die Zeilennummer, die Größe des verwendeten Fonts (Font.Size) und dem Wert von Memo1.Top die nötige Position zu berechnen schläft ebenfalls fehl. Kennt ein Memo diese Koordinaten nicht?
Danke schon mal und Gruss
GU_Meyer
-
- Beiträge: 582
- Registriert: Sa 22. Okt 2016, 23:12
- OS, Lazarus, FPC: W10, L 3.8
- CPU-Target: 32+64bit
- Wohnort: Dresden
Re: Memo - Cursorposition als Koordinaten für Komponente
Entweder: Im Memo mit OnMouseDown bekommst du x+y Koordinaten
Oder: PopupMenu auf das Form Legen und Memo Popup zuweisen
Oder: PopupMenu auf das Form Legen und Memo Popup zuweisen
LG Maik
Windows 10,
- Lazarus 3.8 (stable) + fpc 3.2.2 (stable)
- Lazarus 4.99 (trunk) + fpc 3.3.1 (main/trunk)
Windows 10,
- Lazarus 3.8 (stable) + fpc 3.2.2 (stable)
- Lazarus 4.99 (trunk) + fpc 3.3.1 (main/trunk)
Re: Memo - Cursorposition als Koordinaten für Komponente
Windows only geht sowas hier:
Systemübergreifend würde ich ein Control nehmen, was ein Kontextmenü von Haus aus kann, z.B. TSynEdit etc.
Code: Alles auswählen
uses ..., messages, LCLType, LCLIntf;
...
procedure TForm1.Memo1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
var
ClientAreaCoordinates: LongWord;
MemoTextHeight: LongWord;
CaretPoint: TPoint;
R: TRect;
DC: HDC;
OldFont: HGDIOBJ;
Flags: LongWord;
begin
DC := GetDC(Memo1.Handle);
try
R := Rect(0, 0, 10000, 10000);
OldFont := SelectObject(DC, HGDIOBJ(Memo1.Font.Reference.Handle));
Flags := DT_CALCRECT or DT_EXPANDTABS or DT_SINGLELINE or DT_NOPREFIX;
DrawText(DC, PChar('Ag'), 2, R, Flags);
SelectObject(DC, OldFont);
MemoTextHeight := R.Bottom - R.Top;
finally
ReleaseDC(Memo1.Handle, DC);
end;
ClientAreaCoordinates := SendMessage(Memo1.Handle, EM_POSFROMCHAR, Memo1.SelStart, 0);
CaretPoint.x := LoWord(ClientAreaCoordinates);
CaretPoint.y := HiWord(ClientAreaCoordinates);
CaretPoint := ScreenToClient(Memo1.ClientToScreen(CaretPoint));
Edit1.Left := CaretPoint.x;
Edit1.Top := CaretPoint.y + MemoTextHeight;
end;
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
-
- Beiträge: 582
- Registriert: Sa 22. Okt 2016, 23:12
- OS, Lazarus, FPC: W10, L 3.8
- CPU-Target: 32+64bit
- Wohnort: Dresden
Re: Memo - Cursorposition als Koordinaten für Komponente
TMemo hat doch ein Kontextmenü????
LG Maik
Windows 10,
- Lazarus 3.8 (stable) + fpc 3.2.2 (stable)
- Lazarus 4.99 (trunk) + fpc 3.3.1 (main/trunk)
Windows 10,
- Lazarus 3.8 (stable) + fpc 3.2.2 (stable)
- Lazarus 4.99 (trunk) + fpc 3.3.1 (main/trunk)
Re: Memo - Cursorposition als Koordinaten für Komponente
Wäre eine Möglichkeit. Gefällt mir allerdings nicht so gut.sstvmaster hat geschrieben:Entweder: Im Memo mit OnMouseDown bekommst du x+y Koordinaten
Gefällt mir schon besser, Ist aber auch noch nicht ganz das, was ich will.sstvmaster hat geschrieben:Oder: PopupMenu auf das Form Legen und Memo Popup zuweisen
Trotzdem Danke
Gruss
GU_Meyer
Re: Memo - Cursorposition als Koordinaten für Komponente
Oh, das muss ich mir genauer angucken. Aber nciht mehr heute Abend (Grund dafür siehe meine Antwort an sstvmasterMichl hat geschrieben:Windows only geht sowas hier:Systemübergreifend würde ich ein Control nehmen, was ein Kontextmenü von Haus aus kann, z.B. TSynEdit etc.Code: Alles auswählen
uses ..., messages, LCLType, LCLIntf; ... procedure TForm1.Memo1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); var ClientAreaCoordinates: LongWord; MemoTextHeight: LongWord; CaretPoint: TPoint; R: TRect; DC: HDC; OldFont: HGDIOBJ; Flags: LongWord; begin DC := GetDC(Memo1.Handle); try R := Rect(0, 0, 10000, 10000); OldFont := SelectObject(DC, HGDIOBJ(Memo1.Font.Reference.Handle)); Flags := DT_CALCRECT or DT_EXPANDTABS or DT_SINGLELINE or DT_NOPREFIX; DrawText(DC, PChar('Ag'), 2, R, Flags); SelectObject(DC, OldFont); MemoTextHeight := R.Bottom - R.Top; finally ReleaseDC(Memo1.Handle, DC); end; ClientAreaCoordinates := SendMessage(Memo1.Handle, EM_POSFROMCHAR, Memo1.SelStart, 0); CaretPoint.x := LoWord(ClientAreaCoordinates); CaretPoint.y := HiWord(ClientAreaCoordinates); CaretPoint := ScreenToClient(Memo1.ClientToScreen(CaretPoint)); Edit1.Left := CaretPoint.x; Edit1.Top := CaretPoint.y + MemoTextHeight; end;
Dankeschön
Gruss
GU_Meyer
Re: Memo - Cursorposition als Koordinaten für Komponente
Das ist richtig. Das würde ich sogar nehmen. Aber so richtig gefällt mir das auch nicht. Jetzt hatte ich gerade (Vielleicht kennt ja jemand den "Moment, ich bring nur schnell das Baby ins Bett, schnarch ihm kurz was vor, damit es richtig fest schläft....*zwei-Stunden-später*...wieder wach"-Effekt?) die Idee, dass ich nicht ganz nur ein Kontextmenü suche, sondern eine Mischung aus Kontextmenü und Intellisense. Das Kontextmenü von TMemo ist schon mal gut, ich möchte es aber direkt an die Zeile, die bearbeitet wird, "ketten".sstvmaster hat geschrieben:TMemo hat doch ein Kontextmenü????
Gruss
GU_Meyer