Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   Delphi Android/iOS Öffnen von anderen Forms (https://www.delphipraxis.net/189421-android-ios-oeffnen-von-anderen-forms.html)

rbrose 10. Jun 2016 11:41

Android/iOS Öffnen von anderen Forms
 
Hallo,

ich habe folgendes Problem. Ich finde nirgendwo im Internet wie man bei einer Android App oder iOS richtig die Forms wechselt und die korrekt schließt?

Also ich habe meine Anfangs Show LoginForm. Wenn ich ein Button Registrieren klicke, will ich die Registrieren Form öffnen. Das mache ich mit:

Delphi-Quellcode:
procedure TForm1.RegisterPopupButtonClick(Sender: TObject);
var
  RegisterForm: TForm2;
begin
//
  RegisterForm := RegistrierenForm.TForm2.CreateWithEmailAndPassword(EmailEdit.Text, registerPasswordEdit.Text);
  RegisterForm.Show;
end;
Die Register Form wird geöffnet und korrekt angezeigt.
Wenn ich jetzt aber wieder zurück will muss ich die procedure "Close" aufrufen und meine LoginForm wird wieder angezeigt.

Wenn ich aber aus der RegisterForm in eine neue Form springen will "HauptForm", erstelle ich mit HauptForm.Create(nil) ... und öffne die Form HauptForm.Show.
Soweit so gut, aber ich will das die RegisterForm geschloßen wird und ich beim schließen der HauptForm nicht mehr zurück zu RegisterForm komme sondern zum Login.

Wie schließe ich die RegisterForm korrekt? Also das die beim Öffnen der Hauptform nicht mehr im Speicher ist?

Peter666 10. Jun 2016 13:55

AW: Android/iOS Öffnen von anderen Forms
 
Dein TForm2 hat ein OnClose und da kannst du den Rückgabewert auf cafree setzen.

Peter

rbrose 12. Jun 2016 09:57

AW: Android/iOS Öffnen von anderen Forms
 
Vielen Dank Peter, das funktioniert gut.

Ich habe aber wieder ein anderes Problem.
Meine Android zeigt beim starten eine LoginForm und der User kann sich einloggen. Wenn er sich eingeloggt hat, wird die MainForm angezeigt.
Wenn der Benutzer jetzt den Android back button klickt, kommt er wieder auf die LoginForm. Das soll er aber nicht. Wie kann ich es machen das die LoginForm nach dem öffnen von der MainForm weg ist? Und bei drücken des back Buttons die APP sich schließt?

Und eine andere Sache noch, wenn der User sich das erste Mal eingeloggt hat wird es in der Datenbank gemerkt, beim nächsten Start will ich direkt auf die MainForm springen ohne die LoginForm zu öffnen. Kann ich die Überprüfung direkt im Program unit machen? Da wo Applikation.run aufgerufen wird? Oder wie macht man das korrekt?

Mavarik 12. Jun 2016 10:28

AW: Android/iOS Öffnen von anderen Forms
 
Die Frage kann man mit 100 Möglichkeiten beantworten.

Ich würde eine Steuerunit bauen...
Das MainForm ist eigentlich leer. Nur damit "was" zum laden da ist...

Darin kannst Du den Programmablauf steuern.

Main -> Passwort? Nein -> Form; Ja KeinForm
..|
Eigentliches Mainform...


usw...

Mavarik

rbrose 13. Jun 2016 18:48

AW: Android/iOS Öffnen von anderen Forms
 
Sorry ist mir irgendwie noch nicht klar.

Wenn ich z.B.

Delphi-Quellcode:
procedure TMasterDetailForm.FormCreate(Sender: TObject);
var
  LoginForm: TForm1;
begin
  DB:=TDB.Create(FDConnection1);
  try
    if not DB.isLogged then
      begin
       LoginForm := TForm1.Create(nil);
       LoginForm.Show;
      end;

  finally
    //nothing todo
  end;
end;
Im MainForm im Event FormCreate die LoginForm öffne, dann wird diese im Hintergrund geöffnet. Wie kriege ich diese in den Vordergrund?

Kann ich nicht vorher die Überprüfung machen? Und die mainform überhaupt nicht laden zu dem Zeitpunkt?
Oder muss eine Form existieren beim Programm start? In Android ist es ja eine Activity.

Wenn das nicht geht, dann muss ich die LoginForm in den Vordergrund kriegen und beim Android Back button die App schließen. Richtig?

rbrose 13. Jun 2016 20:52

AW: Android/iOS Öffnen von anderen Forms
 
Also ich habe jetzt bisschen rumprobiert und habe eine Möglichkeit gefunden. Habe aber noch ein Problem :-)

