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/)
-   -   Delphi 2 Formulare Variabeln Übergabe (https://www.delphipraxis.net/128413-2-formulare-variabeln-uebergabe.html)

thomasku 29. Jan 2009 13:32


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:
http://www.delphipraxis.net/internal...ghlight=formen

Dort verstehe ich aber leider folgenden Satz nicht.
Zitat:

Zitat von mkinzler
Nein, du kannst aber auf Variablen, die im Interface deklariert wurden und auf nicht private Member der Form zugreifen

Lg

//Edit Titel verbessert

omata 29. Jan 2009 13:53

Re: 2 Formulare Variabeln Übergabe
 
Zugriffsmethoden!

thomasku 29. Jan 2009 14:12

Re: 2 Formulare Variabeln Übergabe
 
Hallo Omata,

Danke für die schnelle Antwort.

Googeln nach Zugriffsmethoden liefert mir folgendes:
http://docs.codegear.com/docs/radstu...thods_xml.html
bzw.
http://wwwswt.informatik.uni-rostock...griffsklauseln

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

omata 29. Jan 2009 16:12

Re: 2 Formulare Variabeln Übergabe
 
Liste der Anhänge anzeigen (Anzahl: 1)
...

thomasku 4. Feb 2009 12:06

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

nuclearping 4. Feb 2009 12:21

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:
procedure TForm1.Button1Click (Sender: TObject);
begin
  Form2.TestVariable1 := 12345;
  ShowMessage (inttostr (Form2.TestVariable2)); // = 12345
end;
Beide Varianten greifen innerhalb von Form2 auf die gleiche Variable zu. TestVariable1 ist ein direkter Zugriff, TestVariable2 über Getter/Setter-Methoden.

thomasku 4. Feb 2009 13:55

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:
public
  property TestVariable1: Integer;
Bzw.
Delphi-Quellcode:
public
  published
    property TestVariable1: Integer read FVariable1 write FVariable1;
Solange ich die TestVariable1 nur in der aktuellen Unit verändere wäre beides gleich bedeutend oder?


Zu den anderen Fragen bin ich wie gesagt unsicher bezüglich meheren Threads.

Lg

thomasku 8. Feb 2009 15:00

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

mr_emre_d 8. Feb 2009 15:07

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

thomasku 10. Feb 2009 16:44

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:


 unit 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.
2-te Form
Delphi-Quellcode:
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.
(Habe leider noch nicht die Zeit gefunden es mit read/wirte bzw get/set zu Erweitern,
hoffe dies aber noch diese Woche nachzuholen. )

Zu diesen Programm hatte ich nun, eigentlich meine Fragen (siehe auch #5)
1.)
Delphi-Quellcode:
{ TFAuswahl }
Hat dieser Kommentar eine Bedeutung für die Übergabe?
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 23:50 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