经过多次试验,我终于想出了相当简单的 HTML,它以我想要的方式显示表格:6 列具有特定宽度,两列右对齐,在固定标题行下滚动。但是,标题与列不太对齐:
如何使标题与数据列完全对齐? 我的在线搜索发现这是一个常见问题,但没有真正的原因解释或已知的简单修复。
我的 HTML 如下。由于最终将显示的数据,列宽是幻数。使标题文本正常而不是粗体,甚至是空标题,对对齐没有影响。
如果除了解决对齐问题之外,您还有更简单的方法来定义具有相同特征的表格,请告诉我。
编辑: box-sizing: border-box;正如 ProllyGeek 推荐的那样,它似乎很有希望,因为它适用于上面的示例数据,但是使用不同的单元格数据仍然会导致对齐稍微偏离,如下所示(价格/下降、下降/描述和项目#/发布的列边框是即使在使用border-box)时也关闭:
有数十个甚至数百个帖子想要在可滚动行上添加粘性标题,但显然所有解决方案都避免动态列,通常使用颜色来隐藏对齐问题,或者必须知道表格宽度的封闭 div 以显示正确放置在旁边的滚动条动态列宽。大多数示例忽略列宽,只使用 100% 宽的带有超大列的表格。
对于具有动态列宽(未声明表格宽度)、在可滚动行上、具有精确的标题和列对齐、仅使用纯 CSS/HTML 的粘性标题,似乎没有已知的自动解决方案。
我只是要使用thead { background-color: black; color: white; }.
<style>
table {
width: 688px; /* 688 = column widths 80 + 56 + 280 + 120 + 56 + 96 */
table-layout: fixed;
font: 12px Courier;
border-collapse: collapse;
}
table, th, td {
border: 1px solid black;
padding: 5px;
}
tbody {
display: block;
width: …Run Code Online (Sandbox Code Playgroud)构建,而不仅仅是编译,如果启用了优化,则在使用Delphi 6时,以下内容将导致编译错误.使用赋值而不是inc()有效.这是编译器错误吗?奇怪的记录结构是因为原始代码已经简化为这个最小的例子.
program Project1;
type
requestCountsType = array[0..1] of
record
processed: int64;
end;
talliestype = record
counts: requestCountsType;
end;
healthtype = record
charged: talliestype;
end;
procedure computeProcessed(const h: healthtype; var requests, bytesin, bytesout: int64);
var i: byte;
begin
requests := 0; bytesin := 0; bytesout := 0;
for i := 0 to 1 do
begin
inc(requests, h.charged.counts[i].processed); // including this generates compiler internal error C1405 when optimization is on
// requests := requests + h.charged.counts[i].processed; // this works
end;
end; …Run Code Online (Sandbox Code Playgroud) 优化开/关无关紧要.这是用于演示警告的简化代码.在原始例程中,所有赋值和比较都是可以返回各种值的函数表达式.
procedure test;
var i, k: integer;
begin
k := 21;
repeat
if k = 20 then break;
i := 5
until i = 5;
end;
Run Code Online (Sandbox Code Playgroud) 我正在进行UDP服务器/客户端配置.客户端向服务器发送一个数据包,其大小不一,但通常<500字节.服务器基本上立即响应单个传出数据包,通常小于传入请求数据包.完整的事务总是由单个数据包交换组成.
如果客户端在T时间内没有看到响应,则重试R次,在每次重试之前将T增加X,最后放弃并返回错误.目前,R永远不会改变.
选择最佳初始T(等待时间),R(重试)和X(等待增加)是否有任何特殊逻辑?应该重试的持久性(即,使用什么最小值R)来达到某种"可靠"协议的近似值?
此代码适用于使用阻塞套接字的HTTPS服务器:
request := '';
start := gettickcount;
repeat
if SSL_pending(ssl) > 0 then
begin
bytesin := SSL_read(ssl, buffer, sizeof(buffer)-1);
if bytesin > 0 then
begin
buffer[bytesin] := #0;
request := request + buffer;
end
else break; // read failed
end; // pending
until (gettickcount - start) > LARGETIMEOUT;
// "request" is ready, though possibly empty
Run Code Online (Sandbox Code Playgroud)
SSL_pending()始终返回零,并且永远不会到达SSL_read().如果删除了SSL_pending()调用,则执行SSL_read().为什么SSL_pending()不指示可用的字节数?
请注意,如果您调用SSL_read()并且返回的字节数小于缓冲区大小,那么您已经阅读了所有内容并完成了操作.
如果传入的数据大于缓冲区大小,则第一个SSL_read()调用将填充缓冲区,您可以重复调用SSL_read(),直到无法填充缓冲区为止.
但是如果传入的数据是缓冲区大小的精确倍数,则最后一块数据填充缓冲区.如果您尝试另一个SSL_read()认为阻塞套接字上可能有更多数据,它会无限期挂起.因此,首先要检查SSL_pending().然而,这似乎不起作用.
你如何避免挂在最后的SSL_read()上?(我无法想象答案是非阻塞,因为这意味着你永远不能将SSL_read与阻塞一起使用.)
更新: 以下工作.显然SSL_pending()在第一个SSL_read()之后才起作用:
request := '';
repeat
bytesin := SSL_read(ssl, buffer, sizeof(buffer)-1);
if bytesin > 0 then
begin …Run Code Online (Sandbox Code Playgroud) 为什么TCP三次握手在初始握手期间执行时会碰到序列号?这比仅仅保留确认号等于序列号更好吗?
建立连接
Client sends SYN,A
Server responds with SYN-ACK,A+1,B
Client confirms with ACK,B+1
Run Code Online (Sandbox Code Playgroud)
怎么比这更好
Client sends SYN,A
Server responds with SYN-ACK,A,B
Client confirms with ACK,B
Run Code Online (Sandbox Code Playgroud) 我有一些已有15年历史的代码,可以通过POTS进行 MAPP(万事达卡自动销售点计划)信用卡交易以及带有主机数据捕获(而不是终端数据捕获)的调制解调器。它实现:获得批准(操作码#08),批准后(#60),出售(#10),退款(#30)和无效(#50)交易。我记得,MAPP还允许为给定的检索号或整批检索数据。为了进行验证,我需要实现一个或另一个(获取事务或批处理)。对于给定的检索号码,取卡和金额就足够了。但是,我再也找不到“ 60-M08V3.0 / 1096销售点规格和认证程序”的副本,并且该文档似乎不在网络上任何地方。我猜想通过检索编号进行提取将需要诸如TERMINALID,ASCII FS,OPCODE,ASCII FS,RETRIEVAL,ASCII ETX之类的东西(或者批准编号也位于其中)。
提取先前发布的交易或一批交易(通过检索号和/或批准号)以获取合适的协议是什么?网络上是否有60-M08V3.0 / 1096的副本或协议的适用部分?
我有一份Delphi 6和一个使用Indy TIdMessage组件的简单电子邮件程序.我想删除IdMessage.pas然后重新编译应用程序的第464-465行.我很难找到清晰的文档,所以我尝试了这些步骤来修改组件:
\delphi6\source\indy\indy.dpk在IDE中打开IdMessage.pas在包窗口IdMessage.pas并保存文件但后来我得到了一个错误\bpl\indy60.bpl can't be loaded because \bin\indy60.bpl is already loaded.所以我在"组件"菜单中尝试了"安装包...",但只在\bpl\dclindy60.bpl那里找到了.所以我删除了那个包,并且:
\delphi6\source\indy\dclindy.dpk在IDE中打开IDE确认TIdMessage已安装所有组件(包括),但电子邮件程序仍然表现为原始未修改组件仍在使用中.
我究竟做错了什么?
我可以像这样定义记录常量:
const
dialoghdr: DLGTEMPLATE =
(style: 1; dwExtendedStyle: 2; cdit: 3; x: 4; y: 5; cx: 6; cy: 7);
dialogitem: DLGITEMTEMPLATE =
(style: 8; dwExtendedStyle: 9; x: 10; y: 11; cx: 12; cy: 13; id: 14);
Run Code Online (Sandbox Code Playgroud)
我可以定义这样的记录记录:
type
template = packed record
header: DLGTEMPLATE;
item: DLGITEMTEMPLATE;
end;
Run Code Online (Sandbox Code Playgroud)
虽然编译器会接受这个:
const mytemplate: template = (); // compiles!
Run Code Online (Sandbox Code Playgroud)
有没有办法在()中实际放置常量?就像是
const mytemplate: template =
(header.style: 1; header.dwExtendedStyle: 2; header.cdit: 3...,
item.style: 8; item.dwExtendedStyle: 9; item.x: 10...);
Run Code Online (Sandbox Code Playgroud)
要么
const mytemplate: template =
((style: 1; dwExtendedStyle: …Run Code Online (Sandbox Code Playgroud) 我有一个Delphi 6客户端 - 服务器应用程序,其中服务器本质上是:
initialize;
repeat
try
getInput;
putOutput;
except
on e: exception do writeln(e.message);
end
until false;
Run Code Online (Sandbox Code Playgroud)
在开发过程中,错误(例如指针异常)很少见,但服务器可以继续运行.现在,它的生产服务器似乎调试和人们很容易去除try...except,因为它增加了大量的执行对服务器的开销,但随后如有异常要发生,将停止服务器.
一个解决办法是有一个父进程只需重新启动整个服务器,并在重新启动绕过初始化将有效地重现了什么try...except成就,但也不会有什么导致异常的任何记录,并且有或没有初始化重启实际上创造了很多不需要的"状态"问题,特别是与客户端连接.
有没有办法覆盖或修改异常处理,以便在异常发生时将其记录到某个地方(例如在系统事件日志或%errorlevel%中),然后程序退出并重新启动或(更好:)恢复,但没有开销无所不包的try...except?
理想的解决方案将记录异常,但恢复执行的级别repeat...until.也许通过执行诸如保存repeat某些可访问全局的地址之类的内容,然后进行任何异常来解除调用堆栈并在该保存的地址恢复?(我猜这try..except本质上是什么,但是有没有办法避免在没有例外情况下它所施加的开销?)
我在Delphi 6中有一个"发送"例程,它接受一个可变大小的数据块(一个固定大小的头,后跟不同数量的数据),并且该例程最终在Winsock中调用sendto().我用两种方式对它进行了编码,一次是传递的块是var(有点误导,但它有效),一次是传递块的指针.用于基准测试的简单版本类似于:
type
header = record destination, serialnumber: integer end;
pheader = ^header;
var
smallblock: record h: header; data: array[1..5] of integer end;
bigblock: record h: header; data: array[1..100] of integer end;
procedure send1(var h: header; size: integer);
begin
h.destination := 1; // typical header adjustments before sendto()
h.serialnumber := 2;
sendto(sock, h, size, 0, client, sizeof(client))
end;
procedure send2(p: pheader; size: cardinal);
begin
p^.destination := 1;
p^.serialnumber := 2;
sendto(sock, p^, size, 0, client, sizeof(client))
end;
procedure doit1;
begin …Run Code Online (Sandbox Code Playgroud)