Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   Android: Switch vom vorherigen Formular zurücksetzen (https://www.delphipraxis.net/186276-android-switch-vom-vorherigen-formular-zuruecksetzen.html)

amigage 19. Aug 2015 15:05

Android: Switch vom vorherigen Formular zurücksetzen
 
Hallo,

ich bin am Verzweifeln und hoffe auf Euren Tipp.

Und zwar habe zwei nur Firemonkey Formulare.

Form1 hat z.B. nur mehrere TSwitch-Komponenten, die bei Aktivierung ein neues Fenster Form2 öffnen.
Wenn in Form2 ein Zurück-Button betätigt wird, soll vor dem Schließen die gewählte TSwitch-Komponente wieder zurückgesetzt werden. (.isChecked := false);

Also merke ich mir die Komponente in der Variable
Delphi-Quellcode:
RememberSwitch
, um diese dann in der Prozedur
Delphi-Quellcode:
ResetSelectedSwitch()
ansprechen zu können.

Delphi-Quellcode:
type
  public
    { Public-Deklarationen }
    procedure ResetSelectedSwitch;
  end;

// Formular 1   
procedure TForm1.Switch1Switch(Sender: TObject);
var
  Dlg: TForm2;
begin
  RememberSwitch := TSwitch(Sender);
  showmessage(RememberSwitch.Name);  // der entsprechende Name der Komponente wird korrekt angezeigt
   
  if TSwitch(Sender).isChecked then
  begin
      Dlg := TForm2.Create(Self);
      Dlg.Show;
  end
end;

Und hier ist der Aufruf aus Form2.

Delphi-Quellcode:
// Formular 2 
procedure TForm2.btnCancelClick(Sender: TObject);
begin
  Form1.ResetSelectedSwitch;
  Close;
end;

Und hier entsteht bei der Ausgabe des Namens der gemerkten TSwitch-Komponente eine Zugriffsverletzung.

Delphi-Quellcode:
procedure TForm1.ResetSelectedSwitch;
begin
  showmessage(RememberSwitch.Name);  // <---- Zugriffsverletzung
  TSwitch(RememberSwitch).IsChecked := false;
end;

Ich habe es auch schon vorher über FindComponent() probiert, aber auch hier kam eine Zugriffsverletzung.

Ich freue mich über jedweden Hinweis. Danke.

Amigage

Mavarik 19. Aug 2015 15:34

AW: Android: Switch vom vorherigen Formular zurücksetzen
 
Sicher das die Exception da kommt und nicht beim Cancel?

amigage 19. Aug 2015 15:44

AW: Android: Switch vom vorherigen Formular zurücksetzen
 
Ja, sicher. Denn das funktioniert:

Delphi-Quellcode:
procedure TForm1.ResetSelectedSwitch;
begin
  showmessage('hier');
end;

Mavarik 19. Aug 2015 15:47

AW: Android: Switch vom vorherigen Formular zurücksetzen
 
ja aber dlg ist "out auf scope"

ARC!

Wo ist die Variable definiert?

Sir Rufo 19. Aug 2015 15:47

AW: Android: Switch vom vorherigen Formular zurücksetzen
 
und wie sieht es damit aus
Delphi-Quellcode:
// Formular 1
procedure TForm1.Switch1Switch(Sender: TObject);
var
  Dlg: TForm2;
  Switch : TSwitch absolute Sender;
begin
  showmessage(Switch.Name); // kann dann irgendwann raus ;o)

  if Switch.isChecked then
  begin
    Dlg := TForm2.Create(Self);
    Dlg.ShowModal( 
      procedure ( ModalResult : TModalResult )
      begin
        Switch.IsChecked := False;
      end );
  end
end;
Jetzt brauchst du die Form nur noch chliessen und alles wird gut

amigage 19. Aug 2015 16:09

AW: Android: Switch vom vorherigen Formular zurücksetzen
 
@Sir Rufo: Besten Dank, das war's. Damit muss ich mir auch nicht mehr die gewählte Komponente merken, sondern nur das ModalResult auswerten...

Neu für mich war auch:
Delphi-Quellcode:
Switch : TSwitch absolute Sender;
Lese ich das richtig, dass bei der Definition immer davon ausgegangen werden kann, dass es sich um TSwitch handelt? Bisher habe ich TSwitch(Sender) verwendet...

Beste Dank.
Amigage

Sir Rufo 19. Aug 2015 16:15

AW: Android: Switch vom vorherigen Formular zurücksetzen
 
Zitat:

Zitat von amigage (Beitrag 1312751)
Neu für mich war auch:
Delphi-Quellcode:
Switch : TSwitch absolute Sender;
Lese ich das richtig, dass bei der Definition immer davon ausgegangen werden kann, dass es sich um TSwitch handelt? Bisher habe ich TSwitch(Sender) verwendet...

Nein, kann man nicht, genausowenig, wie du bei
Delphi-Quellcode:
TSwitch(Sender)
davon ausgehen kannst, denn hier handelt es sich um einem harten Cast.

Wenn man aber eh einen harten Cast vornimmt, dann kann man das auch gleich so deklarieren und spart sich das ständige casten ... was einfach nur viel Schreibarbeit ist.

Wenn du es sicher haben möchtest, dann so
Delphi-Quellcode:
procedure TForm1.Switch1Switch(Sender: TObject);
var
  Dlg: TForm2;
  Switch : TSwitch absolute Sender;
begin
  // Wir prüfen, ob der Sender auch wirklich vom Typ TSwitch ist
  if not ( Sender is TSwitch ) then
    Exit; // ist nicht, dann z.B. raus hier

  showmessage(Switch.Name); // kann dann irgendwann raus ;o)

  if Switch.isChecked then
  begin
    Dlg := TForm2.Create(Self);
    Dlg.ShowModal(
      procedure ( ModalResult : TModalResult )
      begin
        Switch.IsChecked := False;
      end );
  end
end;


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