Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Erhalte falsches modalResult (https://www.delphipraxis.net/199905-erhalte-falsches-modalresult.html)

delphicoder123 28. Feb 2019 22:05

Erhalte falsches modalResult
 
Hallo,
nach dem Klick auf den Ok bzw. Abbrechen Button möchte ich als Result mrOK bzw. mrCancel erhalten.
Was ist an meinem Code falsch? Ich erhalte gleich beim Starten des Programms die Meldung "False".
Beim Klicken auf die Buttons aber keine Meldung.


Code:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    btnOK: TButton;
    btnAbbrechen: TButton;
    procedure btnOKClick(Sender: TObject);
    procedure btnAbbrechenClick(Sender: TObject);
    function modalErgebnis(): String;
    procedure FormActivate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}


 procedure TForm1.btnOKClick(Sender: TObject);
begin
  Form1.ModalResult:=mrOk;
end;

procedure TForm1.FormActivate(Sender: TObject);
begin
   ShowMessage( modalErgebnis() );
end;

procedure TForm1.btnAbbrechenClick(Sender: TObject);
begin
  Form1.ModalResult:=mrCancel;
end;

function TForm1.modalErgebnis(): String;
begin
  if Form1.ModalResult=mrOk then
  begin
    result:='OK';
  end
  else if Form1.ModalResult=mrCancel then
  begin
     result:='Abbrechen';
  end
  else
  begin
    result:='False';
  end;
end;

end.

old7 1. Mär 2019 03:49

AW: Erhalte falsches modalResult
 
Liste der Anhänge anzeigen (Anzahl: 1)
Du brauchst mindestens zwei Formulare :wink:

Das 1. ruft das 2. mit ShowModal auf und wertet das Ergebnis des Aufrufs aus.

Siehe angehängte Mini-Demo für Delphi7. Im 2. Formular ist Alles über den OI eingestellt.

Ydobon 1. Mär 2019 07:48

AW: Erhalte falsches modalResult
 
Angesichts deiner Fragen wäre es interessant zu erfahren, was du tatsächlich vor hast.
In
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
ist Sender immer die auslösende Komponente, auch wenn du diese Ereignisbehandlungsprozedur zusätzlich noch Button2, Button3,..,ButtonX zuweisen würdest.
Delphi-Quellcode:
(Sender as TButton).Caption
ergibt dann z.B. die Beschriftung des jeweils gedrückten Buttons. Oder die Eigenschaft "Tag" der Komponenten, eine beliebige Ganzzahl, die man zu solchen Identifizierungen auch nutzen kann.

delphicoder123 1. Mär 2019 08:21

AW: Erhalte falsches modalResult
 
Zitat:

Zitat von old7 (Beitrag 1426664)
Du brauchst mindestens zwei Formulare :wink:

Das 1. ruft das 2. mit ShowModal auf und wertet das Ergebnis des Aufrufs aus.

Siehe angehängte Mini-Demo für Delphi7. Im 2. Formular ist Alles über den OI eingestellt.

Die zip-Datei ist fehlerhaft.

jsp 1. Mär 2019 08:33

AW: Erhalte falsches modalResult
 
Nö... Alles funktioniert...

scrat1979 1. Mär 2019 09:13

AW: Erhalte falsches modalResult
 
Du hast im Ereignis „OnActivate“ ja weder mrOk noch mrCancel als ModalResult definiert, daher erscheint logischerweise „false“ als Ausgabe.

old7 1. Mär 2019 09:58

AW: Erhalte falsches modalResult
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von delphicoder123 (Beitrag 1426673)
Zitat:

Zitat von old7 (Beitrag 1426664)
Du brauchst mindestens zwei Formulare :wink:

Das 1. ruft das 2. mit ShowModal auf und wertet das Ergebnis des Aufrufs aus.

Siehe angehängte Mini-Demo für Delphi7. Im 2. Formular ist Alles über den OI eingestellt.

Die zip-Datei ist fehlerhaft.

Dann halt nocheinmal als 7z mit zusätzlicher EXE darin :wink:

Sherlock 1. Mär 2019 10:00

AW: Erhalte falsches modalResult
 
