![]() |
Standardverhalten von Dialogen (ab)ändern
Hallo
Ich habe ein Formular mit dem BorderStyle = bsDialog und zwei Buttons (OK und Abbrechen). Der OK-Button soll zwei Funktionen übernehmen, wenn Caption = Suche mache das und wenn Caption = Stop mache dies. Beispiel:
Delphi-Quellcode:
Doch egal welche Caption der btnOk hat, der Dialog wird immer geschlossen, auch wenn die erste Bedingung erfühlt ist.
procedure TSuchDialog.btnOKClick(Sender: TObject);
begin if (cboColumns.Text = '') or (cboFindText.Text = '') then Exit; if btnOK.Caption = '&Suche' then begin if (FSearchObj is TListView) and (not FSearching) then begin btnOK.Caption := '&Stop'; btnCancel.Enabled := false; SearchListView; end; end else if btnOK.Caption = '&Stop' then begin Close; ModalResult := mrOK; end; end; Falls jemand meint CloseQuery hilft hier, das sieht so aus:
Delphi-Quellcode:
FSearching wird mit dem Beginn von SearchListView auf 'true' gesetzt und beim beenden der Procedure auf 'false'.
procedure TSuchDialog.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin CanClose := not FSearching; end; Wie wird es also Richtig gemacht? Gruß |
Re: Standardverhalten von Dialogen (ab)ändern
Hast du genau '&Suche' eingegeben???
Wenn du im Caption nämlich 'Suche' eingegeben hast dan nimmt er es nicht an Auserdem ist FSearchObj wirklich TListView oder ein abgeleite klasse von TListView?? Wenn das eine etwas dumme Frage ist dan tut es mir leid dachte nur das du es vieleicht vergessen hast :oops: |
Re: Standardverhalten von Dialogen (ab)ändern
|
Re: Standardverhalten von Dialogen (ab)ändern
wo meinst du denn, dass er geschlossen wird???
wenn du ModalResult := mrOK gesetzt hast? das ist in der tat so, wenn ModalResult einen wert <> mrNone hat, wird der zugehörige Dialog geschlossen. ist aber schon immer so ... |
Re: Standardverhalten von Dialogen (ab)ändern
Wäre es nicht -sagen wir- marginal sauberer, zwei Buttons zu verwenden? Einen für 'Stop' und einen für 'Suche'. Sie liegen übereinander uns sichtbar ist entweder der eine oder der andere.
Das Event für den 'Suchen' Knopf verbirgt diesen und macht den "Stop"-Knopf sichtbar und umgekehrt. Über zwei separate und einfach zu verstehende Klick-Events kann man auch die Logik übersichtlich steuern. Denn die Lösung mit den Captions knallt ja, wenn irgendwer die Knöppe mit anderen Beschriftungen versieht (z.B. Internationalisierung). Die Lösung mit der 'Tag'-Eigenschaft ist da schon besser. |
Re: Standardverhalten von Dialogen (ab)ändern
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo
@NickelM Klar, verschreiben kann man sich immer! Nicht aber im diesen Fall. @Lukie Das mit der Tag-Eigenschaft ist klar, nur ändert das nichts am Problem. @grenzgaenger Nee, sobald SerachListView abgearbeitet und damit 'FSearching = true' ist. [edit] 'zwischengefunkt' @alzaimar Ja und Nein. Warum zwei Button für die gleiche Aufgabe verwenden? Im Zeitalter von Quad-Core und Co. mach es zwar egal sein, aber von der Funktionalität nicht. [/edit] @All Mal so nebenbei: Ist euch eigentlich schon mal aufgefallen, das da etwas Faul ist? Man nehme eine Hauptform und ein Dialog, bei dem Dialog, BorderStyle = bsDialog. Im Dialog, zwei Buttons und TEdit welches als property Text veröffentlicht ist, Im OI : btnOK = Caption = 'OK' = ModalResult = mrOK. btnCancel = Caption = 'Abbruch' = ModalResult = mrCancel. Den Dialog aus 'Project->Optione->Formulare->Automatisch Erzeugen' nach 'Project->Optione->Formulare->Verfügbare Formulare' verschieben. Und ruft den Dialog im über einen Menüpunkt im Hauptformular etwa so auf:
Delphi-Quellcode:
Angenommen Ihr habt im Edit einen Text eingegeben oder auch nicht, welchen Wert hat Ret wenn Ihr btnOk klickt?
procedure TForm1.DialogExecute(Sender: TObject);
var Ret :Boolean; St : String; begin Dialog := TDialog.Create(Self); try Dialog.ShowModal; Ret := SearchDialog.ModalResult = mrOK; if Ret then St := Dialog.Text; finally SearchDialog.Free; end; end; Nicht raten, testen. Gruß |
Re: Standardverhalten von Dialogen (ab)ändern
Zitat:
Delphi-Quellcode:
Wenn Du schon sagst,
procedure TSuchDialog.btnSearchClick(Sender: TObject);
begin if (cboColumns.Text = '') or (cboFindText.Text = '') then Exit; if (FSearchObj is TListView) and (not FSearching) then begin btSearch.Visible := false; btStop.Visible := true; SearchListView; end; end; procedure TSuchDialog.btnStopClick(Sender: TObject); begin if (cboColumns.Text = '') or (cboFindText.Text = '') then Exit; // Wird das *wirklich* auch beim Stop verwendet? Close; ModalResult := mrOK; end; Zitat:
Das hat alles im Übrigen mit Quadcores etc. nichts zu tun, sondern mit der direkten Umsetzung der Funktionalität ("zwei Funktionen"). Es kann auch Knöpfe geben, die ihre Beschriftung ändern, aber in Abhängigkeit der Beschriftung funktional sehr ähnliches ausführen. Dann würde ich auch nur einen Knopf nehmen. Zu deiner Frage: Neben den üblichen Flüchtigkeitsfehlern ('Dialog' vs. 'SearchDialog') kannst Du das Funktionsergebnis der Methode 'ShowModal' auswerten und nicht den Wert der Eigenschaft 'ModalResult' (kommt aber -denke ich- aufs Gleiche heraus). Bei mir funktioniert es jedenfalls so wie erwartet. [edit]Der Linker eliminiert übrigens die Zuweisung 'St := ...' sowie 'Rt := ...', da diese irrelevant sind. [/edit] |
Re: Standardverhalten von Dialogen (ab)ändern
Hi,
Überredet. MPS*-Buttons :thumb: Werde ich mir merken. |
Re: Standardverhalten von Dialogen (ab)ändern
Liste der Anhänge anzeigen (Anzahl: 1)
auch auf die gefahr hin, dass die psychologen selbst 'ne persönlichkeitsstörung bekommen... hier mal 'n beispiel eines MPS Dialogs ...
wichtig dabei ist, dass man den kopf vom körper trennt... der eine lenkt der andere teil arbeitet... aber nix mischeln ... :witch: |
Re: Standardverhalten von Dialogen (ab)ändern
Liste der Anhänge anzeigen (Anzahl: 1)
So, So
MPS Dialog: OK. Habe da auch einen der nur ein wenig MPS ist, aber dafür anders. |
Re: Standardverhalten von Dialogen (ab)ändern
wenn du den wert ModalResult <> MrNone setzt, wird dein form geschlossen. wenn du dann beim button click noch mals den modalresult setzt, wird dein vorheriger überschrieben...
wenn du also den modalresult im button setzt (wie in deinem beispiel), darfst du das close nicht mehr verwenden, wenn du das ergebnis auswerten möchtest. <HTH> GG |
Re: Standardverhalten von Dialogen (ab)ändern
Hallo Alter Mann,
das Phänomen erklärt soich wie folgt: Vor Aufruf des OnClick-Ereignisses wird der Wert aus ModalResult an die Form weitergegeben. In Deiner Ereignisbehandlung ruftst Du Close auf. Close besetzt modalResult mit mrCancel (2). Damit ist der Wert von Modalresult schon wieder geändert, bevor dieser ausgewertet wird. Gruß Thomas |
Re: Standardverhalten von Dialogen (ab)ändern
Hallo Thomas
genau das meinte ich. Was mich an der ganzen Sache stört ist der Ablauf als solches. Weise ich den Buttons keine Ereignisbehandlung zu, werden die ModalResult-Werte der Buttons zurückgegeben ansonsten immer mrCancel. Super Logik. Gruß |
Re: Standardverhalten von Dialogen (ab)ändern
Zitat:
Aber in der Procedure Close wird Modalresult für Modale Fenster explizit gesetzt. In einem Aktuellen Projekt gebe ich in der OnClick-Rutine Eines Buttons per Showmessage eine Nachricht aus. Der Button hat ModalResult = mrOk eingestellt. Nach bestätigen der Showmessage, schließt sich aufgrund des Modalresult die Form. Gruß Thomas |
Re: Standardverhalten von Dialogen (ab)ändern
was du machen könntest, wäre die close methode deiner form zu überschreiben und die rückgabewerte entsprechend zu setzen...
|
Re: Standardverhalten von Dialogen (ab)ändern
Ist schon Okay.
Es reicht jetzt :thumb: Wir haben das Thema genug erörtert, ich habe etwas dazu gelernt und gut. Schönes Wochenende und Tschüß :cheer: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:22 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