Problem ze StringGridem....

0

Mam w sumie to dwa problemy:
Powiedzmy że sobie zapisuję dane z bazy do pliku takim kodem:

procedure TForm1.Button2Click(Sender: TObject);
 
var
i,j:Integer;
plik : TextFile;
begin
if   SaveDialog1.Execute then
begin


                  AssignFile(plik ,SaveDialog1.FileName );
                  Rewrite(plik);


for i:=0 to StringGrid1.ColCount-1 do
for j:=0 to StringGrid1.RowCount-1 do

begin

  if i=StringGrid1.ColCount-1 then Writeln(plik, StringGrid1.Cells[i,j])
  else  Writeln(plik,StringGrid1.Cells[i,j]);

end;
end;
Flush (plik);
CloseFile(plik);
end; 

To teraz chciałabym to odczytać z pliku. Zmieniałam z SaveDialog na OpenDialog i tam gdzie Write, Writeln dałam Read i Readln, ale nie działa. Jaki błąd robię w tym?

Druga sprawa:
Chcę sobie wydrukować zawartość tabeli poprzez Printsetupdialog, ale stać mnie tylko na wydruk przez printers, do któreo mam taki kodzik:

procedure PrintGrid(sGrid: TStringGrid; sTitle: string);
var
  X1, X2: Integer;
  Y1, Y2: Integer;
  TmpI: Integer;
  F: Integer;
  TR: TRect;
begin
  Printer.Title := sTitle;
  Printer.BeginDoc; 
  Printer.Canvas.Pen.Color  := 0;
  Printer.Canvas.Font.Name  := 'Arial';
  Printer.Canvas.Font.Size  := 10;
  Printer.Canvas.Font.Style := [fsBold, fsUnderline];
  //Printer.Canvas.TextOut(0, 100, Printer.Title);
  for F := 1 to sGrid.ColCount - 1 do
  begin
    X1 := 0;
    for TmpI := 1 to (F - 1) do
      X1 := X1 + 2 * (sGrid.ColWidths[TmpI]);
    Y1 := 300;
    X2 := 0;
    for TmpI := 1 to F do
      X2 := X2 + 2 * (sGrid.ColWidths[TmpI]);
    Y2 := 350;
    TR := Rect(X1, Y1, X2 - 30, Y2);
    Printer.Canvas.Font.Style := [fsBold];
    Printer.Canvas.Font.Size := 12;
    Printer.Canvas.TextRect(TR, X1 + 25, 350, sGrid.Cells[F, 0]);
    Printer.Canvas.Font.Style := [];
    for TmpI := 1 to sGrid.RowCount - 1 do
    begin
      Y1 := 150 * TmpI + 200;
      Y2 := 150 * (TmpI + 1) + 200;
      TR := Rect(X1, Y1, X2 - 30, Y2);
      Printer.Canvas.TextRect(TR, X1 + 25, Y1 + 25, sGrid.Cells[F, TmpI]);
    end;
  end;
  Printer.EndDoc;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
 PrintGrid(StringGrid1, 'Print Stringgrid');

end;

Nie wiem jak to zrobić, aby było poprzez Printsetupdialog. Czy ktoś wie jak te dwie sprawy rozwiązać? Dziękuję za pomoc, buziaki :-)

0

pierwsze co mi na myśl przychodzi to zmień jeszcze Rewrite(plik) na Reset(plik), a poza tym sprawdz warunek po if czy masz dobrze zapisany, bo ja tam widzę 2 razy WriteLn zamiast Write i WriteLn.

To tyle z mojej skąpej wiedzy co mogłem przekazać ;p

0

a co to?=>>if i=StringGrid1.ColCount-1 then Writeln(plik,StringGrid1.Cells[i,j])
else Writeln(plik,StringGrid1.Cells[i,j]);

Tu jest napisane : jesli (a) to zrob (b) a jesli (nie a) to tez zrob (b) - to po co tak?

// heh , no wlasnie , to to o czym napisal edrique

Poza tym jak cos nie dziala to powiedz co, jaki komunikat? w ktorym miejscu?

A tak w ogóle to chyba wczoraj pytałaś o strumienie - to po co dzis uzywasz jakichs assign rewrite? nie lepiej zrobic to za pomoca strumienia?
http://4programmers.net/Forum/viewtopic.php?id=50614

0

Stosując się do zaleceń Endrigue, czyli poprawiając to co pisał, błąd mi wyskakuje w pętli w wierszy gdzie występuje else:
<font color="green"> else Writeln(plik,StringGrid1.Cells[i,j]); </span>
Gdy wybieram sobie plik do odczytania z listy i klikam na OK to wyskakuje mi błąd I/O właśnie w spomnianym wierszu. Co mam robić???

0

No to widze że zostalem zignorowany - ok juz mnie nie ma

0

Marmar jakie strumienie? Ja się nie pytałam o żadne strumienie, musiałeś mnie pomylić z inną, no ale widocznie myślisz, że na świecie jest jedyna Kornelia. Zaraz sprawdzę co mi poradziłeś.

1 użytkowników online, w tym zalogowanych: 0, gości: 1