Forms-Zustand und Darstellung korrigieren und Change archivieren
This commit is contained in:
@@ -903,6 +903,7 @@ impl Vm {
|
||||
/// Formular schließen, ein anderes Programm starten oder einen Fehler
|
||||
/// auslösen.
|
||||
pub fn run_visible_forms(&mut self, host: &mut dyn Host) -> RunEvent {
|
||||
self.forms.sync_timers(|| host.jetzt_ms());
|
||||
while self.forms.has_visible_forms() {
|
||||
self.tick(host);
|
||||
let dispatched = self.zustellen(host, Zustellpunkt::Kooperativ);
|
||||
@@ -928,6 +929,7 @@ impl Vm {
|
||||
}
|
||||
|
||||
pub fn run(&mut self, host: &mut dyn Host) -> RunEvent {
|
||||
self.forms.sync_timers(|| host.jetzt_ms());
|
||||
loop {
|
||||
if let Some(form) = self.frames.last().and_then(|f| f.waiting_form) {
|
||||
if !self.forms.is_visible(form) {
|
||||
@@ -1381,11 +1383,13 @@ impl Vm {
|
||||
let value = self.pop()?;
|
||||
let value = self.property_value(object, property, value)?;
|
||||
self.forms.set_at(object, index, property, value)?;
|
||||
self.forms.sync_timers(|| host.jetzt_ms());
|
||||
return Ok(Flow::Normal);
|
||||
}
|
||||
}
|
||||
let value = self.property_value(object, property, value)?;
|
||||
self.forms.set_at(object, index, property, value)?;
|
||||
self.forms.sync_timers(|| host.jetzt_ms());
|
||||
Ok(Flow::Normal)
|
||||
}
|
||||
I::PushObject(object, has_index) => {
|
||||
@@ -1442,6 +1446,7 @@ impl Vm {
|
||||
.ok_or(RuntimeError(422))?;
|
||||
let value = self.property_value(object, property, value)?;
|
||||
self.forms.set_at(object, index, property, value)?;
|
||||
self.forms.sync_timers(|| host.jetzt_ms());
|
||||
Ok(Flow::Normal)
|
||||
}
|
||||
I::LoadObjectIndexedProperty(object, property) => {
|
||||
@@ -1585,6 +1590,7 @@ impl Vm {
|
||||
self.forms.object_method_at(object, index, name, args)?;
|
||||
}
|
||||
}
|
||||
self.forms.sync_timers(|| host.jetzt_ms());
|
||||
self.dispatch_next_form_event(true);
|
||||
Ok(Flow::Normal)
|
||||
}
|
||||
@@ -1602,6 +1608,7 @@ impl Vm {
|
||||
self.forms.ensure_loaded(object)?;
|
||||
self.dispatch_next_form_event(true);
|
||||
}
|
||||
self.forms.sync_timers(|| host.jetzt_ms());
|
||||
Ok(Flow::Normal)
|
||||
}
|
||||
I::Dup => {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
//! Regressionen zum Change ereigniszustellung-und-hostgrenzen.
|
||||
//! Regressionen zu Ereigniszustellung, Hostgrenzen und Forms-Zustand.
|
||||
use tb_frontend::forms::{FormCatalog, ObjectClass};
|
||||
use tb_runtime::host::{CaptureHost, Ereignis, Host, MausArt, MausEreignis};
|
||||
use tb_runtime::screen::TextScreen;
|
||||
@@ -582,3 +582,47 @@ fn return_label_verwirft_abgebrochene_eingabe_und_ausdruck() {
|
||||
assert_eq!(string(&vm, "t"), "b");
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn spaete_timeraktivierung_nutzt_hostzeit_auch_ueber_control_parameter() {
|
||||
for (setup, start) in [
|
||||
("", "Timer1.Interval = 100"),
|
||||
("", "CALL Starten(Timer1)"),
|
||||
(
|
||||
"Timer1.Enabled = 0\nTimer1.Interval = 100",
|
||||
"Timer1.Enabled = -1",
|
||||
),
|
||||
] {
|
||||
let mut vm = vm(&format!("DIM SHARED n%\nForm1.Show\n{setup}\nSTOP\n{start}\nSTOP\nDOEVENTS\nSTOP\nDOEVENTS\nEND\nSUB Starten(t AS CONTROL)\nt.Interval = 100\nEND SUB\nSUB Timer1_Timer()\nSHARED n%\nn% = n% + 1\nEND SUB"));
|
||||
let mut host = CaptureHost::default();
|
||||
stop(&mut vm, &mut host);
|
||||
host.uhr_vorruecken(1000);
|
||||
stop(&mut vm, &mut host);
|
||||
assert_eq!(vm.forms.next_deadline(), Some(1100));
|
||||
host.uhr_vorruecken(99);
|
||||
stop(&mut vm, &mut host);
|
||||
assert_eq!(integer(&vm, "n"), 0);
|
||||
host.uhr_vorruecken(1);
|
||||
assert_eq!(vm.run(&mut host), RunEvent::Ended);
|
||||
assert_eq!(integer(&vm, "n"), 1);
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn intervallaenderung_im_handler_verwirft_bereits_faellige_altintervalle() {
|
||||
let mut vm = vm("DIM SHARED n%\nForm1.Show\nTimer1.Interval = 100\nSLEEP 60\nSTOP\nDOEVENTS\nSTOP\nDOEVENTS\nEND\nSUB Timer1_Timer()\nSHARED n%\nn% = n% + 1\nIF n% = 1 THEN\nSTOP\nTimer1.Interval = 200\nELSE\nTimer1.Interval = 0\nEND IF\nEND SUB");
|
||||
let mut host = CaptureHost::default();
|
||||
stop(&mut vm, &mut host); // Im ersten Handler bei 100 ms.
|
||||
assert_eq!(host.jetzt_ms(), 100);
|
||||
host.uhr_vorruecken(350);
|
||||
stop(&mut vm, &mut host); // Alter Rückstau darf nach dem Handler nicht laufen.
|
||||
assert_eq!(integer(&vm, "n"), 1);
|
||||
assert_eq!(vm.forms.next_deadline(), Some(650));
|
||||
host.uhr_vorruecken(199);
|
||||
stop(&mut vm, &mut host);
|
||||
assert_eq!(integer(&vm, "n"), 1);
|
||||
host.uhr_vorruecken(1);
|
||||
assert_eq!(vm.run(&mut host), RunEvent::Ended);
|
||||
assert_eq!(integer(&vm, "n"), 2);
|
||||
assert_eq!(vm.forms.next_deadline(), None);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user