Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Daten von einem Formular in ein anderes übernehmen (https://www.delphipraxis.net/91530-daten-von-einem-formular-ein-anderes-uebernehmen.html)

KRM 6. Mai 2007 17:48


Daten von einem Formular in ein anderes übernehmen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

ich habe da (mal wieder) eine Frage, zu der ihr bestimmt die Antwort kennt! ;)...

Es geht darum, dass ich 2 Formulare habe.
Das erste (Hauptformular) enthält eine Listbox in der Daten aus einer Datei stehen.

Diese Daten sind ein einfacher record mit diesem Format:

Delphi-Quellcode:
type
  IR_Rahmen = record
    name        : string[50];
    geraeteaddy : string[5];
    befehl      : string[7];
    beschreibung : string[150];
  end;
In der Listbox wird immer nur der String mit dem Namen angezeigt.
Nun geht es darum, dass ich die Möglichkeit schaffen will, dass ein Datensatz mit allen Parametern über ein seperates Formular geändert werden kann (siehe Anhang).

Hat jemand eine Idee, wie ich beim Aufruf des zweiten Formulars die Daten in die Edit-Felder bekomme?

pacman1986 6. Mai 2007 17:59

Re: Daten von einem Formular in ein anderes übernehmen
 
wenn du das record global anlegst kannst du darauf zugreifen wenn du die erste unit in die uses klausel der 2 unit schreibst

Gremlin 6. Mai 2007 18:12

Re: Daten von einem Formular in ein anderes übernehmen
 
Hallo,

na du kannst zb. eine class function in deiner Edit-Form definieren mit
Angabe des IR_Rahmen als Parameter oder ensprechend einzeln wenn gewünscht.
Als Rückgabewert gibst du einen Boolean zurück (True=ok und übernehmen, False=Werte verwerfen)

Damit es funktioniert sollte der Record in der Edit-Form bekannt sein. Wenn du das nicht
möchtest, dann nimmst du eben die Parameter einzeln, wird aber später wenn das Programm
einmal erweitert werden sollte, schnell unübersichtlich.


in der Edit-Form

Delphi-Quellcode:

type
  TEditForm = class
   [...]
  public
    class function Execute(var EditParam:IR_Rahmen):Boolean;
  end;

[...]

class function TEditForm.Execute(var EditParam:IR_Rahmen):Boolean;
begin
  with TEditForm.Create(Application) do begin
    <Editname>.Text := EditParam.Name;
    <Editgeraeteaddy>.Text := EditParam.geraeteaddy;
    [...]
    Result := (ShowModal=mrOK);
    if Result then begin
      EditParam.Name := <Editname>.Text;
      EditParam.geraeteaddy := <Editgeraeteaddy>.Text;
      [...]
    end;
  end;
end;

function TEditForm.FormClose...
begin
  if (ModalResult=mrOK) then begin
    // Hier die Werte prüfen auf plausibiblität
  end;
end;

und in der Hauptform wenn die Daten schon im Record stehen

Delphi-Quellcode:

  [...]
  if TEditForm.Execute(MyRecord) then begin
    // Daten übernehmen
  end;
  [...]

KRM 6. Mai 2007 18:25

Re: Daten von einem Formular in ein anderes übernehmen
 
hey cool,

das record war sowieso global und die beiden Formulare kannten sich auch, aber ich wusste nicht, dass man so einfach drauf zugreifen kann...

ok, das Problem ist allerdings noch nicht gelöst.

Denn wenn ich das neue Formular öffne, zeigt er mir immer das erste Element aus der ListBox an und nicht das, welches ich zuletzt angeklickt habe.


Kann es damit zusammen hängen, dass beim Schließen des Formulars eine Funktion aufgerufen wird, die die Listbox neu füllt und die erste Zeile dabei markiert?
(es mag sein, dass ich vllt um zu viele Ecken denke, aber ich denke dabei irgendwie, dass der Code, der beim FormDestroy ausgeführt werden soll, vllt schon intern vorher ausgeführt wird o_O)...

KRM 6. Mai 2007 18:32

Re: Daten von einem Formular in ein anderes übernehmen
 
@gremlin:

Ich probiers gleich mal.
Danke ;)

KRM 7. Mai 2007 11:27

Re: Daten von einem Formular in ein anderes übernehmen
 
