在Delphi中,所有TEdit和TComboBox控件默认为21像素高.在TComboBox的情况下,这个大小是绝对的,并试图将它拉伸到更大的东西是行不通的.在TComboBoxEx的情况下,默认高度为22像素,这使得它在您使用它的任何形式上都很突出.现在根据Microsoft文档,ComboBoxEx本质上是一个ComboBox,其处理所有者绘制的功能以允许图像和缩进.
那么可以让我的TComboBoxEx控件高21像素吗?这取决于什么?
更新:根据Roddy的建议,我在此问题上添加了Quality Central报告.另外,我发现了一个问题.显然,大小取决于组合框中项目-1的大小.因此,您将该大小设置为15(或小于默认大小的一个像素),并且框缩小为更熟悉的21像素.
我们的应用程序过去常常使用所有表单都要继承的公共基本表单.我想摆脱它有很多原因,从需要警察每个人都使用它到几个与Delphi的VFI实施相关的烦恼.事实证明,它提供的大部分功能都可以通过其他更可靠的方式完成.
我不太确定的是自动将所有表单放在其呼叫者的中心.因此,如果我从主窗体打开Dialog A,它应该放在主窗体的中心.如果我从Dialog A打开Dialog B,它应该放在Dialog A的中心,依此类推.
我们过去通过将基本表单的Position属性设置为poOwnerFormCenter来处理所有这些,并且它工作得很好.但是,我如何在应用程序范围内执行此操作?
我想过使用Screen.OnActiveFormChange,但我认为每次表单获得焦点时都会发生这种情况.我还想过使用Application.OnModalBegin,但似乎没有一种明显的方法可以在调用它时查找表单.
有没人试过这个?
当您在Delphi中创建一个类型库并创建一个接口和相关的CoClass时,Delphi也会创建匹配的dispinterface声明.
我的理解是,这些与我的接口派生自IDispatch的事实有关,但我认为TAutoObject实现了IDispatch所需的一切.所以我的问题有三个:
举个简单的例子:
declare @myXml xml
set @myXML = '
<root>
<line id="1"/>
<line id="2"/>
<line id="3"/>
</root>'
select t.c.query('.')
from @myXml.nodes('/root/line') t(c)
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,我回到了三行,看起来像这样:
<line id="1" />
Run Code Online (Sandbox Code Playgroud)
但是,当XML声明其命名空间(甚至只是默认的xmlns)时,您还需要在SQL中指定该命名空间,否则结果集将为空.我知道两种方法:nodes()方法调用中的声明语句或带有xmlnamespaces语句的声明语句.让我们用后者:
declare @myXml xml
set @myXML = '
<root xmlns="urn:somename">
<line id="1"/>
<line id="2"/>
<line id="3"/>
</root>';
with xmlnamespaces(default 'urn:somename')
select t.c.query('.')
from @myXml.nodes('/root/line') t(c)
Run Code Online (Sandbox Code Playgroud)
虽然我现在得到了结果,但结果却有一定的怪异.指定的命名空间将添加为"p1"而不是默认值.所以我的输出看起来像这样:
<p1:line xmlns:p1="urn:somename" id="1" />
Run Code Online (Sandbox Code Playgroud)
在这篇Technet文章中,B部分声明一个默认命名空间显示了我正在尝试实现的内容,但是我使用默认命名空间得到了D. Construction中显示的结果.由于我的例子看起来不像后者,我不明白为什么我会得到这些前缀.
更新: 为了完整起见,这提供了与xmlnamespaces语法完全相同的症状:
select t.c.query('.')
from @myXml.nodes('declare default …Run Code Online (Sandbox Code Playgroud) 我正在使用通常的Deferred链接方法在jQuery中进行一系列顺序AJAX调用.第一个调用返回一个值列表,随后的调用将返回那些返回的列表条目.在第一次返回列表的调用之后,后续调用可以按任何顺序完成,但必须一次完成一次.所以这就是我使用的:
$.when(callWebService()).then(
function (data) {
var looper = $.Deferred().resolve(),
myList = JSON.parse(data);
for (var i in myList) {
(function (i) {
looper = looper.then(function () { // Success
return callWebService();
},
function (jqXHR, textStatus, errorThrown) { // Failure
if (checkIfContinuable(errorThrown) == true)
continueChain();
else
failWithTerribleError();
});
})(i);
}
});
Run Code Online (Sandbox Code Playgroud)
事实证明,后续调用有时可能会失败,但我仍然希望进行剩余的调用.在我的列表中,这就是这一点创造性伪代码的意图:
if (checkIfContinuable(errorThrown) == true)
continueChain();
else
failWithTerribleError();
Run Code Online (Sandbox Code Playgroud)
我怎么实现continueChain呢?似乎任何延迟的失败都会导致链的其余部分也失败.相反,我想记录错误并继续列表的其余部分.
我正在编写一个基于TCustomControl的网格控件,所以我可以自己处理所有的结构,绘画和导航.我似乎无法弄清楚的是这个:
在我的构造函数中,我将ControlStyle设置为:
ControlStyle := ControlStyle + [csCaptureMouse, csClickEvents,
csDoubleClicks, csNeedsBorderPaint, csPannable];
Run Code Online (Sandbox Code Playgroud)
我的想法是,如果控件处理鼠标事件,我可以做像设置选择等事情.我注意到控件永远不会得到焦点.我碰巧在表单上有一个TComboBox,并且在创建表单时它显然是焦点.无论我在网格中点击多少次,焦点都会停留在组合框上.
这当然也会影响我对键盘事件的处理.
所以问题是,当你点击它时,如何确定焦点应转移到控件上?
我知道我可以在使用ADO或OLE DB时为MS SQL Server设置连接超时,方法是将Connect Timeout = somevalue添加到连接字符串.
但这似乎不适用于ODBC连接.具体来说,我们决定使用Windows XP附带的标准SQL Server ODBC驱动程序(SQLSRV32.DLL版本2000.85.1132.00)而不是较新的SQL Native Client,并且使用此驱动程序时连接总是在15秒内超时,与连接超时设置无关.
此外,当它超时时,我得到两个错误.第一个是超时,第二个是"无效的连接字符串属性",所以我猜Connect Connectout不是我需要的.我错过了这个情节的最后线索来自这篇有点过时的文章:http://msdn.microsoft.com/en-us/library/ms811006.aspx
有没有人知道是否有办法在标准SQL Server ODBC驱动程序的连接字符串中指定连接超时?
我正在尝试在Delphi XE中实现支持RTF的工具提示窗口.为了渲染富文本,我正在使用屏幕外的TRichEdit.我需要做两件事:
为了完成这两个任务,我写了这个方法:
procedure TLookupHintWindow.CallFormatRange(R: TRect; var Range: TFormatRange;
MustPaint: Boolean);
var
TextRect: TRect;
begin
RichText.SetBounds(R.Left, R.Top, R.Right, R.Bottom);
TextRect := Rect(0, 0,
RichText.Width * Screen.Pixelsperinch,
RichText.Height * Screen.Pixelsperinch);
ZeroMemory(@Range, SizeOf(Range));
Range.hdc := Canvas.Handle;
Range.hdcTarget := Canvas.Handle;
Range.rc := TextRect;
Range.rcpage := TextRect;
Range.chrg.cpMin := 0;
Range.chrg.cpMax := -1;
SendMessage(RichText.Handle, EM_FORMATRANGE,
NativeInt(MustPaint), NativeInt(@Range));
SendMessage(RichText.Handle, EM_FORMATRANGE, 0, 0);
end;
Run Code Online (Sandbox Code Playgroud)
传入Range参数,因此我可以使用此方法之外的计算尺寸.MustPaint参数确定是应该计算范围(False)还是绘制(True).
要计算范围,我称之为:
function TLookupHintWindow.CalcRichTextRect(R: TRect; const Rtf: string): TRect;
var
Range: TFormatRange;
begin
LoadRichText(Rtf);
CallFormatRange(R, Range, False);
Result := Range.rcpage; …Run Code Online (Sandbox Code Playgroud) 几年前,我编写了一个代码模板,它采用了一些简单的参数(点)并生成了一个类骨架.由于某些方法体中有代码,我无法调用InvokeClassCompletion,只是将实现放在声明中(用户必须移动它们).
在我看来,我可以编写一个代码模板脚本引擎来将这些方法插入到正确的位置,但我不知道我应该如何导航文件.在ToolsAPI.pas中有IOTAEditReader和IOTAEditWriter的声明,但我猜测有一个步骤缺失 - 当然我不需要手动解析Delphi代码只是为了找到实现部分?
有人有经验吗?
如果打开记事本,添加十行并调整编辑器大小仅显示九,拇指轨道(滚动条上的可拖动块)几乎是垂直滚动条的全长.如果添加几千行,则拇指轨道只有几个像素高.
我想在TCustomControl后代复制这个bahaviour,在那里我实现了一个水平滚动条.所以我将WS_HSCROLL添加到我的窗口样式(在CreateParams中)并为WM_HSCROLL实现了一个处理程序.在此过程中,我使用SetScrollRange和SetScrollPos来管理拇指轨道的范围和位置 - 但是小虫子仍然是一个接近完美的方块.
我错过了什么?