AGB  ·  Datenschutz  ·  Impressum  







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

Linien zeichnen in TRichEdit mit TShape ??

Ein Thema von runningsoft · begonnen am 27. Jan 2010 · letzter Beitrag vom 27. Jan 2010
Antwort Antwort
Benutzerbild von runningsoft
runningsoft

Registriert seit: 8. Okt 2004
Ort: Bernau
108 Beiträge
 
Delphi 10.4 Sydney
 
#1

Linien zeichnen in TRichEdit mit TShape ??

  Alt 27. Jan 2010, 00:02
Hallo,

wenn ich auf einem TRichEdit die gesetzten Ränder mit so einer schicken grauen Linie anzeigen möchte, wie im Layoutmodus von Word, so werden mir diese mit folgendem Code zwar wunderbar angezeigt:

Delphi-Quellcode:
procedure TForm11.SetBorders(var R: TRect);
var LeftLine, TopLine, RightLine, BottomLine : TShape;
begin
//Textränder als graue Linie anzeigen
LeftLine := Tshape.Create(RichEdit1);
with LeftLine do
   begin
   Parent := RichEdit1;
   Shape := stRectangle;
   Width := 1;
   Pen.Color := $E6E6E6;
   Top := R.Top - 15;
   Height := R.Bottom - R.Top + 30;
   Left := R.Left - 1;
   end;
TopLine := TShape.Create(RichEdit1);
with TopLine do
   begin
   Parent := RichEdit1;
   Shape := stRectangle;
   Height := 1;
   Width := R.Right - R.Left + 30;
   Pen.Color := $E6E6E6;
   Top := R.Top - 1;
   Left := R.Left - 15;
   end;
RightLine := TShape.Create(RichEdit1);
with RightLine do
   begin
   Parent := RichEdit1;
   Shape := stRectangle;
   Width := 1;
   Pen.Color := $E6E6E6;
   Top := R.Top - 15;
   Height := R.Bottom - R.Top + 30;
   Left := R.Right - 1;
   end;
BottomLine := TShape.Create(RichEdit1);
with BottomLine do
   begin
   Parent := RichEdit1;
   Shape := stRectangle;
   Height := 1;
   Width := R.Right - R.Left + 30;
   Pen.Color := $E6E6E6;
   Top := R.Bottom + 1;
   Left := R.Left - 15;
   end;
end;
aber anschließend sehe ich im RichEdit keine Buchstaben mehr. Der Cursor ist sichtbar und kann auch bewegt werden, aber es erscheinen keine Buchstaben.

Ich hab auch schon versucht, anschließend noch einmal die Fontfarbe des Richedits zu setzen - ohne Erfolg.

Aufgerufen wird die Prozedur im OnShow-Ereignis des TRichEdit.

Leider hat ja TRichedit keinen Canvas auf dem man rummalen kann, oder gibt es dafür doch eine Lösung?

Für Hinweise wäre ich dankbar.

Steffen
Steffen
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#2

Re: Linien zeichnen in TRichEdit mit TShape ??

  Alt 27. Jan 2010, 00:24
Ein TShape, was seines Zeichens ja Nachfahre von TGraphicControl ist, hat keinen eigenen Canvas, sondern zeichnet sich auf den seines Parents. Dies tut es, in dem es sich den DeviceContext des Parents abholt. Was und wie dabei was schief läuft ist schwer zu beurteilen.
Mir fielen zwei mögliche Lösungen ein:
1) Eine eigene Shape- (bzw. Line-) Klasse, die von TWinControl abgeleitet ist, und daher über einen eignen Canvas verfügt.
2) Selbst den DC des RichEdits holen, und ein wenig native GDI betreiben.

Bei Variante 1 ergibt sich evtl. das Problem, dass die Linien immer alles im RichEdit verdecken, also potentiell Buchstaben durchkreuzen. Bei Variante 2 könnte man prüfen, ob man grad wirklich auf einen Pixel in der Hintergrundfarbe zeichnet. Dafür dürfte zweiteres "unschöner" zu implementieren sein, und man müsste genauer wissen was TShape macht, dass das RichEdit selbst nicht mehr klar kommt, und dieses vermeiden. Ich zumindest empfinde native GDI als nicht besonders handlich
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von runningsoft
runningsoft

