我需要从EXE中提取所有图标并将它们保存为磁盘文件,但我无法使用最简单的解决方案(ExtractIconEx),因为我需要以保留大尺寸图标的方式提取ICO文件,即使代码运行在运行Windows XP的系统上.我稍后会使用其他代码提取想要的图标(128x128和其他vista大小图标),但我需要一种方法来提取所有图标,包括它们在EXE中存在的所有资源,无论我的代码是否运行PC on正在运行XP,Vista或Win7.
到目前为止,我知道图标在RT_GROUP_ICONS中.
我知道有些人之前必须在Delphi中这样做,因为像IcoFX和resource-explorer这样的实用程序似乎已经这样做了.我曾经记得看到一个完全开源的Delphi工具可以做到这一点,但它是在几年前.
重述我使用ExtractIconEx的问题 - 它不会访问整个.ico文件,它只会提取支持的图标资源格式,这是平台支持的单一分辨率(大小).因此,在XP上,它将提取32x32或48x48图标,但不提取Vista格式的128x128图标.
更新:这是已接受答案的修改版本,解决了我未来的担忧.如果我们调用的函数以某种方式在未来的Windows版本中从User32.dll中消失,我希望它更优雅地失败,而不是加载我的整个应用程序.
unit ExtractIconUtils;
interface
uses Graphics,Forms,Windows;
//----------------------------------------------------------------------------
// ExtractIcons
// Call "private" MS Api to extract Icon file. This calls a publically
// documented function marked as deprecated in the MSDN documentation.
// It was no doubt Not Originally Intended to be documented, or publically
// accessed, but it provides functionality that its hard to live without.
// It exists on Windows 2000, XP, Vista, and Windows7, …Run Code Online (Sandbox Code Playgroud) 今天有一位朋友问我下面的代码:
var
a: Integer;
begin
ShowMessage(IntToStr(a));
end;
Run Code Online (Sandbox Code Playgroud)
这是局部变量,尚未初始化,好吗?
将代码放在按钮组件的OnClick事件中,然后以下面三种不同的方式运行代码:
我在两台不同的计算机上测试代码并看到相同的结果,对此有何看法?
我想让Drag和Dock在我的应用程序中也能像在Delphi IDE中那样工作(即能够在Object Inspector/Structure View中拖动它们并将它们停靠在合适的站点上).将表格对接到PageControl我已经取得了相当不错的成功,但是想知道是否有人知道如何使用小关闭按钮和引脚等工作.
我也有兴趣了解Delphi IDE使用哪些组件来实现这一目标.
当你有一个TDBGrid,全行选择,并且总是显示选择,即使没有聚焦,你想完全拥有它,你可以选择一个不赞成的事件OnDrawDataCell,一个新的事件DrawColumnCell,我选择后者并尝试这个:
procedure TDbGridTestForm.mygridDrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
if gdSelected in State then begin
// mygrid.DrawCellHighlight(Rect, State, Col, Row);
mygrid.Canvas.Brush.Color := clHighlight;
mygrid.Canvas.Font.Color := clHighlightText;
mygrid.Canvas.FillRect(Rect);
end;
mygrid.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;
Run Code Online (Sandbox Code Playgroud)
让我疯狂的是,我不会使用DefaultDrawColumnCell代码绘制焦点指示(高亮颜色和焦点矩形),我确信我应该调用DrawCellHighlight而不是执行上面我正在做的FillRect hack.
如果我打开DefaultDrawing,我会得到一组毛刺(奇怪的字体绘画问题),如果我将其关闭,我会得到另一组毛刺(即使在gdSelected时也没有突出显示).
DBGrids.pas DefaultDrawColumnCell中的代码除了绘制文本之外什么都不做.很明显,如果你自己接管所有绘图代码,你应该做更多.但是,DBGrids.pas所依赖的Grids.pas中内置的高亮绘图代码并非设计为从此上下文调用.我无法弄清楚我是否应该直接调用DrawCellHighlight(如上所示),并计算Col和Row值,或者我是否应该编写自己的TCustomGrid.DrawCellHighlight复杂版本来手动处理所有各种情况.
当然,这是如此简单,明显,我只是忽略它.我必须关闭DefaultDrawing,因此我必须完全从我的所有者绘制事件中绘制,并且我必须能够在主题服务不可用时运行,并且我必须在主题服务可用时使用它们.所以我需要直接调用TCustomGrid.DrawCellHighlight(我不知道如何),或者我需要完全重新实现它.
我使用/ etc/default/jenkins设置了JENKINS_ARGS,并使用www-data用户启动jenkins作为守护进程.
系统信息页面显示--prefix =/jenkins已设置
HOME/var/www HUDSON_HOME/var/jenkins JENKINS_ARGS --prefix =/jenkins
但仍然只能通过http:// ip:port /而不是http:// ip:port / jenkin访问jenkins .
我还在配置页面上设置了Jenkins URL,但没有成功.
如果还有什么我应该做的,你知道更多吗?
这是我的环境:Linux robopar12227 2.6.35-22-server#35-Ubuntu SMP Sat Oct 16 22:02:33 UTC 2010 x86_64 GNU/Linux java version"1.6.0_20"OpenJDK Runtime Environment(IcedTea6 1.9.13)( 6b20-1.9.13-0ubuntu1~10.10.1)OpenJDK 64位服务器VM(内置19.0-b09,混合模式)Jenkins ver.1.447
我记得有些人做了他的一个IDE专家,更换了库存对象检查员添加过滤等
但我坦率地忘了它的名字
它是如此通用,谷歌搜索我只能得到OI的运行时克隆,而不是IDE加载项.
在Windows中,我可以通过调用GetProcessMemoryInfo来获取Peak Memory的使用情况
function TProcess.Peek: Cardinal;
var
PMC: PPROCESS_MEMORY_COUNTERS;
PMCSize: Cardinal;
begin
PMCSize := SizeOf(PROCESS_MEMORY_COUNTERS);
GetMem(PMC, PMCSize);
try
PMC^.cb := PMCSize;
if GetProcessMemoryInfo(FHandle, PMC, PMCSize) then
Exit(PMC^.PeakWorkingSetSize)
else
Exit(0);
finally
FreeMem(PMC);
end;
end;
Run Code Online (Sandbox Code Playgroud)
什么是Mac OS相当于这样做?
我目前正在尝试加载一个xml文件并修改一对xml标签内的文本,如下所示:
<anode>sometext</anode>
Run Code Online (Sandbox Code Playgroud)
我目前有一个名为helper的函数getText,用于获取sometext上面的文本.现在我需要修改childnodes我想在节点内部修改具有上面显示的XML片段的节点,以更改sometext为othertext.常见的API补丁getText功能如下脚注所示.
所以我的问题是,这就是我们如何获取文本,如何编写一个名为的伴随辅助函数setText(node,'newtext').我更喜欢它是在节点级别上运行的,并且可以自己找到子节点,并且运行稳健.
之前的一个问题有一个接受的答案,上面写着" 我不确定你是否可以修改DOM ".这是真的吗?Minidom是如此破碎,它是否有效只读?
通过脚注,读取<anode>和之间的文本</anode>,我感到惊讶没有直接简单的单个minidom函数存在,并且这个小帮助函数在Python xml教程中建议:
import xml.dom.minidom
def getText(nodelist):
rc = []
for node in nodelist:
if node.nodeType == node.TEXT_NODE:
rc.append(node.data)
return ''.join(rc)
# I've added this bit to make usage of the above clearer
def getTextFromNode(node):
return getText(node.childNodes)
Run Code Online (Sandbox Code Playgroud)
在StackOverflow的其他地方,我从2008年看到了这个接受的答案:
node[0].firstChild.nodeValue
Run Code Online (Sandbox Code Playgroud)
如果用minidom读取它有多难,我不会惊讶地看到有人说"就是不要这样做!" 当你问如何编写可能修改XML文档的Node结构的东西时.
更新下面的答案显示它并不像我想象的那么难.
我正在使用Mercurial,但我想任何知道它下面的版本控制系统的合并工具都可以做一些合并工具,它不知道版本控制系统,只看到两个不同文件夹中的两个"文件" ,永远不会.
我一直在使用KDIFF3,最近尝试过BeyondCompare,他们都不会这样做,至少不是我能搞清楚的.
我想要做的是最好地显示在这张图片,一个注释列,甚至可能从这些注释列打开其他窗口,这样我就可以浏览特定文件的特定版本,以便在尝试合并时查看上下文.
在这里的图像中,我显示了双向合并,但同样适用于三向合并.在显示的实际文件内容的右侧或左侧,我想要一个装订线或右侧注释列,显示这种更改来自何处的某种注释.由于Mercurial hex id相对不友好且无用,并且由于repository-local-revision-numbers是本地存储库,我认为基于提交注释的简短文本描述将是最有帮助的.当然,对于Mercurial,99%的提交评论都会说"Merge",而不是别的.(呻吟.)但是让我们假装我们没有使用工具和工作流程让我们在合并时瘫痪,相反,每次我们都可以看到有用的提交注释:

现在,复杂合并的工作流程对我来说是这样的:
使用我的分布式版本控制工具(mercurial),从另一个实际上是分支的存储库中提取更改.合并.TortoiseHg的合并窗口通常是我从这里开始的.这反过来让我配置合并工具(超出比较或Kdiff3).
但是,似乎没有任何合并工具(我已经看到)可以被告知,"嘿,你不只是在两个完全不同的文件夹中使用不同版本的文件以两种方式或三种方式合并,我告诉你的名字,但这些文件也是具有完整编辑历史的文件,可以向你展示你的人类实际的上下文,这些行更改的提交来自他们的提交注释,通常有一个错误号作为提交将使合并的人能够看到真正发生的事情.
我会从Mercurial改为Git,例如,甚至,对于一个真正的合并体验,并没有强迫我手动完成我认为我的工具可以自动为我做的事情.我正在使用Mercurial,TortoiseHG和KDIFF3,如果我可以从KDIFF3更改为其他工具,或者根本不做任何注释并在一个屏幕上合并,我想这样做.
我试图在Tkinter中使用网格布局管理器来创建一个对话框.我希望底部的文本区域有一个滚动条.不幸的是,我无法弄清楚如何使滚动条与它旁边的文本小部件的高度相同.下面的示例显示滚动条位于正确位置但尺寸错误(仅为Text小部件高度的10%左右).

from tkinter import *
class queryrunner(Tk):
def __init__(self,parent):
Tk.__init__(self,parent)
self.parent = parent
self.minsize(width=800,height=500)
self.initialize()
def initialize(self):
self.grid_columnconfigure(2,weight=1)
self.grid_columnconfigure(3,weight=1)
self.grid_columnconfigure(6,weight=2)
self.grid_rowconfigure(0,weight=1)
self.grid_rowconfigure(1,weight=1)
self.grid_rowconfigure(2,weight=1)
self.grid_rowconfigure(3,weight=1)
self.grid_rowconfigure(4,weight=1)
# BUCKET AND N1QL LABEL + INPUT PAIRS:
self.label = Label(self,text="Bucket", width=10, anchor="w")
self.label.grid(column=0,row=0,columnspan=1,sticky='W')
self.entry = Entry(self);
self.entry.grid(column=1,row=0, columnspan=3, sticky='EW')
self.entry.insert(0, "couchbase://couchbase1.mycompany.com/beer-sample" )
# EXECUTE N1QL QUERY AGAINST BUCKET WHEN BUTTON CLICKED:
self.button = Button(self,text="Go",width=20)
self.button.grid(column=6,row=0)
self.label2 = Label(self,text="N1QL", anchor="w")
self.label2.grid(column=0,row=1,columnspan=1,sticky='W')
self.entry2 = Text(self,height=5);
self.entry2.grid(column=1,row=1, columnspan=3, rowspan=1, sticky='W')
self.label3 = Label(self,text="Output:", width=50,anchor="w")
self.label3.grid(column=0,row=4,columnspan=5,sticky='W')
self.entry3 = …Run Code Online (Sandbox Code Playgroud)