Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi StringGrid aus Form2 in Form1 abspeichern (https://www.delphipraxis.net/190161-stringgrid-aus-form2-form1-abspeichern.html)

strom 6. Sep 2016 10:11

StringGrid aus Form2 in Form1 abspeichern
 
Hallo,

möchte gerne, wenn das Hauptformular(Form1) beendet wird, dass das StringGrid von Form2 abgespeichert wird.

Delphi-Quellcode:
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
   DeleteFile(ExtractFilePath(ParamStr(0)) + 'Ereignisprotokoll.dat');
  SaveStringGrid(Form2.StringGrid1, ExtractFilePath(ParamStr(0)) + 'Ereignisprotokoll.dat');
end;

mkinzler 6. Sep 2016 10:14

AW: StringGrid aus Form2 in Form1 abspeichern
 
Und? Funktioniert es so nicht? Fehler?

hoika 6. Sep 2016 10:20

AW: StringGrid aus Form2 in Form1 abspeichern
 
Hallo,

ColCount und RowCount setzen und dann

Delphi-Quellcode:
for i := 0 to StringGrid1.RowCount - 1 do
  StringGrid2.Rows[i].Assign(StringGrid1.Rows[i]);

strom 6. Sep 2016 12:03

AW: StringGrid aus Form2 in Form1 abspeichern
 
Zitat:

Fehlermeldung : Undeklarierter Bezeichner "SaveStringGrid"
Unit1 und Unit2 kennen sich!

himitsu 6. Sep 2016 12:09

AW: StringGrid aus Form2 in Form1 abspeichern
 
Was ist SaveStringGrid und wo liegt das?

DeddyH 6. Sep 2016 12:09

AW: StringGrid aus Form2 in Form1 abspeichern
 
Und wo steht SaveStringGrid? Vermutlich lediglich im implementation-Abschnitt einer der Units.

dGeek 6. Sep 2016 12:15

AW: StringGrid aus Form2 in Form1 abspeichern
 
Zitat:

möchte gerne, wenn das Hauptformular(Form1) beendet wird, dass das StringGrid von Form2 abgespeichert wird.
Zitat:

Zitat von hoika (Beitrag 1346923)
Hallo,

ColCount und RowCount setzen und dann

Delphi-Quellcode:
for i := 0 to StringGrid1.RowCount - 1 do
  StringGrid2.Rows[i].Assign(StringGrid1.Rows[i]);

Ich habe nichts von einem zweiten StringGrid gelesen :|

himitsu 6. Sep 2016 12:41

AW: StringGrid aus Form2 in Form1 abspeichern
 
Wenn die MainForm geschlossen wird, dann beendet sich eh alles,
also warum speichert Form2 sich nicht selber? (OnDestroy)

dGeek 6. Sep 2016 13:08

AW: StringGrid aus Form2 in Form1 abspeichern
 
http://www.swissdelphicenter.ch/de/showcode.php?id=941
Zitat:

...ein TStringGrid in eine Datei speichern & laden?
Da hat er auch "SaveStringGrid" her.
Nur ich verstehe nicht wo das Problem ist diese Prozedur zu verwenden.

hoika 6. Sep 2016 14:59

AW: StringGrid aus Form2 in Form1 abspeichern
 
Hallo,
ah,

< Unit1 und Unit2 kennen sich! >

Und woher kennt Unit2 SaveStringGrid.
In welcher Unit ist das deklariert?

Mal so in der Schnelle:

Delphi-Quellcode:

unit LoadSaveStringGrid;

interface

uses
  System, Grids; // ???

procedure SaveStringGrid(StringGrid: TStringGrid; const FileName: TFileName);

procedure LoadStringGrid(StringGrid: TStringGrid; const FileName: TFileName);

implementation

procedure SaveStringGrid(StringGrid: TStringGrid; const FileName: TFileName);
var
  f:   TextFile;
  i, k: Integer;
begin
  AssignFile(f, FileName);
  Rewrite(f);
  with StringGrid do
  begin
    // Write number of Columns/Rows
    Writeln(f, ColCount);
    Writeln(f, RowCount);
    // loop through cells
    for i := 0 to ColCount - 1 do
      for k := 0 to RowCount - 1 do
        Writeln(F, Cells[i, k]);
  end;
  CloseFile(F);
end;

// Load a TStringGrid from a file

procedure LoadStringGrid(StringGrid: TStringGrid; const FileName: TFileName);
var
  f:         TextFile;
  iTmp, i, k: Integer;
  strTemp:   String;
begin
  AssignFile(f, FileName);
  Reset(f);
  with StringGrid do
  begin
    // Get number of columns
    Readln(f, iTmp);
    ColCount := iTmp;
    // Get number of rows
    Readln(f, iTmp);
    RowCount := iTmp;
    // loop through cells & fill in values
    for i := 0 to ColCount - 1 do
      for k := 0 to RowCount - 1 do
      begin
        Readln(f, strTemp);
        Cells[i, k] := strTemp;
      end;
  end;
  CloseFile(f);
end;

end.

p80286 6. Sep 2016 15:07

AW: StringGrid aus Form2 in Form1 abspeichern
 
Zitat:

Zitat von strom (Beitrag 1346920)
Hallo,

möchte gerne, wenn das Hauptformular(Form1) beendet wird, dass das StringGrid von Form2 abgespeichert wird.

Delphi-Quellcode:
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
   DeleteFile(ExtractFilePath(ParamStr(0)) + 'Ereignisprotokoll.dat');
  SaveStringGrid(Form2.StringGrid1, ExtractFilePath(ParamStr(0)) + 'Ereignisprotokoll.dat');
end;

Es scheint sich um einen typischen Fall von das eine sagen, etwas anderes machen zu handeln.
Ausgehend vom Sourcecode soll es wohl heißen
"Das Stringgrid auf Form2 (Form2.Stringgrid1)(?) soll gespeichert werden, wenn Form1 geschlossen wird."

@Strom
Und wo ist das Problem?

Gruß
K-H

hoika 6. Sep 2016 20:03

AW: StringGrid aus Form2 in Form1 abspeichern
 
Hallo,
das Problem ist, dass der Thread-Ersteller (TE) noch ziemlich neu in Delphi ist.
Das Konzept der Units und des uses muss man erst mal verstehen.

Und das meine ich Ernst.

Für jemand, der seit 10 Jahren mit Pascal entwickelt, ist das sowas von trivial.

Aber:
Ich habe mal einen ASP.Net-Kurs mitgemacht,
da gab es sowas ähnliches wie x-Datei und y-Datei und hängen zusammen,
das habe ich leider (oder zum Glück) wieder vergessen.

Bitte denkt an Eure Anfänge zurück und denkt "einfach" (TE, nicht bös gemeint).

dGeek 6. Sep 2016 20:14

AW: StringGrid aus Form2 in Form1 abspeichern
 
Der TE muss aber auch entgegenkommen und vernünftige Fragen stellen. Das ist doch drin =)

