Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Record an 2tes Formular übergeben (https://www.delphipraxis.net/156701-record-2tes-formular-uebergeben.html)

Wuffel 12. Dez 2010 11:13

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:
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.
Formular 2:
Delphi-Quellcode:
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.
uConst:
Delphi-Quellcode:
unit uConst;

interface

type
  TPerson = record
    id: integer;
    vorname: string[20];
    nachname: string[30];
    geburtstag: TDateTime;
  end;

implementation

end.

Bummi 12. Dez 2010 11:17

AW: Record an 2tes Formular übergeben
 
Zitat:

wahrscheinlich aber viel zu umständlich:
warum, ist doch gut umgesetzt, wenn Du im Setter und im Getter unzulässige Zugriffe abfängst....

DeddyH 12. Dez 2010 11:20

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;

sx2008 12. Dez 2010 13:16

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;

DeddyH 12. Dez 2010 13:33

AW: Record an 2tes Formular übergeben
 
Welchen Mehrwert soll die lokale Variable bringen? Und zum Free:
Zitat:

Jede Ereignisbehandlungsroutine für das Formular oder für dessen untergeordnete Objekte sollte Release anstelle von Free (Delphi) oder Delete (C++) benutzen. Ansonsten kann ein Speicherzugriffsfehler auftreten.
Quelle

sx2008 13. Dez 2010 08:41

AW: Record an 2tes Formular übergeben
 
Zitat:

Zitat von DeddyH (Beitrag 1068092)
Welchen Mehrwert soll die lokale Variable bringen?

Man vermeidet damit die globale Variable Form2, die leider automatisch von der Delphi IDE angelegt wurde.
(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:

Zitat von DeddyH (Beitrag 1068092)
Und zum Free:
Zitat:

Jede Ereignisbehandlungsroutine für das Formular oder für dessen untergeordnete Objekte sollte Release anstelle von Free (Delphi) oder Delete (C++) benutzen. Ansonsten kann ein Speicherzugriffsfehler auftreten.

Da hast du etwas falsch verstanden.
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:
IrgendeinForm.Release
, dann hat man einen Fehler entdeckt. Nur
Delphi-Quellcode:
Release
oder
Delphi-Quellcode:
self.Release
wäre ein sinnvoller Aufruf.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:53 Uhr.
Seite 2 von 2     12   

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