Memo - Cursorposition als Koordinaten für Komponente

Rund um die LCL und andere Komponenten

Memo - Cursorposition als Koordinaten für Komponente

Beitragvon GU_Meyer » 20. Feb 2019, 16:49 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
GU_Meyer
 
Beiträge: 56
Registriert: 21. Apr 2014, 09:22

Beitragvon sstvmaster » 20. Feb 2019, 18:38 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
OS: Windows 7 32/64bit
Lazarus 2.0.0, 32bit
Lazarus 2.1.0 Trunk 3.3.1, 32bit
sstvmaster
 
Beiträge: 147
Registriert: 22. Okt 2016, 22:12
OS, Lazarus, FPC: Lazarus 2.0 + 2.1.0 Trunk 3.3.1 / Win32, Windows 7 32+64bit | 
CPU-Target: 32Bit
Nach oben

Beitragvon Michl » 20. Feb 2019, 21:24 Re: Memo - Cursorposition als Koordinaten für Komponente

Windows only geht sowas hier:
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;

Systemübergreifend würde ich ein Control nehmen, was ein Kontextmenü von Haus aus kann, z.B. TSynEdit etc.
Code: Alles auswählen
type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 
Michl
 
Beiträge: 2320
Registriert: 19. Jun 2012, 11:54
OS, Lazarus, FPC: Win7 Laz 1.7 Trunk FPC 3.1.1 Trunk | 
CPU-Target: 32Bit/64bit
Nach oben

Beitragvon sstvmaster » 20. Feb 2019, 22:56 Re: Memo - Cursorposition als Koordinaten für Komponente

TMemo hat doch ein Kontextmenü????
OS: Windows 7 32/64bit
Lazarus 2.0.0, 32bit
Lazarus 2.1.0 Trunk 3.3.1, 32bit
sstvmaster
 
Beiträge: 147
Registriert: 22. Okt 2016, 22:12
OS, Lazarus, FPC: Lazarus 2.0 + 2.1.0 Trunk 3.3.1 / Win32, Windows 7 32+64bit | 
CPU-Target: 32Bit
Nach oben

Beitragvon GU_Meyer » 20. Feb 2019, 23:56 Re: Memo - Cursorposition als Koordinaten für Komponente

sstvmaster hat geschrieben:Entweder: Im Memo mit OnMouseDown bekommst du x+y Koordinaten

Wäre eine Möglichkeit. Gefällt mir allerdings nicht so gut.

sstvmaster hat geschrieben:Oder: PopupMenu auf das Form Legen und Memo Popup zuweisen

Gefällt mir schon besser, Ist aber auch noch nicht ganz das, was ich will.

Trotzdem Danke
Gruss
GU_Meyer
GU_Meyer
 
Beiträge: 56
Registriert: 21. Apr 2014, 09:22

Beitragvon GU_Meyer » 20. Feb 2019, 23:59 Re: Memo - Cursorposition als Koordinaten für Komponente

Michl hat geschrieben:Windows only geht sowas hier:
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;

Systemübergreifend würde ich ein Control nehmen, was ein Kontextmenü von Haus aus kann, z.B. TSynEdit etc.


Oh, das muss ich mir genauer angucken. Aber nciht mehr heute Abend (Grund dafür siehe meine Antwort an sstvmaster
Dankeschön
Gruss
GU_Meyer
GU_Meyer
 
Beiträge: 56
Registriert: 21. Apr 2014, 09:22

Beitragvon GU_Meyer » 21. Feb 2019, 00:03 Re: Memo - Cursorposition als Koordinaten für Komponente

sstvmaster hat geschrieben:TMemo hat doch ein Kontextmenü????

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".

Gruss
GU_Meyer
GU_Meyer
 
Beiträge: 56
Registriert: 21. Apr 2014, 09:22

• Themenende •

Zurück zu Komponenten und Packages



Wer ist online?

Mitglieder in diesem Forum: Google [Bot] und 2 Gäste

cron
porpoises-institution
accuracy-worried