我有一个VCL表格,上面有五个标签TPageControl.每个TTabSheet内容都是相当无关的,并且有很多单独的控件和处理逻辑...所以我想要分解它,这样就可以更容易地处理"只是那个选项卡"的代码.像一条线
//-------------------------- begin rules tab methods -------------------
Run Code Online (Sandbox Code Playgroud)
只是不再削减它了.真的,我想我想以某种方式将每个标签放在一个单独的文件中.
目前我正在考虑为每个TTabPage创建一个VCL框架.如果我这样做,我需要将所有帧加载到构造函数中的TPageControl中,或者显示选项卡时.
这是一个好方法吗?为每个标签制作一个完整的TForm会更好吗?我应该继续将选项卡包装在TPageControl中,还是应该在动态加载内容时将其更改为TTabControl?如果这是一个好方法,最好在启动时加载所有选项卡,还是每次显示选项卡?(也许是优点/缺点,如果不是完全明显哪个在大多数/所有情况下都更好)
这两种方法的性能如何确定字符串是否以Delphi中的某个子字符串开头比较?一个比另一个明显更快/更有效吗?
if ((testString[1] = '=') AND (testString[2] = '?')) then ...
Run Code Online (Sandbox Code Playgroud)
与
if (AnsiStartsStr('=?', testString)) then ...
Run Code Online (Sandbox Code Playgroud) MainForm在运行时创建一些辅助Frame对象以显示各种选项面板.
这是其中一个框架类的典型构造函数(它们各自扩展TFrame):
constructor Tframe2.Create(AOwner: TComponent);
begin
inherited;
edTime.Text := '12:00pm'; //edTime is a TEdit control. this line is where it throws the exception
//etc.
end;
Run Code Online (Sandbox Code Playgroud)
这段代码在Delphi中运行良好(无论是否是正确的方法),但Lazarus中的相同代码不断抛出EInvalidOperation异常,因为控件(TEdit)尚未分配父"窗口"(rsControlHasNoParentWindow),当我检查代码时,这实际上是有意义的,因为在调用构造函数之后,父级似乎没有被分配.
这是MainForm中的代码初始化辅助框架:
if Assigned(frame) then FreeAndNil(frame);
case Node.AbsoluteIndex of
optInterval: frame := Tframe2.Create(Self); //here's where the constructor gets called.
//etc
end;
frame := TframeOther.Create(Self);
if Assigned(frame) then
begin
frame.Parent := panOptions; //here's where Tframe2's parent gets set
frame.Align := alClient;
end;
Run Code Online (Sandbox Code Playgroud)
那么有人可以解释Delphi和Lazarus之间在表单初始化序列方面是否存在任何重要差异?
那么解决这种初始化顺序问题的最标准方法是什么?与我更熟悉的其他语言相比,可能有不同的策略来解决此类错误.我可以在构造函数中添加另一个参数,或者如果有一个方法被调用post构造函数在屏幕上预先绘制它我可以覆盖我可以重新定位该代码,或者只是创建一个辅助方法并在调用setParent之后调用它.有什么特别的最佳做法吗?
编辑]:看来这可能是某种特定的TEdit.看起来初始化复选框状态的行没有相同的问题.这可能只是拉撒路的一个错误吗?
从我所看到的,没有菜单选项来查看调用堆栈,就像我以前在其他语言的调试器中看到的那样.这是Delphi的这个(旧)版本中根本不存在的功能吗?如果无法在调试器中查看调用堆栈,是否有其他方法可以搜索引用或检测项目中的其他代码使用特定函数?
我有一个"uObjects"单元.它有几个不同类型的对象,可以扩展TCollection/TCollectionItem.有一次将所有这些小小的类分组在一个文件中可能有很大的意义,因为事情很小而且它们有点相关,然后你就没有担心的bajillion文件了.
但随着时间的推移,越来越多的方法被添加到这些集合中,使得管理变得更加困难,因此我正在考虑将uObjects单元分解为多个较小的单元以使其更易于维护.
但在此之前,我想知道是否有任何我应该知道的警告.这是我应该继续前进而不放弃的事情吗?或者我是否有任何理由(可能在某些情况下)不想将一个单位的无关部分分解成多个单元?这可能会引发问题吗?我仍然试图围绕来自Java世界的单元的细微差别,其中在单个文件中具有多个类通常不是一种选择.
我有一个页面,上面有一个表格.我想让页面上的所有复选框和单选按钮都是只读的(不可编辑的),而不会使它们具有"禁用"外观.我只是想阻止用户轻松更改复选框的值.如何才能做到这一点?
这是关于在启用VCL样式时使工具栏按钮变平的问题的后续行动.使用该问题的解决方案,现在我的大多数TActionToolbar按钮都是扁平的.但是,有一个工具栏按钮,其下拉菜单包含其他操作:

