![]() |
2 Formulare Variabeln Übergabe
Hallo,
Ich habe ein kleines Programm welches 2 Formulare nutzt. Das 2te Formular dient dazu eine Auswahl zu treffen von 6 unterschiedlichen Ereignissen. Nun möchte ich eine Zählvariable (Bsp. Integer) verwenden und diese an das 1-te Formular zu übergeben. Dies ist auch gleichzeitig mein Hauptformular(1). Beide Formen wissen von ihrer gegenseitigen Existenz, dh. uses Form1; . Habe schon mehrfach probiert mir Prozeduren oder Funktionen in Form2 zu erstellen aber ein Aufruf ist mir leider nicht möglich in form1. (In einer früheren Sprache war das mal mit der Kennzeichnung '*' möglich, funktioniert hier allerdings nicht) Für mein Programm würde es eigentlich schon reichen wenn 2 Zählvariabeln übergeben werden, allerdings wenn ich mir diese in Form2 als public definiere erkennt Form1 diese nicht an. Die einzige Möglichkeit die ich daher gefunden habe ist das ich durch ein onclick- Ereignis diese Variable als String an ein Label in Form1 schicke. Persönlich finde ich dies nun als recht aufwendig und ich gehe davon aus, dass ich in Zukunft noch öfter derartige übergaben vornehmen möchte. Daher meine Frage: "Wie könnte ich das realisieren?" Habe schon folgenden Thread dazu gelesen: ![]() Dort verstehe ich aber leider folgenden Satz nicht. Zitat:
//Edit Titel verbessert |
Re: 2 Formulare Variabeln Übergabe
Zugriffsmethoden!
|
Re: 2 Formulare Variabeln Übergabe
Hallo Omata,
Danke für die schnelle Antwort. Googeln nach Zugriffsmethoden liefert mir folgendes: ![]() bzw. ![]() Dies bringt , mich allerdings nicht wirklich weiter, hättest du evtl. ein besseren Link? (Wenn ich dies als Frage auffasse.) Das 2te Formular ist eine Art Menüauswahl die nur aufgerufen wird wenn im 1-ten Formular ein Button geklickt wird. Dort setze ich dann: Form1.visible:=false; Form2.visible:=true; (*Ist vorher auf false gesetzt*) im 2-ten Formular muss man dann eine Auswahl treffen und erst nach getroffener Auswahl kann man einen "Zurück-Button" betätigen der dann Form1.visible:=true; setzt und Form2.visible:=False; An dieser Stelle möchte ich nun gern übergeben! (Prinzipiell ist es hier auch möglich die 2-te Form zu schließen, wie auch oben insofern das etwas ändern würde) Lg |
Re: 2 Formulare Variabeln Übergabe
Liste der Anhänge anzeigen (Anzahl: 1)
...
|
Re: 2 Formulare Variabeln Übergabe
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Omata und vielen Dank für dein Programm.
Entschuldige das ich erst jetzt Antworte aber da ich mich derzeit in der Prüfungsphase befinde, habe ich leider nicht eher Zeit dafür gefunden. Desweitern musste ich mich auch erst einmal mit der Tcombobox-Komponente vertraut machen und ich habe ca. ein halbe Stunde gebraucht bevor ich alle Befehle Nachgeschlagen habe und die Stelle gefunden habe an der die Obstsorten (Tcombo-Auswahl) definiert wird. :) Ich lese gerade ebenfalls ein Delphi-Einsteiger Buch, welches am Anfang den Vermerk gemacht hat, das es Kommentare gibt die der Compiler nicht Ignoriert. Dein Programm hat folgende Zeile: { TFAuswahl } Hat dieser Kommentar eine Bedeutung für die Übergabe? Ich habe mir Erlaubt dein Programm zu kommentieren und zu erweitern. I) erste Erweiterung (Globale Variable): Anlegen einer globalen Variable 'test' dazu jeweils ein Button für jede Form und im Haupformular ein Labelfeld als Kontrollausgabe. Allerdings wird hier nur ein beliebiger Wert übergeben. Wie ich aus obigen Link bereits erfahren habe ist dies Methode nicht gerade sehr geeignet allerdings würde ich schon gerne verstehen warum es auf diese Art und Weise nicht funktioniert. II) 2-te Erweiterung (Werteparameter) Mir ist durchaus bewusst das dass Programm bereits diese Anforderung erfüllt, allerdings habe ich versucht eine nicht 'Komponenten gebundene' Version davon auf zu stellen. In meinen Fall braucht der Anwender keine Kenntnis über die Existenz dieser Variable zu erhalten. Zu mind möchte ich dies erreichen.:) Allerdings wird nur ein beliebiger Speicherwert übergeben. III) 3-te Erweiterung (Referenzparameter) Erstaunlicher Weise funktioniert hier alles. :D Deinen #1 Beitrag verstehe leider immer noch nicht evtl. könntest du noch kurz erklären auf was du mich hinweisen wolltest. Mir ist durch aus bewusst das dies nun mehre Fragen gleichzeitig sind, allerdings gehören Sie auch auf die eine oder andere Weise zusammen daher bin ich unsicher ob ich nicht 3 Eigenständige Threads dazu eröffnen sollte oder nicht. In diesen Fall Bitte Beschied geben und ich werde dies tun. Lg |
Re: 2 Formulare Variabeln Übergabe
Zugriffsmethoden:
Delphi-Quellcode:
unit Unit2;
interface type Form2 = class (TForm) // ... private FVariable1: Integer; function GetVariable1: Integer; procedure SetVariable1 (Value: Integer); public // .. published property TestVariable1: Integer read FVariable1 write FVariable1; property TestVariable2: Integer read GetVariable1 write SetVariable1; end; implementation function TForm2.GetVariable1: Integer; begin Result := FVariable1; end; procedure TForm2.SetVariable1 (Value: Integer); begin FVariable1 := Value; end; end.
Delphi-Quellcode:
Beide Varianten greifen innerhalb von Form2 auf die gleiche Variable zu. TestVariable1 ist ein direkter Zugriff, TestVariable2 über Getter/Setter-Methoden.
procedure TForm1.Button1Click (Sender: TObject);
begin Form2.TestVariable1 := 12345; ShowMessage (inttostr (Form2.TestVariable2)); // = 12345 end; |
Re: 2 Formulare Variabeln Übergabe
Hallo Nuclearping und vielen Dank,
Denke damit habe ich das mit den Zugriffsmethoden verstanden. (hoffe ich zu mind. :-D ) Read/write bzw get/set falls ich Unit übergreifend Parameter verändern möchte. Ist diese Art auch Sinnvoll (Notwendig) wenn ich in der aktuellen Unit den Wert ändere und dann einfach das Ergebnis übergebe (als Konstante). Persönlich würde ich nun denken Nein, allerdings würden diese Erweiterung auch keine Veränderung hervorrufen. Meine folgendes damit:
Delphi-Quellcode:
Bzw.
public
property TestVariable1: Integer;
Delphi-Quellcode:
Solange ich die TestVariable1 nur in der aktuellen Unit verändere wäre beides gleich bedeutend oder?
public
published property TestVariable1: Integer read FVariable1 write FVariable1; Zu den anderen Fragen bin ich wie gesagt unsicher bezüglich meheren Threads. Lg |
Re: 2 Formulare Variabeln Übergabe
Hallo,
Ich mache mal ein push. Was habe ich den Falsch gemacht:? 1.) Zu viele Fragen ? 2.) zu trivial? 3.) unverständlich? Lg |
Re: 2 Formulare Variabeln Übergabe
ähm .. soweit ich das verstanden habe, willst du nur
ein paar Zählervariablen zwischen deine Forms austauschen ? Machs doch mit messages ?! Spricht etwas dagegen ?
Delphi-Quellcode:
// bei beiden:
const wm_mycounter=wm_user+$1234; ... // form1: postmessage(form2.handle, wm_mycounter, zähler, 0); // form2 tform2 = class... private procedure getcounter(var msg:TMessage); message wm_mycounter; // hier einfach aus der msg.wparam auslesen |
Re: 2 Formulare Variabeln Übergabe
Hallo mr_emre_d und Danke für deine Antwort!
Mit Messages habe ich leider noch überhaupt keine Erfahrung werde es mir aber in den nächsten Tagen anschauen. Zu deiner Frage jein, mein Programm benötigt eigentlich nur diese Funktion, allerdings habe ich versucht es etwas allgemeiner zu halten, da ich mit höher Wahrscheinlichkeit es in Zukunft noch öfter brauchen werde. :) Bisher habe ich das wie oben mit den Zugriffsmethoden so verstanden das diese nur benötigt werden wenn Formularübergreifend die Variable geändert werden soll. (Allerdings ist es Sinnvoll für evtl. spätere Erweiterungen dies Grundsätzlich zu tun.) Da mein Programm erst 1x downgeloadet wurde stelle ich mal den Code rein. (Ich denke es ziemlich schnell ersichtlich welche meine Veränderungen sind und welches das original von omata :mrgreen: ) Form1
Delphi-Quellcode:
2-te Formunit MainU; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TFMain = class(TForm) BtnAuswahl: TButton; EdAuswahl: TEdit; (* i) *) Label1: TLabel; Button1: TButton; Label2: TLabel; (* ii) *) Label3: TLabel; Button2: TButton; Label4: TLabel; Button3: TButton; (* iii) *) Label5: TLabel; Label6: TLabel; Button4: TButton; Button5: TButton; (* Clear*) Button6: TButton; procedure BtnAuswahlClick(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Button5Click(Sender: TObject); procedure Button6Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var FMain: TFMain; implementation {$R *.dfm} uses FAuswahlU; procedure TFMain.BtnAuswahlClick(Sender: TObject); var FAuswahl:TFAuswahl; begin FAuswahl:=TFAuswahl.Create(Self); (*init*) try FAuswahl.SetAuswahlText(EdAuswahl.Text); if FAuswahl.ShowModal = mrOK then EdAuswahl.Text:=FAuswahl.GetAuswahlText; finally (*Darunter immer ausfuehren*) FAuswahl.Release; (*Abschnitt(Form) aufrufbar*) end; end; (* i) *) procedure TFMain.Button1Click(Sender: TObject); var FAuswahl:TFAuswahl; a:integer; begin a:=FAuswahl.test; Label1.Caption:=inttostr(a); end; (* ii) *) procedure TFMain.Button2Click(Sender: TObject); VAR FAuswahl:TFAuswahl; a:integer; begin FAuswahl.test2(a); Label4.Caption:=inttostr(a); end; procedure TFMain.Button3Click(Sender: TObject); VAR FAuswahl:TFAuswahl; a:integer; begin FAuswahl.test2b(a); Label4.Caption:=inttostr(a); end; (* iii) *) procedure TFMain.Button4Click(Sender: TObject); VAR FAuswahl:TFAuswahl; a:integer; begin FAuswahl.test3(a); Label6.Caption:=inttostr(a); end; procedure TFMain.Button5Click(Sender: TObject); VAR FAuswahl:TFAuswahl; a:integer; begin FAuswahl.test3b(a); Label6.Caption:=inttostr(a); end; (*Clear*) procedure TFMain.Button6Click(Sender: TObject); begin Label1.Caption:=''; Label4.Caption:=''; Label6.Caption:=''; end; end.
Delphi-Quellcode:
(Habe leider noch nicht die Zeit gefunden es mit read/wirte bzw get/set zu Erweitern,
unit FAuswahlU;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TFAuswahl = class(TForm) BtnOK: TButton; BtnAbbruch: TButton; CoAuswahl: TComboBox; (* i) *) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } test:Integer; test_2:integer; function GetAuswahlText:string; procedure SetAuswahlText(Value:string); procedure test2(test_2:integer); function test2b(test_2:integer):integer; procedure test3(VAR test_3:integer); function test3b(Var test_3:integer):integer; end; implementation {$R *.dfm} { TFAuswahl } function TFAuswahl.GetAuswahlText: string; begin Result:=CoAuswahl.Text; (*Comboboxauswahl zu Ordnen (Obstsorte)*) end; procedure TFAuswahl.SetAuswahlText(Value: string); begin CoAuswahl.ItemIndex:=CoAuswahl.Items.IndexOf(Value); end; (* i) *) procedure TFAuswahl.Button1Click(Sender: TObject); (*Wertzuweisung fuer test-Globale Variable*) begin test:=1; end; (* ii) *) procedure TFAuswahl.test2(test_2:integer); begin test_2:=1; end; function TFAuswahl.test2b(test_2:integer):Integer; begin test_2:=1; end; (* iii) *) procedure TFAuswahl.test3(VAR test_3:integer); begin test_3:=1; end; function TFAuswahl.test3b(VAR test_3:Integer):Integer; begin test_3:=1; end; end. hoffe dies aber noch diese Woche nachzuholen. ) Zu diesen Programm hatte ich nun, eigentlich meine Fragen (siehe auch #5) 1.)
Delphi-Quellcode:
Hat dieser Kommentar eine Bedeutung für die Übergabe?
{ TFAuswahl }
2.)Der globalen Variable wird kein Wert zugewiesen bzw. bekomme ich einen beliebigen ( i) ) 3.)Werteparameter wird nicht übergeben dafür aber der Referenzparameter ( ii) und iii) ) (Werteparameter bekommt beliebigen aus Speicher - Referenz wird übergeben) Aufgrund, das dies nun mehere Fragen sind bin ich wie bereits erwähnt, unsicher bezüglich meheren Threads. Lg |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:10 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