Avatar billede jan_l Nybegynder
27. maj 2001 - 22:08 Der er 4 kommentarer og
1 løsning

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) ;-)
Avatar billede martinlind Nybegynder
27. maj 2001 - 22:16 #1
Prøv martin@e-lind.dk

Uden EXE og DCU tak

/Martin
Avatar billede jan_l Nybegynder
27. maj 2001 - 22:31 #2
Du må gerne tage med i betragtning, at det er mit første program, så det er ret primitivt.  :)
Avatar billede martinlind Nybegynder
28. maj 2001 - 11:27 #3
Hvis du retter et tegn i sidste line i den procedure der gemmer din Grid, så kan den :

Old :

StreamWriteStr(RTF,\'\\pard\\nowidctlpar\\widctlpar\\adjustright {\');

New :

StreamWriteStr(RTF,\'\\pard\\nowidctlpar\\widctlpar\\adjustright {}\');


/Martin
Avatar billede jan_l Nybegynder
28. maj 2001 - 11:57 #4
Jeg bøjer mig i ydmyg agtelse over dit overblik!!! :-)

Mange tak

Det havde jeg ikke haft jordisk chance for at finde ud af selv.
Avatar billede martinlind Nybegynder
28. maj 2001 - 12:03 #5
Skal jeg være ærlig var det lidt et gæt da jeg ikke kender alle RTF koderne, men synes det så lidt mærkeligt ud at { ikke blev lukket af.

/Martin
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester