AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Einfachen Richtexteditor erstellen

Ein Thema von Janek76 · begonnen am 25. Apr 2006 · letzter Beitrag vom 26. Apr 2006
Antwort Antwort
Janek76
(Gast)

n/a Beiträge
 
#1

Einfachen Richtexteditor erstellen

  Alt 25. Apr 2006, 18:01
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?
  Mit Zitat antworten Zitat
Benutzerbild von Die Muhkuh
Die Muhkuh

Registriert seit: 21. Aug 2003
7.332 Beiträge
 
Delphi 2009 Professional
 
#2

Re: Einfachen Richtexteditor erstellen

  Alt 25. Apr 2006, 18:12
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
  Mit Zitat antworten Zitat
Janek76
(Gast)

n/a Beiträge
 
#3

Re: Einfachen Richtexteditor erstellen

  Alt 25. Apr 2006, 18:24
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?
  Mit Zitat antworten Zitat
Benutzerbild von Die Muhkuh
Die Muhkuh

Registriert seit: 21. Aug 2003
7.332 Beiträge
 
Delphi 2009 Professional
 
#4

Re: Einfachen Richtexteditor erstellen

  Alt 25. Apr 2006, 18:27
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
  Mit Zitat antworten Zitat
TBx
(Administrator)

Registriert seit: 13. Jul 2005
Ort: Stadthagen
1.875 Beiträge
 
Delphi 12 Athens
 
#5

Re: Einfachen Richtexteditor erstellen

  Alt 25. Apr 2006, 18:31
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
Thomas Breitkreuz
  Mit Zitat antworten Zitat
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#6

Re: Einfachen Richtexteditor erstellen

  Alt 25. Apr 2006, 18:34
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.
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.136 Beiträge
 
Delphi 12 Athens
 
#7

Re: Einfachen Richtexteditor erstellen

  Alt 25. Apr 2006, 18:38
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?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Janek76
(Gast)

n/a Beiträge
 
#8

Re: Einfachen Richtexteditor erstellen

  Alt 25. Apr 2006, 18:46
Zitat von RWarnecke:
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.
  Mit Zitat antworten Zitat
Janek76
(Gast)

n/a Beiträge
 
#9

Re: Einfachen Richtexteditor erstellen

  Alt 26. Apr 2006, 21:11
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;
  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 23:51 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