![]() |
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:
In der Listbox wird immer nur der String mit dem Namen angezeigt.
type
IR_Rahmen = record name : string[50]; geraeteaddy : string[5]; befehl : string[7]; beschreibung : string[150]; end; 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? |
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
|
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; [...] |
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)... |
Re: Daten von einem Formular in ein anderes übernehmen
@gremlin:
Ich probiers gleich mal. Danke ;) |
Re: Daten von einem Formular in ein anderes übernehmen
Es funktioniert leider nicht, gremlin :(...
Hier mal der komplette code des Formulars:
Delphi-Quellcode:
Wenn ich
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.
Delphi-Quellcode:
Bei der funktions-def. angebe kommt die Fehlermeldung:
class function TForm5.Execute(var EditParam:IR_Rahmen):Boolean;
Delphi-Quellcode:
Wenn ich es dann so ändere, wie es oben steht ist die Fehlermeldung zwar weg, aber eine andere bleibt:
Deklaration von 'Execute' unterscheidet sich von vorheriger Deklaration
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. |
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:
Du solltest diesen einfach rauslöschen und dann müsste alles funktionieren.
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 |
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: |
Re: Daten von einem Formular in ein anderes übernehmen
TMemIni ..
|
Re: Daten von einem Formular in ein anderes übernehmen
Hmmm...
es hat sich doch noch ein Problem ergeben... Und zwar:
Delphi-Quellcode:
ist der Code, wenn der Benutzer den "übernehmen"-Button anklickt und das Formular geschlossen wird.
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; 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 13:46 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