![]() |
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; |
AW: StringGrid aus Form2 in Form1 abspeichern
Und? Funktioniert es so nicht? Fehler?
|
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]); |
AW: StringGrid aus Form2 in Form1 abspeichern
Zitat:
|
AW: StringGrid aus Form2 in Form1 abspeichern
Was ist SaveStringGrid und wo liegt das?
|
AW: StringGrid aus Form2 in Form1 abspeichern
Und wo steht SaveStringGrid? Vermutlich lediglich im implementation-Abschnitt einer der Units.
|
AW: StringGrid aus Form2 in Form1 abspeichern
Zitat:
Zitat:
|
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) |
AW: StringGrid aus Form2 in Form1 abspeichern
![]() Zitat:
Nur ich verstehe nicht wo das Problem ist diese Prozedur zu verwenden. |
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. |
AW: StringGrid aus Form2 in Form1 abspeichern
Zitat:
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 |
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). |
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. |
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 |
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);
|
AW: StringGrid aus Form2 in Form1 abspeichern
Bischen OT aber:
Delphi-Quellcode:
Gewöhn dir am besten gleich zu Anfang ab, auf True oder False zu vergleichen (Info 1).
if result = true then // Info 1
Grid.Row := I else ShowMessage('Datensatz nicht gefunden!' +#13#13+ 'Record not Found!'); // Info 2 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