AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Eine Art Semi-ShowModal?

Ein Thema von sh17 · begonnen am 26. Aug 2015 · letzter Beitrag vom 27. Aug 2015
Thema geschlossen
Seite 1 von 2  1 2      
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.153 Beiträge
 
Delphi 10.3 Rio
 
#1

AW: Eine Art Semi-ShowModal?

  Alt 27. Aug 2015, 12:51
Es gab Zeiten, da gab es keine Türklingeln und man hat periodisch nachschauen müssen, ob jemand vor der Tür steht.
Türklingeln sind also überflüssig.
Ja das kenne ich auch noch...

Ich habe immer gewartet bis ich das Sync-Loch der Diskette gesehen habe und dann meine Daten geschrieben...
 
idefix2

Registriert seit: 17. Mär 2010
Ort: Wien
1.027 Beiträge
 
RAD-Studio 2009 Pro
 
#2

AW: Eine Art Semi-ShowModal?

  Alt 27. Aug 2015, 13:35
Meines Erachtens ist ein grundlegender Unterschied zwischen der asynchronen Reaktion auf ein beliebiges Ereignis, und dem Warten auf die Beendigung eines Tasks, um dann mit dem normalen Programmablauf fortzufahren.

Und die Übergabe als Prozedur funktioniert überhaupt nicht, oder nur mit gröbsten Verrenkungen bzw. völlig unnötigen Rekursionen, wenn der Aufruf der Form in einer Schleife stattfindet.

Delphi-Quellcode:
repeat
   Berechne;
   Form1.ShowSemiModal;
   berechneweiter;
   until BefriedigendesErgebnis;

Zitat:
Warum zum Geier wollt Ihr alle CPU-Zeit verschwenden mit Abfragen, Timer, Sleep und Application.Processmessages?
Erfreulicherweise ist die CPU-Zeit, die dadurch "veschwendet" wird, völlig vernachlässigbar. Bei einer modernen CPU wird da alle 200 Millisekunden nicht einmal eine Mikrosekunde verbraten.

Geändert von idefix2 (27. Aug 2015 um 13:50 Uhr)
 
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.153 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Eine Art Semi-ShowModal?

  Alt 27. Aug 2015, 13:45
Delphi-Quellcode:
repeat
   Berechne;
   Form1.ShowSemiModal;
   Form1.WaitForMe;
   berechneweiter;
until BefriedigendesErgebnis;
Ja, so programmiere ich auch... Ne Stopp das war noch zu DOS Zeiten...

Seit Borland Pascal für Windows programmiert man aber Event-Orientiert...
 
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Eine Art Semi-ShowModal?

  Alt 27. Aug 2015, 13:50
In so einem Fall sollte man sich auch von einer Schleife verabschieden und das mit etwas ersetzen, was zu dem Use-Case besser passt: Eine State-Machine.

Damit bekommt man dann auch die kompliziertesten Verschachtelungen sauber in den Griff.

http://melander.dk/delphi/statemachine/
https://github.com/malcolmgroves/TStateMachine (nicht so tolle Portierung von https://github.com/nblumhardt/stateless (C#))
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
 
Benutzerbild von baumina
baumina

Registriert seit: 5. Mai 2008
Ort: Oberschwaben
1.275 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Eine Art Semi-ShowModal?

  Alt 27. Aug 2015, 13:51
Meines Erachtens ist ein grundlegender Unterschied zwischen der asynchronen Reaktion auf ein beliebiges Ereignis, und dem Warten auf die Beendigung eines Tasks, um dann mit dem normalen Programmablauf fortzufahren.

Und die Übergabe als Prozedur funktioniert überhaupt nicht, oder nur mit gröbsten Verrenkungen bzw. völlig unnötigen Rekursionen, wenn der Aufruf der Form in einer Schleife stattfindet.

Delphi-Quellcode:
repeat
   Berechne;
   Form1.ShowSemiModal;
   berechneweiter;
   until BefriedigendesErgebnis;
Du solltest vielleicht nochmal nachlesen was der TE eigentlich wollte. Er möchte in dem Formular, das dieses SemiModalDingens aufrufen wird, z.B. das Menü weiterhin bedienbar haben und eben nicht in einer Schleife landen, in der der Benutzer nur durch Schließen des SemiFensters irgendwie fortfahren kann.
Hinter dir gehts abwärts und vor dir steil bergauf ! (Wolfgang Ambros)
 
Benutzerbild von sh17
sh17

Registriert seit: 26. Okt 2005
Ort: Radebeul
1.675 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Eine Art Semi-ShowModal?

  Alt 27. Aug 2015, 14:03
Code:
function ShowModal: TModalResult; overload;
    procedure ShowModal(const ResultProc: TProc<TModalResult>); overload;
ich glaub ich versuch mich mal mit dieser Variante, ich geb dem Formular eine Funktion mit,
die nach dem Schließen aufgerufen werden muss. Da muss ich zwar etwas umbauen, sieht aber
besser aus.

Code:
Show;
WaitForMe;
wäre auch eine Option, nur gefallen mir die ganzen Konstrukte, wie gewartet wird, nicht.

Danke erst mal für die Diskussion
Sven Harazim
--
 
idefix2

Registriert seit: 17. Mär 2010
Ort: Wien
1.027 Beiträge
 
RAD-Studio 2009 Pro
 
#7

AW: Eine Art Semi-ShowModal?

  Alt 27. Aug 2015, 14:17
@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:
berechne1;
if JetztBrauchIchNochDaten then
   Form1.ShowSemiModal;
berechne2;
if JetztBraucheIchNochAndereDaten then
   Form2.ShowSemiModal;
berechne3;
Das wird mit so einer anonymen Methode ein völlig undurchsichtiger Wust.
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".
 
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: Eine Art Semi-ShowModal?

  Alt 27. Aug 2015, 14:32
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 (Show , ShowModal ) nicht aushebelt.
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.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
 
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.153 Beiträge
 
Delphi 10.3 Rio
 
#9

AW: Eine Art Semi-ShowModal?

  Alt 27. Aug 2015, 14:41
Obwohl

Danke erst mal für die Diskussion
eigentlich den Thread schon beendet hat.

Da Du ja keine Ruhe gibst...

Das wird mit so einer anonymen Methode ein völlig undurchsichtiger Wust.
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.
Na eben... Daher ist Modal sowieso schlecht...

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...

Delphi-Quellcode:
repeat
   Berechne;
   Form1.ShowSemiModal;
   berechneweiter;
until BefriedigendesErgebnis;

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...
 
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#10

AW: Eine Art Semi-ShowModal?

  Alt 27. Aug 2015, 14:43
PS.: Rule #6 - Schau wie es der SIR macht...
Das impliziert aber noch die Rule #7
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
 
Thema geschlossen
Seite 1 von 2  1 2      


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 01:12 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 by Thomas Breitkreuz