Autor |
Beitrag |
Ulixes
      
Beiträge: 63
Win Vista Home Premium
Delphi 2009 Professional, XHTML, CSS, PHP
|
Verfasst: Fr 30.01.09 14:01
Hey!
Mein Problem liegt dabei, dass ich Daten einlese und deshalb das Programm ein längere Zeit (unbekannt) nicht "ansprechbar" ist.
Wenn ich User wäre, schlösse ich das Programm, was nicht der Sinn sein kann. Also möchte ich am Anfang der Prozedur sagen, dass es etwas länger dauern
kann. Am Ende der Prozedur soll dann die Messagebox automatisch geschlossen werden (ein Pipston wäre schön  ).
Wie kann ich die Messagebox automatisch schließen, obwohl die Zeit unbekannt ist??
Ich habe dazu nichts brauchbares im Internet gefunden.
Vielen Dank im Vorraus!
|
|
nagel
      
Beiträge: 708
Win7, Ubuntu 10.10
|
Verfasst: Fr 30.01.09 14:05
Einfache Lösung wäre: Hinweisfenster selbst bauen anstatt MessageBox zu verwenden und dann am Ende der Verarbeitung Form.Close. Da die Zeit vermutlich nicht vollkommen zufällig ist  , kannst du da auch noch eine Fortschrittsanzeige einbauen.
|
|
Ulixes 
      
Beiträge: 63
Win Vista Home Premium
Delphi 2009 Professional, XHTML, CSS, PHP
|
Verfasst: Fr 30.01.09 14:09
Ja stimmt...daran habe ich gar nicht gedacht...
VIELEN DANK
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 30.01.09 14:10
Und wenn das Programm wirklich gar nicht mehr antwortet, dann machst du auch etwas falsch. Wie wäre es, wenn du mal ein Application.ProcessMessages dazwischenwirfst? Dann wird das Programm gar nicht erst als abgestürzt dargestellt.
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 30.01.09 14:26
jaenicke hat folgendes geschrieben : | Und wenn das Programm wirklich gar nicht mehr antwortet, dann machst du auch etwas falsch. Wie wäre es, wenn du mal ein Application.ProcessMessages dazwischenwirfst? Dann wird das Programm gar nicht erst als abgestürzt dargestellt. |
Aber unnütz ausgebremst. Für Nebenläufigkeit nimmt man besser Threads.
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 30.01.09 15:19
Das wäre natürlich die beste Lösung, ist aber auch mit etwas mehr Aufwand verbunden.
Die einfachste, wenn auch nicht so schöne, Lösung wäre erstmal die mit Application.ProcessMessages. Denn das Problem ist, dass die MessageBox ja zum selben Thread gehört und dementsprechend auch nicht mehr reagiert.
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 30.01.09 15:20
Schwerer dürfte wiegen, dass eine Messagebox modal angezeigt wird und somit den ganzen Thread anhält.
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 30.01.09 15:23
Ich meinte die selbstgebastelte MessageBox als eigenes Formular, die dann natürlich mit Show angezeigt werden muss. Aber diese wird eben trotzdem ebenfalls als nicht mehr reagierend angezeigt.
|
|
Ulixes 
      
Beiträge: 63
Win Vista Home Premium
Delphi 2009 Professional, XHTML, CSS, PHP
|
Verfasst: Fr 30.01.09 16:58
Vielen Dank für die weiteren Antworten.
Bei mir funktioniert die Funktion "Application.ProcessMessages" super. Ich brauche das ganze nur für eine Präsentation,
bei der keiner in mein Quelltext schaut  ...soll nur schön aussehen...wenn ich berechnen möchte, nehme ich die alte
Methode.
|
|
JayEff
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: Fr 30.01.09 17:04
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
delfiphan
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: Sa 31.01.09 15:00
Von Application.ProcessMessages kann ich (zu mindest bei einigermassen komplexen Programmen) nur abraten. Vor allem dann, wenn der entsprechende Code nur ein Teil des ganzen Programmes darstellt.
Man darf das Application.ProcessMessages nicht einfach nur als "de-freeze" sehen. Denn in Application.ProcessMessages werden offene Ereignisse (bzw. Messages) abgearbeitet und in einem ereignisorientierten Programm kann das so ziemlich alles sein.
Wenn du in einem OnClick ein Application.ProcessMessages machst, dann gibst du dem System die Möglichkeit, das OnClick-Ereignis während dem Application.ProcessMessages gleich nochmals auszulösen. Das Programm gewinnt plötzlich enorm an Komplexität, weil man plötzlich alle nicht-erwünschten Ereignisse unterbinden muss, oder das Ergebnis eines dazwischen ausgeführten Ereignisses mitberücksichtigen muss.
Ausserdem kann eine Funktion, die Application.ProcessMessage aufruft, nicht mehr überall eingesetzt werden, weil dieser Fall (in bestehendem Code) wohl keiner wirklich berücksichtigt.
Für deine Präsentation mag das okay sein. Aber allgemein würde ich mit Threads arbeiten, wobei das leider auch eine sehr heikle und komplexe Angelegenheit werden kann.
|
|