Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi RichEdit Texteinzug (https://www.delphipraxis.net/154955-richedit-texteinzug.html)

Dunkelbunt27 2. Okt 2010 22:08

RichEdit Texteinzug
 
Hallo liebe Delphi Praxis,
ich arbeite an einem kleinen Textbearbeitungsprogramm und habe ein paar wichtige Fragen.
Ich hoffe irgendjemand weiß eine Antwort.
(Bitte antwortet verständlich und möglichst mit Quelltextschnipseln ;)

1) Texteinzug setzen
um bei einem 'Dokument' nicht links am Rand anzufangen habe ich folgenden Quelltext:
Delphi-Quellcode:
with Editor do begin
    Paragraph.FirstIndent := i;

    Paragraph.Tab[0] := 150;
    Paragraph.Tab[1] := 250;
    Paragraph.Tab[2] := 320;
    Paragraph.Tab[3] := 450;
    Paragraph.Tab[4] := 550;
  end;
end;
Hierbei ist Editor mein RichEdit1.
Das ganze funktioniert in sofern, dass ich nach 150pxls Platz anfange zu schreiben, was auch so sein soll.
Ich habe es in die RicheEdit OnClick geschoben, da mir nichts besseres eingefallen ist. Wo wär es besser aufgehoben?

Wie kann ich festlegen, dass ich erst nach 2 Zeilen Platz für z.B. Ein Kopfzeile anfange zu schreiben?
(Und wie kann man eine Kopfzeile definieren um darin zu schreiben?)

2) Wenn ich die Tab-Taste im gestarteten Programm drücke soll der Texteinzug weiterspringen, wie man das gewöhnt ist, also um die 4 Leerzeichen Platz gelassen werden.
Da die Tab Taste jedoch eine Steuerfunktion hat, schaltet sie statt einen Tab zu machen zwischen den Komponeten der Unit durch.
Wie kann ich das umgehen, bzw. Die Taste zwingen in der RichEdit zu bleiben und nich andere Buttons anzusteuern?

Ich freue mich auf die Antworten,
Liebe Grüße Dunkelbunt

Dunkelbunt27 2. Okt 2010 22:34

AW: RichEdit Texteinzug
 
Nicht push ;)

Bernerbaer 2. Okt 2010 22:41

AW: RichEdit Texteinzug
 
Mit dem pushen innerhalb eines Tages machst du dich hier nicht besonders beliebt!

Zeilen einfügen am Begin: richedit1.lines.insert(0,'');

tab: property wanttabs auf true setzen

Kopf- und Fusszeile: RIchedit unterstützt in Delphi keine Kopf- und Fusszeilen, also entweder selber malen oder auf ein externes Control ausweichen.

Sir Rufo 2. Okt 2010 22:45

AW: RichEdit Texteinzug
 
Zitat:

Zitat von Dunkelbunt27 (Beitrag 1053420)
*Push*

nach 26 Minuten schon pushen ... was rauchst du denn gerade ... stell mal auf auf was ruhigeres um

Dunkelbunt27 2. Okt 2010 23:04

AW: RichEdit Texteinzug
 
'Tschuldigung! :oops:

Danke für die Antwort, das mit Wanttabs ist klasse.
Jetz nochmal die Frage, wo ist die gesamte Texteinzugsprozedur am besten aufgehoben?
OnClick ist eher unpassend...

Edit1:
Ich habe bei der RichEdit folgende Property entdeckt:
Border Width. Wenn man den Wert auf etwa 50 festlegt ist der Abstand des Textes zum Rand größer.
Dadurch hat man etwa den selben effekt...
Nachteil ist das der Platz, also die Border (Grenze) unbeschreibbar ist.

Bernerbaer 2. Okt 2010 23:18

AW: RichEdit Texteinzug
 
Wo du die Texteinzugsprozedur einfügst hängt von deiner Anwendung ab.

Es gibt verschiedene Möglichkeiten:
- im Formcreate
- in einem Menü oder Button, wenn es der Benutzer zur Laufzeit festlegen soll

