AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Tutorials Delphi RichEdit
Tutorial durchsuchen
Ansicht
Themen-Optionen

RichEdit

Ein Tutorial von Nils_13 · begonnen am 25. Dez 2004 · letzter Beitrag vom 25. Dez 2004
Antwort Antwort
Nils_13
Registriert seit: 15. Nov 2004
Hi,
ich wünsche ihnen viel Spaß beim Lesen und programmieren

1. Anmerkungen

Da es mein erstes Tutorial ist bitte ich um Nachsicht und würde mich über Kritik fruen.
In diesem Tutorial geht es nur darum, einen Texteditor zu programmieren, Word oder OpenOffice zu programmieren, wäre ein großer Schritt von diesem Tutorial entfernt.
Dieses Tutorial wurde mit dem Tutorial-Editor entwickelt.
Das Tutorial verwendet Komponenten von Delphi5 Professional.
Es gibt am Ende des Tutorials einen Anhang.

2. Grundsatz

Ind eisem Tutorial wird die Toolbar verwendet, wer nicht weiß wie man damit umgeht, sollte sich erst mal ein anderes Tutorial über die Toolbar durchlesen.

3. Die Programmierung

Es werden folgende Komponenten verwendet:
1. MainMenu
2. ToolBar
3. RichEdit
4. StatusBar
5. ComboBox
6. SpinEdit
7. Open, SaveDialog

Um ein Neues Dokument zu erstellen verwenden sie einfach ein MainMenuItem:

RichEdit.clear; Öffnen:

Delphi-Quellcode:
if op1.Execute then
   RichEdit.Lines.LoadFromFile(op1.filename);
Nun zum Speichern:
Ich finde 2 MenuItems umständlich ("speichern", "speichern unter ..."), man könnte es doch in einem lösen!
Delphi-Quellcode:
// FileExsists: exestiert die Datei schon?
if FileExists(save.filename) then
edit.lines.savetofile(save.Filename)
else begin
if (save.Execute) then
  edit.Lines.SaveToFile(save.filename);
end;
Um den Drucken-Dialog aufzurufen verwenden sie einfach:
Delphi-Quellcode:
  try
    if print.Execute then
    begin
      RichEdit.Text := Text; // Die Vereinbarung ist wirklich nötig sonst kann Delphi keinen Dialog aufrufen
      RichEdit.Print ('Text');
    end;
  except
    ShowMessage ('Kein Drucker verfügbar!');
  end;
Eine Undo-Funktion (Rückgängig) wäre auch ganz praktisch, da sich der Benutzer ja auch vertippen könnte:
Delphi-Quellcode:
 with RichEdit do
    if HandleAllocated then SendMessage(Handle, EM_UNDO, 0, 0);
Jetzt kommen ziemlich einfache Teile, daher fasse ich alles zusammen:

Ausschneiden (Strg + X)
RichEdit.CutToClipboard; Kopieren (Strg + C)
RichEdit.CopyToClipboard; Einfügen (Strg + V)
RichEdit.PasteFromClipboard; Um die Toolbar auch noch zu programmieren, nehmen sie bei den OnClick Befehle einfach die Befehle aus dem MainMenu.

In die Toolbar sollten sie Zusätzlich dem MainMenu noch folgendes einfügen:
1. FontName (ComboBox)
2. FontSize (ComboBox)
3. UpDown (SpinEdit)

Um alle voorhandenen Schriftarten in FontName aufzulisten verwenden sie einfach
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
FontName.Items:= Screen.Fonts;
end;
Fügen sie nun die Funktion CurrText ein:
Delphi-Quellcode:
// Ist für die Bold, Italic, Underline, FontName, FontSize-Funktion wichtig
function TForm1.CurrText: TTextAttributes;
begin
  if RichEdit.SelLength > 0 then Result := RichEdit.SelAttributes
  else Result := RichEdit.DefAttributes;
end;
Damit man auch die angegebenen Schriftarten verwenden kann öffnen sie einfach die OnChange (FontName):
Delphi-Quellcode:
// FUpdating ist eine Private Variable in Boolean
procedure TForm1.FontNameChange(Sender: TObject);
begin
  if FUpdating then Exit;
  CurrText.Name := FontName.Items[FontName.ItemIndex];
