如何在DM脚本中自动向下滚动文本框

问题描述

更新文本时如何自动向下滚动对话框TextBox


考虑以下示例对话框(以下代码)。

其中包含一个TextBox。文本更改后,文本框将立即更新。文本每0.5秒更改一次,由另一个线程调用。 (文本是您所用语言的当前日期。)如上图所示,滚动条位于最顶部。但是,这乍一看妨碍了用户获得最新状态。用户必须手动向下滚动并保持鼠标单击,否则文本框将再次跳至开始位置。

如何更改此行为?我希望用户始终看到最后添加的文本。因此,换句话说:如何设置滚动条的位置?


注意:我考虑过在前面插入新文本。但这是不直观的。对话框显示测量状态。每个步骤都需要分别进行几个状态更新。因此,要么为每个插入顶部的步骤创建“块”。但是随后无法显示实际发生时的状态更新(我强烈希望避免),因为我必须先创建该块。或者,我可以将每行添加到顶部,这看起来非常混乱(我已经尝试过了),因为顺序完全很奇怪。


string text = "";
number running = 1;
number update_task;

class UpdateThread : Thread{
    void RunThread(object self){
        while(running){
            text += "It is now " + FormatTimeString(GetCurrentTime(),34) + "\n";
            sleep(0.5);
        }
    }
}

class ExampleDialog : UIFrame{
    void update(object self){
        TagGroup field = self.lookupElement("textbox");
        if(field.TagGroupIsValid()){
            self.SetTextElementData("textbox",text);
            
            field.DLGInvalid(1);
            self.validateView();
        }
    }
    
    object init(object self){
        TagGroup dlg,dlg_items,field;
        
        dlg = DLGCreateDialog("Example",dlg_items);
        
        field = DLGCreateTextBox(100,10,10000);
        field.DLGIdentifier("textbox");
        dlg.DLGAddElement(field);
        
        update_task = AddMainThreadPeriodicTask(self,"update",0.1);
        
        self.super.init(dlg);
        return self;
    }
}

alloc(UpdateThread).StartThread();
alloc(ExampleDialog).init().pose();
running = 0;
RemoveMainThreadTask(update_task);

解决方法

我不认为您追求的功能目前在GMS(3.4.2)中已经存在,但是我可以肯定地理解为什么拥有它会很有用。

您可能要考虑通过Gatan的软件发行报告表将其添加为功能请求。

,

使用TextBox.appendText()方法。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...