AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

RichEdit scrollen verhindern

Ein Thema von fsch · begonnen am 25. Apr 2015 · letzter Beitrag vom 1. Mai 2015
Antwort Antwort
fsch

Registriert seit: 30. Apr 2010
5 Beiträge
 
#1

RichEdit scrollen verhindern

  Alt 25. Apr 2015, 16:01
Hallo,

ich möchte in einem RichEdit (genauer: TJvDBRichEdit aus der JVCL-Bibliothek) verhindern, dass Text außerhalb des sichbaren Bereichs eingegeben werden kann. Es soll also verhindert werden, dass das Richedit horizontal und vertikal scrollt. Und man soll nicht über den linken und unteren Rand hinaus schreiben können.

Hintergrund ist der, dass der Text aus dem Feld in ein genau bemessenes Feld auf einem Etikett ausgedruckt werden soll. Und das trotzdem mit allen Formatierungsmöglichkeiten von RichText.

Hat jemand eine Idee, wie ich das erreichen kann?

Vielen Dank!
Frank
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.004 Beiträge
 
Delphi 2009 Professional
 
#2

AW: RichEdit scrollen verhindern

  Alt 25. Apr 2015, 16:43
Formatierungen wie "Fett" und Schriftgröße könnten vermutlich auch dazu führen dass ein zuvor noch "passender" Text über die Ränder des Druckbereichs ragt.
Gibt es eine Möglichkeit, nach jeder Änderung eine Berechnung der gesamten Textbreite und -Höhe zu ermitteln? Um die Überschreitung des Druckbereichs anzuzeigen, würde ich dann eine etwas größere Eingabefläche anzeigen und Begrenzungslinien einblenden die den maximal nutzbaren Bereich sichtbar machen. Andere visuelle Möglichkeiten wären das Einfärben des nicht nutzbaren Bereichs sobald der Text aus dem Rahmen gerät.
Michael Justin
habarisoft.com
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#3

AW: RichEdit scrollen verhindern

  Alt 25. Apr 2015, 18:23
Mal als Grundlage, musst noch etwas Arbeit für Feintuning reinstecken:
Delphi-Quellcode:
function GetCurLine(Memo: TCustomMemo): Longint;
begin
  with Memo do
    Result := SendMessage(Handle, EM_LINEFROMCHAR, SelStart, 0);
end;

function GetCurCol(Memo: TCustomMemo): Longint;
begin
  with Memo do
    Result := SelStart - SendMessage(Handle, EM_LINEINDEX, GetCurLine(Memo), 0);
end;

procedure TempCanvas(Font: TFont; Text: string; out TextWidth, TextHeight: Integer);
begin
  with TBitmap.Create do
  try
    Canvas.Font.Assign(Font);
    TextWidth := Canvas.TextWidth(Text);
    TextHeight := Canvas.TextHeight(Text);
  finally
    Free;
  end;
end;

procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: Char);
const
  MaxLen = 100;
  MaxHeight = 100;
var
  Memo: TMemo;
  LineIndex,
  LineCol,
  TextWidth,
  TextHeight: Integer;
  s: string;
begin
  Memo := Sender as TMemo;

  LineIndex := GetCurLine(Memo);
  LineCol := GetCurCol(Memo);

  s := Memo.Lines[LineIndex];
  TempCanvas(Memo.Font, s + Key, TextWidth, TextHeight);

  if TextWidth > MaxLen then
    if Ord(Key) >= 32 then
      Key := #0;

  Memo.Lines[LineIndex] := s;

  while (Memo.Lines.Count * TextHeight) > MaxHeight do
    Memo.Lines.Delete(Memo.Lines.Count - 1);
end;
  Mit Zitat antworten Zitat
fsch

Registriert seit: 30. Apr 2010
5 Beiträge
 
#4

AW: RichEdit scrollen verhindern

  Alt 26. Apr 2015, 09:45
@mjustin:
Die Idee mit dem etwas größeren Eingabefeld und der farbigen Markierung der Druckbereichsüberschreitung ist gut. Nur löst das nicht das grundsätzliche Problem, dass das RichTextEdit horizontal und vertikal scrollt. Das möchte ich auf jeden Fall verhindern.

@Popov:
Der Vorschlag funktioniert in einem TMemo, jedoch nicht in einem TRichEdit. Dort kann der Font ja innerhalb jeder Zeile mehrfach wechseln. Gibt es eine Funktion, die die Zeilenlänge eines RTF-Textes errechnet?

Vielen Dank!
Frank
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#5

AW: RichEdit scrollen verhindern

  Alt 26. Apr 2015, 12:29
Gibt es eine Funktion, die die Zeilenlänge eines RTF-Textes errechnet?
Nennt sich Programmieren.
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.338 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: RichEdit scrollen verhindern

  Alt 27. Apr 2015, 07:33
Ich würde es über CaretPos versuchen.
Zumindest gibt es das bei TRichEdit. Ich gehe davon aus, dass es das dann auch bei TJvRichEdit gibt.

Damit kannst du die aktuelle Eingabe-Position feststellen und (soweit ich mich erinnern kann) auch festlegen.

Was die Breite des Eingabe-Bereichs betrifft, habe ich in einer Anwendung mal die Größe des TRichEdit genauso groß gemacht, wie in dem zugehörigen Report. Dadurch könnte man den automatischen Word-Wrap für das Problem nutzen. Das wird aber etwas tückisch, wenn die Anwender mit unterschiedlichen Skalierungen arbeiten. In dem Fall musst du das TRichEdit ein wenig umrechnen. Die Scrollbars müssen bei der Größenberechnung ebenfalls berücksichtigt werden. Aber vielleicht kannst du es dir leicht machen und die Komponente einfach grundsätzlich etwas kleiner machen, als den nutzbaren Bereich des Etiketts.

Source kann ich leider nicht zur Verfügung stellen. Aber vielleicht hilft das ja als Ansatz für deine Umsetzung.
Peter
  Mit Zitat antworten Zitat
fsch

Registriert seit: 30. Apr 2010
5 Beiträge
 
#7

AW: RichEdit scrollen verhindern

  Alt 1. Mai 2015, 15:05
Ich habe das Problem jetzt so gelöst:

Das automatische Scrollen kann ich verhindern, indem ich in der Windows-Funktion EM_SETOPTIONS die Optionen ECO_AUTOVSCROLL und ECO_AUTOHSCROLL lösche. Dies mache ich im OnCreate der übergeordneten Fensters mittels SendMessage.

Weiterhin markiere ich im OnChange des RichEdit jede Zeile rot, die länger ist, als das RichEdit breit ist. Das ermittle ich über die Funtion GetCharPos() von TJvRichEdit (dies ist die gekapselte Windows-Funktion EM_POSFROMCHAR).

Und wenn zu viele Zeilen eingegeben wurden, wird der Hindergrund des kompletten RichEdits eingefärbt (ebenfalls über GetCharPos() plus die Zeilenhöhe der letzten Zeile).

Mal sehen, ob sich das in der Praxis so bewährt...

Nochmal vielen Dank für eure Hilfe.
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:14 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz