Delphi-PRAXiS
Seite 1 von 2  1 2      

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 11. Dez 2010 19:01

Record an 2tes Formular übergeben
 
Hallo Leute,

ich möchte von einem Formular das mit Recorddaten gefüllten Stringgrid durch doppelklicken den ausgewählten Datensatz in einem 2ten Formular bearbeiten. Durch klicken auf OK soll dann der Record gespeichert werden, bzw. durch Abbruch die Änderungen verworfen werden. Hänge jetzt schon den ganzen Nachmittag an dem Problem und werde einfach nicht fündig nach der Lösung. Vielleicht kann mir jemand unter die Arme greifen.

Formular1:
Delphi-Quellcode:
unit PUnit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids;

type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    procedure StringGrid1DblClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure StringGridInit;
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

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

var
  Form1: TForm1;
  personen: array[1..9] of TPerson;

implementation

uses PUnit2;

{$R *.dfm}

procedure TForm1.StringGrid1DblClick(Sender: TObject);
begin
  //Werte an Form2 übergeben (wie besser lösbar?)
  form2.edit1.text := personen[StringGrid1.Row].vorname;
  form2.edit2.text := personen[StringGrid1.Row].nachname;
  form2.edit3.text := DateToStr(personen[StringGrid1.Row].geburtstag);
  form2.Show;
end;

procedure TForm1.FormCreate(Sender: TObject);
var i: Integer;
begin
  //Felder mit beispielwerten füllen
  for i := 1 to 9 do begin
  personen[i].id := i;
  personen[i].vorname := 'Willi ' + IntToStr(i);
  personen[i].nachname := 'Mustermann';
  personen[i].geburtstag := StrToDate('31.12.1999');
  end;

  StringGridInit;
end;

procedure TForm1.StringGridInit;
var i: Integer;
begin
  with StringGrid1 do
  begin
    RowCount := length(personen)+1;
    Cells[0,0] := 'ID';
    Cells[1,0] := 'Vorname';
    Cells[2,0] := 'Name';
    Cells[3,0] := 'Geburtsdatum';
  end;

  for i := 1 to length(Personen) do with StringGrid1 do
  begin
    Cells[0,i] := IntToStr(personen[i].id);
    Cells[1,i] := personen[i].vorname;
    Cells[2,i] := personen[i].nachname;
    Cells[3,i] := DateToStr(personen[i].geburtstag);
  end
end;

end.
Formular2:
Delphi-Quellcode:
unit PUnit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm2 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Save: TButton;
    Cancel: TButton;
    procedure CancelClick(Sender: TObject);
    procedure SaveClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

uses PUnit1;

procedure TForm2.SaveClick(Sender: TObject);
begin
  //Werte in Record speichern und wieder zu Form1 zurückkehren

  //Problem: Auf Record von Form1 kann nicht zugegriffen werden
  {
  Edit1.Text := personen[id].vorname;
  Edit2.Text := personen[id].nachname;
  Edit3.Text := personen[id].geburtsdatum;
  }
  Form2.Close;
  Form1.StringGridInit; // Stringgrid aktualisieren
end;

procedure TForm2.CancelClick(Sender: TObject);
begin
  // Bei Abbruch Werte nicht speichern, nur Formular schließen
  Form2.Close;
end;

end.

DeddyH 11. Dez 2010 19:05

AW: Record an 2tes Formular übergeben
 
Ich würde den Record in einer eigenen Unit deklarieren und diese in beiden Units einbinden. Form2 bekommt dann eine Property vom Typ dieses Records spendiert, welche dann von Form1 zugewiesen wird.

patti 11. Dez 2010 19:12

AW: Record an 2tes Formular übergeben
 
Hi und willkommen in der DP ;-)

Einmal abgesehen davon, dass ich das ganze nicht mit einem Record und einem Array, sondern mit Objekten in einer (Object-)List lösen würde, würde ich dein konkretes Problem vermutlich so lösen:

Das zweite Formular wird standardmäßig nicht erzeugt, sondern nur dynamisch. Nach dem Schließen wird es dann wieder freigegeben. Mach dir bei deiner Form1 eine neue Methode:

Delphi-Quellcode:
procedure DatenAendern(nummer : integer);
var dlg: TForm2;
begin
   //--
   if (nummer >= Low(personen)) and (nummer <= High(personen)) then
   begin
      dlg := TForm2.Create(self);
      //
      dlg.Edit1.Text := personen[nummer].vorname; // oder was auch immer
      //...
      if dlg.ShowModal = mrOK then
      begin
          personen[nummer] := dlg.Edit1.Text;
          //...
      end;
      //
      dlg.free;
   end;
end;
Im Form2 brauchst du dann im OnClick vom Save-Button nur noch folgendes:

Delphi-Quellcode:
Self.ModalResult := mrOK;

Ich hoffe, es wurde einigermaßen klar, was ich meine. (Nicht vergessen, dass in den Projektoptionen eingestellt werden muss, dass Form2 standardmäßig nicht erzeugt wird!)

mfg,
Patti

DeddyH 11. Dez 2010 19:17

AW: Record an 2tes Formular übergeben
 
Wieso unbedingt dynamisch? Und weshalb wird da direkt auf VCL-Controls zugegriffen? Was passt Dir an meinem Property-Vorschlag nicht?

patti 11. Dez 2010 19:23

AW: Record an 2tes Formular übergeben
 
Zitat:

Zitat von DeddyH (Beitrag 1067973)
Was passt Dir an meinem Property-Vorschlag nicht?