end;
Dasselbe gilt für die größe:
Delphi-Quellcode:
if FUpdating then Exit;
CurrText.Size := StrToInt(FontSize.Text);
Bold, Italic, Underline habe ich schonmal erwähnt.
Delphi-Quellcode:
// Bold, Italic, Underline
procedure TForm1.BoldButtonClick(Sender: TObject);
begin
  if FUpdating then Exit;
  if BoldButton.Down then
    CurrText.Style := CurrText.Style + [fsBold]
  else
    CurrText.Style := CurrText.Style - [fsBold];
end;

procedure TForm1.ItalicButtonClick(Sender: TObject);
begin
  if FUpdating then Exit;
  if ItalicButton.Down then
    CurrText.Style := CurrText.Style + [fsItalic]
  else
    CurrText.Style := CurrText.Style - [fsItalic];
end;

procedure TForm1.UnderlineButtonClick(Sender: TObject);
begin
  if FUpdating then Exit;
  if UnderlineButton.Down then
    CurrText.Style := CurrText.Style + [fsUnderline]
  else
    CurrText.Style := CurrText.Style - [fsUnderline];
end;
Die Punkteaufzählung ist einigen Leuten wichtig!
Delphi-Quellcode:
procedure TForm1.ToolButton18Click(Sender: TObject);
begin
  if FUpdating then Exit;
  edit.Paragraph.Numbering := TNumberingStyle(ToolButton18.Down);
end;
Jetzt kommt ein wichtiger Teil: die Paragraphfunktion von RichEdit!
Delphi-Quellcode:
// SelectionChange, leftalign, rightalign, centeralign
procedure TForm1.editSelectionChange(Sender: TObject);
begin
case edit.Paragraph.Alignment of
taLeftJustify: begin Toolbutton14.Down:=true; Toolbutton15.Down:=false; Toolbutton16.Down:=false; end;
taCenter: begin Toolbutton15.Down:=true; Toolbutton14.Down:=false; Toolbutton16.Down:=false; end;
taRightJustify: begin Toolbutton16.Down:=true; Toolbutton14.Down:=false; Toolbutton15.Down:=false; end;
end;
end;

procedure TForm1.ToolButton14Click(Sender: TObject);
begin
ToolButton15.Down:= false;
ToolButton16.Down:= false;
edit.Paragraph.Alignment:=taLeftJustify;
end;

procedure TForm1.ToolButton15Click(Sender: TObject);
begin
ToolButton14.Down:= false;
ToolButton16.Down:= false;
edit.Paragraph.Alignment:=taCenter;
end;

procedure TForm1.ToolButton16Click(Sender: TObject);
begin
ToolButton14.Down:= false;
ToolButton15.Down:= false;
edit.Paragraph.Alignment:=taRightJustify;
end;
Jetzt fehlt noch der letzte Schliff!
Wie finden sie die Farbauswahl?

Um die Farbauswahl zu programmieren benötigen sie eine weitere ComboBox!
1. Color = ComboBox für die farbauswahl
2. In die ComboBox müssen sie die in GetColor vorkommenden Farben eintippen.
Delphi-Quellcode:
function TForm1.GetColor(idx: Integer): TColor;
begin
    case idx of
      0 : result := clBlack;
      1 : result := clMaroon;
      2 : result := clGreen;
      3 : result := clOlive;
      4 : result := clNavy;
      5 : result := clPurple;
      6 : result := clGray;
      7 : result := clSilver;
      8 : result := clRed;
      9 : result := clLime;
      10 : result := clYellow;
      11 : result := clFuchsia;
      12 : result := clAqua;
      13 : result := clWhite;
      14 : result := clScrollBar;
      15 : result := clBackground;
    end;
end;

procedure TForm1.ColorChange(Sender: TObject);
begin
CurrText.Color := getcolor(Color.ItemIndex);
end;
Nun nochmal der ganze Quellcode (die Komponenten haben hier einen anderen Namen):
Delphi-Quellcode:
unit sys;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Menus, ComCtrls, ToolWin, ImgList, StdCtrls;

