Thank You for Your further reports.
I was able to reproduce the problem and posted a hot fix for the RTF writer.
Thank You for Your further reports.
I was able to reproduce the problem and posted a hot fix for the RTF writer.
I tested again - cannot find a problem in 8.01.1 -
so please try if it really makes a difference which text you enter. If unicode text is a problem.
Sometimes it happens that the compiler finds DCU units in different locations. If an older version is combined with a new one, problems can happen anywhere in the program.
Please also add
{$HIGHCHARUNICODE ON}
to WPINC.INC. It may make a difference.
Please try to set
WPRichText.HeaderFooter._CheckTableHeightInFormat := false
Einen Header fügt man ja so ein:
WPRichText1.HeaderFooter.Get(wpIsHeader,wpraNamed,'MICKEY').WorkOnText := TRUE;
WPRichText1.InputString('WPTools Documentation');
WPRichText1.WorkOnText := wpIsBody;
und aktivieren kann man den dann so gemäss Seitenzahl PageNo
procedure TForm1.WPRichText1GetSpecialText(Sender: TObject;
par: TParagraph; PosInPar, PageNr: Integer; Kind: TWPPagePropertyKind;
var IsLastPage, UseThis: Boolean; var SpecialText: TWPRTFDataBlock);
begin
// We use 'Get' to find the header or footer
SpecialText := WPRichtext1.HeaderFooter.Get(Kind, wpraNames, 'MICKEY' );
// Only then the variable is actually used
UseThis := TRUE;
end;
Speichern in RTF geht natürlich nicht, da dort nur die standard header positionen unterstützt werden.
Der code zum zeichenweise auslesen der Attribute muss neu geschrieben werden, PTAttr gibt es nicht mehr.
WPTools speichert seit V5 die Attribute mittels eines Zeichenattribute index wertes. Dieser wird in dem array par.CharAttr gespeichert.
Das höchstwertigste byte von CharAttr wird für interne Zwecke verwendet, also bitte den Wert &FFFFFF nehmen.
Diesen kann man dann WPRichText.AttributeHelper.CharAttr zuweisen und erhält über dieses Interface die Möglichkeit die Attribute auszulesen.
Im Manual ist eine Einführung für die Datenstrukturen. Praktischerweise ist für gleiche Attribute der Wert vom CharAttr gleich. Dadurch muss man nur neu auswerten, wenn sich CharAttr ändert.
pc^ kann einfach durch par.CharItem[i] ersetzt werden.
pa^.width gibt es nicht mehr, dafür aber CharPos[i].Width
Seit WPTools 5 werden die Zeilen nicht mehr umgebrochen in einzelne Blöcke innerhalb eines Absatzes. Stattdessen werden in par.Lines die Anfangsposition sowie die Länge jeder Zeile gespeichert.
Im wesentlichen dient der Code dazu einen Paragraph Zeichen für Zeichen durchzuscannen und
Text mit gleichen Textattributen zusammengefasst als Text-Elemente für eine eigenes Format
zu konvertieren.
Um ein eigenes Format zu realisieren würde ich aber eher einen writer programmieren. Der HTML writer aus WPIOHTML.pas kann hierfür als Vorbild dienen.
Use COMPDF_MouseAddOneDrawObject as in your orginal sample code.
Did you try my sample?
t.Alpha := 255
disables the transparency. The rest of your original code was fine.
Grundsätzlich erscheint die Textbox immer auf der Seite auf der ihr Anker WPTextObj eingefügt wurde.
Man müsste also eine feste neue Seite mit inputString(#12) erstellen und in den neuen Absatz dann die Textbox einfügen.
CPPage ist nicht unbedingt immer exakt da ein Absatz ja über mehrere Seiten gehen kann. Das einfügen der Textbox verschiebt den text, die Formatierung wird ungültig. Insgesamt gesehen scheint mir dies kein gutes Vorgehen zu sein.
Ich würde die Textboxen in spezielle Header texte einfügen und die Header dann für einzelne Seiten aktivieren mit OnGetSpecialText.
Das ReformatAll ist da scheinbar wirkungslos?
Wird das nicht ausserhalb der Schleife aufgerufen?
Tested your project ...
I have no crash here - used the official 8.01.1 version.
I assume the problem happens in
ShowMessage(WPRichText1.AsString);
As wrote before:
add the compiler symbol WPDEBUG and you get a hint on the pascal
line where the problems happens.
Alpha is defined like this:
Alpha : Integer; // 0 or Alpha in range 1..255.
So to make it opaque please either use the value 0 or 255. It is not a percentage values.
COMPDF_MouseAddOneDrawObject purpose is to create a rectangle with the mouse. If you need to create it without user input you need
FillChar(t, SizeOf(t), 0);
t.ColorBrush := clRed;
t.Alpha := 255; // not transparent
t.grtyp := 1; // Rectangle
t.x := 72; // unit = point!
t.y := 72;
t.w := 72;
t.h := 72 div 2;
pdf.CommandStrEx(
COMPDF_AddDrawObject, // COMPDF_MouseAddOneDrawObject,
'REDRECT', Cardinal(@t));
Alles anzeigen
You will not be able to select the object with the mouse since this command does not switch the mouse mode.
AsString does not expect unicode text. It expects formatted text as RTF or WPT format.
Since you use the professional version you can activate extended debugging by activating $define WPDEBUG in the project options or the file WPINC.INC. You will then see where the problem happens and can send me at support@wptools.de further information.
Julian
Hi,
Undo is supposed to work only for annotations, not draw objects added by user interaction with the mouse.
From a menu item execute
WPViewPDF.command(COMPDF_Ann_Undo, 2);
Hi,
WPViewPDF PLUS cannot start a PDF from scratch. It can combined PDF files, delete pages, also reorder pages - and it is possible to add empty pages. But it will not create a new PDF file.
That depends on the edition, STD, PRO, Premium and how many Developer there are in the company. Please send your question to support@wptools.de
There is a newer version of WPTools 7 than WPTools version 7.21. I recommend to use the latest.
Of course it would be best to get the upgrade to WPTools 8.
In case you use threading please make sure to create a WPTools environment for each thread. See the threading demo.
Hallo,
TWPRichText.FindParagraph arbeitet komplett unabhängig von der cursor position.
Um mehrere Absätze der Reihe nach abhängig von ihrem jeweiligen Namen zu bearbeiten oder auszulesen geht man so vor:
par := WPRichText1.BodyText.FirstPar;
while par<>nil do
begin
if par.Name='ARTIKEL' then ....
par := par.Next;
end;
Wenn man auch in Header und Footer sowie TextBoxen suchen will
par := WPRichText1.RTFData.FirstPar;
while par<>nil do
begin
if par.Name='ARTIKEL' then ....
par := par.GlobalNext;
end;
Grüsse,
Julian ZIersch
Diese Zeile
WP.ActiveText := WP.BodyText;
positioniert den Cursor ganz am Anfang wodurch auch dort mittels AddTable die Tabelle erstellt wird. Das problem ist, dass die TextBox dann Teil der Tabelle ist was nicht geht.
Sie brauchen
WP.ActiveText := WP.BodyText;
WP.CPPosition := MaxInt;
Damit die Tabelle nach dem TextBox absatz erstellt wird.
Bitte rufen Sie ausserdem auf:
WPRichText1.HeaderFooter._CheckTableHeightInFormat := false;
Beste Grüsse,
Julian Ziersch
Mit der gezeigten Technik "cell := row.AppendNewCell();" liesse sich auch eine mehrzeilige Tabelle erstellen.
Code wie dieser wird mit steigender Anzahl der Abätze langsamer da LastPar ja immer neu ermittelt wird.
WP.ActiveParagraph := WP.BodyText.LastPar;
Es ist daher immer schneller direkt mit den Absatz Referenzen zu arbeiten und insbesondere die letzte Referenz zu nutzen um weitern Inhalt zu produzieren.
Das fragliche Anzeige Problem kann ich allerdings nicht erkennen - grundsätzlich arbeitet WPTools immer Seiten basiert und da müssen Umbrüche an manchen Stellen eingebaut werden.
Wenn Sie eine durchgehende Tabelle brauchen sollten Sie die Zellen über den Name der Zelle anstatt dem Namen der Tabelle adressieren. Namen für Reihen können nicht gespeichert werden.
Ich befürchte ein Dokument mit 5000 tabellen überfordert manchen RTF "consumer". Das Layout leidet auch.
(Ich habe den Titel des Beitrags so angepasst, dass er einen Hinweis auf die enthaltene Fragestellung bzw. Lösung enthält.)
Grüsse,
Julian
In dem code werden 5000 Tabellen mit je 1 Zeile und 1 Reihe erstellt - welches Problem löst dies?
Wie sie ja schon gesehen haben ergibt sich eine andere Höhe durch den Umbruch. Probieren Sie den Umbruch für Tabellen in FormatOptions abzuschalten.,
Weniger Overhead hat diese code:
table, row, cell, par : TParagraph;
begin
table := WPRichText1.ActiveParagraph;
for I := 1 to 5000 do
begin
table := table.AppendNewTable();
row := table.AppendNewRow();
row.ASet(WPAT_BoxMinHeight, 600);
cell := row.AppendNewCell();
cell.SetText(i.tostring);
cell.ASet(WPAT_BorderFlags, 15 ); // oder 7 ohne bottom border!
table.Name := 'Tabelle ' + i.tostring;
end;
WPRichText1.ReformatAll(false, true);
Alles anzeigen