AGB  ·  Datenschutz  ·  Impressum  







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

Verständnisfragen zu Forms

Ein Thema von ChrisTG · begonnen am 2. Jul 2013 · letzter Beitrag vom 2. Jul 2013
Antwort Antwort
ChrisTG

Registriert seit: 2. Jul 2013
2 Beiträge
 
#1

Verständnisfragen zu Forms

  Alt 2. Jul 2013, 08:49
Delphi-Version: 6
Hallo zusammen,

ich habe folgende Ausgangslage, die ich irgendwie nicht komplett in einer Struktur abgebildet bekomme.
Es sind 2 Forms vorhanden. Standardmäßig soll das Programm ohne Forms laufen. Tritt ein bestimmtes Ereignis ein, soll erst eine Form eingeblendet werden. Dort hat man dann die Möglichkeit "Ja" oder "Nein" zu drücken. Beim Druck auf "Ja" schließt sich Form1 und Form2 wird geöffnet.
Und genau hier komme ich nicht weiter: Wie schaffe ich es, dass ich an einer Stelle alle Type und Konstantendefinitionen erstellen kann, man trotzdem aus den Methoden der Forms darauf zugreifen kann und Form1 sich selbst schließt und Form2 öffnet?
Bei den Ansätzen die ich versucht hatte, bin ich an dem Punkt gescheitert dass ich Unit1 in Unit2 referenzieren musste und eigentlich auch Unit2 in Unit1. Das geht natürlich nicht.
Wo ist mein Denkfehler?
Bin für jeden Tipp dankbar.

Gruß
Christian
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.619 Beiträge
 
Delphi 12 Athens
 
#2

AW: Verständnisfragen zu Forms

  Alt 2. Jul 2013, 08:51
Pack die Typen und Konstanten einfach in eine eigene Unit, die Du in beiden Formularunits einbindest.

P.S.: Willkommen in der DP
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 Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.639 Beiträge
 
#3

AW: Verständnisfragen zu Forms

  Alt 2. Jul 2013, 08:57
Pack die Typen und Konstanten einfach in eine eigene Unit, die Du in beiden Formularunits einbindest.
Yikes. Das ist natürlich komplett Ansichtssache, aber ich würde genau anders herum vorgehen (MVVM-Like).

Die beiden Forms haben genau Null logik. Noch nicht einmal Eventhandler.
Ein UIController würde beide Form-Units kennen.
Der UIController würde den Ja/Nein-Dialog instanziieren, sich dort auf das Event mit einem eigenen Handler attachen und dann das erste Form anzeigen.
Wenn dort Ja geclickt wurde, würde er das gleiche mit Form 2 machen, sich an die Eingabeevents hängen und ein ViewModel an das Form übergeben. Das Form 2 würde dann lediglich dafür sorgen, das das ViewModel korrekt mit den aktuellen Usereingaben gefüllt wird.

Wenn der User dann die Eingabe abschliesst, kann der UIController das Form zerstören, hat aber noch alle Eingaben im ViewModel parat und kann die entsprechend verarbeiten.

Der Code der Anwendung braucht somit nur eine Instanz des UIControllers und kann darüber alles abfackeln.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Benutzerbild von baumina
baumina

Registriert seit: 5. Mai 2008
Ort: Oberschwaben
1.275 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Verständnisfragen zu Forms

  Alt 2. Jul 2013, 09:12
Delphi-Quellcode:
unit Main;

  ....

implementation

uses Unit1, Unit2;

....
Procedure ShowUnit1;
begin
  If Form1.ShowModal = mrOK then
  begin
    Form2.ShowModal;
  end;
end;

end.
Delphi-Quellcode:
unit Unit1;

interface

uses
  ....

type
  TForm1 = class(TForm)
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

uses Unit2;

{$R *.dfm}

end.
Delphi-Quellcode:
unit Unit2;

interface

uses
  ....

type
  TForm2 = class(TForm)
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form2: TForm2;

implementation

uses Unit1;

{$R *.dfm}

end.
So in etwa?
Hinter dir gehts abwärts und vor dir steil bergauf ! (Wolfgang Ambros)
  Mit Zitat antworten Zitat
ChrisTG

Registriert seit: 2. Jul 2013
2 Beiträge
 
#5

AW: Verständnisfragen zu Forms

  Alt 2. Jul 2013, 10:13
Hallo,

Danke für die Antworten!
Das Codebeispiel ist im Grunde genommen, was ich möchte.
Allerdings würde ich gerne den 1. Dialog nicht als Modaldialog öffnen, sondern den weiteren Ablauf per OnClick steuern.
Also Benutzer klickt Button auf Form1 -> Form1 schließt sich und es öffnet sich Form2.
Ist das so möglich?
  Mit Zitat antworten Zitat
Benutzerbild von baumina
baumina

Registriert seit: 5. Mai 2008
Ort: Oberschwaben
1.275 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Verständnisfragen zu Forms

  Alt 2. Jul 2013, 10:20
Delphi-Quellcode:
unit Main;

   ....

implementation

uses Unit1;

 ....
Procedure ShowUnit1;
begin
  Form1.Show;
end;

end.
Delphi-Quellcode:
unit Unit1;

interface

uses
   ....

type
   TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
   private
     { Private-Deklarationen }
   public
     { Public-Deklarationen }
   end;

var
   Form1: TForm1;

implementation

uses Unit2;

{$R *.dfm}