delphicoder123: Ich lege Dir aufgrund Deiner Fragen dringend nahe, eine Einführung in die Programmierung mit Delphi zu lesen. Z.B. folgendes freies eBook: https://de.wikibooks.org/wiki/Programmierkurs:_Delphi

Sherlock

Andreas L. 1. Mär 2019 10:04

AW: Erhalte falsches modalResult
 
Zitat:

Zitat von delphicoder123 (Beitrag 1426661)
Code:
  TForm1 = class(TForm)
    btnOK: TButton;
    btnAbbrechen: TButton;
    procedure btnOKClick(Sender: TObject);
    procedure btnAbbrechenClick(Sender: TObject);
    function modalErgebnis(): String;
    procedure FormActivate(Sender: TObject);
  end;

...

procedure TForm1.btnOKClick(Sender: TObject);
begin
  Form1.ModalResult:=mrOk;
end;

procedure TForm1.FormActivate(Sender: TObject);
begin
   ShowMessage( modalErgebnis() );
end;

procedure TForm1.btnAbbrechenClick(Sender: TObject);
begin
  Form1.ModalResult:=mrCancel;
end;

function TForm1.modalErgebnis(): String;
begin
  if Form1.ModalResult=mrOk then
  begin
    result:='OK';
  end
  else if Form1.ModalResult=mrCancel then
  begin
     result:='Abbrechen';
  end
  else
  begin
    result:='False';
  end;
end;

  • Wenn man auf die Variable des Forms (bei dir Form1) innerhalb der Form-Unit direkt zugreift, kann das in manchen Fällen Probleme geben. Ich würde an deiner Stelle lieber Self. statt Form1. verwenden oder den Namen komplett weglassen. Aus anderen Units z. B. Unit2 musst du natürlich Form1. voranstellen um auf das Form1 aus Unit1 zuzugreifen können.
  • Wie old7 schon geschrieben hat, muss natürlich das Form via ShowModal aufgerufen werden damit du an ModalResult rankommst (Rückgabe-Wert von ShowModal).
  • Du musst das ModalResult bei den Buttons nicht zwangsläufig im Code setzen. Du kannst einfach die ModalResult-Eigenschaft des Buttons im Objekt-Inspector festlegen. Bei einem Klick wird das ModalResult automatisch übergeben.
  • Wenn du mehrere Buttons hast mit jeweils unterschiedlichen ModalResults kannst du die Auswertung mit Case statt If machen.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  case Form2.ShowModal of
  begin
    mrOK: ShowMessage('OK gedrückt');
    mrCancel: ShowMessage('Abbrechen gedrückt');
    mrYes: ShowMessage('Ja gedrückt');
    mrNo: ShowMessage('Nein gedrückt');
    ...
  end
  else
    ShowMessage('Ein ModalResult wurde zurückgegeben das nicht im Case steht!');
end;
Der Else-Zweig ist Optional.

peterbelow 1. Mär 2019 13:38

AW: Erhalte falsches modalResult
 
Zitat:

Zitat von delphicoder123 (Beitrag 1426661)
Hallo,
nach dem Klick auf den Ok bzw. Abbrechen Button möchte ich als Result mrOK bzw. mrCancel erhalten.
Was ist an meinem Code falsch? Ich erhalte gleich beim Starten des Programms die Meldung "False".
Beim Klicken auf die Buttons aber keine Meldung.

TButton hat eine Eigenschaft ModalResult, die Du schon im Designer auf den Wert setzten kannst, den das ModalResult des Forms bekommen soll, wenn der Button geklickt wird. Wenn Du sonst nichts weiter tun mußt, wenn der Button betätigt wird, brauchst Du auch keinen OnClick handler für ihn.

Noch was: Die gängige Konvention für modale Dialoge ist, dass der OK-Button die Default-Eigenschaft auf true gesetzt hat, während der Cancel-Button die Cancel-Eigenschaft auf True gesetzt hat. Damit kann der Benutzer einfach die Return/Enter-Taste benutzen, um den OK-Button auszulösen, bzw. die ESC-Taste, um den Cancel-Button auszulösen, und zwar auch, wenn keiner der Buttons gerade den Fokus hat. Das geht nur dann nicht, wenn das Control mit Fokus diese Tasten selbst bearbeitet.


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