![]() |
Verständnisfrage zu DialogResult
Hallo, Allerseits.
In einer eigenen Komponente befindet sich eine Dialog-Box mit den beiden Buttons "OK" und "Cancel". Für den OK-Button ist DialogResult auf OK gesetzt und im Formular "AcceptButton := BuOK". Der Dialog öffnet sich, wenn die Komponente den Focus erhält. Soweit ist noch alles klar. Ich wollte nun erreichen, dass mit dem Schließen des Dialogs automatisch das nächste Steuerelement angesprungen wird. Ich habe das so versucht:
Delphi-Quellcode:
Das Problem dabei ist nun, dass das nächste Steuerelement immer angesprungen wird - auch beim Click auf den Cancel-Button. Wenn sich nun auf einem Formular ausschließlich meine Komponenten befinden, komme ich nicht mehr aus diesem Kreislauf heraus. Ursprünglich hatte ich das Problem auch mit dem OK-Button, konnte das aber mit "MyDialog.DialogResult := System.Windows.Forms.DialogResult.None;" lösen. Bei "BuCancel_Click" klappt das leider nicht.
procedure TStringEdit.MyControl_Enter(sender: System.Object; e: System.EventArgs);
begin if MyDialog.ShowDialog = System.Windows.Forms.DialogResult.OK then begin DoSomething; MyDialog.DialogResult := System.Windows.Forms.DialogResult.None; end; // if MyDialog.ShowDialog = OK parent.SelectNextControl(Self,true,true,true,true); end; Procedure TStringEdit.BuCancel_Click(sender: System.Object; e: System.EventArgs); begin MyDialog.Close; end; Wie komme ich da wieder raus??? Vielen Dank im Voraus und noch einen schönen Tag. Gruß Jürgen. |
Re: Verständnisfrage zu DialogResult
Hallo Jürgen,
Zitat:
Delphi-Quellcode:
Grüße vom marabu
procedure TStringEdit.MyControl_Enter(sender: System.Object; e: System.EventArgs);
begin if MyDialog.ShowDialog = System.Windows.Forms.DialogResult.OK then begin DoSomething; MyDialog.DialogResult := System.Windows.Forms.DialogResult.None; parent.SelectNextControl(Self,true,true,true,true); end; // if MyDialog.ShowDialog = OK end; |
Re: Verständnisfrage zu DialogResult
@ marabu
Vielen Dank - Hab's ausprobiert, hat aber leider nichts genützt. - :gruebel: Außerdem begreife ich jetzt gar nichts mehr! Auf einem Formular befinden sich 5 meiner eigenen Komponenten. Wenn diese Komponenten den Focus erhalten, wird ein Dialog geöffnet, d.h. beim Start des Programms ist der Dialog der ersten Komponente geöffnet. Durch Klick auf OK wird der Dialog geschlossen, das nächste Steuerelement angesprungen und der dazu gehörige Dialog geöffnet usw. Um diesen Ablauf zu unterbrechen, muss ich einen Dialog mit CANCEL beenden. - Und dabei passiert folgendes: Habe ich (bei 5 Komponenten) ein- bis viermal einen Dialog mit OK bestätigt, muss ich dann zwei- bis fünfmal CANCEL anklicken, um diesen (Teufels)kreis zu durchbrechen - also immer einmal öfter CANCEL als OK. Habe ich fünf- bis neunmal mit OK bestätigt, muss ich fünf- bis neunmal CANCEL anklicken - also CANCEL = OK. Bei zehn- bis vierzehnmal OK neun- bis dreizehnmal CANCEL - also CANCEL = OK-1. Und so weiter ... :wiejetzt: Mir ist das völlig unverständlich, da in StringEdit_Enter ja nur die bereits vorhandenen fünf Dialoge aufgerufen werden; es wird in der Prozedur ja nichts neues erzeugt. Vielleicht kann mir von Euch jemand weiterhelfen. Bis dahin verwende ich die weniger komfortable Variante. Grúß Jürgen. |
Re: Verständnisfrage zu DialogResult
Guten Morgen Jürgen,
mit .NET lebst du derzeit nicht in meiner Welt, so dass ich dir nicht so gut helfen kann. Mir fällt aber auf, das deine Benutzerschnittstelle eigentlich sequentielle Abläufe aufweist. Solche Abläufe werden bei GUI-Programmen eigentlich über einen Wizard (Assistenten, Genie) visuell gestaltet. Wäre das nicht auch eine Lösung für dich? Grüße, marabu |
Re: Verständnisfrage zu DialogResult
Guten Morgen, marabu.
Da verstehe ich leider nur Bahnhof! (Da trotz des fortgeschrittenen Alterns noch immer Anfänger). Trotzdem vielen Dank für Dein Engagement und noch einen schönen Tag. Gruß Jürgen. |
Re: Verständnisfrage zu DialogResult
Fast jede Setup-Routine kommt mit einem Wizard-Interface. Es zeichnet sich durch ein Panel mit den Schaltelementen (Vorwärts, Rückwärts, Beenden) im unteren Bereich und auswechselbare Tafeln im oberen Bereich aus. JEDI bringt einen JvWizard mit - wie es bei .NET aussieht, weiß ich leider nicht.
|
Re: Verständnisfrage zu DialogResult
Hallo Marabu.
Jetzt weiß ich, was Du meintest. Kommt für mich aber nicht in Frage. In meinem Fall handelt es sich um eine eigene Komponente, die zusammen mit den Standardkomponenten in einem Formular verwendet werden wird. Das Problem tritt nur dann auf, wenn mehrere meiner eigenen Komponenten hintereinander in der Tab-Reihenfolge liegen. Sobald das nächste Steuerelement ein "normales" Steuerelement ist, bin ich ja aus dem Teufelskreis entkommen. Aufgefallen ist mir das, weil ich zum Testen meiner Komponente auf einem Formular nur eigene Komponenten verwendet habe. Gruß Jürgen. |
Re: Verständnisfrage zu DialogResult
Hallo, Allerseits.
Ich bin mit meinem Problem nicht wirklich weitergekommen. Hier mal der Quelltext meiner Komponente:
Delphi-Quellcode:
Was ich festgestellt habe ist: Wenn durch Click auf den OK-Button in das nächste Steuerelement gewechselt wird, dann wird die Prozedur StrEdit_Leave nicht ausgeführt. Sollte sie m.E. aber, da ja zweifelsfrei das Steuerelement verlassen wird.
unit StringEdit;
interface uses System.Drawing, System.Collections, System.ComponentModel, System.Windows.Forms, System.Data; type StrEdit = class(System.Windows.Forms.TextBox) {$REGION 'Vom Designer verwalteter Code'} strict private /// <summary> /// Erforderliche Designervariable. /// </summary> Components : System.ComponentModel.Container; StrEditDialog : System.Windows.Forms.Form; StrEditDialogTextBox : System.Windows.Forms.TextBox; StrEditDialogOK : System.Windows.Forms.Button; StrEditDialogCancel : System.Windows.Forms.Button; /// <summary> /// Erforderliche Methode zur Unterstützung des Designers - /// ändern Sie die Methode nicht mit dem Quelltext-Editor /// </summary> procedure InitializeComponent; procedure StrEdit_Enter(sender: System.Object; e: System.EventArgs); procedure StrEdit_Leave(sender: System.Object; e: System.EventArgs); {$ENDREGION} strict protected /// <summary> /// Ressourcen nach der Verwendung bereinigen /// </summary> procedure Dispose(Disposing: Boolean); override; private { Private-Deklarationen } public constructor Create; end; [assembly: RuntimeRequiredAttribute(TypeOf(StrEdit))] implementation uses System.Globalization; {$AUTOBOX ON} {$REGION 'Vom Windows Form-Designer erzeugter Code'} /// <summary> /// Erforderliche Methode zur Unterstützung des Designers -- /// ändern Sie die Methode nicht mit dem Quelltext-Editor /// </summary> procedure StrEdit.InitializeComponent; begin // // StrEdit // Include(Self.Leave, Self.StrEdit_Leave); Include(Self.Enter, Self.StrEdit_Enter); end; {$ENDREGION} constructor StrEdit.Create; begin inherited Create; // // Erforderlich für die Unterstützung des Windows Forms-Designers // InitializeComponent; // // TODO: Fügen Sie nach dem Aufruf von InitializeComponent Konstruktorcode hinzu. // StrEditDialog := System.Windows.Forms.Form.Create; StrEditDialog.Size := System.Drawing.Size.Create(400,130); StrEditDialog.Text := 'Komfort-Eingabe'; StrEditDialog.ControlBox := false; StrEditDialogOK := System.Windows.Forms.Button.Create; StrEditDialogOK.Size := System.Drawing.Size.Create(100,30); StrEditDialogOK.Location := System.Drawing.Point.Create(StrEditDialog.Width-250, StrEditDialog.Height-70); StrEditDialogOK.Text := '&OK'; StrEditDialogOK.DialogResult := System.Windows.Forms.DialogResult.OK; StrEditDialog.Controls.Add(StrEditDialogOK); StrEditDialogCancel := System.Windows.Forms.Button.Create; StrEditDialogCancel.Size := System.Drawing.Size.Create(100,30); StrEditDialogCancel.Location := System.Drawing.Point.Create(StrEditDialog.Width-250+110, StrEditDialog.Height-70); StrEditDialogCancel.Text := '&Abbruch'; StrEditDialogCancel.DialogResult := System.Windows.Forms.DialogResult.Cancel; StrEditDialog.Controls.Add(StrEditDialogCancel); StrEditDialogTextBox := System.Windows.Forms.TextBox.Create; StrEditDialogTextBox.Size := System.Drawing.Size.Create(StrEditDialog.Width-25, 38); StrEditDialogTextBox.Location := System.Drawing.Point.Create(10,10); StrEditDialog.Controls.Add(StrEditDialogTextBox); end; procedure StrEdit.StrEdit_Leave(sender: System.Object; e: System.EventArgs); begin Self.BackColor := System.Drawing.Color.White; parent.BackColor := System.Drawing.Color.Red; end; procedure StrEdit.StrEdit_Enter(sender: System.Object; e: System.EventArgs); begin Self.BackColor := System.Drawing.Color.Yellow; if StrEditDialog.ShowDialog = System.Windows.Forms.DialogResult.OK then begin Findform.SelectNextControl(self,true,true,true,true); end; end; procedure StrEdit.Dispose(Disposing: Boolean); begin if Disposing then begin if Components <> nil then Components.Dispose(); end; inherited Dispose(Disposing); end; end. Vielleicht kann mir an Hand des o.a. Quelltextes jemand weiterhelfen? Vielen Dank im Voraus. Gruß Jürgen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:21 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz