![]() |
AW: Record an 2tes Formular übergeben
Ich habe das mit den Property nun so umgesetzt, wahrscheinlich aber viel zu umständlich:
Formular 1:
Delphi-Quellcode:
Formular 2:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Grids, uConst; type TForm1 = class(TForm) StringGrid1: TStringGrid; procedure StringGrid1DblClick(Sender: TObject); procedure FormCreate(Sender: TObject); function Get_personen(Index: Integer): TPerson; procedure Set_personen(Index: Integer; Rec: TPerson); private procedure StringGridInit; public property personen[index: Integer]: TPerson read Get_personen write Set_personen; end; var Form1: TForm1; fpersonen: array[1..9] of TPerson; implementation uses Unit2; {$R *.dfm} function TForm1.Get_personen(index: Integer): TPerson; begin Result := fpersonen[index]; end; procedure TForm1.Set_personen(index: Integer; Rec: TPerson); begin fpersonen[index] := Rec; end; procedure TForm1.StringGrid1DblClick(Sender: TObject); var form2: TForm2; begin form2 := TForm2.Create(Self); //ID an Form2 übergeben form2.edit4.text := IntToStr(personen[StringGrid1.Row].id); case form2.ShowModal of mrOk: begin fpersonen[StringGrid1.Row].vorname := form2.edit1.text; fpersonen[StringGrid1.Row].nachname := form2.edit2.text; fpersonen[StringGrid1.Row].geburtstag := StrToDate(form2.edit3.text); StringGridInit; end end; form2.Free; end; procedure TForm1.FormCreate(Sender: TObject); var i: Integer; begin //Felder mit beispielwerten füllen for i := 1 to 9 do begin fpersonen[i].id := i; fpersonen[i].vorname := 'Willi ' + IntToStr(i); fpersonen[i].nachname := 'Mustermann'; fpersonen[i].geburtstag := StrToDate('31.12.1999'); end; StringGridInit; end; procedure TForm1.StringGridInit; var i: Integer; begin with StringGrid1 do begin RowCount := length(fpersonen)+1; Cells[0,0] := 'ID'; Cells[1,0] := 'Vorname'; Cells[2,0] := 'Name'; Cells[3,0] := 'Geburtsdatum'; end; for i := 1 to length(fpersonen) do with StringGrid1 do begin Cells[0,i] := IntToStr(fpersonen[i].id); Cells[1,i] := fpersonen[i].vorname; Cells[2,i] := fpersonen[i].nachname; Cells[3,i] := DateToStr(fpersonen[i].geburtstag); end end; end.
Delphi-Quellcode:
uConst:
unit Unit2;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, uConst; type TForm2 = class(TForm) Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Save: TButton; Cancel: TButton; Edit4: TEdit; procedure CancelClick(Sender: TObject); procedure SaveClick(Sender: TObject); procedure FormActivate(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form2: TForm2; implementation {$R *.dfm} uses Unit1; procedure TForm2.SaveClick(Sender: TObject); begin ModalResult := mrOK; end; procedure TForm2.CancelClick(Sender: TObject); begin // Bei Abbruch Werte nicht speichern, nur Formular schließen ModalResult := mrCancel; end; procedure TForm2.FormActivate(Sender: TObject); begin edit1.text := fpersonen[StrToInt(edit4.text)].vorname; edit2.text := fpersonen[StrToInt(edit4.text)].nachname; edit3.text := DateToStr(fpersonen[StrToInt(edit4.text)].Geburtstag); end; end.
Delphi-Quellcode:
unit uConst;
interface type TPerson = record id: integer; vorname: string[20]; nachname: string[30]; geburtstag: TDateTime; end; implementation end. |
AW: Record an 2tes Formular übergeben
Zitat:
|
AW: Record an 2tes Formular übergeben
Wir hatten das anders herum gemeint: eine Property vom Typ TPerson in Form2 deklarieren, von Form1 aus zuweisen und bei ModalResult mrOK übernehmen.
Delphi-Quellcode:
Form2 := TForm2.Create(nil);
try Form2.Person := Personen[Index]; if Form2.ShowModal = mrOK then Personen[Index] := Form2.Person; finally Form2.Release; end; |
AW: Record an 2tes Formular übergeben
Ich würd' dann noch Folgendes ändern.
.Free statt .Release Lokale Variable frm statt globale Variable Form2 verwendet Private Methode EditPerson - damit wird im Code klar ausgedrückt, was hier passieren soll
Delphi-Quellcode:
procedure TForm1.EditPerson(var person:TPerson);
var frm : TForm2; begin frm := TForm2.Create(nil); try frm.Person := person; if frm.ShowModal = mrOK then person := frm.Person; finally frm.Free; end; end; |
AW: Record an 2tes Formular übergeben
Welchen Mehrwert soll die lokale Variable bringen? Und zum Free:
Zitat:
![]() |
AW: Record an 2tes Formular übergeben
Zitat:
(Dass Delphi automatisch pro Formular eine globale Variable anlegt ist eine sehr grosse Unschönheit an Delphi. Es verleitet die Programmierer dazu immer diese globalen Variablen zu benützen und lässt manche auch glauben Formularklasse und Formular wäre das Gleiche.) Diese Variable sollte man einfach auskommentieren, wenn man im Vorraus weiss, dass man TForm2 nur als modales Formular benützen wird. Wenn man die globale Variable Form2 benützt, dann hinterlässt man eine Art von Tretmine. Irgendein unbedarfter Programmier könnte schreiben Form2.Show und schon würde man auf Speicher zugreifen, der schon freigegeben wurde. Zitat:
Release braucht man nur dann, wenn man das eigene Formular aus einer Ereignisbehandlungsroutine freigeben möchte. Für andere Formulare, die nicht zur Formularklasse gehören in dessen Kontext man sich gerade befindet, trifft das nicht zu. Wenn man also irgendwo Code wie diesen sieht
Delphi-Quellcode:
, dann hat man einen Fehler entdeckt. Nur
IrgendeinForm.Release
Delphi-Quellcode:
oder
Release
Delphi-Quellcode:
wäre ein sinnvoller Aufruf.
self.Release
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:53 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