var ServerAppList : array[TCommandCode] of TServerAppClass;
function GetPartID(sPartCode: string): string;
implementation
function GetPartID(sPartCode: string): string; var nResult, nCode: integer; cc1, cc2: Char;
function _FindB(cLow, cHigh: char; N: integer; var R: integer; var rc1, rc2: Char): boolean; var c1, c2: Char; begin Result := false; for c1 := cLow to cHigh do begin if not ((c1 in ['0'..'9']) or (c1 in ['A'..'Z'])) then Continue;
for c2 := cLow to cHigh do begin if not ((c2 in ['0'..'9']) or (c2 in ['A'..'Z'])) then Continue;
Inc(R); if R >= N then begin rc1 := c1; rc2 := c2; Result := true; Exit; end; end;
end; end;
begin try nCode := strtoint(sPartCode); except nCode := 1100; end;
nResult := 0; if _FindB('0', 'Z', nCode, nResult, cc1, cc2) then Result := cc1 + cc2 else Result := '00'; end;
{TCommObject} procedure TCommObject.ReceiveData(buf: PChar; Size: integer); begin end;
function TCommObject.RecevieText(sText: string): integer; begin end;
procedure TCommObject.UpdateData; var ACmmList: TCmmList; begin if FRMTCmmList <> nil then if Assigned(FRMTCmmList.OnUpdateData) then FRMTCmmList.OnUpdateData(Self); end;
destructor TCommObject.Destroy; begin if (FRMTSocket <> nil) and (Self is TClientAppObject) then FRMTSocket.Disconnect(FRMTSocket.SocketHandle); inherited; end;
procedure TCommObject.DoReceiveData(buf: PChar; Size: integer); begin end;
procedure TCommObject.SetStatus(AValue: TCommStatus); begin if FCommStatus = AValue then Exit; FCommStatus := AValue; UpdateData; end;
function IsNewBlock: boolean; begin Result := (PFlg^ = Send_Info) and ((PCmmHead^ = Comm_Head) or (PCmmHead^ = Block_Blank)) and (PHead^ = Block_Head); end;
function IsBlockEnd: boolean; begin Result := (PEnd^ = Block_End) or (PCmmEnd^ = Block_Blank); end;
if Assigned(FOnBlockEnd) then FOnBlockEnd(Self); end;
procedure TServerCommObject.RequestNextBlock; begin FRMTSocket.SendText(Return_Info + Comm_C_GetNext); end;
procedure TServerCommObject.DoCommFinished; var oApp: TServerAppObject; begin FRMTSocket.SendText(Return_Info + Comm_C_Finish); //调用数据包应用对象 if ServerAppList[PCMPackRec(FDataBuf)^.CmdCode] <> nil then begin oApp := ServerAppList[PCMPackRec(FDataBuf)^.CmdCode].Create(Self); oApp.ProcessData(FDataBuf, FDataSize); oApp.Free; end; InitData; end;
{TServerAppObject} constructor TServerAppObject.Create(ACmmObj: TCommObject); begin FCmmObject := ACmmObj; end;
function TServerAppObject.ProcessData(ABuf: PChar; ASize: integer): integer; begin Result := 0; end;
destructor TClientAppObject.Destroy; begin FTimer.Free; inherited; end;
procedure TClientAppObject.OnTimer(Sender: TObject); begin Inc(FWaitTime); if FWaitTime >= Send_OverTime {FTimeOut} then begin FIfTimeOut := true; FWaitting := false; end; end;
function TClientAppObject.SendOneBlock(ABlock: PChar; Size: integer) :integer; var SendTime: integer; begin Result := 1; SendTime := 0; repeat FRMTSocket.SendBuf(ABlock[0], Size); Result := WaitForEnd(); Inc(SendTime); if Result = 0 then Break; until (SendTime > Max_Send_time); //如果失败,重试发送Max_Send_time次 end;
function TClientAppObject.WaitForEnd: integer; begin Result := 0; FWaitting := true; FIfTimeout := false; FWaitTime := 0; FTimer.Enabled := true; while FWaitting do begin sleep(30); Application.ProcessMessages; end; FTimer.Enabled := false; if FIfTimeout then Result := 2; end;
function TClientAppObject.RecevieText(sText: string): integer; var AInfo: string; begin AInfo := trim(sText); if (AInfo = Comm_C_GetNext) or (AInfo = Comm_C_Finish) then FWaitting := false; end;
//打包一块通信数据 function TClientAppObject.CreateBlock(var ABlock: PChar; Size:integer; AblockType: TBlockTypes; var NewSize: integer): boolean; var AStream: TStream; FlgWord: Word; FlgByte: Char; begin AStream := TMemoryStream.Create;
function TClientAppObject.UploadData(buf: PChar; Size: integer; APrgFunc: TProgressFunc): integer; var nRemainSize, nSize, P: integer; BSize :integer; BType :TBlockTypes; begin Result := 1; BType := [btFirst, btNormal]; ATmpbuf := AllocMem(Block_Size); nRemainSize := Size; P := 0; while nRemainSize >0 do begin while IfPause do Application.ProcessMessages; //响应暂停
if nRemainSize < Block_Size then nSize := nRemainSize else nSize := Block_Size;
if (nRemainSize - nSize) <= 0 then BType := BType + [btLast];
function TClientAppObject.UploadFile(sFileName, sTarget: string; APrgFunc: TProgressFunc): integer; begin Result := UploadFile(sFileName, '', sTarget, APrgFunc); end;
//打包一块数据 function TClientAppObject.CreatePack(AHead: TCMPackRec; var AData: PChar; Size: integer; var NewSize: integer): boolean; var AStream: TStream; sTmp: string; P, R, N :integer; begin // sTmp := ExtractFilePath(ParamStr(0))+ 'tmp1';
FreeMem(AData); AData := AllocMem(NewSize); AStream.Position := 0; ReadFromStream(AStream, AData); AStream.Free; // if FileExists(sTmp) then // DeleteFile(sTmp); Result := true; end;
{TCmmList}
constructor TCmmList.Create; begin inherited; FList := TList.Create; end;
destructor TCmmList.Destroy; begin FList.Free; inherited; end;
function TCmmList.GetItem(AIndex: integer): TCommObject; begin if AIndex < FList.Count then Result := FList[AIndex] else Result := nil; end;
function TCmmList.GetCount: integer; begin Result := FList.Count; end;
procedure TCmmList.SetItem(AIndex: integer; Value: TCommObject); begin if AIndex < FList.Count then FList[AIndex] := Value end;
function TCmmList.IndexOf(AItem: TCommObject): integer; begin Result := FList.IndexOf(AItem); end;
procedure TCmmList.Add(AItem: TCommObject); begin FList.Add(AItem); if Assigned(FOnAddItem) then FOnAddItem(AItem); end;
procedure TCmmList.Insert(AIndex: integer; AItem: TCommObject); begin FList.Insert(AIndex, AItem); if Assigned(FOnAddItem) then FOnAddItem(AItem); end;
procedure TCmmList.Delete(AIndex: integer); var AItem: TCommObject; begin AItem := FList[AIndex]; FList.Delete(AIndex);
if Assigned(FOnDeleteItem) then FOnDeleteItem(AItem);
AItem.Free; end;
procedure TCmmList.Remove(AItem: TCommObject); begin FList.Remove(AItem); if Assigned(FOnDeleteItem) then FOnDeleteItem(AItem); end;
var I: TCommandCode; initialization for I := Low(TCommandCode) to High(TCommandCode) do ServerAppList[I] := nil; end.
----------------------------------------------
www.acreport.com