我正在使用Indy(idHTTP)从Internet下载EXE文件,我可以使用memorystream或filestream将其保存到磁盘,但我真的不知道它们之间是否有任何区别(可能在文件的结果结构中? ).我找不到答案.
这里有两个简单的函数来模拟我在做什么:
Function DownloadMS(FUrl, Dest: String): Boolean;
var
Http: TIdHTTP;
Strm: TMemoryStream;
Begin
Result := False;
Http := TIdHTTP.Create;
Strm := TMemoryStream.Create;
With Http, Strm Do
Try
Try
Get(FUrl, Strm);
If (Size > 0) Then
Begin
Position := 0;
SaveToFile(Dest);
Result := True;
end;
Except
end;
Finally
Strm.Free;
Http.Free;
end;
end;
Function DownloadFS(FUrl, Dest: String): Boolean;
var
Http: TIdHTTP;
Strm: TFileStream;
Begin
Result := False;
Http := TIdHTTP.Create;
Strm := TFileStream.Create(Dest, fmCreate);
With Http, Strm Do
Try
Try
Get(FUrl, …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Delphi XE3在Windows 7上管理防火墙规则(例外).我发现了一个非常有趣的代码,用于向Windows防火墙添加规则,但没有删除(删除)它.拜托,有人可以帮忙吗?
以下是添加规则的代码:
procedure AddExceptToFirewall(const Caption, AppPath: String);
// Uses ComObj
const
NET_FW_PROFILE2_PRIVATE = 2;
NET_FW_PROFILE2_PUBLIC = 4;
NET_FW_IP_PROTOCOL_TCP = 6;
NET_FW_ACTION_ALLOW = 1;
var
Profile: Integer;
Policy2: OleVariant;
RObject: OleVariant;
NewRule: OleVariant;
begin
Profile := NET_FW_PROFILE2_PRIVATE OR NET_FW_PROFILE2_PUBLIC;
Policy2 := CreateOleObject('HNetCfg.FwPolicy2');
RObject := Policy2.Rules;
NewRule := CreateOleObject('HNetCfg.FWRule');
NewRule.Name := Caption;
NewRule.Description := Caption;
NewRule.ApplicationName := AppPath;
NewRule.Protocol := NET_FW_IP_PROTOCOL_TCP;
NewRule.Enabled := True;
NewRule.Grouping := '';
NewRule.Profiles := Profile;
NewRule.Action := NET_FW_ACTION_ALLOW;
RObject.Add(NewRule);
end;
Run Code Online (Sandbox Code Playgroud)
谢谢!
我最近开始学习 SQL,现在被要求对表执行一个简单的删除,保留每个用户的最后 100 条记录。我正在研究将其存档的最佳方法(更有效的方法),并找到了一些可能的解决方案(SQL 查询:从表中删除除最新 N 之外的所有记录?,从 SQL 中的数据库表中删除除前 n之外的所有记录),但它是那种错综复杂的让我根据效率选择一个。所以我在这里寻求你的帮助。
这是我们保存用户访问日志的名为“访问”的表。
access:
- id (autoincrement) - primary
- userid (integer 11) - key
- refer (varchar 100)
- date (date/time)
Run Code Online (Sandbox Code Playgroud)
我的想法是每次同一用户进入系统时,就在插入新日志之前,从用户 ID 中删除旧记录。
我已经尝试了以下代码,但出现错误:此版本的 MySQL 尚不支持“LIMIT & IN/ALL/ANY/SOME 子查询”
DELETE FROM
access
WHERE
id NOT IN (
SELECT id FROM access WHERE userid = 10 ORDER BY id DESC LIMIT 100
);
Run Code Online (Sandbox Code Playgroud)
拜托,你能给我建议一些解决方案吗?谢谢!
我正在为使用Delphi 7创建的软件设计保护模式,想知道我是否需要担心函数/过程,变量等中使用的名称。“黑客”能否在已编译的exe VCL应用程序中访问这些名称?在没有任何第三方保护(即混淆)的情况下使用Delphi创建的?
我需要通过HTML字符串并将字符替换为0(零),标签,空格和换行符除外.我在下面创建了这个代码,但它太慢了.请有人帮助我加快速度(优化)吗?
procedure TForm1.btn1Click(Sender: TObject);
var
Txt: String;
Idx: Integer;
Tag: Boolean;
begin
Tag := False;
Txt := mem1.Text;
For Idx := 0 to Length(Txt) - 1 Do
Begin
If (Txt[Idx] = '<') Then
Tag := True Else
If (Txt[Idx] = '>') Then
Begin
Tag := False;
Continue;
end;
If Tag Then Continue;
If (not (Txt[Idx] in [#10, #13, #32])) Then
Txt[Idx] := '0';
end;
mem2.Text := Txt;
end;
Run Code Online (Sandbox Code Playgroud)
HTML文本永远不会有"<"或">"外部标记(在文本中间),所以我不需要担心这一点.
谢谢!
我的想法是使用TDictionary来管理IdTCPServer上的客户端连接.这是一个简单的示例代码(未经过测试),用于理解目的:
var
Dic: TDictionary<string, TIdContext>;
procedure TfrmMain.FormCreate(Sender: TObject);
begin
Dic := TDictionary<string, TIdContext>.Create;
end;
procedure TfrmMain.FormDestroy(Sender: TObject);
begin
Dic.Free;
end;
procedure TfrmMain.TCPServerConnect(AContext: TIdContext);
var
Hostname: string;
begin
Hostname := UpperCase(GStack.HostByAddress(AContext.Binding.PeerIP));
if not Dic.ContainsKey(Hostname) then Dic.Add(Hostname, AContext);
end;
procedure TfrmMain.TCPServerDisconnect(AContext: TIdContext);
var
Hostname: string;
begin
Hostname := UpperCase(GStack.HostByAddress(AContext.Binding.PeerIP));
if Dic.ContainsKey(Hostname) then
begin
Dic[Hostname].Free;
Dic.Remove(Hostname);
end;
end;
Run Code Online (Sandbox Code Playgroud)
这段代码线程安全吗?
也许(可能)这是一个愚蠢的问题,但我找不到答案......
请检查这个假设代码:
type
TCustomType = (Type1, Type2, Type3);
function CustomTypeToStr(CTp: TCustomType): string;
begin
Result := '';
case CTp of
Type1: Result := 'Type1';
Type2: Result := 'Type2';
Type3: Result := 'Type3';
end;
end;
function StrToCustomType(Str: string): TCustomType;
begin
Result := nil; <--- ERROR (Incompatible types: 'TCustomType' and 'Pointer')
if (Str = 'Type1') then
Result := Type1 else
if (Str = 'Type2') then
Result := Type2 else
if (Str = 'Type3') then
Result := Type3;
end;
Run Code Online (Sandbox Code Playgroud)
请问,如何将nil/null/empty设置为此自定义类型var,以便检查函数结果并避免出现问题?
我正在创建一个远程文件管理器。服务器端应用程序获取计算机中的驱动程序、目录和文件列表,将其保存为流并在我所在的当前计算机中发送给我。一切正常。
在当前计算机中,首先我使用“OnCreate”事件用外壳图标(来自同一台当前计算机)填充 TListImage 并将其与将显示文件列表的 ListView 链接。因此,一旦收到列表,我就使用下面的这个函数在 ListView 中显示通用文件图标:
function GetGenericFileIconIndex(Filename: string): Integer;
var
FInfo: TSHFileInfo;
begin
Result := -1;
if (SHGetFileInfo(PChar(Filename), FILE_ATTRIBUTE_NORMAL, FInfo, SizeOf(FInfo),
SHGFI_SYSICONINDEX or SHGFI_USEFILEATTRIBUTES) <> 0) then
Result := FInfo.iIcon;
end;
for I := 0 to Pred(List.Count) do
begin
Item := ListView.Items.Add;
Item.ImageIndex := GetGenericFileIconIndex(List[I]);
Item.Caption := List[I];
end;
Run Code Online (Sandbox Code Playgroud)
使用文件名/扩展名,即使在不同的计算机中,我也可以获得正确的外壳图标。但我还需要显示正确的驱动器类型图标。例如,远程计算机上的“D:\”是本地固定驱动器,而当前计算机上的“D:\”是CD/DVD驱动器,因此我无法使用驱动器号来获取此图标。我需要一种从远程计算机(固定驱动器)获取“通用”驱动器类型图标索引并将其发送到当前计算机的方法。
例如,我的目标是获得一个默认的图标为一个本地硬盘跳水,一次默认图标为远程磁盘,CD / DVD设备等等...
抱歉有错误,英语不是我的母语。我尽力解释。
也许我需要的是不可能的,请告诉我...
谢谢!
请关于这段代码:
type
TClient = class(TObject)
public
Host: String;
Queue: TIdThreadSafeStringList;
end;
var
Clients: TThreadList;
procedure TMain.FormCreate(Sender: TObject);
const
Hosts: Array[0..4] of String = (
'HOST1', 'HOST2', 'HOST3', 'HOST4, 'HOST5'
);
var
I: Integer;
List: TList;
Client: TClient;
begin
Clients := TThreadList.Create;
Clients.Duplicates := dupAccept;
for I := Low(Hosts) to High(Hosts) do
begin
Client := TClient.Create;
Client.Host := Hosts[I];
Client.Queue := TIdThreadSafeStringList.Create;
Clients.Add(Client);
Client := nil;
end;
end;
Run Code Online (Sandbox Code Playgroud)
我想知道释放内存的正确方法是:
procedure TMain.FormDestroy(Sender: TObject);
var
I: Integer;
List: TList;
begin
List := Clients.LockList; …Run Code Online (Sandbox Code Playgroud) 我不知道这是否可能,但我需要的是通过指针访问(使用和释放)TStream 变量,将字符串参数传递给另一个函数。
这是我正在尝试做的“不起作用”的示例:
procedure TForm1.Button1Click(Sender: TObject);
var
Stm: TMemoryStream;
begin
Stm := TMemoryStream.Create;
try
Memo.Lines.SaveToStream(Stm);
Stm.Position := 0;
Memo.Clear;
Edit.Text := IntToStr(Integer(@Stm));
except
Stm.Free;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
PStm: ^TMemoryStream;
begin
PStm := Pointer(StrToInt(Edit.Text));
try
Memo.Lines.LoadFromStream(PStm^); // <--- Access Violation
finally
PStm^.Free;
end;
end;
Run Code Online (Sandbox Code Playgroud)
感谢您帮助解决这个问题!