我有一个应用程序,它具有动态生成的视图,并且每次加载视图时都可以不同.主视图包含一个设置为主视图边界的ScrollView.然后将子视图动态添加到ScrollView,但这些视图的高度将不同,并且它们可以随时更改高度(例如,用户单击视图的内容并更改).我想使用布局约束来确保每个视图保持与其上方的视图对齐,并使用一些任意填充.见下图:

现在所有填充值都设置为10(顶部,左侧和右侧).我正在使用他们的框架手动设置这些子视图的位置,但如果视图改变大小,这不起作用,所以我想改变它以使用NSLayoutConstraints,但我遇到了一些问题.
作为测试,我像之前一样设置子视图的框架,但后来我添加了约束:
// newView is created and its frame is initialized
self.scrlView?.addSubview(newView)
let constr = NSLayoutConstraint(item: newView, attribute: NSLayoutAttribute.Top, relatedBy: NSLayoutRelation.Equal, toItem: self.previousView, attribute: NSLayoutAttribute.Bottom, multiplier: 1, constant: 10)
NSLayoutConstraints.activateConstraints([constr])
newView.translatesAutoResizingMaskIntoConstraints = false
self.previousView = newView
Run Code Online (Sandbox Code Playgroud)
但这些观点无处可见.我究竟做错了什么?所需要的只是确保每个视图的顶部在前一个视图下方对齐,并且无论视图高度如何,它们都保持这种状态.
此外,由于这些视图都被添加到滚动视图中,使用上面的布局约束如何设置滚动视图的正确内容大小?
我需要使用 Delphi 2007 获取系统的总物理内存。在 4GB 或更大的系统上使用 GlobalMemoryStatus 似乎会给我带来错误。在 Delphi 2007 中,GlobalMemoryStatusEx 不存在,因此我手动将函数调用添加到我的程序中。它在我的 Windows 7 x64 上正确返回内存 (8GB),但在 Vista x32 系统上它仍然返回错误值(在此系统上应为 4GB,但返回 2.9GB)。知道我可能做错了什么吗?GlobalMemoryStatusEx 可以在旧操作系统上运行吗?
type
DWORDLONG = UInt64;
PMemoryStatusEx = ^TMemoryStatusEx;
TMemoryStatusEx = packed record
dwLength: DWORD;
dwMemoryLoad: DWORD;
ullTotalPhys: DWORDLONG;
ullAvailPhys: DWORDLONG;
ullTotalPageFile: DWORDLONG;
ullAvailPageFile: DWORDLONG;
ullTotalVirtual: DWORDLONG;
ullAvailVirtual: DWORDLONG;
ullAvailExtendedVirtual: DWORDLONG;
end;
function GlobalMemoryStatusEx(var lpBuffer: TMemoryStatusEx): BOOL; stdcall; external kernel32;
function getmemorysize:word;
var
memory: TMemoryStatusEx;
begin
FillChar(memory, SizeOf(memory), 0);
memory.dwLength := SizeOf(memory);
GlobalMemoryStatusEx(memory);
result:=memory.ullTotalPhys div (1024*1024);
end;
Run Code Online (Sandbox Code Playgroud) 我有一个主要表格和状态表格,类似于这里提出的问题.但是,我的状态窗口的FormStyle是fsStayOnTop,当我尝试在状态窗口显示时最小化主窗体时会导致一些奇怪的行为.
当我最小化主窗体时,两个窗体都按预期隐藏,但是当状态窗体完成其最小化时完成其任务时,主窗体自动恢复自身并且其最小化按钮不再起作用(但最大化/恢复/关闭所有还在工作).使最小化功能再次起作用的唯一方法是重新启动应用程序.如果我将FormStyle设置为其他任何东西,一切正常,但我的应用程序要求状态窗体在可见时保持在顶部.
有没有理由为什么主窗体会自动恢复?有没有办法来解决这个问题?
procedure ButtonClick(sender:TObject);
begin
//Gather some data
ShowStatusWindow; // sets status window to visible, does its work,
// then sets invisible. (Usually visible for about 10 seconds)
//Gather more data
Windows.SendMessage(self.Handle, WM_SETREDRAW, 0, 0); //Freeze the main form for
//flickerless drawing
// Handle everything that would cause a redraw
Windows.SendMessage(self.Handle, WM_SETREDRAW, 1, 0); // thaw form
RedrawWindow(self.Handle, 0, 0, RDW_ERASE or RDW_FRAME or RDW_INVALIDATE or RDW_ALLCHILDREN);
end;
Run Code Online (Sandbox Code Playgroud) 我需要将数据库列从整数更改为字符串/文本,但我不知道如何去做.
此列用于存储标识号,但最近ID格式已更改,现在ID也包含ASCII字符(因此,通过此更改,新ID不能存储为整数).
我正在更新的应用程序是用Delphi 7编写的,并使用odbcexpress组件作为SQL Server库.
有可能ALTER TABLE用于此吗?或者是否需要将数据作为字符串复制到新列,删除旧列,并将列重命名为旧名称?
你能提供一个如何做到这一点的例子吗?我对SQL Server的工作方式不是很熟悉.
谢谢!