我试图使一组应用程序使用UDP和广播消息发现彼此.应用程序将定期发送一个UDP数据包,说明它们是谁以及它们可以做什么.最初我们只用于广播到INADDR_BROADCAST.
所有应用程序共享同一个端口进行监听(因此SO_REUSEADDR).事件内核对象附加到套接字,因此当我们可以获取新数据包并在WaitFor循环中使用它时,我们会收到通知.套接字用于异步.
打开插座:
FBroadcastSocket := socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP );
if FBroadcastSocket = INVALID_SOCKET then Exit;
i := 1;
setsockopt( FBroadcastSocket, SOL_SOCKET, SO_REUSEADDR, Pointer( @i ), sizeof( i ) );
i := 1;
setsockopt( FBroadcastSocket, SOL_SOCKET, SO_BROADCAST, Pointer( @i ), sizeof( i ) );
System.FillChar( A, sizeof( A ), 0 );
A.sin_family := AF_INET;
A.sin_port := htons( FBroadcastPort );
A.sin_addr.S_addr := INADDR_ANY;
if bind( FBroadcastSocket, A, sizeof( A ) ) = SOCKET_ERROR then begin
CloseBroadcastSocket();
Exit;
end;
WSAEventSelect( FBroadcastSocket, FBroadcastEvent, …
Run Code Online (Sandbox Code Playgroud) 我有一个使用 vue-router 的 Vue.js SPA。因为登录后每个页面都需要保持状态(如输入的过滤器/分页)这是使用保持活动完成的:
<keep-alive>
<router-view/>
</keep-alive>
Run Code Online (Sandbox Code Playgroud)
这很有效,但是当有人注销并再次登录时,由于保持活动状态,我仍然看到相同的过滤器值。
我可以在注销时以某种方式刷新/清除以编程方式保持活动的页面吗?
我试图将PDF内容呈现给GDI设备上下文(确切地说是24位位图).将PDF流解析为PDF对象并从内容字典中呈现PDF命令效果很好,包括字体渲染.
嵌入式字体从其FontFile流中解压缩并使用"加载" AddFontMemResourceEx
.现在一些嵌入字体删除了GDI所需的一些TrueType表,比如'name'表.因此,我尝试通过将TrueType子集字体解析为其表来修改字体,并修改那些具有数据缺失/缺失表的表,并使用尽可能正确的信息重新生成.
我使用Microsoft字体验证工具来查看生成的字体是如何"正确"的.我仍然得到一些错误,比如对于maxp表,最大值通常太大(它是一个子集)或者xAvgCharWidth
字段不等于'OS/2'表的计算值不正确但这不会停止其他嵌入字体可用.使用PDFCreator嵌入的字体是有问题的.
问题:
如果需要:我可以在某处制作原始字体文件和更改后的字体文件.
到目前为止做了哪些修改:
当使用 Graphics 单元中的 GDI 位图的 TBitmap 包装器时,我注意到在使用 SetSize( w, h ) 设置位图时,它总是会清除位图(使用 PatBlt 调用)。当我稍后复制这些位时(参见下面的例程),似乎 ScanLine 是最快的可能性,而不是 SetDIBits。
function ToBitmap: TBitmap;
var
i, N, x: Integer;
S, D: PAnsiChar;
begin
Result := TBitmap.Create();
Result.PixelFormat := pf32bit;
Result.SetSize( width, height );
S := Src;
D := Result.ScanLine[ 0 ];
x := Integer( Result.ScanLine[ 1 ] ) - Integer( D );
N := width * sizeof( longword );
for i := 0 to height - 1 do begin
Move( S^, D^, N ); …
Run Code Online (Sandbox Code Playgroud) 正如在其他SO问题中所回答的那样,现代Delphi最终支持编译器内部函数AtomicIncrement
.
在某个地方有一个列表,其中的内部函数是在哪个版本的Delphi中引入的,因此我可以使用它{$if CompilerVersion ...}
来保持代码向后兼容(使用内联asm)和更清晰的未来编译器?
在我需要以不同方式处理大量键的应用程序中,我想要处理WM_KEYDOWN中的所有情况,而根本不使用WM_CHAR.是否可以从WM_KEYDOWN提供的虚拟键序列中获取正确的ASCII/UNICODE字符,而不是依赖于更常规的TranslateMsg/WM_CHAR?
作为一个例子:应用程序应该能够以完全不同的方式处理Shift-B,按下CTRL-B的常规B.
使用MapVirtualKey,您不使用Shift,Control和Alt键的状态,或者至少不是我能看到的状态.
正如Leo Davidson所说:你可以使用ToUnicode调用来自己执行VK - > Unicode转换.
delphi ×3
bitmap ×1
broadcast ×1
gdi ×1
intrinsics ×1
keyboard ×1
localhost ×1
optimization ×1
pdf ×1
truetype ×1
udp ×1
vue-router ×1
vue.js ×1
winapi ×1
windows ×1