AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

MessageDLg beantwortet sich selbst?

Ein Thema von SearchBot · begonnen am 4. Okt 2017 · letzter Beitrag vom 5. Okt 2017
Antwort Antwort
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#1

AW: MessageDLg beantwortet sich selbst?

  Alt 4. Okt 2017, 12:41
Wie wird denn das Schließen der Form initiiert? Über einen anderen Button oder über das Schließen X?

Wenn über einen anderen Button, dann wird der Fehler sicherlich dort irgendwo liegen. Weil ein MessageDlg wird nicht 2x angezeigt. Hast du evtl. bei dem zweiten Button (oder irgendwo anders) schon einen ModalResult Wert vergeben der das Schließen der Form auslöst?

Zudem halte ich es für keine gute Idee, einen Event-Handler eines Buttons manuell aufzurufen. Lagere deine Speichern Funktion in eine gesonderte Procedure aus und rufe diese auf. Siehe Beispiel:

Delphi-Quellcode:
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  CanClose := False;
  if Editor.Modified then
    case MessageDlg('Text im Editor wurde bearbeitet. Soll vor dem Beenden dieser Text gespeichert werden?', mtConfirmation, [mbYes, mbNo, mbCancel], 0) of
     idYes:
     begin
       SaveChanges();
       CanClose := True;
     end;
     
     idNo: CanClose := True;
     
     idCancel: CanClose := False;
    end
  else
    CanClose := True;
end;

procedure TForm1.btn_saveClick(Sender: TObject);
begin
  SaveChanges();
end;


procedure TForm1.SaveChanges();
begin
  Memo1.Lines.SaveToFile(); // Oder welche Komponente auch immer bzw. wie auch immer der Speichervorgang ablaufen soll
end;
  Mit Zitat antworten Zitat
Glados
(Gast)

n/a Beiträge
 
#2

AW: MessageDLg beantwortet sich selbst?

  Alt 4. Okt 2017, 12:46
Zitat:
Muss das nicht mrYes statt idYes heißen? Natürlich die anderen beiden Resultate respektive.
Beides ergibt am Ende dasselbe: 6.
  Mit Zitat antworten Zitat
hsg

Registriert seit: 24. Apr 2006
Ort: Wustermark
354 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: MessageDLg beantwortet sich selbst?

  Alt 4. Okt 2017, 13:02
Zudem halte ich es für keine gute Idee, einen Event-Handler eines Buttons manuell aufzurufen. Lagere deine Speichern Funktion in eine gesonderte Procedure aus und rufe diese auf. Siehe Beispiel:
Warum? Ich muss gestehen, dass ich tatsächlich die Event-Handler direkt aufrufe. Brauche ich die Information, ob der Benutzer den Button betätigt hat, dann kann ich das Argument Sender prüfen. Ist es nil, dann kam der Aufruf direkt aus dem Source.
  Mit Zitat antworten Zitat
Glados
(Gast)

n/a Beiträge
 
#4

AW: MessageDLg beantwortet sich selbst?

  Alt 4. Okt 2017, 13:07
An btn_saveClick wird es meiner Meinung nach nicht liegen.
Irgendetwas passiert vorher schon. Daher ja die Frage, welche anderen Events du noch benutzt.
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: MessageDLg beantwortet sich selbst?

  Alt 4. Okt 2017, 13:17
Zudem halte ich es für keine gute Idee, einen Event-Handler eines Buttons manuell aufzurufen. Lagere deine Speichern Funktion in eine gesonderte Procedure aus und rufe diese auf. Siehe Beispiel:
Warum? Ich muss gestehen, dass ich tatsächlich die Event-Handler direkt aufrufe. Brauche ich die Information, ob der Benutzer den Button betätigt hat, dann kann ich das Argument Sender prüfen. Ist es nil, dann kam der Aufruf direkt aus dem Source.
Du musst nicht. Es geht auch so. Aber es ist meiner Meinung nach nicht besonders schön gelöst. Der Event-Handler ruft die Methode auf, die nur zum Speichern gedacht ist. Eventuell werden beim Button Click vorher noch Prüfungen durchgeführt die in einem anderen Fall nicht durchgeführt werden müssen. Und schon hast du den Salat. Deshalb macht man ja kleine und kompakte Funktionen die dann leichter erweiterbar sind und nicht überall direkt voll reingrätschen. Aber jedem das Seine. Ich mache es so wie ich es im Beispiel gezeigt habe und so machen es auch sehr viele andere Leute. Aber es bleibt dir überlassen wie du programmieren willst.

Aber nichts desto trotz. An dem Event-Handler liegt es sicherlich nicht. Das habe ich auch so nie gesagt. Ich habe eher das Stichwort ModalResult im Kopf. Aber auch hier bringt es nichts, dadrüber zu philosophieren. Der TE sollte sich da mal konkret du den Vorschlägen äußern und ggf. mehr SourceCode posten.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.629 Beiträge
 