type
  TForm1 = class(TForm)
    MainMenu1: TMainMenu;
    Datei1: TMenuItem;
    NeuesDokument1: TMenuItem;
    Dokumentffnen1: TMenuItem;
    Speichern1: TMenuItem;
    N1: TMenuItem;
    Drucken1: TMenuItem;
    N2: TMenuItem;
    Beenden1: TMenuItem;
    ImageList1: TImageList;
    ToolBar1: TToolBar;
    ToolButton1: TToolButton;
    ToolButton2: TToolButton;
    ToolButton3: TToolButton;
    ToolButton4: TToolButton;
    ToolButton5: TToolButton;
    ToolButton6: TToolButton;
    ToolButton7: TToolButton;
    ToolButton8: TToolButton;
    ToolButton9: TToolButton;
    ToolButton10: TToolButton;
    edit: TRichEdit;
    StatusBar: TStatusBar;
    op1: TOpenDialog;
    save: TSaveDialog;
    print: TPrintDialog;
    font: TFontDialog;
    Bearbeiten1: TMenuItem;
    Rckgngig1: TMenuItem;
    N3: TMenuItem;
    Ausschneiden1: TMenuItem;
    Kopieren1: TMenuItem;
    Einfgen1: TMenuItem;
    FontName: TComboBox;
    BoldButton: TToolButton;
    UnderlineButton: TToolButton;
    ItalicButton: TToolButton;
    FontSize: TEdit;
    UpDown1: TUpDown;
    ToolButton11: TToolButton;
    ToolButton12: TToolButton;
    ToolButton13: TToolButton;
    ToolButton18: TToolButton;
    ToolButton19: TToolButton;
    Colors: TColorDialog;
    Color: TComboBox;
    ToolButton14: TToolButton;
    ToolButton15: TToolButton;
    ToolButton16: TToolButton;
    function GetColor(idx: Integer): TColor;
    procedure speichern;
    procedure Beenden1Click(Sender: TObject);
    procedure NeuesDokument1Click(Sender: TObject);
    procedure ToolButton1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure ToolButton2MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure ToolButton3MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure ToolButton4MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure ToolButton6MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure ToolButton7MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure ToolButton8MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure ToolButton9MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure Dokumentffnen1Click(Sender: TObject);
    procedure Speichernunter1Click(Sender: TObject);
    procedure Speichern1Click(Sender: TObject);
    procedure Drucken1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Rckgngig1Click(Sender: TObject);
    procedure Ausschneiden1Click(Sender: TObject);
    procedure Kopieren1Click(Sender: TObject);
    procedure Einfgen1Click(Sender: TObject);
    procedure BoldButtonClick(Sender: TObject);
    procedure ItalicButtonClick(Sender: TObject);
    procedure UnderlineButtonClick(Sender: TObject);
    procedure FontNameChange(Sender: TObject);
    procedure ToolButton18Click(Sender: TObject);
    procedure FontSizeChange(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure ColorChange(Sender: TObject);
    procedure AlignButtonClick(Sender: TObject);
    procedure editSelectionChange(Sender: TObject);
    procedure ToolButton14Click(Sender: TObject);
    procedure ToolButton15Click(Sender: TObject);
    procedure ToolButton16Click(Sender: TObject);
  private
    { Private-Deklarationen }
    FUpdating: Boolean;
    function CurrText: TTextAttributes;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  col: TColor;

implementation

{$R *.DFM}

function TForm1.GetColor(idx: Integer): TColor;
begin
    case idx of
      0 : result := clBlack;
      1 : result := clMaroon;
      2 : result := clGreen;
      3 : result := clOlive;
      4 : result := clNavy;
      5 : result := clPurple;
      6 : result := clGray;
      7 : result := clSilver;
      8 : result := clRed;
      9 : result := clLime;
      10 : result := clYellow;
      11 : result := clFuchsia;
      12 : result := clAqua;
      13 : result := clWhite;
      14 : result := clScrollBar;
      15 : result := clBackground;
    end;
end;


function TForm1.CurrText: TTextAttributes;
begin
  if edit.SelLength > 0 then Result := edit.SelAttributes
  else Result := edit.DefAttributes;
end;

procedure TForm1.Beenden1Click(Sender: TObject);
begin
form1.Close;
end;

procedure TForm1.speichern;
begin
if FileExists(save.filename) then
edit.lines.savetofile(save.Filename)
else begin
if (save.Execute) then
  edit.Lines.SaveToFile(save.filename);
end;
end;

procedure TForm1.NeuesDokument1Click(Sender: TObject);
begin
edit.clear;
end;

procedure TForm1.ToolButton1MouseMove(Sender: TObject; Shift: TShiftState;
  X, Y: Integer);
begin
StatusBar.Panels[0].Text:= 'Neues Dokument erstellen';
end;

procedure TForm1.ToolButton2MouseMove(Sender: TObject; Shift: TShiftState;
  X, Y: Integer);
begin
StatusBar.Panels[0].Text:= 'Dokument öffnen';
end;

procedure TForm1.ToolButton3MouseMove(Sender: TObject; Shift: TShiftState;
  X, Y: Integer);
begin
StatusBar.Panels[0].Text:= 'Neues Dokument speichern';
end;

procedure TForm1.ToolButton4MouseMove(Sender: TObject; Shift: TShiftState;
  X, Y: Integer);
begin
StatusBar.Panels[0].Text:= 'Dokument drucken';
end;

procedure TForm1.ToolButton6MouseMove(Sender: TObject; Shift: TShiftState;
  X, Y: Integer);
begin
StatusBar.Panels[0].Text:= 'Ausschneiden';
end;

procedure TForm1.ToolButton7MouseMove(Sender: TObject; Shift: TShiftState;
  X, Y: Integer);
begin
StatusBar.Panels[0].Text:= 'Kopieren';
end;

procedure TForm1.ToolButton8MouseMove(Sender: TObject; Shift: TShiftState;
  X, Y: Integer);
begin
StatusBar.Panels[0].Text:= 'Einfügen';
end;

procedure TForm1.ToolButton9MouseMove(Sender: TObject; Shift: TShiftState;
  X, Y: Integer);
begin
StatusBar.Panels[0].Text:= 'Rückgängig';
end;

procedure TForm1.Dokumentffnen1Click(Sender: TObject);
begin
if op1.Execute then
   Edit.Lines.LoadFromFile(op1.filename);
end;

procedure TForm1.Speichernunter1Click(Sender: TObject);
begin
if save.Execute then
   edit.Lines.SaveToFile(save.filename);
end;

procedure TForm1.Speichern1Click(Sender: TObject);
begin
speichern;
end;

procedure TForm1.Drucken1Click(Sender: TObject);
begin
  try
    if print.Execute then
    begin
      edit.Text := Text;
      edit.Print ('Text');
    end;
  except
    ShowMessage ('Kein Drucker verfügbar!');
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
FontName.Items:= Screen.Fonts;
FontName.Text:= 'Arial';
end;

procedure TForm1.Rckgngig1Click(Sender: TObject);
begin
 with edit do
    if HandleAllocated then SendMessage(Handle, EM_UNDO, 0, 0);
end;

procedure TForm1.Ausschneiden1Click(Sender: TObject);
begin
edit.CutToClipboard;
end;

procedure TForm1.Kopieren1Click(Sender: TObject);
begin
edit.CopyToClipboard;
end;

procedure TForm1.Einfgen1Click(Sender: TObject);
begin
edit.PasteFromClipboard;
end;

procedure TForm1.BoldButtonClick(Sender: TObject);
begin
  if FUpdating then Exit;
  if BoldButton.Down then
    CurrText.Style := CurrText.Style + [fsBold]
  else
    CurrText.Style := CurrText.Style - [fsBold];
end;

procedure TForm1.ItalicButtonClick(Sender: TObject);
begin
  if FUpdating then Exit;
  if ItalicButton.Down then
    CurrText.Style := CurrText.Style + [fsItalic]
  else
    CurrText.Style := CurrText.Style - [fsItalic];
end;

procedure TForm1.UnderlineButtonClick(Sender: TObject);
begin
  if FUpdating then Exit;
  if UnderlineButton.Down then
    CurrText.Style := CurrText.Style + [fsUnderline]
  else
    CurrText.Style := CurrText.Style - [fsUnderline];
end;

procedure TForm1.FontNameChange(Sender: TObject);
begin
  if FUpdating then Exit;
  CurrText.Name := FontName.Items[FontName.ItemIndex];
end;

procedure TForm1.ToolButton18Click(Sender: TObject);
begin
  if FUpdating then Exit;
  edit.Paragraph.Numbering := TNumberingStyle(ToolButton18.Down);
end;

procedure TForm1.FontSizeChange(Sender: TObject);
begin
  if FUpdating then Exit;
  CurrText.Size := StrToInt(FontSize.Text);
end;

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
case MessageDlg('Änderungen speichern?',mtConfirmation, mbYesNoCancel, 0) OF
  mrYes : speichern;
  mrNo : CanClose := true;
end;
end;

procedure TForm1.ColorChange(Sender: TObject);
begin
CurrText.Color := getcolor(Color.ItemIndex);
end;

procedure TForm1.AlignButtonClick(Sender: TObject);
begin
  if FUpdating then Exit;
  edit.Paragraph.Alignment := TAlignment(TControl(Sender).Tag);
end;

procedure TForm1.editSelectionChange(Sender: TObject);
begin
case edit.Paragraph.Alignment of
taLeftJustify: begin Toolbutton14.Down:=true; Toolbutton15.Down:=false; Toolbutton16.Down:=false; end;
taCenter: begin Toolbutton15.Down:=true; Toolbutton14.Down:=false; Toolbutton16.Down:=false; end;
taRightJustify: begin Toolbutton16.Down:=true; Toolbutton14.Down:=false; Toolbutton15.Down:=false; end;
end;
end;

procedure TForm1.ToolButton14Click(Sender: TObject);
begin
ToolButton15.Down:= false;
ToolButton16.Down:= false;
edit.Paragraph.Alignment:=taLeftJustify;
end;

procedure TForm1.ToolButton15Click(Sender: TObject);
begin
ToolButton14.Down:= false;
ToolButton16.Down:= false;
edit.Paragraph.Alignment:=taCenter;
end;

procedure TForm1.ToolButton16Click(Sender: TObject);
begin
ToolButton14.Down:= false;
ToolButton15.Down:= false;
edit.Paragraph.Alignment:=taRightJustify;
end;

end.
Das ist ein kleiner fertiger Texteditor.

Noch der Anhang (Ich bin einfach mal großzügig und zipe alle Bilder etc.):
Angehängte Dateien
Dateityp: zip editor_106.zip (262,6 KB, 373x aufgerufen)
 
Benutzerbild von fkerber
fkerber

 
Delphi XE Professional
 
#2
  Alt 25. Dez 2004, 15:36
Hi!

Vorweg:
Warum noch ein Tutorial zu dem Thema?
http://www.delphipraxis.net/internal...ct.php?t=22890

(Ich weiß, das ist von mir. Es soll jetzt hier aber keine Werbung sein, sondern ich frage mich nur, warum es 2 Tutorials zu diesem einen Thema geben soll)


Inhaltlich:
Mich überkam manchmal das Prinzip der "Copy&Paste-Anstachelung"
Ich finde es fehlen an einigen Stellen erkläredene Worte.


Ciao Frederic
Frederic Kerber
  Mit Zitat antworten Zitat
Nils_13
 
#3
  Alt 25. Dez 2004, 15:53
wusst ich nicht, danke für die Kritik, bei Gelegenheit werd ichs verbessern.
  Mit Zitat antworten Zitat
Benutzerbild von Meflin
Meflin
 
#4
  Alt 25. Dez 2004, 15:58
Zitat von Nils_13:
Nun zum Speichern:
Ich finde 2 MenuItems umständlich ("speichern", "speichern unter ..."), man könnte es doch in einem lösen!
Delphi-Quellcode:
// FileExsists: exestiert die Datei schon?
if FileExists(save.filename) then
edit.lines.savetofile(save.Filename)
else begin
if (save.Execute) then
  edit.Lines.SaveToFile(save.filename);
end;
das ist erlichgesagt... zimelich blöd! stell dir einfach mal vor, ich habe eine datei abgespeichert. ich will sie aber nun nochmal unter einem anderen namen abspeichern! das wäre mit diesem teil schlichtweg unmöglich... was glaubst du warum jeder editor da zwischen speichern und speichern unter unterscheidet...
Leo S.
  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 17:38 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