delphi BlockRead的正确用法?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了delphi BlockRead的正确用法?相关的知识,希望对你有一定的参考价值。

我用API来伟传送文件,代码是这样的
procedure TForm1.transfile (filename : String );
var
Ftrans : file of byte ;
BlockBuf : array[1..BlockLen] of Byte ;
BlockNum ,BlockRem,Flen , SendLen , i : Integer ;

begin
AssignFile(Ftrans , filename) ;
reset (Ftrans) ;
Flen := FileSize(Ftrans);
BlockNum := Flen div BlockLen ;
BlockRem := Flen mod BlockLen ;
intrans := True ;
stoptrans := False ;
SendLen := 1 ;
for i := 1 to BlockNum do
begin
if (intrans = false ) or (SendLen <= 0 ) then Break ;
BlockRead(Ftrans , BlockBuf[0] , BLockLen);
SendLen := send(client , BlockBuf , BLockLen , 0);
Application.ProcessMessages;

end;

if BlockRem > 0 then
begin
BlockRead(Ftrans , BlockBuf ,1 );

SendLen := send(client , BlockBuf ,sizeof(BlockBuf),0);
if SendLen = SOCKET_ERROR then
begin
CloseFile(Ftrans);
stoptrans := True ;
intrans := False ;
MessageBox(handle , '连接中断,传送失败!', '错误' , MB_OK );
Exit
end ;
end;

end;

总提示我 BlockRead(Ftrans , BlockBuf ,SizeOf(BlockBuf) );这一句话错误,这里面几个参数我改来改去的就是改不来,有时改好了能传输了但传达室过去的文件大小好像有点变化,这究竟要怎么写?请各位一定要帮帮我!

楼上两位都错! 没错楼主这样来用blockread是正确是,但错是错在最后 一个数据包的处理没做好
BlockNum := Flen div BlockLen ;
BlockRem := Flen mod BlockLen ;
这两句中的其中这一句BlockRem := Flen mod BlockLen ;就是得出最后一个包的实际大小的,用socket传输文件最后一个数据包一定要按实际大小来发送,所以 BlockRead(Ftrans , BlockBuf ,1 );
SendLen := send(client , BlockBuf ,sizeof(BlockBuf),0);
应改为 BlockRead(Ftrans , BlockBuf ,BlockRem );
SendLen := send(client , BlockBuf ,BlockRem,0);
这样就好了!
参考技术A   blockread的参数是var ,所以,直接传BlockBuf就可以了。  
  BlockRead从文件F读取Count或小于Count个记录到内存中,读取记录将存放到Buf中。实际读取的记录数存放到AmtTransferred中。  
  F是一无类型文件,Buf是任意类型变量,Count是整型表达式,AmtTransferred是可选整型表达式。
参考技术B blockread的参数是var ,所以直接传BlockBuf就可以了.
你这样用是对的,
你要不停的循环去BlockRead然后判断第四个参数(实际读取了多少个字节)是否=0,如果是0说明读完了.
参考技术C 把BlockRead(Ftrans , BlockBuf[0] , BLockLen);中的BlockBuf[0]改为BlockBuf试试!

delphi中STRINGGRID的用法

for I := 1 to Screen.Fonts.Count do
begin
StringGrid1.Cells [I, 0] := Screen.Fonts.Strings [I-1];
StringGrid1.Canvas.Font.Name := StringGrid1.Cells [I, 0];
StringGrid1.Canvas.Font.Size := 32;
StringGrid1.ColWidths [I] :=
StringGrid1.Canvas.TextWidth (’AaBbYyZz’);
end;
能给解释下各句的意思吗??小弟万分感激``

参考技术A StringGrid行列的增加和删除
type
TExCell = class(TStringGrid)
public
procedure DeleteRow(ARow: Longint);
procedure DeleteColumn(ACol: Longint);
procedure InsertRow(ARow: LongInt);
procedure InsertColumn(ACol: LongInt);
end;
procedure TExCell.InsertColumn(ACol: Integer);
begin
ColCount :=ColCount +1;
MoveColumn(ColCount-1, ACol);
end;
procedure TExCell.InsertRow(ARow: Integer);
begin
RowCount :=RowCount +1;
MoveRow(RowCount-1, ARow);
end;
procedure TExCell.DeleteColumn(ACol: Longint);
begin
MoveColumn(ACol, ColCount -1);
ColCount := ColCount - 1;
end;
procedure TExCell.DeleteRow(ARow: Longint);
begin
MoveRow(ARow, RowCount - 1);
RowCount := RowCount - 1;
end.
参考技术B 1,列举出系统所有的字体并显示在第一列
2,设置Canvas的字体名称跟该cell的内容相同
3,设置Canvas的字体大小
4,设置cell的宽度
5,设置Canvas的字宽
参考技术C 遍历可获取的字体,在表格的第一列,用该字体的样式,32号字体,显示字体的名称,并设置列的宽度

以上是关于delphi BlockRead的正确用法?的主要内容,如果未能解决你的问题,请参考以下文章

delphi中STRINGGRID的用法

delphi popupmenu控件用法

delphi timer的用法

Delphi 中PChar()函数的用法

delphi WaitForSingleObject 函数 用法

请教关于delphi中dbnavigator控件的用法!