AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Verständnisfrage zu DialogResult

Ein Thema von gfjs · begonnen am 29. Sep 2006 · letzter Beitrag vom 1. Okt 2006
Antwort Antwort
gfjs

Registriert seit: 8. Dez 2005
Ort: Hohenkammer
298 Beiträge
 
Delphi 2006 Professional
 
#1

Verständnisfrage zu DialogResult

  Alt 29. Sep 2006, 10:47
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:
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;
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.

Wie komme ich da wieder raus???

Vielen Dank im Voraus und noch einen schönen Tag.

Gruß Jürgen.
Mein neues Motto (von "Unbekannt"):
Gewinnen: Wenn Du kannst - Verlieren: Wenn Du musst - Aufgeben: NIE!
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: Verständnisfrage zu DialogResult

  Alt 29. Sep 2006, 11:05
Hallo Jürgen,

Zitat von gfjs:
Das Problem dabei ist nun, dass das nächste Steuerelement immer angesprungen wird - auch beim Click auf den Cancel-Button.
musst du dann nicht einfach SelectNextControl() in den bedingten Zweig aufnehmen?

Delphi-Quellcode:
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;
Grüße vom marabu
  Mit Zitat antworten Zitat
gfjs

Registriert seit: 8. Dez 2005
Ort: Hohenkammer
298 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Verständnisfrage zu DialogResult

  Alt 30. Sep 2006, 07:09
@ marabu

Vielen Dank - Hab's ausprobiert, hat aber leider nichts genützt. - 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 ...

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.
Mein neues Motto (von "Unbekannt"):
Gewinnen: Wenn Du kannst - Verlieren: Wenn Du musst - Aufgeben: NIE!
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: Verständnisfrage zu DialogResult

  Alt 30. Sep 2006, 07:45
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
  Mit Zitat antworten Zitat
gfjs

Registriert seit: 8. Dez 2005
Ort: Hohenkammer
298 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Verständnisfrage zu DialogResult

  Alt 30. Sep 2006, 07:51
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.
Mein neues Motto (von "Unbekannt"):
Gewinnen: Wenn Du kannst - Verlieren: Wenn Du musst - Aufgeben: NIE!
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#6

Re: Verständnisfrage zu DialogResult

  Alt 30. Sep 2006, 07:56
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.
  Mit Zitat antworten Zitat
gfjs

Registriert seit: 8. Dez 2005
Ort: Hohenkammer
298 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Verständnisfrage zu DialogResult

  Alt 30. Sep 2006, 08:03
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.
Mein neues Motto (von "Unbekannt"):
Gewinnen: Wenn Du kannst - Verlieren: Wenn Du musst - Aufgeben: NIE!
  Mit Zitat antworten Zitat
gfjs

Registriert seit: 8. Dez 2005
Ort: Hohenkammer
298 Beiträge
 
Delphi 2006 Professional
 
#8

Re: Verständnisfrage zu DialogResult

  Alt 1. Okt 2006, 19:27
Hallo, Allerseits.

Ich bin mit meinem Problem nicht wirklich weitergekommen. Hier mal der Quelltext meiner Komponente:

Delphi-Quellcode:
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.
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.

Vielleicht kann mir an Hand des o.a. Quelltextes jemand weiterhelfen?

Vielen Dank im Voraus.

Gruß Jürgen.
Mein neues Motto (von "Unbekannt"):
Gewinnen: Wenn Du kannst - Verlieren: Wenn Du musst - Aufgeben: NIE!
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 15:19 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