StringGrid til *.RTF
Jeg har et program, hvor jeg gerne vil gemme et StringGrid i en RTF-fil, og jeg bruger en Freeware-komponent(Control To RTF 8.13 KB), der skulle kunne gøre det. Den ligger her:http://members.xoom.com/nishitafree/software/ctltortf.zip
Det virker fint og upåklageligt, når jeg nøjes med at gemme et enkelt StringGrid, men lige så snart jeg prøver at gemme to eller flere så kommer Word med denne fejlmeddelelse:
Dokumentnavnet eller stien er ugyldig. Prøv følgende.
*Kontroller rettighederne for dokumentet eller drevet.
*Brug dialogboksen Åbn fil til at søge efter dokumentet.
Dette synes jeg i sig selv er lidt kryptisk, og jeg tror ikke helt, det er der problemet ligger, da jeg uden problemer kan åbne filen, hvis jeg kun har gemt et enkelt StringGrid.
I mit program kalder jeg komponenten med disse kommandoer:
ControlToRTF.CreateRTFHeader;
ControlToRTF.GridToRTF(sgDimensions);
Og i komponenten ser deklarering og procedurer sådan ud:
unit Ctltortf;
interface
uses
SysUtils, {$IFDEF WIN32} Windows, {$ELSE} WinTypes, WinProcs,{$ENDIF} Messages,
Classes, Graphics, Controls, StdCtrls, ExtCtrls, Grids, Forms;
type
TCtrlToRTF = class(TComponent)
private
{ Private declarations }
FFileName:string;
RTF:TMemoryStream;
FontTable:TStringList;
procedure StreamWriteStr(var ms: TMemoryStream; s: string);
function GetRTFFontTableName(FontName:string):string;
function GetRTFFontAttrib(Style:TFontStyles):string;
function GetRTFFontSize(Size:Integer):string;
function GetRTFAlignment(Alignment:TAlignment):string;
function GetRTFFontColorTableName(Color:TColor):string;
protected
{ Protected declarations }
public
{ Public declarations }
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure CreateRTFHeader;
procedure AddFontToTable(Font:TFont);
procedure ImageToRTF(Image:TImage;Alignment:TAlignment);
procedure MemoToRTF(Memo:TMemo);
procedure ListBoxToRTF(pList:TListBox);
procedure StringListToRTF(pStringList:TStringList;Font:TFont;Alignment:TAlignment);
procedure StringToRTF(pString:String;Font:TFont;Alignment:TAlignment);
procedure TextBufToRTF(TextBuf:pointer;size:word;Font:TFont;Alignment:TAlignment);
procedure LabelToRTF(pLabel:TLabel);
procedure EditToRTF(pEdit:TEdit);
procedure GridToRTF(Grid:TStringGrid);
procedure SaveToFile(pFileName:String);
published
{ Published declarations }
end;
procedure Register;
implementation
{$IFDEF WIN32}
{$R *.D32}
{$ELSE}
{$R *.D16}
{$ENDIF}
constructor TCtrlToRTF.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
RTF:=TMemoryStream.Create;
FontTable:=TStringList.Create;
end;
destructor TCtrlToRTF.Destroy;
begin
RTF.Free;
FontTable.Free;
inherited Destroy;
end;
------------------------------------------------------
procedure TCtrlToRTF.CreateRTFHeader;
var i:Integer;
begin
StreamWriteStr(RTF,\'{\\rtf1\\ansi\\ansicpg1252\\deff0\\deftab720\');
StreamWriteStr(RTF,\'{\\fonttbl\');
for i:=0 to FontTable.count-1 do
StreamWriteStr(RTF,FontTable.Strings[i]);
StreamWriteStr(RTF,\'}\');
StreamWriteStr(RTF,\'{\\colortbl\');
StreamWriteStr(RTF,\'\\red0\\green0\\blue0;\'); {Black}
StreamWriteStr(RTF,\'\\red128\\green0\\blue0;\'); {Maroon}
StreamWriteStr(RTF,\'\\red0\\green128\\blue0;\'); {Green}
StreamWriteStr(RTF,\'\\red128\\green128\\blue0;\'); {Olive}
StreamWriteStr(RTF,\'\\red0\\green0\\blue128;\'); {Navy}
StreamWriteStr(RTF,\'\\red128\\green0\\blue128;\'); {Purple}
StreamWriteStr(RTF,\'\\red0\\green128\\blue128;\'); {Teal}
StreamWriteStr(RTF,\'\\red128\\green128\\blue128;\'); {Gray}
StreamWriteStr(RTF,\'\\red192\\green192\\blue192;\'); {Silver}
StreamWriteStr(RTF,\'\\red255\\green0\\blue0;\'); {Red}
StreamWriteStr(RTF,\'\\red0\\green255\\blue0;\'); {Lime}
StreamWriteStr(RTF,\'\\red255\\green255\\blue0;\'); {Yellow}
StreamWriteStr(RTF,\'\\red0\\green0\\blue255;\'); {Blue}
StreamWriteStr(RTF,\'\\red255\\green0\\blue255;\'); {Fuchsia}
StreamWriteStr(RTF,\'\\red0\\green255\\blue255;\'); {Aqua}
StreamWriteStr(RTF,\'\\red255\\green255\\blue255;\'); {White}
StreamWriteStr(RTF,\'}\');
end;
------------------------------------------------------
procedure TCtrlToRTF.GridToRTF(Grid:TStringGrid);
var i,j:Integer;
Temp:double;
Align, FontColor,FontAttrib,FontSize,FontName:String;
begin
FontColor:=GetRTFFontColorTableName(Grid.Font.Color);
FontSize:=GetRTFFontSize(Grid.Font.Size);
FontAttrib:=GetRTFFontAttrib(Grid.Font.Style);
FontName:=GetRTFFontTableName(Grid.Font.Name);
StreamWriteStr(RTF,\'\\par \\pard\\plain\\cgrid\');
StreamWriteStr(RTF,\'{\\stylesheet{\\nowidctlpar\\widctlpar\\adjustright \\fs20\\cgrid \\snext0 Normal;}\');
StreamWriteStr(RTF,\'{\\*\\cs10 \\additive Default Paragraph Font;}}\');
StreamWriteStr(RTF,\'{\\*\\pnseclvl1\\pnucrm\\pnstart1\\pnindent720\\pnhang{\\pntxta\');
StreamWriteStr(RTF,\'.}}{\\*\\pnseclvl2\\pnucltr\\pnstart1\\pnindent720\\pnhang\');
StreamWriteStr(RTF,\'{\\pntxta .}}{\\*\\pnseclvl3\\pndec\\pnstart1\'+\'\\pnindent720\\pnhang{\\pntxta\');
StreamWriteStr(RTF,\'.}}{\\*\\pnseclvl4\\pnlcltr\\pnstart1\\pnindent720\\pnhang{\\pntxta\');
StreamWriteStr(RTF,\')}}{\\*\\pnseclvl5\\pndec\\pnstart1\\pnindent720\\pnhang{\\pntxtb (}{\\pntxta\');
StreamWriteStr(RTF,\')}}{\\*\\pnseclvl6\\pnlcltr\\pnstart1\\pnindent720\\pnhang\');
StreamWriteStr(RTF,\'{\\pntxtb (}{\\pntxta )}}{\\*\\pnseclvl7\\pnlcrm\\pnstart1\\pnindent720\'+
\'\\pnhang{\\pntxtb (}{\\pntxta\');
StreamWriteStr(RTF,\')}}{\\*\\pnseclvl8\\pnlcltr\\pnstart1\\pnindent720\\pnhang{\\pntxtb (}{\\pntxta\');
StreamWriteStr(RTF,\')}}{\\*\\pnseclvl9\\pnlcrm\\pnstart1\\pnindent720\\pnhang{\\pntxtb (}{\\pntxta )}}\');
for i:=0 to Grid.RowCount-1 do
begin
StreamWriteStr(RTF,\'\\trowd\');
StreamWriteStr(RTF,\'\\trgaph108\');
StreamWriteStr(RTF,\'\\trrh260\');
StreamWriteStr(RTF,\'\\trleft90\');
StreamWriteStr(RTF,\'\\trbrdrt\\brdrs\\brdrw10\');
StreamWriteStr(RTF,\'\\trbrdrl\\brdrs\\brdrw10\');
StreamWriteStr(RTF,\'\\trbrdrb\\brdrs\\brdrw10\');
StreamWriteStr(RTF,\'\\trbrdrr\\brdrs\\brdrw10\');
StreamWriteStr(RTF,\'\\trbrdrh\\brdrs\\brdrw10\');
StreamWriteStr(RTF,\'\\trbrdrv\\brdrs\\brdrw10\');
for j:=0 to Grid.ColCount-1 do
begin
StreamWriteStr(RTF,\'\\clvertalt\');
StreamWriteStr(RTF,\'\\clbrdrt\\brdrs\\brdrw10\');
StreamWriteStr(RTF,\'\\clbrdrl\\brdrs\\brdrw10\');
StreamWriteStr(RTF,\'\\clbrdrb\\brdrs\\brdrw10\');
StreamWriteStr(RTF,\'\\clbrdrr\\brdrs\\brdrw10\');
if (j<Grid.FixedCols) or (i<Grid.FixedRows) then StreamWriteStr(RTF,\'\\clcbpat8\');
{if (j=0) or (i=0) then StreamWriteStr(RTF,\'\\clshdng1500\');}
StreamWriteStr(RTF,\'\\cltxlrtb\');
Temp:=(j+1)*Grid.DefaultColWidth;
Temp:=(Temp/Screen.pixelsperinch)*1440.0+108.0;
StreamWriteStr(RTF,\'\\cellx\'+IntToStr(round(Temp)));
end;
StreamWriteStr(RTF,\'\\pard\\ri-123\\nowidctlpar\\widctlpar\\intbl\\adjustright\');
StreamWriteStr(RTF,\' {\'+FontName+FontSize+FontAttrib+FontColor+\'\\cgrid0\');
for j:=0 to Grid.ColCount-1 do
StreamWriteStr(RTF,Grid.Cells[j,i]+\'\\cell \');
StreamWriteStr(RTF,\'}\');
StreamWriteStr(RTF,\'\\pard \\nowidctlpar\\widctlpar\\intbl\\adjustright {\\row}\');
end;
StreamWriteStr(RTF,\'\\pard\\nowidctlpar\\widctlpar\\adjustright {\');
end;
------------------------------------------------------
Er der nogen der ud fra dette, kan se hvad der dog går galt, når der skal gemmes to eller flere StringGrids?
Hvis det kan hjælpe kan jeg sagtens sende koden til vedkommende, der vil/kan hjælpe !!!
Det er en del af et eksamensprojekt, og jeg skal derfor helst kunne skrive data og resultater ud som dokumentation. (og gerne på en pæn måde) ;-)
