![]() |
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? |
Re: Einfachen Richtexteditor erstellen
Hi,
du kannst mit dem TRichEdit verschiedene Textattribute setzen (siehe hierzu ![]() Etwas fertiges gibt es bestimmt, nur ist das nicht bei Delphi dabei. Vielleicht kannst du dich mal auf ![]() Zitat:
|
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? |
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 ;)
|
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 |
Re: Einfachen Richtexteditor erstellen
Zitat:
|
Re: Einfachen Richtexteditor erstellen
Zitat:
|
Re: Einfachen Richtexteditor erstellen
Zitat:
|
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...:
![]()
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