Delphi 12 Athens
 
#6

AW: MessageDLg beantwortet sich selbst?

  Alt 4. Okt 2017, 13:35
Ich muss gestehen, dass ich tatsächlich die Event-Handler direkt aufrufe. Brauche ich die Information, ob der Benutzer den Button betätigt hat, dann kann ich das Argument Sender prüfen. Ist es nil, dann kam der Aufruf direkt aus dem Source.
Wenn du Zeit und Lust hast, dann lies mal diesen Artikel zu dem Thema: When, What, Why!
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.115 Beiträge
 
Delphi 2009 Professional
 
#7

AW: MessageDLg beantwortet sich selbst?

  Alt 4. Okt 2017, 13:45
Es ist schon nicht so einfach, mit Delphi-Mitteln einen modalen Dialog zu schließen. Als ich das mal machen musste, um einen Öffnen-Dialog beim Auswählen eines bestimmten Dateityps in den Ordner zu schicken, in dem sich diese Dateien ausschließlich befinden konnten, habe ich ein Alt+F4 oder Esc per Tastendruck an den Dialog geschickt.
Ich würde auf ein anderes Programm tippen oder einen kurzzeitigen Bug im Tastaturtreiber tippen.

Letztendlich enthält dieser Thread ab mikhals Post nur Offtopic. Man könnte z.B. auch noch die völlig sinnlose erste Zeile im Quelltext diskutieren.
Janni
2005 PE, 2009 PA, XE2 PA

Geändert von Redeemer ( 4. Okt 2017 um 13:48 Uhr)
  Mit Zitat antworten Zitat
hsg

Registriert seit: 24. Apr 2006
Ort: Wustermark
354 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: MessageDLg beantwortet sich selbst?

  Alt 4. Okt 2017, 13:53
Danke für die Erklärungen.
Ich muss gestehen, dass ich mir nie Gedanken über die Trennung "When, What, Why" gemacht habe. Größere Operationen teile ich instinktiv schon auf, weil ich kleine Source-Abschnitte bevorzuge. Die Schaltflächen haben naturgemäß Namen, die ausdrücken, was sie tun sollen (z.B. btnSave), sodass der Name der Eventroutine eigentlich das When- und What beinhaltet. Aber es wäre natürlich besser, das When- und What klarer zu trennen.
Ich werde in Zukunft versuchen, es besser zu machen.
  Mit Zitat antworten Zitat
SearchBot

Registriert seit: 27. Jun 2004
Ort: N-W vom Bodensee
328 Beiträge
 
Delphi 12 Athens
 
#9

AW: MessageDLg beantwortet sich selbst?

  Alt 5. Okt 2017, 11:32
Hallo,

also schließen tue ich über den X-Button vom Form.
Das funktioniert auch immer - außer wie beschrieben, wenn ich den Dialog einmalig gecancelt habe (weil das schließlich auch die einzige Antwort ist, die das Programm offen hält).

Komischerweise kann ich es heute nicht mehr reproduzieren - hat sich also von selbst gelöst
Ich wüßte nicht, wo ich das Verhalten des Dialogs beeinflussen könnte, um dieses Verhalten zu erzeugen.
Es ist weg, falls es wieder passiert melde ich mich wieder.

Zu den anderen erwähnten Dingen:
ich gehöre zu den Pfuschern und rufe überall im Programm Click-Ereignisse auch aus dem Code auf und unterscheide das dann mit dem Sender=nil oder ähnlich, das ist praktisch und "zerkrümelt" den Code nicht so. Ich hatte damit bisher keine Probleme, weshalb es mir auch nicht aufgefallen ist, das es blöd sein könnte. Oder ich tat mich schwer, wusste aber nicht warum

Aber Uwes Artikel hat mich nachdenklich gemacht (man könnte auch ins andere Extrem schwenken und für jedes Objekt auch eine eigene Unit machen wenn man schon die Funktionen aus den Events auslagert ) - immerhin hat mein Post dann doch was Gutes gehabt.
  Mit Zitat antworten Zitat
Glados
(Gast)

n/a Beiträge
 
#10

AW: MessageDLg beantwortet sich selbst?

  Alt 5. Okt 2017, 17:47
Zitat:
und für jedes Objekt auch eine eigene Unit machen
Vielleicht nicht für jedes Objekt. Aber du könntest Units erstellen mit Utils oder anderem thematisch identischen Code drin. Habe ich vor Kurzem auch begonnen.
Eine saumäßige Arbeit, wenn man das vorher nicht hatte Ein Pfuscher, der Events direkt aufruft, bin ich aber trotzdem noch.
  Mit Zitat antworten Zitat
Antwort Antwort

 
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 06:26 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