Er scheint wohl von der von mir verlinkten Webseite den Code kopiert zu haben. Das ist doch schonmal was.
Die Prozeduren zum Speichern und Laden hat er demnach ja.

strom 7. Sep 2016 06:42

AW: StringGrid aus Form2 in Form1 abspeichern
 
Hallo,

jetzt nochmal zurück zu meiner Frage.
Habe eine Unit Ereignisprotokoll mit dem Type "StringGrid1: TStringGrid"

Habe aber auch ein Unit Hauptformular, wenn ich jetzt zum Beispiel über das "MainMenu1 Hauptformular" im StringGrid was suchen möchte!
Wie binde ich TStrinGrid im Hauptformular mit ein???


Richtig wieder ein Quelltext aus Delphi Treff
Code:
function SeekRecord(Grid: TStringGrid; ColOrder: array of integer;
  StrList: array of String): Boolean;
var
  I, J : Integer;
begin
  result := false;
  for I := 1 to Grid.RowCount - 1 Do
  begin
    for J := low(ColOrder) to high(ColOrder) do
    begin
      if (Grid.Cells[ColOrder[J],I]=StrList[J]) then
         result := true
      else
         result := false;
      if result = false then break;
    end;
    if result = true then break;
  end;

  if result = true then
     Grid.Row := I
  else
     ShowMessage('Datensatz nicht gefunden!' +#13#13+ 'Record not Found!');
end;
Code:
procedure TForm1.Button1Click(Sender: TObject);
begin
  //Suche Zeile nach Column 0 mit Suchbegriff
  SeekRecord(Grid,[0],['Suchbegriff']);
  //Suche Zeile nach Column 0 und 1 mit Suchbegriffen 1 und 2
  SeekRecord(Grid,[0,1],['Suchbegriff1','Suchbegriff2']);
  //Suche Zeile nach Column 1, 5 und 2 mit Suchbegriffen 1, 2 und 3
  SeekRecord(Grid,[1,5,2],['Suchbegriff1','Suchbegriff2','Suchbegriff3']);
  //usw.
end;

Delphi-Quellcode:
unit Ereignisprotokoll;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Buttons, Vcl.ExtCtrls,
  Vcl.Grids;

type
  TForm2 = class(TForm)
    StringGrid1: TStringGrid;
    Panel1: TPanel;
    BitBtn1: TBitBtn;
    procedure BitBtn1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form2: TForm2;
implementation

{$R *.dfm}

uses Hauptformular;

procedure SaveStringGrid(StringGrid: TStringGrid; const FileName: TFileName);
var
 f: TextFile;
 i, k: Integer;
begin
  AssignFile(f, FileName);
  Rewrite(f);
 with StringGrid do
  begin
   Writeln(f, ColCount);
   Writeln(f, RowCount);
    for i := 0 to ColCount - 1 do
      for k := 0 to RowCount - 1 do
    Writeln(F, Trim(Cells[i, k]));
  end;
  CloseFile(F);
end;

procedure LoadStringGrid(StringGrid: TStringGrid; const FileName: TFileName);
var
 f: TextFile;
 iTmp,i,k: Integer;
 strTemp: String;
begin
  AssignFile(f, FileName);
  Reset(f);
 with StringGrid do
  begin
    Readln(f, iTmp);
    ColCount := iTmp;
    Readln(f, iTmp);
    RowCount := iTmp;
     for i := 0 to ColCount - 1 do
      for k := 0 to RowCount - 1 do
      begin
        Readln(f, strTemp);
        Cells[i, k] := strTemp;
      end;
  end;
  CloseFile(f);
end;

procedure TForm2.BitBtn1Click(Sender: TObject);
begin
 Form2.Visible := false;
 Form1.Bearbeiten1.Enabled := false;
end;

procedure TForm2.FormCreate(Sender: TObject);
var
 i, j :integer;
begin
 Stringgrid1.ColWidths[0] := 5;
 Stringgrid1.ColWidths[1] := 25;
 Stringgrid1.ColWidths[2] := 70;
 Stringgrid1.ColWidths[3] := 70;
 Stringgrid1.ColWidths[4] := 100;
 StringGrid1.ColWidths[5] := 1000;
 StringGrid1.Cells [1,0] := ' ';
 StringGrid1.Cells [2,0] := 'Date';
 StringGrid1.Cells [3,0] := 'Time';
 StringGrid1.Cells [4,0] := 'ID';
 StringGrid1.Cells [5,0] := 'Event';
 for i := StringGrid1.FixedCols to StringGrid1.ColCount - 1 do
  begin
   for j :=StringGrid1.FixedRows to StringGrid1.RowCount - 1 do
    begin
     StringGrid1.Cells[i,j] := '';
    end;
   end;
    LoadStringGrid(StringGrid1, ExtractFilePath(ParamStr(0)) + 'Ereignisprotokoll.dat');
end;

procedure TForm2.FormDestroy(Sender: TObject);
begin
    DeleteFile(ExtractFilePath(ParamStr(0)) + 'Ereignisprotokoll.dat');
     SaveStringGrid(StringGrid1, ExtractFilePath(ParamStr(0)) + 'Ereignisprotokoll.dat');
end;

end

DeddyH 7. Sep 2016 07:54

AW: StringGrid aus Form2 in Form1 abspeichern
 
Füg in der Ereignisprotokoll-Unit diese Zeile vor der implementation-Zeile ein:
Delphi-Quellcode:
procedure SaveStringGrid(StringGrid: TStringGrid; const FileName: TFileName);

dGeek 7. Sep 2016 11:13

AW: StringGrid aus Form2 in Form1 abspeichern
 
Bischen OT aber:

Delphi-Quellcode:
if result = true then // Info 1
 Grid.Row := I
else
 ShowMessage('Datensatz nicht gefunden!' +#13#13+ 'Record not Found!'); // Info 2
Gewöhn dir am besten gleich zu Anfang ab, auf True oder False zu vergleichen (Info 1).
Schreib lieber: "if Result then" und "if not Result then".

Benutz besser "sLineBreak" statt #13#13 bzw #13#10.

Und immer schön auf Groß- und Kleinschreibung achten. Delphi ist da relativ entspannt. Aber solltest du später mal zu einer anderen Sprache wechseln oder sie nur kurzeitig verwenden, wird nichts funktionieren, wenn du die Groß- und Kleinschreibung nicht beachtest.

Die Deklaration von sLineBreak sieht so aus (ist nur eine Info und soll nicht kopiert werden oder so):
Delphi-Quellcode:
const
 sLineBreak = {$IFDEF POSIX} AnsiChar(#10) {$ENDIF}
 {$IFDEF MSWINDOWS} AnsiString(#13#10) {$ENDIF};


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:37 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz