Ich versuche gerade sehr alten Code von WPTools4 auf WPTools8 zu heben.
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.
In WPTools4 konnte dazu für jedes Zeichen auf sein TAttr zugegriffen werden (siehe alter Code unten)
Mittlwerweile sind diese Werte offenbar über CharAttr[i] zugreifbar. Allerdings nur als Index-Wert (Cardinal).
Was ist nun die korrekte Methode, um vom CharAttr[i] auf die Textattribute zu kommen?
Code
procedure ScanLine(aPar: PTParagraph; aLin: PTLine);
var
i: integer;
pt: TPoint;
IncX: integer;
str: string;
pc: PChar;
pa: PTAttr;
ax, ay, h: Longint;
begin
pa := alin^.pa;
pc := aLin^.pc;
update(pa);
if LineNo <= 1 then begin
aRichText.GetXYFromPosition(ax, ay, h, MyCp, 0, 0, 0);
IncX := ax;
end
else begin
aRichText.GetXYFromPosition(ax, ay, h, MyCp + 1, 0, 0, 0);
IncX := ax - pa^.width;
end;
pt.x := IncX + 1;
pt.y := alin^.y_start + alin^.Base;
str := '';
i := 0;
entdat.seperator := 0;
//frei nach function TWPRTFTextPaint.Get_LineWidth(lin: PTLine): Integer;:
while i < alin^.plen do begin
if (pa^.width > 1) or not (afsHidden in pa^.style) then begin
if (pc^ = TABCODE) or (pc^ = #32) and (aPar.align = paralBlock) then begin
//inc(spc, pa^.width)
if length(str) > 0 then begin
entdat := EntityDataFromAttr(aRichText, FOldAttr, pt, IncX, str);
aSaveEnt(entdat);
str := '';
end;
// IncX erhaelt Position des naechsten Zeichens nach tab oder blank
aRichText.GetXYFromPosition(ax, ay, h, MyCp + i + 1, 0, 0, 0);
IncX := ax;
//inc(IncX, pa^.width);
pt.x := IncX + 1;
end
else if pc^ = NEWLINECODE then begin
end
else begin
if pa^.width > 0 then begin
if (*true or jedes Zeichen *)
(*(pc^=' ') or jedes Wort (automatisch bei Blocksatz s.o.) *)
Changed(pa) (* jede Formataenderung *) then begin
entdat := EntityDataFromAttr(aRichText, FOldAttr, pt, IncX, str);
aSaveEnt(entdat);
Update(pa);
pt.x := IncX + 1;
str := '';
end;
inc(IncX, pa^.width);
str := str + pc^;
end;
end;
end;
inc(i);
inc(pc);
inc(pa);
end;
MyCp := MyCp + i;
if length(str) > 0 then begin
entdat := EntityDataFromAttr(aRichText, FOldAttr, pt, IncX, str);
entdat.seperator := 1;
aSaveEnt(entdat);
end;
end;
Alles anzeigen