Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi RichEdit Formatierung: (https://www.delphipraxis.net/98301-richedit-formatierung.html)

Störtebeker 24. Aug 2007 16:01


RichEdit Formatierung:
 
Hallo,

Ich weiß, dass es schon Threads in ähnlicher Richtung gibt und daher tut es mir erstmal leid, dass ich jetzt nochmal ein Thread dafür verschwenden muss. :oops: Nur haben sich diese Threads entweder auf einen Button oder auf das formatieren vorbestimmer Wärter gerichtet.

Aber folgendes:

Ich habe eine Combox, wo ich über:

Delphi-Quellcode:
begin
  RichEdit1.Font.Name:='Arial';
  ComboBox1.Items:= Screen.Fonts;
end;
im OnCreate Ereignis der Form die Schriften in die Combobox lade. Mit dem Ergebnis, dass sich mit

Delphi-Quellcode:
begin
RichEdit1.Font.Name:=ComboBox1.Items[ComboBox1.ItemIndex];
end;
im OnChange Ereignis der Combobox der gesamte Text ändert. Nun wollte ich es aber so, dass nur das formatiert wird, was auch makiert ist. Sei es ein einzelnes Zeichen oder ein ganzes Wort.

In der Delphi-Hilfe (die ich auch zu Rate gezogen habe), stand was von

Delphi-Quellcode:
property SelAttributes: TTextAttributes;
den OnChange Code habe ich dann wie folgt geändert:

Delphi-Quellcode:
var SelAttributes: TTextAttributes;
begin
RichEdit1.Font.Name:=ComboBox1.Items[ComboBox1.ItemIndex];
end;
So und da stockt es leider bei mir. Ich glaube ich muss irgendwas mit If machen. Die Frage ist nur, was.
Wie realisierbar?

Thx.

P.S.: Bitte nicht rummeckern, es gäbe schon viele Threads, die sich mit der Formatierung beschäftigen.

shmia 24. Aug 2007 16:27

Re: RichEdit Formatierung:
 
Schau dir doch mal das Borland Demo unter
C:\Programme\Borland\Delphi 5\Demos\RichEdit an!! (Wenn du Delphi 7 hast, ist der Pfad anderst; logisch)
Das Projekt RichEdit.dpr ist ein kompletter Editor für RichText.
Am Besten du kupferst einfach alles ab.

Störtebeker 24. Aug 2007 17:43

Re: RichEdit Formatierung:
 
Danke für den Tipp.

Wie und wo ist aber CurrText deklariert?

Delphi-Quellcode:
  if FUpdating then Exit;
  CurrText.Size := StrToInt(FontSize.Text);
Das Editfeld, für die Schriftgröße (zusammen mit einer Up/Down Komponente.

"CurrText" wird mir als undeklarierter bezeichner angegeben. Und was ist FUpdating??

Wenn ich die function von CurrText einfüge, kommt Delphi mit: "function needs result"

Delphi-Quellcode:
  function TForm1.CurrText: TTextAttributes;
begin
  if edit.SelLength > 0 then Result := edit.SelAttributes
  else Result := edit.DefAttributes;
end;
Der folgende Code ist von der RichEdit Demo von Delphi6:

Delphi-Quellcode:
unit remain;

interface

uses
{...}

type
  {...}
    procedure SelectionChange(Sender: TObject);
    {...}
  private
    FFileName: string;
    FUpdating: Boolean;
    FDragOfs: Integer;
    FDragging: Boolean;
    function CurrText: TTextAttributes;
    procedure GetFontNames;
    procedure SetFileName(const FileName: String);
    procedure CheckFileSave;
    procedure SetupRuler;
    procedure SetEditRect;
    procedure UpdateCursorPos;
    procedure WMDropFiles(var Msg: TWMDropFiles); message WM_DROPFILES;
    procedure PerformFileOpen(const AFileName: string);
    procedure SetModified(Value: Boolean);
  end;

var
  MainForm: TMainForm;

implementation

uses REAbout, RichEdit, ShellAPI, ReInit;

resourcestring
  sSaveChanges = 'Save changes to %s?';
  sOverWrite = 'OK to overwrite %s';
  sUntitled = 'Untitled';
  sModified = 'Modified';
  sColRowInfo = 'Line: %3d  Col: %3d';

const
  RulerAdj = 4/3;
  GutterWid = 6;

  ENGLISH = (SUBLANG_ENGLISH_US shl 10) or LANG_ENGLISH;
  FRENCH = (SUBLANG_FRENCH shl 10) or LANG_FRENCH;
  GERMAN = (SUBLANG_GERMAN shl 10) or LANG_GERMAN;

{$R *.dfm}

procedure TMainForm.SelectionChange(Sender: TObject);
begin
  with Editor.Paragraph do
  try
    FUpdating := True;
    FirstInd.Left := Trunc(FirstIndent*RulerAdj)-4+GutterWid;
    LeftInd.Left := Trunc((LeftIndent+FirstIndent)*RulerAdj)-4+GutterWid;
    RightInd.Left := Ruler.ClientWidth-6-Trunc((RightIndent+GutterWid)*RulerAdj);
    BoldButton.Down := fsBold in Editor.SelAttributes.Style;
    ItalicButton.Down := fsItalic in Editor.SelAttributes.Style;
    UnderlineButton.Down := fsUnderline in Editor.SelAttributes.Style;
    BulletsButton.Down := Boolean(Numbering);
    FontSize.Text := IntToStr(Editor.SelAttributes.Size);
    FontName.Text := Editor.SelAttributes.Name;
    case Ord(Alignment) of
      0: LeftAlign.Down := True;
      1: RightAlign.Down := True;
      2: CenterAlign.Down := True;
    end;
    UpdateCursorPos;
  finally
    FUpdating := False;
  end;
end;

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

function EnumFontsProc(var LogFont: TLogFont; var TextMetric: TTextMetric;
  FontType: Integer; Data: Pointer): Integer; stdcall;
begin
  TStrings(Data).Add(LogFont.lfFaceName);
  Result := 1;
end;

procedure TMainForm.GetFontNames;
var
  DC: HDC;
begin
  DC := GetDC(0);
  EnumFonts(DC, nil, @EnumFontsProc, Pointer(FontName.Items));
  ReleaseDC(0, DC);
  FontName.Sorted := True;
end;

procedure TMainForm.SetFileName(const FileName: String);
begin
  FFileName := FileName;
  Caption := Format('%s - %s', [ExtractFileName(FileName), Application.Title]);
end;

procedure TMainForm.CheckFileSave;
var
  SaveResp: Integer;
begin
  if not Editor.Modified then Exit;
  SaveResp := MessageDlg(Format(sSaveChanges, [FFileName]),
    mtConfirmation, mbYesNoCancel, 0);
  case SaveResp of
    idYes: FileSave(Self);
    idNo: {Nothing};
    idCancel: Abort;
  end;
end;

procedure TMainForm.SetupRuler;
var
  I: Integer;
  S: String;
begin
  SetLength(S, 201);
  I := 1;
  while I < 200 do
  begin
    S[I] := #9;
    S[I+1] := '|';
    Inc(I, 2);
  end;
  Ruler.Caption := S;
end;

procedure TMainForm.SetEditRect;
var
  R: TRect;
begin
  with Editor do
  begin
    R := Rect(GutterWid, 0, ClientWidth-GutterWid, ClientHeight);
    SendMessage(Handle, EM_SETRECT, 0, Longint(@R));
  end;
end;

{ Event Handlers }

procedure TMainForm.FormCreate(Sender: TObject);
begin
  Application.OnHint := ShowHint;
  OpenDialog.InitialDir := ExtractFilePath(ParamStr(0));
  SaveDialog.InitialDir := OpenDialog.InitialDir;
  SetFileName(sUntitled);
  GetFontNames;
  SetupRuler;
  SelectionChange(Self);

  CurrText.Name := DefFontData.Name;
  CurrText.Size := -MulDiv(DefFontData.Height, 72, Screen.PixelsPerInch);

  LanguageEnglish.Tag := ENGLISH;
  LanguageFrench.Tag := FRENCH;
  LanguageGerman.Tag := GERMAN;
  case SysLocale.DefaultLCID of
    ENGLISH: SwitchLanguage(LanguageEnglish);
    FRENCH: SwitchLanguage(LanguageFrench);
    GERMAN: SwitchLanguage(LanguageGerman);
  end;
end;

procedure TMainForm.ShowHint(Sender: TObject);
begin
  if Length(Application.Hint) > 0 then
  begin
    StatusBar.SimplePanel := True;
    StatusBar.SimpleText := Application.Hint;
  end
  else StatusBar.SimplePanel := False;
end;

procedure TMainForm.FileNew(Sender: TObject);
begin
  SetFileName(sUntitled);
  Editor.Lines.Clear;
  Editor.Modified := False;
  SetModified(False);
end;

procedure TMainForm.PerformFileOpen(const AFileName: string);
begin
  Editor.Lines.LoadFromFile(AFileName);
  SetFileName(AFileName);
  Editor.SetFocus;
  Editor.Modified := False;
  SetModified(False);
end;

procedure TMainForm.FileOpen(Sender: TObject);
begin
  CheckFileSave;
  if OpenDialog.Execute then
  begin
    PerformFileOpen(OpenDialog.FileName);
    Editor.ReadOnly := ofReadOnly in OpenDialog.Options;
  end;
end;

procedure TMainForm.FileSave(Sender: TObject);
begin
  if FFileName = sUntitled then
    FileSaveAs(Sender)
  else
  begin
    Editor.Lines.SaveToFile(FFileName);
    Editor.Modified := False;
    SetModified(False);
  end;
end;

procedure TMainForm.FileSaveAs(Sender: TObject);
begin
  if SaveDialog.Execute then
  begin
    if FileExists(SaveDialog.FileName) then
      if MessageDlg(Format(sOverWrite, [SaveDialog.FileName]),
        mtConfirmation, mbYesNoCancel, 0) <> idYes then Exit;
    Editor.Lines.SaveToFile(SaveDialog.FileName);
    SetFileName(SaveDialog.FileName);
    Editor.Modified := False;
    SetModified(False);
  end;
end;

procedure TMainForm.FilePrint(Sender: TObject);
begin
  if PrintDialog.Execute then
    Editor.Print(FFileName);
end;

procedure TMainForm.FileExit(Sender: TObject);
begin
  Close;
end;

procedure TMainForm.EditUndo(Sender: TObject);
begin
  with Editor do
    if HandleAllocated then SendMessage(Handle, EM_UNDO, 0, 0);
end;

procedure TMainForm.EditCut(Sender: TObject);
begin
  Editor.CutToClipboard;
end;

procedure TMainForm.EditCopy(Sender: TObject);
begin
  Editor.CopyToClipboard;
end;

procedure TMainForm.EditPaste(Sender: TObject);
begin
  Editor.PasteFromClipboard;
end;

procedure TMainForm.HelpAbout(Sender: TObject);
begin
  with TAboutBox.Create(Self) do
  try
    ShowModal;
  finally
    Free;
  end;
end;

procedure TMainForm.SelectFont(Sender: TObject);
begin
  FontDialog1.Font.Assign(Editor.SelAttributes);
  if FontDialog1.Execute then
    CurrText.Assign(FontDialog1.Font);
  SelectionChange(Self);
  Editor.SetFocus;
end;

procedure TMainForm.RulerResize(Sender: TObject);
begin
  RulerLine.Width := Ruler.ClientWidth - (RulerLine.Left*2);
end;

procedure TMainForm.FormResize(Sender: TObject);
begin
  SetEditRect;
  SelectionChange(Sender);
end;

procedure TMainForm.FormPaint(Sender: TObject);
begin
  SetEditRect;
end;

procedure TMainForm.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 TMainForm.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 TMainForm.FontSizeChange(Sender: TObject);
begin
  if FUpdating then Exit;
  CurrText.Size := StrToInt(FontSize.Text);
end;

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

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

procedure TMainForm.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 TMainForm.BulletsButtonClick(Sender: TObject);
begin
  if FUpdating then Exit;
  Editor.Paragraph.Numbering := TNumberingStyle(BulletsButton.Down);
end;

procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  try
    CheckFileSave;
  except
    CanClose := False;
  end;
end;

{ Ruler Indent Dragging }

procedure TMainForm.RulerItemMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  FDragOfs := (TLabel(Sender).Width div 2);
  TLabel(Sender).Left := TLabel(Sender).Left+X-FDragOfs;
  FDragging := True;
end;

procedure TMainForm.RulerItemMouseMove(Sender: TObject; Shift: TShiftState;
  X, Y: Integer);
begin
  if FDragging then
    TLabel(Sender).Left := TLabel(Sender).Left+X-FDragOfs
end;

procedure TMainForm.FirstIndMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  FDragging := False;
  Editor.Paragraph.FirstIndent := Trunc((FirstInd.Left+FDragOfs-GutterWid) / RulerAdj);
  LeftIndMouseUp(Sender, Button, Shift, X, Y);
end;

procedure TMainForm.LeftIndMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  FDragging := False;
  Editor.Paragraph.LeftIndent := Trunc((LeftInd.Left+FDragOfs-GutterWid) / RulerAdj)-Editor.Paragraph.FirstIndent;
  SelectionChange(Sender);
end;

procedure TMainForm.RightIndMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  FDragging := False;
  Editor.Paragraph.RightIndent := Trunc((Ruler.ClientWidth-RightInd.Left+FDragOfs-2) / RulerAdj)-2*GutterWid;
  SelectionChange(Sender);
end;

procedure TMainForm.UpdateCursorPos;
var
  CharPos: TPoint;
begin
  CharPos.Y := SendMessage(Editor.Handle, EM_EXLINEFROMCHAR, 0,
    Editor.SelStart);
  CharPos.X := (Editor.SelStart -
    SendMessage(Editor.Handle, EM_LINEINDEX, CharPos.Y, 0));
  Inc(CharPos.Y);
  Inc(CharPos.X);
  StatusBar.Panels[0].Text := Format(sColRowInfo, [CharPos.Y, CharPos.X]);
end;

procedure TMainForm.FormShow(Sender: TObject);
begin
  UpdateCursorPos;
  DragAcceptFiles(Handle, True);
  RichEditChange(nil);
  Editor.SetFocus;
  { Check if we should load a file from the command line }
  if (ParamCount > 0) and FileExists(ParamStr(1)) then
    PerformFileOpen(ParamStr(1));
end;

procedure TMainForm.WMDropFiles(var Msg: TWMDropFiles);
var
  CFileName: array[0..MAX_PATH] of Char;
begin
  try
    if DragQueryFile(Msg.Drop, 0, CFileName, MAX_PATH) > 0 then
    begin
      CheckFileSave;
      PerformFileOpen(CFileName);
      Msg.Result := 0;
    end;
  finally
    DragFinish(Msg.Drop);
  end;
end;

procedure TMainForm.RichEditChange(Sender: TObject);
begin
  SetModified(Editor.Modified);
end;

procedure TMainForm.SetModified(Value: Boolean);
begin
  if Value then StatusBar.Panels[1].Text := sModified
  else StatusBar.Panels[1].Text := '';
end;

procedure TMainForm.SwitchLanguage(Sender: TObject);
var
  Name : String;
  Size : Integer;
begin
  if LoadNewResourceModule(TComponent(Sender).Tag) <> 0 then
  begin
    Name := FontName.Text;
    Size := StrToInt(FontSize.Text);
    ReinitializeForms;
    LanguageEnglish.Checked := LanguageEnglish = Sender;
    LanguageFrench.Checked := LanguageFrench = Sender;
    LanguageGerman.Checked := LanguageGerman = Sender;

    CurrText.Name := Name;
    CurrText.Size := Size;
    SelectionChange(Self);
    FontName.SelLength := 0;

    SetupRuler;
    if Visible then Editor.SetFocus;
  end;
end;

procedure TMainForm.ActionList2Update(Action: TBasicAction;
  var Handled: Boolean);
begin
 { Update the status of the edit commands }
  EditCutCmd.Enabled := Editor.SelLength > 0;
  EditCopyCmd.Enabled := EditCutCmd.Enabled;
  if Editor.HandleAllocated then
  begin
    EditUndoCmd.Enabled := Editor.Perform(EM_CANUNDO, 0, 0) <> 0;
    EditPasteCmd.Enabled := Editor.Perform(EM_CANPASTE, 0, 0) <> 0;
  end;
end;

procedure TMainForm.UpDown1Click(Sender: TObject; Button: TUDBtnType);
begin

end;

end.

Helmi 24. Aug 2007 18:05

Re: RichEdit Formatierung:
 
Hallo,

die Formatierung eines markierten Bereiches kannst du so ändern:

Delphi-Quellcode:
begin
  with RichEdit1 do
    begin
      If SelLength > 0 then //prüfen ob was markiert wurde
        SelAttributes.Name := ComboBox1.Items[ComboBox1.ItemIndex]; //ausgewählte Font der Markierung zuweisen
    end;

Störtebeker 24. Aug 2007 18:12

Re: RichEdit Formatierung:
 
Danke. Das mit der Schriftart funzt jetzt. :thumb:

Fehlt aber noch die Schriftgröße.
Hast du da auch ne Idee?

Helmi 24. Aug 2007 18:19

Re: RichEdit Formatierung:
 
schon mal geschaut was SelAttributes alles kann?

Delphi-Quellcode:
SelAttributes.Name := 'Arial'; //Schriftart
SelAttributes.Size := 14;     //Größe
SelAttributes.Color := clRed;  //Farbe

Störtebeker 24. Aug 2007 18:31

Re: RichEdit Formatierung:
 
Das ist mir schon klar.

Aber:

Delphi-Quellcode:
begin
  with RichEdit1 do
    begin
      If SelLength > 0 then //prüfen ob was markiert wurde
        SelAttributes.size := ComboBox2.Items[ComboBox2.ItemIndex];
end;
funzt nicht.

Der Code, um die Fonts in die Combobox zu bekommen:

Delphi-Quellcode:
begin
  RichEdit1.Font.Name:='Arial';
  ComboBox1.Items:= Screen.Fonts;
end;
für die Größe?? :oops:

Sorry. :oops:

Helmi 24. Aug 2007 18:35

Re: RichEdit Formatierung:
 
von welcher ComboBox reden wir jetzt?
ComboBox1 oder ComboBox2?

Weisst du eigentlich was bei
Delphi-Quellcode:
ComboBox2.Items[ComboBox2.ItemIndex];
rauskommt? - Ein String nämlich!!

Wenn du aber folgendes machst:
Delphi-Quellcode:
begin
  with RichEdit1 do
    begin
      If SelLength > 0 then //prüfen ob was markiert wurde
        SelAttributes.size := ComboBox2.Items[ComboBox2.ItemIndex];
end;
weisst du der Property "size", die einen Integer erwartet, einen String zu.
Dass das nicht gehen kann ist dir hoffentlich klar.

Was willst du eigentlich tun?

Störtebeker 24. Aug 2007 18:45

Re: RichEdit Formatierung:
 
Mein Projekt, an dem ich gerade arbeite, enthält neben vielen Funktionen unter anderem auch ein Textverabeitungsprogramm.

Auf einer Toolbar, habe ich die ganzen Toolbarbutton (neu, kopieren, öffnen, etc.) und eben zwei Comboboxen für die Schriftart(die ja Dank DEINER Hilfe :thumb: jetzt funzt(Combobox1) und halt eine Combobox2 (schriftgröße), an der es noch hapert. Sowohl mit dem (Schriftgrößen in die Combobox kriegen), sowie mit dem ändern des makierten Textes in Bezug auf seine Größe.

Ich hoffe, ich konnte die mein "Vorhaben" etwas deutlicher machen.

Helmi 24. Aug 2007 18:52

Re: RichEdit Formatierung:
 
also ich denke nicht, dass die Schriftgrößen im System hinterlegt sind.
Die musst du schon selbst in die ComboBox schreiben.

Abfragen kannst es so:
Delphi-Quellcode:
SelAttributes.size := StrToInt(ComboBox2.Items[ComboBox2.ItemIndex]);
Voraussetzung dafür ist, dass sich nur, ausschliesslich nur, Zahlen in den Items der ComboBox befinden!
Ansonsten bekommst ne Exception.

Die könnte mal auch abfangen, nämlich so:
Delphi-Quellcode:
SelAttributes.size := StrToIntDef(ComboBox2.Items[ComboBox2.ItemIndex], 10);
So hättest du, wenn keine Zahl in der ComboBox ist, eine definierte Größe von 10, ansonsten die Angewählte der ComboBox.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:48 Uhr.
Seite 1 von 2  1 2      

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