Es funktioniert leider nicht, gremlin :(...

Hier mal der komplette code des Formulars:

Delphi-Quellcode:
unit rahmen_aendern;

interface

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

type
  TForm5 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Memo1: TMemo;
    Label4: TLabel;
    Button1: TButton;
    Button2: TButton;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    class function Execute(var EditParam:IR_Rahmen):Boolean;
  end;

type
  IR_Rahmen = record
    name        : string[50];
    geraeteaddy : string[5];
    befehl      : string[7];
    beschreibung : string[150];
  end;

var
  Form5: TForm5;

implementation

{$R *.dfm}


//class function TForm5.Execute(var EditParam:IR_Rahmen):Boolean;
//-> FEHLER: Deklaration von 'Execute' unterscheidet sich von vorheriger Deklaration
class function Execute(var EditParam:IR_Rahmen):Boolean;
begin
  with Form5.Create(Application) do begin
    Edit1.Text := EditParam.Name;
    Edit2.Text := EditParam.geraeteaddy;
    Edit3.Text := EditParam.befehl;
    Memo1.Text := EditParam.beschreibung;
    Result := (ShowModal=mrOK);
    if Result then begin
      EditParam.Name        := Edit1.Text;
      EditParam.geraeteaddy := Edit2.Text;
      EditParam.befehl      := Edit3.Text;
      EditParam.beschreibung := Memo1.Text;
    end;
  end;
end;

// OK-Button
procedure TForm5.Button1Click(Sender: TObject);
begin
  close;   // Eigenschaft: ModalResult = mrOk
end;

// Abbrechen-Button
procedure TForm5.Button2Click(Sender: TObject);
begin
  close;   // Eigenschaft: ModalResult = mrCancel
end;

procedure TForm5.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  if (ModalResult=mrOK) then begin
    // Hier die Werte prüfen auf plausibiblität
  end;
end;

end.
Wenn ich

Delphi-Quellcode:
class function TForm5.Execute(var EditParam:IR_Rahmen):Boolean;
Bei der funktions-def. angebe kommt die Fehlermeldung:
Delphi-Quellcode:
Deklaration von 'Execute' unterscheidet sich von vorheriger Deklaration
Wenn ich es dann so ändere, wie es oben steht ist die Fehlermeldung zwar weg, aber eine andere bleibt:

Delphi-Quellcode:
[Pascal Fehler] rahmen_aendern.pas(28): E2065 Ungenügende Forward- oder External-Deklaration: 'TForm5.Execute'
[Pascal Fataler Fehler] main.pas(109): F2063 Verwendete Unit 'rahmen_aendern.pas' kann nicht compiliert werden

Dabei wird mir dann die Zeile 28 knallrot angestrichen, also dort, wo die Deklaration von der function ist...

Was habe ich falsch gemacht?
Nebenbei noch die Frage: Kann ich die Button-proceduren so stehen lassen?
Ich habe bei den Buttons einfach die Eigenschaft ModalResult geändert.
Wird dann beim Schließen des Formulars automatisch der Wert des Buttons, dass gedrückt wurde zurück gegeben?

Die Plausibilitätsprüfungen habe ich im "IR-Rahmen erstellen"-Button über onKeyPress-Ereignisse gelöst.

Gremlin 7. Mai 2007 13:14

Re: Daten von einem Formular in ein anderes übernehmen
 
Du darfst nur denselben Typ für alle Parameter verwenden. Werden mehrere gleiche Typen in unterschiedlichen Units definiert, dann sind diese trotzdem unterschiedlich.
Ich nehme mal an, das in deiner Main der Typ für den IR_Rahmen schon deklariert wurde.

Delphi-Quellcode:
type
    class function Execute(var EditParam:IR_Rahmen):Boolean;
  end;

type
  IR_Rahmen = record
    name        : string[50];
    geraeteaddy : string[5];
    befehl      : string[7];
    beschreibung : string[150];
  end;

var
  Form5: TForm5;

implementation
Du solltest diesen einfach rauslöschen und dann müsste alles funktionieren.

KRM 7. Mai 2007 14:28

Re: Daten von einem Formular in ein anderes übernehmen
 
ok, es hat funktioniert. :thumb:

Ich habe den record IR_Rahmen in einer komplett seperaten Unit geschrieben, die in allen anderen Formularen bei Bedarf eingbunden werden kann (mittels uses) ;)...

VIELEN DANK!!!!!!!! :corky:

mschaefer 7. Mai 2007 16:15

Re: Daten von einem Formular in ein anderes übernehmen
 
TMemIni ..

KRM 10. Mai 2007 14:58

Re: Daten von einem Formular in ein anderes übernehmen
 
Hmmm...

es hat sich doch noch ein Problem ergeben...

Und zwar:

Delphi-Quellcode:
procedure TForm5.FormClose(Sender: TObject; var Action: TCloseAction);
var
  ok : BOOLEAN;
begin
  ok := true;
  if (ModalResult=mrOK) then begin
      // Editfelder die Standard-Windowfarbe verpassen
    Edit1.Color := clWindow;
    Edit2.Color := clWindow;
    Edit3.Color := clWindow;

    F_Message.Caption := '';
    ok := true;
    if length(Edit1.Text) < 2 then begin
      F_Message.Caption := F_Message.Caption +
                      '-> Der Name muss mindestens 2 Zeichen lang sein.'#13#10;
      Edit1.Color := clYellow;
      ok := false;
    end;
    if length(Edit2.Text) < 5 then begin
      F_Message.Caption := F_Message.Caption +
                      '-> Die Geräte-Adresse muss mindestens 5 Zeichen lang sein.'#13#10;
      Edit2.Color := clYellow;
      ok := false;
    end;
    if length(Edit3.Text) < 7 then begin
      F_Message.Caption := F_Message.Caption +
                      '-> Der Befehl muss mindestens 7 Zeichen lang sein. ';
      Edit3.Color := clYellow;
      ok := false;
    end;

  end;
end;
ist der Code, wenn der Benutzer den "übernehmen"-Button anklickt und das Formular geschlossen wird.
Nun sollen ja dort die eingaben überprüft werden.
Wie bewirke ich denn, dass bei falschen Eingaben das Formular geöffnet bleibt?


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

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