我写了一个基于Web的小工具,它使用文件输入来读取不断变化的文件.用户手动选择它(一次!)和更改它时的JavaScript跟踪(最后文件修改时间和文件大小).如果已更改,则会再次读取文件内容.
这适用于Windows上的所有浏览器.但是在macOS上(在Safari 10.1.2和Firefox 51.0.1中测试),只有最后修改时间似乎会更新.文件大小未更新,似乎也无法再读取文件内容.所以我无法跟踪macOS上的浏览器中的文件更改.
但为什么?这是macOS的安全限制吗?
请使用以下代码段进行测试.选择一个文件(例如文本文件),查看上次修改的时间戳和文件大小,然后更改文件并再次查看,如果大小已更改.在macOS上,文件大小不会更改.
请不要jQuery.
window.addEventListener('load', function() {
window.setInterval(function() {
var logFile = document.querySelector('#file').files[0];
if (logFile) {
document.querySelector('#info').innerHTML = '<br/>' +
(new Date()).toString() + '<br/>Last modified: ' +
logFile.lastModified +
'<br/>Size: ' +
logFile.size;
}
}, 1000);
});Run Code Online (Sandbox Code Playgroud)
#info {
font-family: Courier;
font-size: 0.9em;
}Run Code Online (Sandbox Code Playgroud)
<!DOCTYPE html>
<input type="file" id="file" />
<p id="info"></p>Run Code Online (Sandbox Code Playgroud)
此问题与以下问题高度相关:为什么所有对话框都使用“旧” Android 2.x样式?
我正在使用Delphi Berlin(10.1),该问题已得到解决:
但是,一旦将TStyleBook放到窗体中并分配给它(例如,通过右键单击一个组件,然后“编辑自定义样式”),对话框(所有对话框)将再次变为深色样式:
自动创建的“修剪”样式仍然是“ light”版本(“ AndroidL Light”)。是的,我检查了FMX.Helpers.Android.pas中的函数“ GetNativeTheme()”分配了Result,甚至复制了文件并将其添加到项目中。从Form1.StyleBook再次显示本机样式对话框中删除任务。
在仍然继续使用TStyleBook的情况下如何解决?
通常,当滚动“滚动框”的内容时,滚动框的子组件不会触发任何事件函数,例如在本机应用程序中。但在 FireMonkey 中,如果 TVertScrollBox 包含像 TRectangle 这样的子元素(我想将其用作自定义菜单的菜单条目),则用手指滚动 Android 上的 TVertScrollBox 有时会触发子元素的事件函数(如 OnClick)这对我和我们的客户来说非常令人困惑 - 他们不想在滚动时点击特定元素。
在本机应用程序中,这种情况永远不会发生。我不知道如何防止这种行为。我尝试将 OnMouseEnter 和 OnMouseLeave 中的所有子元素的 HitTest 属性设置为 FALSE(我还尝试了其他事件),如下所示:
procedure TframeCornerMenu.VertScrollBox1MouseEnter(Sender: TObject);
var
list: TRectangle;
i: Integer;
begin
list := FindComponent('rectMenuList') as TRectangle;
for i := 0 to list.ChildrenCount - 1 do
begin
if list.Children[i] is TRectangle then
TRectangle(list.Children[i]).HitTest := false;
end;
end;
Run Code Online (Sandbox Code Playgroud)
但这显然不起作用(也不能),因为用户首先点击位于 TVertScrollBox 顶部的子元素。
这是 FireMonkey 中的错误/未实现的功能吗?我很欣赏解决这个滚动问题的所有想法。如果可能的话,不使用第三方组件。
我使用的是 Delphi 社区版 10.3.2 (26.0.34749.6593)。
我通常使用C++ Builder,刚开始在Delphi中测试.我找不到使用Delphi(XE5)Pos()函数的换行符,这是奇怪的语法.我错了什么?使用StringReplace()等其他函数可以正常工作.这是一个示例代码:
sl := TStringList.Create;
sl.Add('Hello');
sl.Add('world');
sl.Add('!');
if (Pos(sl.Text, #13#10) > 0) then
ShowMessage('1')
else if (Pos(sl.Text, #13) > 0) then
ShowMessage('2')
else if (Pos(sl.Text, #10) > 0) then
ShowMessage('3')
else
ShowMessage('4'); // Comes always here...
Run Code Online (Sandbox Code Playgroud)
这就是我总是在C++ Builder中做到这一点并且从来没有遇到任何问题.