AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Record an 2tes Formular übergeben

Ein Thema von Wuffel · begonnen am 11. Dez 2010 · letzter Beitrag vom 13. Dez 2010
Antwort Antwort
Seite 1 von 2  1 2      
Wuffel

Registriert seit: 11. Dez 2010
4 Beiträge
 
Delphi 7 Professional
 
#1

Record an 2tes Formular übergeben

  Alt 11. Dez 2010, 19:01
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.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Record an 2tes Formular übergeben

  Alt 11. Dez 2010, 19:05
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von patti
patti

Registriert seit: 20. Okt 2004
Ort: Mittelfranken
665 Beiträge
 
Turbo Delphi für Win32
 
#3

AW: Record an 2tes Formular übergeben

  Alt 11. Dez 2010, 19:12
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:

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
Patrick Kreutzer
[Informatik-Student im 4. Semester]
http://www.patti-k.de/
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Record an 2tes Formular übergeben

  Alt 11. Dez 2010, 19:17
Wieso unbedingt dynamisch? Und weshalb wird da direkt auf VCL-Controls zugegriffen? Was passt Dir an meinem Property-Vorschlag nicht?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von patti
patti

Registriert seit: 20. Okt 2004
Ort: Mittelfranken
665 Beiträge
 
Turbo Delphi für Win32
 
#5

AW: Record an 2tes Formular übergeben

  Alt 11. Dez 2010, 19:23
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...

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...

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
Patrick Kreutzer
[Informatik-Student im 4. Semester]
http://www.patti-k.de/
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Record an 2tes Formular übergeben

  Alt 11. Dez 2010, 19:24
Sicher müssen die Daten angezeigt werden, aber weshalb von außen? IMO sollte das Form2 schon selbst machen.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von mleyen
mleyen

Registriert seit: 10. Aug 2007
609 Beiträge
 
FreePascal / Lazarus
 
#7

AW: Record an 2tes Formular übergeben

  Alt 11. Dez 2010, 19:27
Willkommen in der
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.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#8

AW: Record an 2tes Formular übergeben

  Alt 11. Dez 2010, 19:35
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.
Michael
Ein Teil meines Codes würde euch verunsichern.

Geändert von Luckie (11. Dez 2010 um 19:41 Uhr)
  Mit Zitat antworten Zitat
Wuffel

Registriert seit: 11. Dez 2010
4 Beiträge
 
Delphi 7 Professional
 
#9

AW: Record an 2tes Formular übergeben

  Alt 11. Dez 2010, 20:25
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.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#10

AW: Record an 2tes Formular übergeben

  Alt 11. Dez 2010, 20:34
http://www.michael-puff.de/Programmi...tauschen.shtml
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:59 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz