下面的代码将stdout重定向到文件fname,然后重定向回原始标准输出.这对我来说可以.但我无法理解它是如何运作的.如果有人能帮助我理解我将会相信它.
printf("\n This is console");
fflush(stdout);
fgetpos(stdout, &pos);
fd = dup(fileno(stdout));
freopen(fname, "a+", stdout);
printf("inside file op");
fflush(stdout);
dup2(fd,fileno(stdout));
close(fd);
clearerr(stdout);
fsetpos(stdout, &pos);
printf("\nBack to Console");
Run Code Online (Sandbox Code Playgroud) 最近我对读取汇编感兴趣,汇编由像ollydbg这样的反汇编程序显示.我想阅读这个程序集的原因是为了了解其他开发人员如何构建他们的应用程序或程序所具有的二进制文件的文件格式之类的东西.
这不像我是一个完整的编程新手,因为我已经使用C++和C#一段时间了.我对C++有了深刻的理解,因此整个指针概念对我来说很清楚.
我知道互联网上有大量的装配指南,但我不知道这个教程有多可靠:http://jakash3.wordpress.com/2010/04/24/x86-assembly-a-crash -course-tutorial-i /对我来说非常有用,这是一种教程,只是对指令的简短解释.这一点对我来说非常清楚,但它并未涵盖所有汇编代码.
我希望有人可以提供一个很好的指导/教程.
此问题遵循以下问题:为什么东京 10.2.3 中存在这种变化?并介绍一下我认为delphi中的一个误解
基本上,在 firemonkey 中,您拥有一些方法BeginUpdate,EndUpdate允许您在更新控件时停用/激活控件。realign每次更改控件的属性之一时,不必重新调整控件几次,而是在最后调用时只执行一次EndUpdate
下面是这些函数的实现:
procedure TControl.BeginUpdate;
var
I: Integer;
begin
if FUpdating = 0 then
DoBeginUpdate;
Inc(FUpdating);
if FControls <> nil then
for I := 0 to FControls.Count - 1 do
FControls[I].BeginUpdate;
end;
procedure TControl.EndUpdate;
var
I: Integer;
begin
if IsUpdating then
begin
if FControls <> nil then
for I := 0 to FControls.Count - 1 do
FControls[I].EndUpdate;
Dec(FUpdating);
if not IsUpdating then
begin …Run Code Online (Sandbox Code Playgroud) 下面的C代码如何在Delphi中完成?我尝试翻译,但似乎Delphi不允许使用此语法。基本上,我需要像在C代码中那样将函数分配给变量。在Delphi上怎么做?
这是参考的C代码:
void EnumWindowsTopToDown(HWND owner, WNDENUMPROC proc, LPARAM param)
{
HWND currentWindow = GetTopWindow(owner);
if (currentWindow == NULL)
return;
if ((currentWindow = GetWindow(currentWindow, GW_HWNDLAST)) == NULL)
return;
while (proc(currentWindow, param) && (currentWindow = GetWindow(currentWindow, GW_HWNDPREV)) != NULL);
}
Run Code Online (Sandbox Code Playgroud)
这是我的尝试:
type
TFNWndEnumProc = function(_hwnd: HWND; _lParam: LPARAM): BOOL; stdcall;
procedure EnumWindowsTopToDown(Owner: HWND; Proc: TFNWndEnumProc;
_Param: LPARAM);
var
CurrentWindow: HWND;
begin
CurrentWindow := GetTopWindow(Owner);
if CurrentWindow = 0 then
Exit;
CurrentWindow := GetWindow(CurrentWindow, GW_HWNDLAST);
if CurrentWindow = 0 then
Exit;
while Proc(CurrentWindow, …Run Code Online (Sandbox Code Playgroud) Delphi书中的编码有关于接口约束的这个例子:
1 type
2 IStoppable = interface
3 procedure Stop;
4 end;
5
6 TWidget<T: IStoppable> = class
7 FProcess: T;
8 procedure StopProcess;
9 end;
10
11 { TWidget<T> }
12
13 procedure TWidget<T>.StopProcess;
14 begin
15 FProcess.Stop;
16 end;
Run Code Online (Sandbox Code Playgroud)
我在第15行不明白他怎么称呼"停止"方法?是不是FProcess是一个通用变量?那他怎么能从变量中调用一个方法呢?
他怎么能直接从界面调用"停止"方法呢?是不是应该调用实现的方法?
我正在使用Delphi 10 Starter版.我正在研究如何使用Delphi的TTreeView组件.
一切正常,没有问题.我留下的唯一问题是:
将对象添加到节点后,删除项及其对象的正确方法是什么?
这是我的代码(见Button6Click):
type
TMyNode2 = class
public
nom: Integer;
comm: String;
end;
var
Form1: TForm1;
MyNode2: TMyNode2;
procedure TForm1.Button1Click(Sender: TObject); // add node
var
x: TTreeNode;
begin
x := tv1.Items.Add(tv1.Selected, Edit1.Text + ' ' + IntToStr(Round(Random(100))));
x.ImageIndex := 1;
x.SelectedIndex := x.ImageIndex;
x.StateIndex := x.ImageIndex;
end;
procedure TForm1.Button4Click(Sender: TObject); // add child node
var
x: TTreeNode;
begin
x := tv1.Items.AddChild(tv1.Selected, 'Child ' + Edit1.Text + ' ' + IntToStr(Round(Random(100))));
x.ImageIndex := 2; …Run Code Online (Sandbox Code Playgroud) Embarcadero公司的RAD Studio VCL有TClipboard.HasFormat方法,有使用例如Clipboard.HasFormat(CF_TEXT)或Clipboard.HasFormat(CF_BITMAP)等.
但我没有找到任何支持CF_RTF或CF_RICHTEXT格式描述符,表明剪贴板中的富文本格式.
所以我在Microsoft WordPad中创建了一些格式化文本并将其复制到剪贴板.然后我用剪贴板间谍程序来检查剪贴板上的格式:
这里列出了3种富文本格式的格式描述符C078,C16B和C1A5.
这些格式描述符是普遍的还是依赖于单个系统或当前情况?即,我通常可以Clipboard.HasFormat($C078)用来检测剪贴板上的任何RichText格式吗?还是有另一种方法吗?
在DelphiAST中有一个基类:TmwSimplePasPar解析Delphi代码.
另外还有一个类:TPasSyntaxTreeBuilder它应该覆盖其基类中的每个方法.
有没有办法检查后代类是否覆盖了其基类中的每个虚方法?
能够放入断言会很高兴.
TPasSyntaxTreeBuilder.Create;
begin
Assert(Self.OverridenMethods.Count = (BaseClass.VirtualMethodCount - TObject.VirtualMethodCount));
....
Run Code Online (Sandbox Code Playgroud)
请注意,我在谈论所有虚拟方法,而不仅仅是抽象方法(不实现抽象方法发出警告).
在Delphi 2007中,我可以使用以下ToolsAPI调用轻松获取当前项目的版本信息:
procedure Test;
var
ProjectOptions: IOTAProjectOptions;
Project: IOTAProject;
Major: Variant;
Minor: Variant;
Release: Variant;
Build: Variant;
begin
// GxOtaGetCurrentProject is a function in GExpert's GX_OTAUtils unit that returns the current IOTAProject
Project := GxOtaGetCurrentProject;
if Assigned(Project) then begin
ProjectOptions := Project.ProjectOptions;
if Assigned(ProjectOptions) then begin
Major := ProjectOptions.Values['MajorVersion'];
Minor := ProjectOptions.Values['MinorVersion'];
Release := ProjectOptions.Values['Release'];
Build := ProjectOptions.Values['Build'];
end;
end;
end;
Run Code Online (Sandbox Code Playgroud)
在Delphi 10.2.3中,无论实际版本号如何,它都将始终返回版本1.0.0.0.这是"简单"的案例:VCL应用程序.
我还尝试了"Keys"值,它返回一个TStrings指针.在那里我也得到了FileVersion字符串,但它总是"1.0.0.0".
我想这与各种平台和配置的支持有关,但我找不到任何关于它现在应该如何工作的文档.我还搜索了ToolsAPI.pas中的"版本"和"发布",但没有出现任何可疑的内容.
有关如何在Delphi 10.2中获取版本信息的任何提示?