The code below assumes that a PrintJob is already open.
PEGetNFormulas PEGetNthFormula PESetNthFormula PEGetFormula PESetFormula PECheckFormula PEGetHandleString
uses CRDelphi;
var
slFormulas : TStringList;
{In this example, the Formula Names and Texts are stored to slFormulas, a
public StringList}
procedure GetFormulas;
var
NameHandle : hWnd;
NameLength : smallint;
TxtHandle : hWnd;
TxtLength : smallint;
TxtBuffer : PChar;
nFormulas : smallint;
nFormula : smallint;
begin
{Get number of Formulas}
nFormulas := PEGetNFormulas(PrintJob);
if (nFormulas = -1 ) then
{Do Error Handler};
slFormulas := TStringList.Create;
{Loop through the formulas}
for nFormula := 0 to (nFormulas - 1) do
begin
NameLength := 0;
TxtLength := 0;
{Retrieve formula}
if not PEGetNthFormula(PrintJob, nFormula, NameHandle, NameLength,
TxtHandle, TxtLength) then
{Do Error Handler};
{Get Formula Name}
TxtBuffer := StrAlloc(NameLength);
if not PEGetHandleString(NameHandle, TxtBuffer, NameLength) then
{Do Error Handler};
{Add a new Formula Name to StringList}
slFormulas.Add(StrPas(TxtBuffer));
{Get Formula Text}
StrDispose(TxtBuffer);
TxtBuffer := StrAlloc(TxtLength);
if not PEGetHandleString(TxtHandle, TxtBuffer, TxtLength) then
{Do Error Handler};
{Add the Formula Text to the StringList Object}
slFormulas.Objects[nFormula] := TStringList.Create;
TStringList(slFormulas.Objects[nFormula]).SetText(TxtBuffer);
StrDispose(TxtBuffer);
end;
end;
{This procedure assumes we are using the public slFormulas StringList
which was filled with Formula information in the GetFormulas procedure
above}
procedure SetFormulas;
var
sFormulaName : string;
nTextLen : smallint;
hText : hWnd;
nFormulas : smallint;
nFormula : smallint;
pRptFormula : PChar;
Changed : boolean;
slTemp : TStringList;
begin
{Get the number of Formulas}
nFormulas := PEGetNFormulas(PrintJob);
if (nFormulas = -1 ) then
{Do Error Handler};
{Loop through the formulas}
for nFormula := 0 to (nFormulas - 1) do
begin
Changed := False;
{Get the Formula Name from the StringList created in GetFormulas}
sFormulaName := slFormulas[nFormula];
nTextLen := 0;
{Retrieve the Formula currently in the Report}
if not PEGetFormula(PrintJob, PChar(sFormulaName), hText, nTextLen)
then
{Do Error Handler};
{Get the Formula Text from the Report}
pRptFormula := StrAlloc(nTextLen);
if not PEGetHandleString(hText, pRptFormula, nTextLen) then
{Do Error Handler};
{Put the Report Formula Text into a StringList}
slTemp := TStringList.Create;
slTemp.SetText(pRptFormula);
{Compare it to the new formula...If they are the same, do not send}
if StrComp(TStringList(slFormulas.Objects[nFormula]).GetText,
slTemp.GetText) <> 0 then
Changed := True;
StrDispose(pRptFormula);
slTemp.Free;
{Send the Formula to the Report}
if Changed then
begin
if not PESetFormula(PrintJob, PChar(sFormulaName),
TStringList(slFormulas.Objects[nFormula]).GetText) then
{Do Error Handler};
{Check the Formula}
if not PECheckFormula(PrintJob, PChar(sFormulaName)) then
{Do Error Handler};
end;
end;
end;
{Here is a procedure which shows how to free the memory allocated for the
slFormulas StringList}
procedure FreeFormulasList;
var
cnt : integer;
slTemp : TStringList;
begin
for cnt := (slFormulas.Count - 1) downto 0 do
begin
slTemp := TStringList(slFormulas.Objects[cnt]);
slTemp.Free;
end;
slFormulas.Free;
end;
| Seagate Software IMG Holdings, Inc. http://www.seagatesoftware.com Support services: http://support.seagatesoftware.com |