Als ich meinen Beitrag geschrieben habe, hatte ich deinen noch nicht gelesen. Beim Abschicken kam dann der rote Kasten, aber ich hab mir gedacht, dass ich meinen Vorschlag trotzdem abschicke... ;-)

Zitat:

Zitat von DeddyH (Beitrag 1067973)
Wieso unbedingt dynamisch?

Warum denn nicht? Klar, man kann das Formular auch über die gesamte Programmlaufzeit im Speicher lassen, aber nötig ist das IMHO nicht...

Zitat:

Zitat von DeddyH (Beitrag 1067973)
Und weshalb wird da direkt auf VCL-Controls zugegriffen?

Versteh ich ehrlich gesagt nicht ganz :?: An irgendeiner Stelle muss ich doch die Daten in die Edit-Felder eintragen bzw. die Benutzereingaben wieder lesen :gruebel:

DeddyH 11. Dez 2010 19:24

AW: Record an 2tes Formular übergeben
 
Sicher müssen die Daten angezeigt werden, aber weshalb von außen? IMO sollte das Form2 schon selbst machen.

mleyen 11. Dez 2010 19:27

AW: Record an 2tes Formular übergeben
 
Willkommen in der :dp:
Was dir fehlt ist Delphi-Referenz durchsuchenModalResult

Um mal die Komplett-lern-lösung zu geben:

Form1:
Delphi-Quellcode:
unit Unit1;

interface

uses
  SysUtils, Classes, Controls, Forms, uConst, Grids, Unit2;

type
  TForm1 = class(TForm)
    strngrd1: TStringGrid;
    procedure strngrd1DblClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    personen: array[1..9] of TPerson;
    procedure StringGridInit;
  public
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
  i: Integer;
begin
  //Felder mit beispielwerten füllen
  for i := 1 to 9 do
  begin
    personen[i].id := i;
    personen[i].vorname := 'Willi ' + IntToStr(i);
    personen[i].nachname := 'Mustermann';
    personen[i].geburtstag := StrToDate('31.12.1999');
  end;

  StringGridInit;
end;

procedure TForm1.StringGridInit;
var
  i: Integer;
begin
  with strngrd1 do
  begin
    RowCount := length(personen) + 1;
    Cells[0, 0] := 'ID';
    Cells[1, 0] := 'Vorname';
    Cells[2, 0] := 'Name';
    Cells[3, 0] := 'Geburtsdatum';
  end;

  for i := 1 to length(Personen) do
    with strngrd1 do
    begin
      Cells[0, i] := IntToStr(personen[i].id);
      Cells[1, i] := personen[i].vorname;
      Cells[2, i] := personen[i].nachname;
      Cells[3, i] := DateToStr(personen[i].geburtstag);
    end
end;

procedure TForm1.strngrd1DblClick(Sender: TObject);
var
  frm2: TForm2;
begin
  frm2 := TForm2.Create(Self);
  frm2.edt1.text := personen[strngrd1.Row].vorname;
  frm2.edt2.text := personen[strngrd1.Row].nachname;
  frm2.edt3.text := DateToStr(personen[strngrd1.Row].geburtstag);
  case frm2.ShowModal of
    mrOk:
    begin
      personen[strngrd1.Row].vorname := frm2.edt1.text;
      personen[strngrd1.Row].nachname := frm2.edt2.text;
      personen[strngrd1.Row].geburtstag := StrToDate(frm2.edt3.text);

      with strngrd1 do
      begin
        Cells[1, strngrd1.Row] := personen[strngrd1.Row].vorname;
        Cells[2, strngrd1.Row] := personen[strngrd1.Row].nachname;
        Cells[3, strngrd1.Row] := DateToStr(personen[strngrd1.Row].geburtstag);
      end;
    end
  end;
  frm2.Free;
end;

end.

Form2:
Delphi-Quellcode:
unit Unit2;

interface

uses
  Classes, Controls, Forms,
  StdCtrls;

type
  TForm2 = class(TForm)
    btnCancel: TButton;
    btnSave: TButton;
    edt1: TEdit;
    edt2: TEdit;
    edt3: TEdit;
    procedure btnCancelClick(Sender: TObject);
    procedure btnSaveClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.btnCancelClick(Sender: TObject);
begin
  ModalResult := mrCancel;
end;

procedure TForm2.btnSaveClick(Sender: TObject);
begin
  ModalResult := mrOk;
end;

end.

uConst: (Gemeinsme Dinge um uses-Konflikten vorzubeugen)
Delphi-Quellcode:
unit uConst;

interface

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

implementation

end.

Luckie 11. Dez 2010 19:35

AW: Record an 2tes Formular übergeben
 
Nimm bitte eine Property um den Datensatz zu übergeben. Wenn du am zweiten Formular was änderst kannst du das auch gleich im Quellcode vom ersten machen. Übergibst du nur den Record über eine Property, brauchst du nur am zweiten Formular was ändern. Und der Quellcode im ersten Formular wird übersichtlicher.

Wuffel 11. Dez 2010 20:25

AW: Record an 2tes Formular übergeben
 
:-D Wow, das ging ja schnell. Vielen Dank an alle. Jetzt funktionierts und ich kann weiter machen.

@Luckie & DeddyH: Das mit den Property hatte ich heute schon probiert, bin aber nicht zurecht damit gekommen. Hast du mir ein Beispiel? Ich würde gerne diese Möglichkeit auch testen wollen.

Luckie 11. Dez 2010 20:34

AW: Record an 2tes Formular übergeben
 
http://www.michael-puff.de/Programmi...tauschen.shtml


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:25 Uhr.
Seite 1 von 2  1 2      

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