Hallo,
kann man bei LayoutMode = wplayLayout den schwarzen Rahmen um das Blatt abschalten?
Ciao
Stefan
Hallo,
kann man bei LayoutMode = wplayLayout den schwarzen Rahmen um das Blatt abschalten?
Ciao
Stefan
Danke für die Tips.
ProtectedProp hatte ich schon, was aber das Löschen oder Überschreiben von Feldern nicht verhindert hat.
Jetzt weiß ich auch den Grund, ppProtectSelectedTextToo hatte ich nicht gesetzt, nur ppIsInsertpoint und ppIsMergedText.
Jetzt verhält sich alles wie gewünscht :-)
Den obigen Codeschnipsel habe ich in meine Sammlung übernommen, vielen Dank dafür.
Ciao
Stefan
Hallo,
der Event, welcher das Problem verursacht, ist gefunden!
Im OnKeypress rufe ich eine Funktion
function MarkierungMitFeld: boolean;
var
sa, sl: integer;
i: integer;
begin
result := false;
// ist ein Textbereich markiert und sind in der Markierung Felder enthalten?
sa := RTFRichtext.SelStart;
sl := RTFRichtext.SelLength;
RTFRichtext.CPPosition := sa;
// Cursor über den selektierten Bereich bewegen
for i := 1 to sl do
begin
RTFRichtext.CPMoveNext;
if RTFRichtext.FieldAtCP <> nil then
begin
result := true;
break;
end;
end;
end;
Alles anzeigen
auf, die falls true key := #0 setzt.
Damit möchte ich verhindern, dass bei Textmarkierung die ein Feld enthält, dieses durch Tippen gelöscht wird.
Da in der oben gezeigten Funktion aber die Cursorposition verändert wird, geht die Toolbar-Einstellung verloren.
Wie prüft man besser ob in einem Stück markierten Text ein Feld enthalten ist, ohne den Cursor zu verschieben?
Ciao
Stefan
Hallo,
ich erzeuge WPRichtText's per Code und setze dort nach der Erzeugung
WPRichtext := TWPRichText.create(FormMain);
WPRichtext.CurrAttr.FontName := 'Courier New';
WPRichtext..CurrAttr.Size := 16;
WPRichtext.WPToolBar := WPToolBar1;
Wenn ich nun ins RTF klicke steht in der Toolbar wie erwartet Courier New mit 16er Größe.
Nur wenn ich tippe kommt Schrift in Arial, wenn ich davon Textteile markiere und in der Toolbar die Größe ändere, ändert sich zwar die Schriftgröße aber bleibt bei Arial.
Was habe ich bei der Erzeugung an Einstellungen übersehen?
Ciao
Stefan
Ich benötige eigentlich nur den Stream eines WPRichText mit bestimmten Schriftformatierungen zur Weiterverwendung.
Daher erzeuge ich nun nicht mehr die Komponente(mit Panel, Richtext etc.) sondern nur wie vorgeschlagen ein TWPRichText mit CreateDynamic und damit funktioniert es nun wie gewünscht.
Wenn mal Zeit ist baue ich das wieder zurück und fange mal den Fehler ein...
Ciao
Stefan
Folgender Codeschnipsel führt zu Fehler bei der Bereichsprüfung wenn rechtsbündig ausgerichtet wird. Linksbündig und zentriert funktioniert.
Das Richtext wurde dynamisch erzeugt und liegt auf einem ebenfalls dynamisch erzeugten Panel, das Richtext enthält nur ein Wort.
RTFRichtext.Clear;
RTFRichtext.InputString('Hallo');
RTFRichtext.SelectAll;
case AFieldRec.TextAlign of
1:
RTFRichtext.CurrAttr.Alignment := paralLeft;
2:
RTFRichtext.CurrAttr.Alignment := paralRight;
3:
RTFRichtext.CurrAttr.Alignment := paralCenter;
else
RTFRichtext.CurrAttr.Alignment := paralLeft;
end;
RTFRichtext.reformatall(true, true);
Alles anzeigen
Was ist an meinem Code falsch bzw. was müsste ich richtigerweise machen?
Lege ich zur Entwurfszeit ein Richtext auf ein Formular dann funktioniert obiger Code.
Ciao
Stefan
Hallo,
nach unendlichen Versuchen habe ich eine Lösung:
im
procedure TTextForm.WPRichText1TextObjectMouseUp(Sender: TWPCustomRtfEdit;
pobj: TWPTextObj; obj: TWPObject; Button: TMouseButton; Shift: TShiftState;
X, Y: Integer);
begin
obj.Edit;
end;
stellt sich der Cursor zwar immer noch kurz oben zwischen die beiden gepunkteten Headerzeilen, aber im Mouseup dann ist die Textbox unter der Maus editierbar...
Dafür muss dann das Allowed := false im LeaveRTFDataBlock wieder weg.
Ciao
Stefan
Ja, irgendwie drehe ich mich im Kreis!
Eigentlich möchte ich die Textboxen in den Headern, nur lande ich beim Klick auf eine solche zuerst oben im Header zwischen den beiden gepunkteten Zeilen, da soll der Nutzer aber nichts einfügen dürfen
(siehe Gesperrter Header aber Textobjekte darin bearbeitbar)
Daher die Idee, die Boxen nun doch auf die Seiten im Body zu platzieren, was ja aber auch nicht so einfach geht (weil teilweise dann doppelt erzeugt)
Lässt sich für das Problem im obigen Link eine Lösung finden?
Ciao
Stefan
Hallo,
ich habe beschlossen, Textboxen nicht im Header, sondern im Text anzulegen.
Im OnGetSpecialText muss ich aber nun herausfinden, ob für die betreffende Seite die Textboxen bereits erzeugt wurden.
Im Header geht das einfach per
if Kind = wpIsHeader then
begin
aName := 'HEADER#' + inttostr(pagenr);
SpecialText := WPRichText1.HeaderFooter.Get(wpIsHeader, wpraNamed, aName);
if SpecialText.Empty then
begin
...
wie aber kann ich erkennen, ob auf der Seite im Bodytext etwas vorhanden ist?
Die Textboxen werden im OnGetSpecialText erzeugt
txtObj := WPRichText1.TextObjects.InsertTextBox(3000, 500, RTFData);
txtObj.PositionMode := wpotPage;
txtObj.ExtraProp['Seite'] := pagenr.ToString;
was funktioniert, aber wenn ich alle TextObjekte durchlaufe
WPRichText1.TextObjectsGetList(list, wpobjTextObject, true);
for i := 0 to list.Count - 1 do
begin
if list[i].ExtraProp['Seite'] = 'Seite' + pagenr.tostring then
begin
pagevorhanden := true;
break;
end;
end;
ist die ExtraProp immer leer!
Was läuft da schief?
Ciao
Stefan
Vielen herzlichen Dank!
Die Begründung des Fehlers ist klar, und wenn ich RTFData.RTFText.LoadFromStream verwende, ist alles wie gewünscht!
Ciao
Stefan
Ich habe ein kleines WPRichtext welches z.B. eine Zeile, dann 3 weitere Zeilen und eine unterste Zeile beinhaltet.
Das sieht so aus:
Zeile ganz oben
1
2
3
unterste Zeile
Dessen Inhalt speichere ich in einen Stream:
Nun erzeuge ich in einem anderen WPRichtext eine Textbox und möchte in diese den Stream laden:
RTFData := nil;
TxtObj := WPRichText1.TextObjects.InsertTextBox(b, h, RTFData,
SpecialText.FirstPar);
TxtObj.PositionMode := wpotPage;
TxtObj.RelX := 1000;
TxtObj.Rely := 1000;
TxtObj.Frame := [wpframeFine];
if RTFData <> nil then
begin
StreamText.Position :=0;
RTFData.FirstPar.LoadFromStream(Stream, 'WPT');
end;
Alles anzeigen
Als Ergebnis habe ich nun darin stehen:
Zeile ganz oben1
2
3
unterste Zeile
Da fehlt also ein Zeilenumbruch oben vor der 1!
Versuchsweise habe ich beim Stream laden die Option [wploadpar_AsChildrenPar] benutzt, jetzt ist der Text korrekt, aber enthält ganz oben eine neue unerwünschte Leerzeile!
Es steht da also nun
Leerzeile
Zeile ganz oben
1
2
3
unterste Zeile
Wie bekomme ich den Originaltext korrekt in meine textbox?
Ciao
Stefan
Der genannte Event wird aber nur gefeuert, wenn ich im LeaveRTFDataBlock die Allowed-Sperre rausnehme.
Das aber wieder führt dazu, dass beim ersten Klick in den Header die beiden Punktzeilen erscheinen und der Cursor da oben steht und der Nutzer da irgendwelchen Text hintippen kann!
Ciao
Stefan
Prima, danke, funktioniert!
Ciao
Stefan
Hallo,
ich habe mit
procedure TTextForm.WPRichText1LeaveRTFDataBlock(Sender: TObject;
FromBlock, ToBlock: TWPRTFDataBlock; var Allowed: Boolean);
begin
Allowed := ToBlock.Kind <> wpIsHeader;
end;
das Tippen im Header verboten.
Nun aber gibt es im Header auch Textobjekte die teilweise bearbeitbar sein sollen, eingefügt werden sie im OnGetSpecialText
if Kind = wpIsHeader then
begin
aName := 'HEADER#' + inttostr(pagenr);
SpecialText := WPRichText1.HeaderFooter.Get(wpIsHeader, wpraNamed, aName);
if SpecialText.Empty then
begin
X := 100;
Y := 100;
b := 500;
h := 500;
RTFData := nil;
TxtObj := WPRichText1.TextObjects.InsertTextBox(b, h, RTFData,
SpecialText.FirstPar);
TxtObj.PositionMode := wpotPage;
TxtObj.RelX := X;
TxtObj.Rely := Y - WPRichText1.Header.MarginHeader;
TxtObj.Frame := [wpframeFine];
if RTFData <> nil then
begin
//befüllen
StreamText.Position := 0;
RTFData.FirstPar.LoadFromStream(StreamText, 'WPT');
end;
.....
Alles anzeigen
Gibt es einen Weg die Bearbeitung darin zu erlauben, das Tippen im Header (da erscheinen ja oben die beiden gepunkteten Linien) aber zu unterbinden?
Ciao
Stefan
ZitatAm einfachsten wäre es aber dem Textfeld einfach einen grauen Hintergrund zuzuweisen, wie es auch bei normalem text möglich ist.
Das versuche ich seit Stunden ;-)
Wie bekomme ich einem Textfeld einen Hintergrund zugewiesen?
Ich habe es mit Styles versucht, ParentPar.AsetColor (was die gesamte Zeile mit der Nummer gefärbt hat) usw...
... und ich möchte es vor Veränderung (löschen, übertippen usw) schützen, was aber auch nicht wie bei MergeFields funktioniert!
Ciao
Stefan
Hallo,
mit
füge ich ein Mergefield ein, welches im Text grau hinterlegt ist weil so in AutomaticTextAttr festgelegt.
Ein mit
erzeugtes Textfeld mit Seitennummer hat keinen grauen Hintergrund, ich möchte aber dass es optisch genau so aussieht wie das Mergefield!
OnMailMergeGetText, wo ich Zugriff auf Content hätte, wird für dieses Textfeld nicht gefeuert, gibt es einen Trick?
Ciao
Stefan