它仍然在它周围绘制按钮边缘.如何删除带有下拉菜单的工具栏按钮的按钮边框,以便它们与其他普通按钮匹配,看起来更像是在禁用VCL样式时?
我有一些delphi代码,有点像这样:
try
//some code
//occasionally throws an exception here, for example an EIndexOutOfRangeException
//more code...should get skipped if exception is thrown
finally
// there may or may not be any important cleanup code here
end;
Run Code Online (Sandbox Code Playgroud)
在这种情况下的例外情况不需要处理超出try块的处理.因此,在将mad-except添加到项目中以进行错误故障排除之前,此代码"正常工作".但现在我收到错误报告,因为MadExcept报告了未捕获的异常.
相关问题,MadExcept触发器尝试最终表明MadExcept在这种情况下破坏的行为是"预期的",因为异常不是"处理".
我想澄清我的选择是什么,以防止在此代码运行时弹出疯狂的对话框,无论是否抛出内部异常并忽略它.
所以我认为没有开关禁止MadExcept打破try/finally块中的无法处理的异常?即使我想忽略它,我还是需要明确地"抓住"异常?
我应该做这样的事情(忽略任何异常):
try
//some code
//sometimes throws EIndexOutOfRangeException here
//more code...should get skipped if exception is thrown
except do begin end;
end;
Run Code Online (Sandbox Code Playgroud)
或者(忽略一个非常具体的例外):
try
//some code
//sometimes throws EIndexOutOfRangeException here
//more code...should get skipped if exception is thrown
except on …Run Code Online (Sandbox Code Playgroud) 高代表用户对我今天早些时候提出的另一个问题的评论表明,更换try/finally和try/except的顺序会更好.
所以,而不是这个:
try
try
//some code
//something that throws an exception, eg: EIndexOutOfRangeException
//more code
except on E : EIndexOutOfRangeException do begin .... end;
finally
// some cleanup code
end;
Run Code Online (Sandbox Code Playgroud)
它会有try/finally嵌套在里面,而try/except在外面:
try
try
//some code
//something that throws an exception, eg: EIndexOutOfRangeException
//more code
finally
// some cleanup code
end;
except on E : EIndexOutOfRangeException do begin .... end;
end;
Run Code Online (Sandbox Code Playgroud)
我想知道什么时候使用这个成语是合适的,也是个好主意,是否有特殊情况你不应该这样做?为什么选择一个而不是另一个?我认为清理代码中抛出的异常将是主要的考虑因素,因为我认为它可以抑制其中一个例外,如果最终抛出异常,但可以防止意外冒泡错误?
Delphi是否提供了在TCollection中迭代TCollectionItems的好方法?
也许,某些事情......
for mycollectionitem in mycollection.Items do
mycollectionitem.setWhatever();
Run Code Online (Sandbox Code Playgroud)
但这不会编译
或者我真的没有什么比这更优雅了:
for num := 1 to mycollection.Count do
mycollection.Items[num-1].setWhatever();
Run Code Online (Sandbox Code Playgroud) delphi ×9
debugging ×1
delphi-7 ×1
freepascal ×1
jquery ×1
lazarus ×1
loops ×1
madexcept ×1
performance ×1
tcollection ×1
tpagecontrol ×1
vcl ×1
vcl-styles ×1