Registriert seit: 8. Okt 2004
Ort: Bernau
108 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: Linien zeichnen in TRichEdit mit TShape ??

  Alt 27. Jan 2010, 09:55
Ich hab das jetzt vom Ansatz her etwas anders gelöst, keine Ahnung, ob es besonders elegant ist, aber es funktioniert offensichtlich.

Das RichEdit habe ich in einer ScrollBox platziert. Und in dieser Scrollbox erzeuge ich zur Laufzeit als visuelle Begrenzungslinien für die im Richedit gesetzten Ränder vier Panele von entweder 1 px Breite (senkrechte Linien) oder 1 px Höhe (waagerechte Linien).

Die Panele werden über das Richedit gezeichnet und beeinflussen das RichEdit überhaupt nicht, so dass der Text wieder ganz normal sichtbar ist.

Das ganze hatte ich vorher mit TBevel bzw. TShape in der Scrollbox versucht, was aber beides nicht funktioniert hat, da sowohl Bevel als auch Shape hinter dem Richedit gezeichnet wurden, während das Panel vor dem RichEdit erscheint.

Hier noch der Code:

Delphi-Quellcode:
procedure TForm11.PaintBorders(var R : TRect);
var bLine : TPanel;
    I : integer;
begin
//Textränder als graue Linie jeweils 1 Pixel außerhalb der gesetzten Ränder anzeigen
for I := 1 to 4 do
   begin
   bLine := TPanel.Create(ScrollBox1);
   with bLine do
      begin
      Parent := ScrollBox1;
      Name := 'bLine' + IntTostr(I);
      Caption := '';
      Ctl3D := False;
      Color := $e0e0e0;
      BevelInner := bvNone;
      BevelOuter := bvNone;
      if I < 3 then
         begin
         //waagerechte Linien
         Height := 1;
         Width := R.Right - R.Left + 30;
         Left := RichEdit1.Left + R.Left - 15;
         end
      else
         begin
         //senkrechte Linien
         Width := 1;
         Top := RichEdit1.Top + R.Top - 15;
         Height := R.Bottom - R.Top + 30;
         end;
      case I of
         1: Top := RichEdit1.Top + R.Top - 1;
         2: Top := RichEdit1.Top + R.Bottom + 1;
         3: Left := RichEdit1.Left + R.Left - 1;
         4: Left := RichEdit1.Left + R.Right + 1;
         end;
      end;
   end;
end;
Steffen
Steffen
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#4

Re: Linien zeichnen in TRichEdit mit TShape ??

  Alt 27. Jan 2010, 11:51
Zitat von runningsoft:
Das ganze hatte ich vorher mit TBevel bzw. TShape in der Scrollbox versucht, was aber beides nicht funktioniert hat, da sowohl Bevel als auch Shape hinter dem Richedit gezeichnet wurden, während das Panel vor dem RichEdit erscheint.
Das liegt genau an der angesprochenen Klassenhierachie. TBevel und TShape sind TGraphicControls und zeichnen immer auf den Parent-Canvas, sämtliche auch auf dem Parent befindlichen Nachfahren von TWinControl überzeichnen diese. So auch das RichEdit. Ein TPanel ist im Gegensatz zu den anderen selbst ein TWinControl (also ein echt eigenes Fenster mit Handle und so), und kann daher auch andere TWinControls überdecken. Das ist im Grunde mein Vorschlag 1, nur dass du ein TPanel statt einer eigenen kleinen Linien-Kompo nimmst - geht natürlich genau so gut, auch wenn's evtl. auf den ersten Blick seltsam erscheint .
Die ScrollBox dürftest du dir sogar sparen können. Die ist nicht viel anders als ein Formular, d.h. du kannst die Panels gleich auch auf dem Formular erzeugen. Wenn es um die Vereinfachung der Koordinaten geht, würde sich wiederum ein Panel als Container anbieten, wenn du aber tatsächlich auch scollen willst, ist die ScrollBox natürlich gold richtig .
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  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 04:13 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