Delphi-PRAXiS

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 Einfachen Richtexteditor erstellen (https://www.delphipraxis.net/68171-einfachen-richtexteditor-erstellen.html)

Janek76 25. Apr 2006 18:01


Einfachen Richtexteditor erstellen
 
Hallo,

eine kurze Frage habe ich: Ich möchte in einer kleinen Anwendung eine Möglichkeit schaffen, mit der der Benutzer eine Richtextvorlage für einen Briefkopf erstellen kann. Da stehen dann Feldbezeichnungen drin, die ich dann mit den Daten aus der Datenbank ersetze.

Es sollte also ein einfaches TRichedit sein, das im Prinzip die Möglichkeiten von WordPad hat, also Schriftart und -größe wählen, fett, kursiv, unterstrichen, Textausrichtung und Copy&Paste.

Gibt es dafür schon etwas fertiges, oder muß ich mir die Steuerelemente und Funktionen zur Textformatierung selber zusammenbauen. Am besten wäre TRichEdit mit einer entsprechenden Buttonleiste als Steuerelement, wenn es sowas gibt...

Ist es überhaupt mit einem Richedit möglich, daß der Benutzer einen Text markiert und dann für diese Auswahl per Button-Klick der Style z.B. auf fett geändert wird?

Ist es möglich, die rtf-Vorlage aus der rtf-Datei ohne den Umweg über ein TRichEdit direkt in den Zwischenspeicher zu schicken und dabei mit String-Replace Feldbezeichnungen durch die Daten zu ersetzen, ohne die Formatierung zu zerstören?

Die Muhkuh 25. Apr 2006 18:12

Re: Einfachen Richtexteditor erstellen
 
Hi,

du kannst mit dem TRichEdit verschiedene Textattribute setzen (siehe hierzu Delphi-Referenz durchsuchenSelAttributes). Damit könntest du auch ein kleines "WordPad" nachprogrammieren.

Etwas fertiges gibt es bestimmt, nur ist das nicht bei Delphi dabei. Vielleicht kannst du dich mal auf Torry.net umsehen, die haben bestimmt etwas. Ansonsten musst du das selbst machen, aber das ist kein großes Hexenwerk.

Zitat:

Ist es überhaupt mit einem Richedit möglich, daß der Benutzer einen Text markiert und dann für diese Auswahl per Button-Klick der Style z.B. auf fett geändert wird?
Na klar geht das ;)

Janek76 25. Apr 2006 18:24

Re: Einfachen Richtexteditor erstellen
 
OK. Danke für die Antwort. Dann werde ich es halt selber schreiben. Möglich scheint es mit RichEdit ja zu sein.

Zu meiner letzten Frage befürchte ich fast, daß ich die Vorlage aus der rtf-Datei erst in ein Richedit und dann erst in die Zwischenablage kopieren kann, oder? Die Texteigenschaft dürfte sich ohne Auswirkungen auf die Formatierungen wahrscheinlich leicht ändern lassen, während, wenn ich alles in einen String schicke, die Formatierung wohl kaputt wäre, oder?

Die Muhkuh 25. Apr 2006 18:27

Re: Einfachen Richtexteditor erstellen
 
Hmm, da ich sowas selbst noch nicht gebraucht bzw. versucht habe, müsstest du einfach testen, ob es funktioniert. Und ob du es ohne Umwege machen kannst, bin ich überfragt ;)

TBx 25. Apr 2006 18:31

Re: Einfachen Richtexteditor erstellen
 
Hallo!

AFAIR findest Du bei Delphi unter den Demos ein Richedit-Projekt.

Und Du kannst RTF-Dateien auch ohne ein Richedit öffnen und mit StringReplaxe arbeiten. Die Textformatierung wird im RTF auch nur in Zeichenketten gespeichert, sodaß nichts verloren gehen dürfte, wenn Du nur Deine Schlüsselworte ersetzt.

Gruß

Thomas

RWarnecke 25. Apr 2006 18:34

Re: Einfachen Richtexteditor erstellen
 
Zitat:

Zitat von Janek76
Ist es möglich, die rtf-Vorlage aus der rtf-Datei ohne den Umweg über ein TRichEdit direkt in den Zwischenspeicher zu schicken und dabei mit String-Replace Feldbezeichnungen durch die Daten zu ersetzen, ohne die Formatierung zu zerstören?

Warum willste das machen ? Lade doch die Vorlage in ein TRichEdit. Damit gehst Du dann auf Nummer sicher, dass keine Formatierungen von Deinem Text verloren gehen. Wenn der User dieses RichEdit nicht sehen soll, dann verstecke es hinter einem Panel oder einem anderen RichEdit-Feld.

himitsu 25. Apr 2006 18:38

Re: Einfachen Richtexteditor erstellen
 
Zitat:

Zitat von RWarnecke
Wenn der User dieses RichEdit nicht sehen soll, dann verstecke es hinter einem Panel oder einem anderen RichEdit-Feld.

Kennst du das Attribut Visible?

Janek76 25. Apr 2006 18:46

Re: Einfachen Richtexteditor erstellen
 
Zitat:

Zitat von RWarnecke
Zitat:

Zitat von Janek76
Ist es möglich, die rtf-Vorlage aus der rtf-Datei ohne den Umweg über ein TRichEdit direkt in den Zwischenspeicher zu schicken und dabei mit String-Replace Feldbezeichnungen durch die Daten zu ersetzen, ohne die Formatierung zu zerstören?

Warum willste das machen ? Lade doch die Vorlage in ein TRichEdit. Damit gehst Du dann auf Nummer sicher, dass keine Formatierungen von Deinem Text verloren gehen. Wenn der User dieses RichEdit nicht sehen soll, dann verstecke es hinter einem Panel oder einem anderen RichEdit-Feld.

