AW: Eine Art Semi-ShowModal?
Code:
ich glaub ich versuch mich mal mit dieser Variante, ich geb dem Formular eine Funktion mit,
function ShowModal: TModalResult; overload;
procedure ShowModal(const ResultProc: TProc<TModalResult>); overload; die nach dem Schließen aufgerufen werden muss. Da muss ich zwar etwas umbauen, sieht aber besser aus.
Code:
wäre auch eine Option, nur gefallen mir die ganzen Konstrukte, wie gewartet wird, nicht.
Show;
WaitForMe; Danke erst mal für die Diskussion |
AW: Eine Art Semi-ShowModal?
@Baumina
Inwieweit widerspricht das eine dem anderen? Das Programm braucht zum Abarbeiten eines Tasks noch Eingaben von mir (und das vielleicht in einer Schleife - ich sage nicht, dass der TE das braucht, aber es geht um den allgemeinen Fall), und kann mit DIESEM Task ohne die Eingaben nicht weitermachen. Mir erscheint es extrem unschön, alles, was nach dieser einen Abfrage passiert, in eine anonyme Routine zu pressen, die man der Abfrage übergibt. Oder nimm einen anderes Beispiel:
Delphi-Quellcode:
Das wird mit so einer anonymen Methode ein völlig undurchsichtiger Wust.
berechne1;
if JetztBrauchIchNochDaten then Form1.ShowSemiModal; berechne2; if JetztBraucheIchNochAndereDaten then Form2.ShowSemiModal; berechne3; Und es kann schon vorkommen, dass der User zum Beantworten der Frage, die ihm das Programm stellt, gerne in irgend einem anderen Menüpunkt des Programms etwas nachschauen würde - geht bei modalen Fenstern nicht. @Sir Rufo Danke für den Link, das ist eine sehr interessante Komponente, die ich bei einigen Gelegenheiten schon gerne gehabt hätte. In der aktuellen Fragestellung geht es aber nicht um komplizierte Verschachtelungen, sondern um eine ganz einfache Schleife. Kompliziert wird es nur, wenn man sich darauf versteift, unter keinen Umständen mehr so programmieren zu dürfen, "wie zu DOS Zeiten". |
AW: Eine Art Semi-ShowModal?
Es geht hier eher um "nicht mehr wollen", denn das führte immer zu Spaghetti-Code.
Hier mal eine schnelle Implementierung, die alle anderen Show-Methoden (
Delphi-Quellcode:
,
Show
Delphi-Quellcode:
) nicht aushebelt.
ShowModal
Delphi-Quellcode:
unit Unit1;
interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.AppEvnts; type TForm1 = class( TForm ) private FApplicationEvents: TApplicationEvents; FSavedFormStyle : TFormStyle; FIsSemiModal : Boolean; FResultProc : TProc<TModalResult>; procedure ApplicationEventsIdle( Sender: TObject; var Done: Boolean ); protected procedure DoClose( var Action: TCloseAction ); override; public procedure ShowSemiModal( const ResultProc: TProc<TModalResult> ); procedure AfterConstruction; override; end; var Form1: TForm1; implementation {$R *.dfm} uses Vcl.Consts; { TForm1 } procedure TForm1.AfterConstruction; begin inherited; FApplicationEvents := TApplicationEvents.Create( Self ); FApplicationEvents.OnIdle := ApplicationEventsIdle; end; procedure TForm1.ApplicationEventsIdle( Sender: TObject; var Done: Boolean ); begin if FIsSemiModal and ( ModalResult <> mrNone ) then begin Exclude( FFormState, fsModal ); FormStyle := FSavedFormStyle; Close; end; end; procedure TForm1.DoClose( var Action: TCloseAction ); begin inherited; if FIsSemiModal then begin FIsSemiModal := False; Hide( ); FResultProc( ModalResult ); end; end; procedure TForm1.ShowSemiModal( const ResultProc: TProc<TModalResult> ); begin if not Enabled or Visible or ( fsModal in FormState ) then raise EInvalidOperation.Create( SCannotShowModal ); if not Assigned( ResultProc ) then raise EArgumentNilException.Create( 'ResultProc' ); FResultProc := ResultProc; FSavedFormStyle := FormStyle; FormStyle := fsStayOnTop; FIsSemiModal := True; Include( FFormState, fsModal ); Show( ); end; end. |
AW: Eine Art Semi-ShowModal?
Obwohl
Zitat:
Da Du ja keine Ruhe gibst... 8-) Zitat:
Allgemein: anonymen Methode bringen den Code lesbar da hin wo er gebraucht wird... Daher auch viel übersichtlicher als immer hin und her zu springen wo die eigentliche Procedure ist. Aber darum geht es nicht... Bleiben wir mal bei Deinem Beispiel... Zitat:
Ich fange den User doch nicht in so einer Schleife... Abgesehen von der UI-Task. Daher die 5 einfachen Regeln für ein reaktives Userinterface: Rule #1 / Führe nie Code in einem ONXYEvent aus der länger als wenige Millisekunden dauert. (Außer #2) Rule #2 / Ich will das Userinterface Updaten? Mach es im OnIdle Rule #3 / Du brauchst Application.Processmessages - Überprüfe Dein Design Rule #4 / Eine Aktion dauert 2xlänger als die Zeit einen Thread zu erzeugen? Erzeuge einen Thread! Rule #5 / Die Zeit eine Thread zu erzeugen ist zu lang. - Erzeuge den Thread vorher und starte ihn nur noch in wenigen (ns) {Auszug aus meinem Vortrag - Firemonkey im realen Crossplattform-Einsatz} Designe den Programm-Ablauf so wie der User es auch bedienen würde. Mavarik PS.: Rule #6 - Schau wie es der SIR macht... |
AW: Eine Art Semi-ShowModal?
Zitat:
|
AW: Eine Art Semi-ShowModal?
Zitat:
Zitat:
Zitat:
Zitat:
|
AW: Eine Art Semi-ShowModal?
Ich glaube ich mach hier dicht, den das Problem ist gelöst und die unterschiedlichen Ansichten werden auch durch weitere Diskzussion nicht abgebaut werden können.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 16: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