Es wird immer die MainForm gestartet und in dem CreateForm Ereignis prüfe ich ob der User sich einloggen muss und wenn ja öffne ich so die LoginForm:

Delphi-Quellcode:
var
  LoginForm: TForm1;
begin
  DB:=TDB.Create(FDConnection1);
  try
    if not DB.isLogged then
      begin
       LoginForm := TForm1.Create(nil);
       LoginForm.ShowModal(procedure(ModalResult : TModalResult)
                begin
                  if ModalResult = mrOK then
                    // do something here
                end);
      end;

  finally
    //nothing todo
  end;
ABER, wenn ich jetzt in eine Edit Komponente reinklicke ... taucht die Tastatur nicht mehr auf :-( Ich kann den Benutzernamen und Passwort nicht eingeben.

Wenn ich jetzt aber den Code oben in ein Button onClick Ereignis reintune, wird die LoginForm geöffnet und ich kann problemlos Benutzername und Passwort eingeben.

Wieso ist das so? Liegt es daran das der Focus nicht an der LoginForm liegt? Was für eine Möglichkeit habe ich?


Habe eine Lösung gefunden, die Form einfach im Thread starten und schon funktioniert es super:

http://stackoverflow.com/questions/3...monkey-project

QuickAndDirty 14. Jun 2016 07:59

AW: Android/iOS Öffnen von anderen Forms
 
Ich habe mich auch vorher mal erkundigt wie die Leute hier bei delphipraxis sowas machen und dann folgenden Ansatz ausgewählt.

Ich hab mir ein kleine "Framework" geschrieben das sich um die Navigation und die Anzeige von Formularen kümmert.

Grundsätzlich habe ich eine MainForm die immer sichtbar ist. Die Mainform und ein Seiten Menü sind quasi Teil des "Frameworks".

Auf der Mainform habe ich 3 Layout Controls als ViewPorts.
(HeaderViewPort,MainViewPort,FooterViewPort)

Auf jedem Formular habe ich ebenfalls 3 Layout Controls welche mit den ViewPorts korrespondieren.
In meinem Fall sind die per Namenskonvention zugeordnet, aber besser wäre wohl gewesen ein ILayoutsInterface oder so zu verwenden.


Wenn ich Navigate(MeinKontext) aufrufe passiert folgendes.
-Alle ViewPorts werden geleert.
-Das aktuelle Formular wird mit Release freigegeben und dann vergessen ( :=nil ) .
-Das Formular passend zum Kontext wird erzeugt
-Die Layouts werden per "Parent" property in den ViewPorts angezeigt.

bra 14. Jun 2016 08:28

AW: Android/iOS Öffnen von anderen Forms
 
Muss es eigentlich unbedingt ein Form sein? Wir haben bei uns alles in Frames ausgelagert und zeigen die bei Bedarf im Form an. Und ein Frame in den Vordergrund legen, funktioniert ohne Probleme.

DeddyH 14. Jun 2016 08:35

AW: Android/iOS Öffnen von anderen Forms
 
Oder man nimmt einfach ein TabControl und schaltet bei Bedarf die Seiten durch.

QuickAndDirty 14. Jun 2016 15:15

AW: Android/iOS Öffnen von anderen Forms
 
Zitat:

Zitat von bra (Beitrag 1340099)
Muss es eigentlich unbedingt ein Form sein? Wir haben bei uns alles in Frames ausgelagert und zeigen die bei Bedarf im Form an. Und ein Frame in den Vordergrund legen, funktioniert ohne Probleme.

Da laut Maverik Frames und Livebindings nicht so gut zusammen gingen habe ich diesen Ansatz verworfen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:18 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