procedure Unit1.Button1Click(Sender: TObject);
begin
  Form2.Show;
  Close;
end;

end.
Hinter dir gehts abwärts und vor dir steil bergauf ! (Wolfgang Ambros)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#7

AW: Verständnisfragen zu Forms

  Alt 2. Jul 2013, 11:16
@Phoenix
Wow, das ganze bitte mal in Zeitlupe.
Könntest Du das bitte einmal an einem Beispiel verdeutlichen?
Ich muß zugeben, daß ich so gut wie nichts verstanden habe.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.639 Beiträge
 
#8

AW: Verständnisfragen zu Forms

  Alt 2. Jul 2013, 11:46
@Phoenix
Wow, das ganze bitte mal in Zeitlupe.
Könntest Du das bitte einmal an einem Beispiel verdeutlichen?
So grob in Pseudocode (ich hab Delphi seit Jahren nicht mehr angefasst und schreibe eigentlich nur noch Webanwendungen in C# und JavaScript):

Code:
method GetUserInput() // wird aus dem normalen Code heraus aufgerufen:
begin
  var ctlr := new UIController();
  ctlr.OnInputFinished := InputFinished;

  ctlr.GetInput();
end;

method InputFinished(sender, eventArgs)
begin

   // controller wieder aufräumen
   var ctlr = sender als UIController;
   ctlr.Dispose();
 
   // benutzereingabe verarbeiten:
   var input := (eventArgs as UserInputEventArgs).Model;
   ...
end;


// Klasse UIController:

using Form1, Form2; // Form 1 und Form 2 sind *strunzdoof* und geben nur ihre Events nach draussen. Sonst haben die absolut keine eigene Logik, so wie sich das für MVVM gehört

method GetInput() : passenderDatentyp
begin

  var dialog = new Form1();
  dialog.OnButtonClick := Form1ButtonClicked;
  dialog.Show();

end;

method Form1ButtonClicked(sender, eventArgs)
begin

  // form 1 wegräumen
  var form1 := sender as Form1;
  form1.Hide();

  var result := form1.ViewModel; // Datentyp des Viewmodels. Für Form1 liefert das nur zurück, welcher Button gedrückt wurde
  form1.Dispose();

  // optional je nach Eingabe weitermachen, EventArgs ist hier ein eigener Typ
  if (result.OKClicked)
  begin

    var model = new Form2ViewModel();

    var form2 := new Form2(model);
    form2.OnUserInputReady := Form2UserInputReady;
    form2.Show();
  end;

end;

method Form2UserInputReady(sender, eventArgs)
begin

  var form2 := sender as Form2;
  form2.Hide();
  var model = form2.Model;  // Formularstatus abrufen:
 
  form2.Dispose();

  // event auslösen das die Benuztereingabe fertig ist
  OnInputFinished(self, new UserInputEventArgs(model));
end;
Wie man sieht ist das ganze Eventgesteuert gehalten. Wenn die Formulare ggf. auf einem anderen Thread laufen blockiert da also nichts.

Mit einer leichten Anpassungen (hineingeben einer FormFactory in den UIController) kann man sogar die ganze Geschichte am Ende sauber Unit-Testen. Anstelle der echten Factory die die echten Formulare erzeugt würde dann eine TestFactory reingegeben, die beliebige Test-Eingaben auf die Models schreibt und dann die events auslöst. Die echten Formulare hingegen können auch mit Test-Models bestückt und getestet werden.

Der UIController muss lediglich die Formulare (besser noch: Nur Interfaces der Formulare) kennen.

So schreibt man entkoppelten und Testbaren Code. Klar kann man auch alles in Form1.OnButton1Click reinbolzen, aber eine saubere Anwendungsarchitektur dankt es einem hinterher, wenn man das nicht macht.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#9

AW: Verständnisfragen zu Forms

  Alt 2. Jul 2013, 12:02
Also irgendwie ist das alles zu kompliziert und undurchsichtig.
Dieses Ja/Nein-Formular ist sehe ich eindeutig als modales Formular.
Der Benutzer kann entweder Ja oder Nein wählen (oder Schliesen-Icon als 3. Möglichkeit).
Das modale Formular gibt einfach zurück für was sich der Benutzer entschieden hat.
Und das modale Formular benötigt keinerlei Wissen über das andere Formular.
Das bewirkt eine saubere Entkoppelung der beiden Formulare!

Delphi-Quellcode:
// liefert mrYes, mrNo oder mrAbort jenachdem wie sich der Benutzer entscheidet
function FrageUserWasErWill:TModalResult;
var
  f : TFormJaNein;
begin
  f := TFormJaNein.Create(nil);
  try
    f.Caption := 'Wollen Sie das Internet wirklich löschen ?';
    result := f.ShowModal;
  finally
    f.Free;
  end;
end;

....
var
  erg : TModalResult;
  f2 : TForm2;
begin
  // dieser Code steuert den Ablauf
  erg := FrageUserWasErWill;
  if erg = mrAbort then
     exit; // User hat Close-Icon geklickt (Programm beenden?)
  f2 := TForm2.Create(Application);
  if erg = mrYes then
    f2.BombeAktiv := True
  else
    f2.BombeAktiv := false;
  f2.Show;
fork me on Github
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#10

AW: Verständnisfragen zu Forms

  Alt 2. Jul 2013, 12:14
@Phoenix
Danke, mal schauen was sich daraus machen läßt.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Antwort Antwort


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 04:31 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