Zu dem Rand:

Nein, das ist nicht der gleiche Effekt! Ein Einzug gilt für einen Paragraph, und kann somit für unterschiedliche Absätze unterschiedlich gesetzt werden. Wenn also ein Blatt mit einem fixen Rand gesetzt werden soll verwende ich jeweils folgende Prozedur:
Delphi-Quellcode:
procedure TForm1.SetMargin(RE: TRichEdit; L,R,T,B : Integer);
// Linken, Rechten, Oberen und Unteren Rand setzen
var Rect :TRect;
begin
  SendMessage(RE.Handle,EM_GETRECT,0,LongInt(@Rect));
  Rect.Left  := Rect.Left + L;
  Rect.Right := Rect.Right - R;
  Rect.Top   := Rect.Top + T;
  Rect.Bottom := Rect.Bottom - B;
  SendMessage(RE.Handle,EM_SETRECT,0,LongInt(@Rect));
end;

Dunkelbunt27 2. Okt 2010 23:29

AW: RichEdit Texteinzug
 
Delphi erkennt die SetMargin nicht.
Muss ich irgendetwas bestimmtes einbinden oder beachten?

Bernerbaer 2. Okt 2010 23:45

AW: RichEdit Texteinzug
 
Zitat:

Zitat von Dunkelbunt27 (Beitrag 1053426)
Delphi erkennt die SetMargin nicht.
Muss ich irgendetwas bestimmtes einbinden oder beachten?

füge unter private den Prozedurkopf ein, damit Delphi die Prozedur kennt:
Delphi-Quellcode:
type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
    // hier einfügen
    procedure SetMargin(RE: TRichEdit; L,R,T,B : Integer);
die Prozedur fügst du dann irgendwo nach implementation ein

Delphi-Quellcode:
implementation

{$R *.dfm}

procedure TForm1.SetMargin(RE: TRichEdit; L,R,T,B : Integer);
// Linken, Rechten, Oberen und Unteren Rand setzen
var Rect :TRect;
begin
  SendMessage(RE.Handle,EM_GETRECT,0,LongInt(@Rect));
  Rect.Left := Rect.Left + L;
  Rect.Right := Rect.Right - R;
  Rect.Top := Rect.Top + T;
  Rect.Bottom := Rect.Bottom - B;
  SendMessage(RE.Handle,EM_SETRECT,0,LongInt(@Rect));
end;
und die Prozedur rufst du dann im Formcreate auf:
Delphi-Quellcode:
setMargin(richedit1,30,50,100,20);

Dunkelbunt27 3. Okt 2010 09:39

AW: RichEdit Texteinzug
 
Danke für die Erklärung! :dp:
Ist eine große Hilfe.

Ich melde mich im Edit wieder. =)

Edit1:

Hier tut sich mir eine weiter Frage auf:
1) Wie stell ich es an, dass bei Programmstart der Cursor (also das Pipe Zeichen) direkt auf der ersten möglichen Zeile des RichEdit landet, und nicht meine Combobox für die Schriftart markiert ist?
2) Gibt es eine möglichkeit für folgendes:
man markiert Text hält die Maus drüber und an der Stelle des Curor (Mouse.CursorPos(X,Y)) öffnet sich ein Menü mit Buttons.
Es soll keine neue Form sein und möglichst erst nach 1sec draufhalten erscheinen.
(Zusätzlich wäre es noch toll wenn das Menü eingeblendet wird und sich dann wieder ausblendet)

Ich hoffe jemand kann die Frage beantworten.

Vielen Dank,
Dunkelbunt

Chillkröte 4. Okt 2010 15:25

AW: RichEdit Texteinzug
 
zu 1) SetCursorPos
ich glaub das ist es was du möchtest...

zu 2) keine ahnung ob das möglich ist, glaube aber nicht

an deiner stelle würde ich einfach nochmal neu posten anstatt dies im edit zu machen
so bekommt man das wenigstens mit, wenn du was neues fragst


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:36 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz