小编Guy*_*ush的帖子

Delphi - MemoryStream或FileStream

我正在使用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 memorystream indy filestream idhttp

7
推荐指数
1
解决办法
2万
查看次数

使用Delphi删除Windows防火墙规则(例外)

我正在尝试使用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)

谢谢!

windows delphi firewall exception rule

5
推荐指数
1
解决办法
2186
查看次数

MySQL - 有效删除除最后 N 条以外的所有记录

我最近开始学习 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)

拜托,你能给我建议一些解决方案吗?谢谢!

mysql sql sql-delete

5
推荐指数
1
解决办法
2548
查看次数

黑客可以访问已编译的exe Delphi VCL应用程序中的变量,方法,单元等名称吗?

我正在为使用Delphi 7创建的软件设计保护模式,想知道我是否需要担心函数/过程,变量等中使用的名称。“黑客”能否在已编译的exe VCL应用程序中访问这些名称?在没有任何第三方保护(即混淆)的情况下使用Delphi创建的?

delphi decompiling reverse-engineering software-protection

5
推荐指数
1
解决办法
183
查看次数

替换HTML字符串中的字符 - 除标记外

我需要通过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文本永远不会有"<"或">"外部标记(在文本中间),所以我不需要担心这一点.

谢谢!

html delphi string replace char

4
推荐指数
1
解决办法
383
查看次数

Delphi - TDictionary线程是否安全

我的想法是使用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)

这段代码线程安全吗?

delphi multithreading tcp indy thread-safety

4
推荐指数
1
解决办法
2217
查看次数

将枚举类型var设置为nil

也许(可能)这是一个愚蠢的问题,但我找不到答案......

请检查这个假设代码:

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,以便检查函数结果并避免出现问题?

delphi

4
推荐指数
1
解决办法
914
查看次数

如何获取驱动器、设备或文件的默认系统图标

我正在创建一个远程文件管理器。服务器端应用程序获取计算机中的驱动程序、目录和文件列表,将其保存为流并在我所在的当前计算机中发送给我。一切正常。

在当前计算机中,首先我使用“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设备等等...

抱歉有错误,英语不是我的母语。我尽力解释。

也许我需要的是不可能的,请告诉我...

谢谢!

delphi winapi icons

4
推荐指数
1
解决办法
2347
查看次数

Delphi - 我必须在发布之前释放TObject中的所有元素吗?

请关于这段代码:

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)

delphi memory-management list object

3
推荐指数
1
解决办法
437
查看次数

Delphi - 将变量指针作为字符串传递给另一个函数

我不知道这是否可能,但我需要的是通过指针访问(使用和释放)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)

感谢您帮助解决这个问题!

delphi pointers stream

3
推荐指数
1
解决办法
2288
查看次数