Ja, kann man so machen, ich dachte nur, es wäre die sauberere Lösung, das alles in Variablen oder Streams zu machen. Mit formatiertem Text habe ich bis jetzt noch keine Erfahrung.

Janek76 26. Apr 2006 21:11

Re: Einfachen Richtexteditor erstellen
 
Also ich glaube ich nehme wirklich lieber ein unsichtbares Richedit, denn ich weiß nicht wieviel Zeit vergehen würde, bis ich das hier kapiere...:


http://www.swissdelphicenter.ch/torr...ode.php?id=945


Delphi-Quellcode:
uses
  clipbrd;

procedure CopyStreamToClipboard(fmt: Cardinal; S: TStream);
var
  hMem: THandle;
  pMem: Pointer;
begin
  Assert(Assigned(S));
  S.Position := 0;
  hMem      := GlobalAlloc(GHND or GMEM_DDESHARE, S.Size);
  if hMem <> 0 then
  begin
    pMem := GlobalLock(hMem);
    if pMem <> nil then
    begin
      try
        S.Read(pMem^, S.Size);
        S.Position := 0;
      finally
        GlobalUnlock(hMem);
      end;
      Clipboard.Open;
      try
        Clipboard.SetAsHandle(fmt, hMem);
      finally
        Clipboard.Close;
      end;
    end { If }
    else
    begin
      GlobalFree(hMem);
      OutOfMemoryError;
    end;
  end { If }
  else
    OutOfMemoryError;
end; { CopyStreamToClipboard }

procedure CopyStreamFromClipboard(fmt: Cardinal; S: TStream);
var
  hMem: THandle;
  pMem: Pointer;
begin
  Assert(Assigned(S));
  hMem := Clipboard.GetAsHandle(fmt);
  if hMem <> 0 then
  begin
    pMem := GlobalLock(hMem);
    if pMem <> nil then
    begin
      try
        S.Write(pMem^, GlobalSize(hMem));
        S.Position := 0;
      finally
        GlobalUnlock(hMem);
      end;
    end { If }
    else
      raise Exception.Create('CopyStreamFromClipboard: could not lock global handle ' +
        'obtained from clipboard!');
  end; { If }
end; { CopyStreamFromClipboard }

procedure SaveClipboardFormat(fmt: Word; writer: TWriter);
var
  fmtname: array[0..128] of Char;
  ms: TMemoryStream;
begin
  Assert(Assigned(writer));
  if 0 = GetClipboardFormatName(fmt, fmtname, SizeOf(fmtname)) then
    fmtname[0] := #0;
  ms := TMemoryStream.Create;
  try
    CopyStreamFromClipboard(fmt, ms);
    if ms.Size > 0 then
    begin
      writer.WriteInteger(fmt);
      writer.WriteString(fmtname);
      writer.WriteInteger(ms.Size);
      writer.Write(ms.Memory^, ms.Size);
    end; { If }
  finally
    ms.Free
  end; { Finally }
end; { SaveClipboardFormat }

procedure LoadClipboardFormat(reader: TReader);
var
  fmt: Integer;
  fmtname: string;
  Size: Integer;
  ms: TMemoryStream;
begin
  Assert(Assigned(reader));
  fmt    := reader.ReadInteger;
  fmtname := reader.ReadString;
  Size   := reader.ReadInteger;
  ms     := TMemoryStream.Create;
  try
    ms.Size := Size;
    reader.Read(ms.memory^, Size);
    if Length(fmtname) > 0 then
      fmt := RegisterCLipboardFormat(PChar(fmtname));
    if fmt <> 0 then
      CopyStreamToClipboard(fmt, ms);
  finally
    ms.Free;
  end; { Finally }
end; { LoadClipboardFormat }

procedure SaveClipboard(S: TStream);
var
  writer: TWriter;
  i: Integer;
begin
  Assert(Assigned(S));
  writer := TWriter.Create(S, 4096);
  try
    Clipboard.Open;
    try
      writer.WriteListBegin;
      for i := 0 to Clipboard.formatcount - 1 do
        SaveClipboardFormat(Clipboard.Formats[i], writer);
      writer.WriteListEnd;
    finally
      Clipboard.Close;
    end; { Finally }
  finally
    writer.Free
  end; { Finally }
end; { SaveClipboard }

procedure LoadClipboard(S: TStream);
var
  reader: TReader;
begin
  Assert(Assigned(S));
  reader := TReader.Create(S, 4096);
  try
    Clipboard.Open;
    try
      clipboard.Clear;
      reader.ReadListBegin;
      while not reader.EndOfList do
        LoadClipboardFormat(reader);
      reader.ReadListEnd;
    finally
      Clipboard.Close;
    end; { Finally }
  finally
    reader.Free
  end; { Finally }
end; { LoadClipboard }



// Examples:

{ Save Clipboard }

procedure TForm1.Button1Click(Sender: TObject);
var
  ms: TMemoryStream;
begin
  ms := TMemoryStream.Create;
  try
    SaveClipboard(ms);
    ms.SaveToFile('c:\temp\ClipBrdSaved.dat');
  finally
    ms.Free;
  end; { Finally }
end;

{ Clear Clipboard }

procedure TForm1.Button2Click(Sender: TObject);
begin
  clipboard.Clear;
end;

{ Restore Clipboard }

procedure TForm1.Button3Click(Sender: TObject);
var
  fs: TfileStream;
begin
  fs := TFilestream.Create('c:\temp\ClipBrdSaved.dat',
    fmopenread or fmsharedenynone);
  try
    LoadClipboard(fs);
  finally
    fs.Free;
  end; { Finally }
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:45 Uhr.

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