他在1998年的Bruce Eckel的Thinking In Java简介中说:
编程是关于管理复杂性:您要解决的问题的复杂性,以及解决它的机器的复杂性.由于这种复杂性,我们的大多数编程项目都失败了.然而,在我所知道的所有编程语言中,他们都没有全力以赴,并决定他们的主要设计目标是克服开发和维护程序的复杂性.
在第二版和后一版中,他添加了这个脚注(大约2003年):
我在第二版中回过头来看:我相信Python语言最接近完全正是如此.见www.Python.org.
我是java的dabbler,有Delphi(Pascal),C,C++和Python的背景.这是我想知道的:
当埃克尔在征服复杂性时称Python为"更好"时,他究竟考虑了什么?他和其他人一起使用这两者的想法是什么?
您如何看待征服复杂性?Python的更短和更简洁的语法是一种克服复杂性的关键方法(因此,例如,Jython可能是Java优秀库的一个很好的桥梁,以及Python的简洁语法),或者是Java的强类型思维,从C++继承了这个想法,从Simula继承了这个想法,我认为它是征服复杂性的关键?或者它是Rapid Application Designer(想想Delphi,还是Java,优秀的免费NetBeans窗口/表单设计器工具)或组件,bean或J2EE?什么征服了所有人,对你而言?
这已经被标记为主观的.[编辑]
注意:更多关于布鲁斯的想法,关于他喜欢Python的原因可以在这里找到.文章的一个关键引用:
Bruce Eckel:他们说你可以在脑海中持有七个加减两个信息.我不记得如何用Java打开文件.我写过章节.我已经完成了很多次,但步骤太多了.当我真正分析它时,我意识到这些只是他们所做的愚蠢的设计决定.即使他们坚持在java.io中使用Decorator模式,他们也应该有一个方便的构造函数来简单地打开文件.因为我们一直打开文件,但没有人能记得如何.抱在脑海里的信息太多了.
所以,块理论.通过块理论度量,Python杀死了其他所有人.我会批他的.但您使用的指标是什么?我想特别邀请人们支持Java,如果你愿意的话,反对布鲁斯.
[请不要投票重新开放,这个主题本质上是煽动性的,而且我的失言已经让它更加如此.我同意主持人的意见.]
我想创建一个窗口,它将成为主窗口,Windows本身将其识别为主应用程序窗口.但是,当我使窗口无边框,并且根本没有任何非客户区域时,Windows不再认识到该窗口是应用程序主窗口.这有几个副作用:
WindowsKey + M最小化除应用程序主窗口之外的所有窗口.
单击任务栏上的一次(在win7中)然后再次,应该在正常状态和最小化状态之间切换应用程序主窗口的状态/可见性.这对于这样的窗口不起作用.
在简单的Win32编程术语中,我询问dwStyle的参数值,就像调用CreateWindow(WS _...常量)或CreateWindowEx(WS_EX _...常量)一样.对于delphi用户,这些值将在您将覆盖的CreateParams方法中设置,然后设置Params.Style:= WS_xxx; 对于MFC/C++用户和C用户,框架中的某些内容最终将使用此dwStyle值调用CreateWindow.
在delphi术语中,设置form.BorderStyle = bsNone,得到dwStyle = WS_POPUP.但是我想要一个不使用dwStyle = WS_POPUP的无边框窗口.
注意:下面的所有答案都很好,但在生产场景中使用每个答案都是有问题的,而且我试图这样做,导致遇到许多故障,对于专业质量的应用程序,我仍然发现我无法解决.戴维斯的答案是一个很棒的纯Win32 API答案,并且符合要求.似乎工业强度解决方案应该结合多种品质,包括我在上面的问题中所具有的所有品质.简而言之,使用BorderStyle = bsNone(dwStyle = WS_POPUP)的无边框表单会阻止通常应用于应用程序主窗口的所有Windows功能,并且下面的所有解决方案都可以解决部分问题.
基于David的建议,我写了以下内容,但是没有用:我想要一个没有边框的窗口,它在各个方面都像一个Windows应用程序窗口一样,对系统来说,也就是说,它可以通过最小化/恢复单击任务栏中的窗口,WindowsKey + M将最小化.我开始认为这样做的唯一方法是添加非客户端绘制代码并将顶部非客户区域边界调整为零.这当然不是一个微不足道的想法.
事实证明,我在编码中犯了一个简单的错误(因此上面的两段),事实上下面的代码现在按照我的意愿工作.这个是pascal,但它应该很容易转换为C++或其他任何东西.
program NoBorderProject;
uses
Windows, Messages;
{the Messages unit contains the windows
Message constants like WM_COMMAND}
{$R *.RES}
var
wClass: TWndClass;
Msg: TMsg;
win:HWND;
function WindowProc(hWnd,Msg,wParam,lParam:Integer):Integer; stdcall;
begin
if Msg = WM_DESTROY then PostQuitMessage(0);
Result := DefWindowProc(hWnd,Msg,wParam,lParam);
end;
begin
wClass.lpszClassName:= 'CN';
wClass.lpfnWndProc := @WindowProc;
wClass.hInstance := hInstance;
wClass.hbrBackground:= 1;
RegisterClass(wClass); …Run Code Online (Sandbox Code Playgroud) 对于我们的dbgrid,我们希望不断隐藏滚动条.由于TDBGrid没有'滚动条'属性,我们使用:
ShowScrollBar(DBGrid1.Handle, SB_VERT, False);
ShowScrollBar(DBGrid1.Handle, SB_HORZ, False);
Run Code Online (Sandbox Code Playgroud)
但是,当我们调整窗口大小(以及包含dbgrid的面板)时,只有在调用上述两种方法后,滚动条才会出现并再次隐藏.
解决方案是在DrawColumnCell中调用这些方法,但这会导致dbgrid闪烁,即使DoubleBuffered设置为true也是如此.
有没有办法永久隐藏滚动条?
提前致谢!
我需要一个delphi键/值集合,这将允许我按照插入/添加键/值对的相同顺序迭代集合.
TList<T>保证订单但TDictionary<T1, T2>不保证.
我想我总是可以定义一个,TList<TPair<Key, Value>>但使用它会更麻烦.
是否有符合我要求的内置集合类型或者包装TList<TPair<Key, Value>>是我的最佳选择?或者也许最好有一个TList<Key>和一个TDictionary<Key, Value>并遍历列表.
使用TTreeView.OnAdvancedCustomDrawItem或TTreeView.CustomDrawItem,如何完全绘制树视图项?docwiki上没有高级自定义绘图项的示例代码.
在德尔福文档网站,有引用不样品中存在的代码,不编译一个混乱的样品.我认为问题分为三个独立的绘画问题:
最后,应设置一个DefaultDraw := false以便控件不对节点执行默认绘制.
在我看来,这样一个基本的东西应该作为一个真正的工作样本存在,但我发现的最接近的是文档维基,它只是说"看到这个其他的东西",并没有提供其他代码的链接.
非工作样本带有相当多的挥手和不完整的代码,引用了一些未在本演示中定义的内容,但显然是从工作样本中剪切和粘贴的.一些人所做的改变是显而易见的(比如定义你自己的方式来获取画笔的颜色,以及你自己决定节点应该是什么字体的方式),有些则不是,比如如何实现DrawButton:
procedure TCustomDrawForm.TVCustomDrawItem(Sender: TCustomTreeView; Node: TTreeNode;
State: TCustomDrawState; var DefaultDraw: Boolean);
var
NodeRect: TRect;
begin
with TV.Canvas do
begin
{
If DefaultDraw it is true, any of the node's font
properties can be changed. Note also that when
DefaultDraw = True, Windows draws the buttons and
ignores our font background colors, using instead the
TreeView's Color property.
}
if cdsSelected in State then
begin
Font.Assign(SelectedFontDialog.Font); …Run Code Online (Sandbox Code Playgroud) 单元SysUtils(System.SysUtils)不再具有EraNames或FormatSettings.EraNames.什么是它的替代品,它去了哪里?
即:
for I := Low(SysUtils.EraNames) to High(SysUtils.EraNames) do
begin
..
end;
Run Code Online (Sandbox Code Playgroud) 在开发Azure移动服务时,我可以在本地运行时运行测试页面.如果我按下"试一试"按钮,我可以测试我的api,但是当发布到Azure时,我需要进行身份验证才能使用"试一试"按钮.
我的问题是测试页面发布到云时的用户名和密码是什么?我没有在我的项目中指定任何授权.
我试图将一些在Delphi XE8中运行的代码移植到Delphi 10 Seattle.此代码调用Winapi.Windows中的GetPath函数.
新的Win32 API函数签名是:
function GetPath(DC: HDC; Points: PPointL; Types: PByte; nSize: Integer): Integer; stdcall;
Run Code Online (Sandbox Code Playgroud)
在XE8中,先前该函数具有"var Points,Types",其通常被称为"var无类型"参数.
修复代码以使用Delphi 10 Seattle意味着"统一"应用程序代码中的任意类型,以准确使用单元本身中声明的类型.然而令我困惑的是,有两种类型,PPointL和TPoint,当我得到GetPath函数时,它填充的数据被填充到_POINTL记录数组中,因此在Winapi.Windows中声明:
type
_POINTL = record { ptl }
x: Longint;
y: Longint;
end;
{$EXTERNALSYM _POINTL}
PPointL = ^TPointL;
TPointL = _POINTL;
Run Code Online (Sandbox Code Playgroud)
但是,还有另一种类型TPoint,在System.Types中声明:
TPoint = record
X: FixedInt;
Y: FixedInt;
public
Run Code Online (Sandbox Code Playgroud)
在其他地方,对于32位和64位Windows,FixedInt都是Longint的别名,因此就我所知,TPoint和_POINTL至少在Windows平台上是等效的.
如果现有的应用程序组件代码都使用名为TPoint的类型,如下所示:
procedure AddPoint(const P:TPoint);
Run Code Online (Sandbox Code Playgroud)
......对于Delphi 10中的RTL源内部情况,我有什么意义?我应该怎样解决这个问题?别名TPoint到单位级_POINTL?
我该如何解决这个问题并继续进行?由于此代码是商业组件,我想我会等到供应商修复此问题,但是,我认为理解RTL中的_POINTL和TPoint,以及为什么这些结构在定义中冗余/重复,将有助于其他人将低级Win32代码从Delphi XE8移植到Delphi 10 Seattle.
更新:作为一种解决方法,我发现我可以重新声明GetPath函数的导入,并在我自己的私有单元实现区域导入中将其保留为var无类型,并继续:
{$ifdef D23}
{$POINTERMATH ON}
// Delphi 10 Seattle: function GetPath(DC: HDC; Points: PPointL; Types: PByte; nSize: Integer): …Run Code Online (Sandbox Code Playgroud) 是否可以从Delphi应用程序中调用内核Native API?喜欢nt和zw系统调用.
delphi ×8
winapi ×3
azure ×1
c++builder ×1
collections ×1
dbgrid ×1
delphi-7 ×1
delphi-xe5 ×1
generics ×1
java ×1
python ×1
scrollbar ×1
system-calls ×1
treeview ×1
visual-c++ ×1
windows ×1