1207 lines
32 KiB
ObjectPascal
1207 lines
32 KiB
ObjectPascal
unit uListMoreConent;
|
||
|
||
interface
|
||
|
||
uses
|
||
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
|
||
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Objects,
|
||
System.ImageList, FMX.ImgList, FMX.Controls.Presentation, FMX.Edit,uKsoap,
|
||
FMX.Layouts, System.Rtti, FMX.Grid.Style, FMX.Memo, FMX.ScrollBox, FMX.Grid,
|
||
FMX.StdCtrls, FMX.ListBox, FMX.TabControl,uShowInfo,uTCPDevice,uSafeLog,Winapi.ActiveX,
|
||
SysTem.StrUtils, FMX.Memo.Types;
|
||
|
||
type
|
||
TfrmListMoreConent = class(TForm)
|
||
Rectangle1: TRectangle;
|
||
Rectangle2: TRectangle;
|
||
Rectangle3: TRectangle;
|
||
TxtFactoryCode: TText;
|
||
Rectangle4: TRectangle;
|
||
Rectangle6: TRectangle;
|
||
Text2: TText;
|
||
Rectangle18: TRectangle;
|
||
Rectangle26: TRectangle;
|
||
Text17: TText;
|
||
Rectangle33: TRectangle;
|
||
Rectangle5: TRectangle;
|
||
Rectangle16: TRectangle;
|
||
Text11: TText;
|
||
Text13: TText;
|
||
TxtEmpNo: TText;
|
||
Line1: TLine;
|
||
Line2: TLine;
|
||
TxtPc: TText;
|
||
Text18: TText;
|
||
TxtLine: TText;
|
||
Timer1: TTimer;
|
||
Rectangle11: TRectangle;
|
||
Rectangle14: TRectangle;
|
||
Rectangle001: TRectangle;
|
||
StringGrid1: TStringGrid;
|
||
StringColumn1: TStringColumn;
|
||
StringColumn2: TStringColumn;
|
||
StringColumn3: TStringColumn;
|
||
StringColumn4: TStringColumn;
|
||
StringColumn5: TStringColumn;
|
||
StringColumn6: TStringColumn;
|
||
StringColumn7: TStringColumn;
|
||
GlyphColumn1: TGlyphColumn;
|
||
Rectangle13: TRectangle;
|
||
Text21: TText;
|
||
Text3: TText;
|
||
Glyph23: TGlyph;
|
||
ImageList1: TImageList;
|
||
TxtVerInfo: TText;
|
||
Rectangle9: TRectangle;
|
||
TxtLineNum: TText;
|
||
Text7: TText;
|
||
Text1: TText;
|
||
Text8: TText;
|
||
EditLotNo: TEdit;
|
||
Rectangle8: TRectangle;
|
||
Rectangle10: TRectangle;
|
||
Rectangle7: TRectangle;
|
||
Rectangle12: TRectangle;
|
||
Text4: TText;
|
||
Rectangle15: TRectangle;
|
||
Text5: TText;
|
||
Memo1: TMemo;
|
||
StyleBook1: TStyleBook;
|
||
TxtLotNoError: TText;
|
||
Rectangle17: TRectangle;
|
||
Rectangle19: TRectangle;
|
||
Rectangle20: TRectangle;
|
||
TxtPc11: TText;
|
||
EdtInput1: TEdit;
|
||
TxtInput1Error: TText;
|
||
Rectangle23: TRectangle;
|
||
StringGrid2: TStringGrid;
|
||
StringColumn8: TStringColumn;
|
||
StringColumn9: TStringColumn;
|
||
Rectangle21: TRectangle;
|
||
StringGrid3: TStringGrid;
|
||
StringColumn10: TStringColumn;
|
||
StringColumn11: TStringColumn;
|
||
EdtInput2: TEdit;
|
||
Text6: TText;
|
||
Text9: TText;
|
||
Text29: TLabel;
|
||
Label1: TLabel;
|
||
Rectangle22: TRectangle;
|
||
TxtLotNumInfo: TText;
|
||
StringGrid4: TStringGrid;
|
||
StringColumn12: TStringColumn;
|
||
StringColumn13: TStringColumn;
|
||
StringColumn14: TStringColumn;
|
||
StringColumn15: TStringColumn;
|
||
TabControl1: TTabControl;
|
||
TabItem1: TTabItem;
|
||
TabItem2: TTabItem;
|
||
StringColumn16: TStringColumn;
|
||
Rectangle25: TRectangle;
|
||
Rectangle27: TRectangle;
|
||
CheckBox1: TCheckBox;
|
||
procedure Rectangle28Click(Sender: TObject);
|
||
procedure Rectangle21Click(Sender: TObject);
|
||
procedure StringGrid1DrawColumnCell(Sender: TObject; const Canvas: TCanvas;
|
||
const Column: TColumn; const Bounds: TRectF; const Row: Integer;
|
||
const Value: TValue; const State: TGridDrawStates);
|
||
procedure Text3Click(Sender: TObject);
|
||
procedure Timer1Timer(Sender: TObject);
|
||
procedure FormCreate(Sender: TObject);
|
||
procedure StringGrid1DrawColumnHeader(Sender: TObject;
|
||
const Canvas: TCanvas; const Column: TColumn; const Bounds: TRectF);
|
||
procedure FormResize(Sender: TObject);
|
||
procedure StringGrid1CellClick(const Column: TColumn; const Row: Integer);
|
||
procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
|
||
Shift: TShiftState; X, Y: Single);
|
||
procedure StringGrid1Tap(Sender: TObject; const Point: TPointF);
|
||
procedure Text5Click(Sender: TObject);
|
||
procedure Text4Click(Sender: TObject);
|
||
procedure EditLotNoKeyDown(Sender: TObject; var Key: Word;
|
||
var KeyChar: Char; Shift: TShiftState);
|
||
procedure EdtInput2KeyDown(Sender: TObject; var Key: Word;
|
||
var KeyChar: Char; Shift: TShiftState);
|
||
procedure EdtInput1KeyDown(Sender: TObject; var Key: Word;
|
||
var KeyChar: Char; Shift: TShiftState);
|
||
procedure FormDestroy(Sender: TObject);
|
||
procedure TabItem1Click(Sender: TObject);
|
||
procedure TabItem2Click(Sender: TObject);
|
||
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
|
||
procedure Button1Click(Sender: TObject);
|
||
procedure Text10Click(Sender: TObject);
|
||
procedure Text12Click(Sender: TObject);
|
||
procedure CheckBox1Change(Sender: TObject);
|
||
private
|
||
tv_hp: Boolean;
|
||
iDetailCount:Integer;
|
||
IsFirst:boolean;
|
||
vP_ID:Double;
|
||
F2DCode:T2DCode;
|
||
Rfid:TRfid;
|
||
NumEnce:TNumEnce;
|
||
iCount:Integer;
|
||
BarCodeDic:TStringList;
|
||
Ord_Avalue: String;
|
||
Ord_iCord2D: Integer;
|
||
Ord_iRfid: Integer;
|
||
RfidLen: boolean;
|
||
CheckBoxCode: Boolean;
|
||
|
||
procedure Clear();
|
||
procedure ShowEndNum();
|
||
procedure MainData();
|
||
procedure ListDataIn(sValue:string);
|
||
procedure ReOpen2D();
|
||
procedure AddRow(sLotNo,sGoodsNo,sLotNoNum:string);
|
||
procedure DelRow(const iRow:Integer);
|
||
procedure F2DCodeWork(Sender: TObject;sValue:string);
|
||
procedure NumEnceWork(Avalue: string);
|
||
procedure RfidWork(Avalue: string);
|
||
procedure AddLog(sLog:string);
|
||
procedure F2DCodeShowState(Avalue: string);
|
||
procedure ShowLotNoError(LotNoError: string);
|
||
function F2CodeBoolean(sValue: String): boolean;
|
||
procedure LogGridAdd;
|
||
procedure LogGridToFile;
|
||
procedure AddWork(sValue: string);
|
||
public
|
||
|
||
end;
|
||
|
||
var
|
||
frmListMoreConent: TfrmListMoreConent;
|
||
|
||
implementation
|
||
|
||
{$R *.fmx}
|
||
|
||
uses uPucFun, uDM, uMain, uLostDummy;
|
||
|
||
procedure TfrmListMoreConent.CheckBox1Change(Sender: TObject);
|
||
begin
|
||
CheckBoxCode:= CheckBox1.IsChecked;
|
||
end;
|
||
|
||
procedure TfrmListMoreConent.Clear();
|
||
begin
|
||
TxtLotNumInfo.Text:= '';
|
||
Text29.Text:= '0';
|
||
Label1.Text:= '0';
|
||
EdtInput1.Text:= '';
|
||
EdtInput2.Text:= '';
|
||
Memo1.Lines.Clear;
|
||
iCount:= 0;
|
||
StringGrid2.RowCount:= 0;
|
||
StringGrid3.RowCount:= 0;
|
||
end;
|
||
|
||
procedure TfrmListMoreConent.ShowEndNum();
|
||
begin
|
||
if StringGrid1.RowCount=0 then exit;
|
||
|
||
// if StrToInt(StringGrid1.Cells[4,0])=0 then
|
||
// Clear();
|
||
|
||
TxtLotNumInfo.Visible:=StrToInt(StringGrid1.Cells[3,0])-iCount<6;
|
||
if TxtLotNumInfo.Visible then
|
||
begin
|
||
if ksoap.P_Lot_Num>iCount then
|
||
TxtLotNumInfo.Text:=Format('该批次即将完成,还剩%d片,请注意换批!',[ksoap.P_Lot_Num-iCount])
|
||
else
|
||
TxtLotNumInfo.Text:='该批次已经完成,请注意换批!';
|
||
end;
|
||
end;
|
||
|
||
procedure TfrmListMoreConent.ListDataIn(sValue:string);
|
||
begin
|
||
if length(EdtInput2.Text)<10 then //去掉异常的
|
||
EdtInput2.Text:= '';
|
||
|
||
//开启线程,提交数据到服务器,提交不成功,就保存在本地
|
||
TThread.CreateThreadX<string>(
|
||
procedure (Avalue:string)
|
||
var
|
||
DetailRecord:TDetailRecord;
|
||
sError:string;
|
||
bResult:boolean;
|
||
tmp:string;
|
||
begin
|
||
DetailRecord.P_ORG_CODE:=ksoap.P_ORG_CODE; //廠區
|
||
DetailRecord.P_LOT:=StringGrid1.Cells[1,0]; //批號
|
||
DetailRecord.P_BC:=sValue; // 條碼(批號10碼+PNL3碼)
|
||
DetailRecord.P_PC:=ksoap.P_PC; //製程
|
||
DetailRecord.P_LINE:=ksoap.P_LINE; //線別
|
||
DetailRecord.P_LINE_NUM:=ksoap.P_LINE_NUM; //線別編號
|
||
DetailRecord.P_LOT_TYPE:='正常'; //正常/重工
|
||
DetailRecord.P_TROLLEY_NUM:=EdtInput2.Text; //台車編號
|
||
DetailRecord.P_COPPER_MODEL:='-1';
|
||
DetailRecord.P_BUFFER_TYPE:='-1';
|
||
DetailRecord.P_CREATION_DATE:=FormatDateTime('yyyymmdd hh:mm:ss',Now);
|
||
DetailRecord.P_ID:=vP_ID.ToString;
|
||
CoInitialize(nil);
|
||
try
|
||
bResult:=Ksoap.Insert_cc_wip_lot_bc_history(DetailRecord,sError);
|
||
if StringGrid4.RowCount>0 then
|
||
StringGrid4.Cells[4,StringGrid4.RowCount-1]:= sError;
|
||
if sError='連接數據庫服務器失败' then
|
||
begin
|
||
// dm.InsertDetail(vId,DetailRecord);
|
||
tmp:=Avalue+'提交失敗:連接數據庫服務器失败,暫存本地';
|
||
end;
|
||
if bResult then
|
||
tmp:=Avalue+'提交成功:OK'
|
||
else
|
||
begin
|
||
// dm.InsertDetail(vId,DetailRecord);
|
||
tmp:=Avalue+'提交失敗:'+sError;
|
||
end;
|
||
WorkLog.MessageInfo(tmp);
|
||
DataLog.MessageInfo('明细表:%s,%s,%s',[vP_ID.ToString,sValue,EdtInput2.Text]);
|
||
|
||
finally
|
||
CoUninitialize;
|
||
end;
|
||
|
||
TThread.Synchronize( nil,
|
||
procedure
|
||
begin
|
||
AddLog(tmp);
|
||
|
||
//最後一片刪除當前批號
|
||
if StrToInt(StringGrid1.Cells[3,0])=StrToInt(StringGrid1.Cells[5,0]) then
|
||
begin
|
||
Clear();
|
||
delrow(0);
|
||
end;
|
||
EdtInput1.Text:= '';
|
||
EdtInput2.Text:= '';
|
||
|
||
end
|
||
);
|
||
end,sValue
|
||
).Start;
|
||
end;
|
||
|
||
procedure TfrmListMoreConent.ReOpen2D();
|
||
begin
|
||
TThread.CreateAnonymousThread(
|
||
procedure
|
||
begin
|
||
Sleep(1000);
|
||
TThread.Synchronize( nil,
|
||
procedure
|
||
begin
|
||
if F2DCode<>nil then F2DCode.Open;
|
||
//TxtBarCodePrompt.Text:='读码中...';
|
||
end
|
||
);
|
||
end
|
||
).Start;
|
||
end;
|
||
|
||
procedure TfrmListMoreConent.F2DCodeWork(Sender: TObject;sValue:string);
|
||
begin
|
||
if StringGrid4.RowCount>0 then
|
||
StringGrid4.Cells[1,StringGrid4.RowCount-1]:= sValue;
|
||
|
||
if StringGrid1.RowCount=0 then exit;
|
||
|
||
if sValue='ERROR' then
|
||
BEGIN
|
||
AddLog('条码读取出错'+sValue);
|
||
//WorkLog.MessageInfo('条码读取出错'+sValue);
|
||
//TxtBarCodePrompt.Text:='二维码读取出错';
|
||
// ReOpen2D();
|
||
Exit;
|
||
END;
|
||
|
||
if BarCodeDic.IndexOf(sValue)>=0 then //判断重复
|
||
BEGIN
|
||
AddLog('条码重复'+sValue);
|
||
WorkLog.MessageInfo('条码重复'+sValue);
|
||
// TxtBarCodePrompt.Text:=Format('二维码重复:%s',[sValue]);
|
||
// ReOpen2D();
|
||
Exit;
|
||
END;
|
||
|
||
//混批
|
||
if not F2CodeBoolean(sValue) then
|
||
begin
|
||
AddLog('注意混批301:'+sValue);
|
||
TxtLotNumInfo.Text:= '注意混批:'+sValue;
|
||
if (NumEnce<>nil) and (Sender<>nil) then
|
||
begin
|
||
if (T2DCode(Sender).Num=4) then
|
||
begin
|
||
NumEnce.SendStr('#0111101');
|
||
Sleep(500);
|
||
NumEnce.SendStr('#0111100');
|
||
AddLog('混批101:#0111101,'+intToStr(T2DCode(Sender).Num));
|
||
end
|
||
else
|
||
begin
|
||
NumEnce.SendStr('#0111501');
|
||
Sleep(500);
|
||
NumEnce.SendStr('#0111500');
|
||
AddLog('混批102:#0111501,'+intToStr(T2DCode(Sender).Num));
|
||
end;
|
||
|
||
end;
|
||
// ReOpen2D();
|
||
// Exit;
|
||
//Sleep(100);
|
||
// NumEnce.SendStr('#011300');
|
||
// Sleep(50);
|
||
// NumEnce.SendStr('#011400');
|
||
end;
|
||
|
||
BarCodeDic.Add(sValue);
|
||
|
||
AddWork(sValue);
|
||
end;
|
||
|
||
procedure TfrmListMoreConent.AddWork(sValue:string);
|
||
begin
|
||
inc(iCount);
|
||
|
||
if StringGrid1.RowCount>0 then
|
||
with StringGrid1 do
|
||
begin
|
||
BeginUpdate;
|
||
Cells[5,0]:=IntToStr(iCount);
|
||
Cells[4,0]:=IntToStr(StrToInt(Cells[3,0])-StrToInt(Cells[5,0]));
|
||
Cells[6,0]:=FormatDateTime('yyyymmdd hh:mm:ss',Now);
|
||
EndUpdate;
|
||
end;
|
||
|
||
with StringGrid3 do
|
||
begin
|
||
if CheckBoxCode then
|
||
begin
|
||
BeginUpdate;
|
||
RowCount:=RowCount+1;
|
||
// Cells[0,RowCount-1]:=iCount.ToString;
|
||
Cells[0,RowCount-1]:=sValue;
|
||
Cells[1,RowCount-1]:=FormatDateTime('yyyymmdd hh:mm:ss',Now);
|
||
SelectRow(RowCount-1);
|
||
EndUpdate;
|
||
end;
|
||
|
||
inc(iDetailCount);
|
||
Text29.Text:=iCount.ToString;
|
||
end;
|
||
ShowEndNum();
|
||
EdtInput1.Text:=sValue;//Format('二维码 %d:%s',[iCount,sValue]);
|
||
WorkLog.MessageInfo('条码数据:'+sValue);
|
||
//开启线程,3秒后开启2D读头
|
||
// ReOpen2D();
|
||
|
||
//第一片加入主表
|
||
if StrToInt(StringGrid1.Cells[5,0])=1 then
|
||
begin
|
||
MainData();
|
||
end;
|
||
|
||
if EdtInput2.Text<>'' then
|
||
begin
|
||
ListDataIn(EdtInput1.Text);
|
||
AddLog('提交數據:'+EdtInput1.Text);
|
||
WorkLog.Debug('提交數據:%s',[EdtInput1.Text]);
|
||
EdtInput1.Text:='';
|
||
end;
|
||
end;
|
||
|
||
function TfrmListMoreConent.F2CodeBoolean(sValue: String):boolean;
|
||
begin
|
||
Result:= False;
|
||
if StringGrid1.RowCount=0 then Exit;
|
||
if not tv_hp then
|
||
begin
|
||
Result:= True;
|
||
Exit;
|
||
end;
|
||
//混批
|
||
if (Length(sValue)<20) and (LeftStr(StringGrid1.Cells[1,0],8)<>LeftStr(sValue,8)) then
|
||
begin
|
||
|
||
Exit;
|
||
//Sleep(100);
|
||
// NumEnce.SendStr('#011300');
|
||
// Sleep(50);
|
||
// NumEnce.SendStr('#011400');
|
||
end
|
||
else
|
||
begin
|
||
|
||
end;
|
||
|
||
Result:= True;
|
||
end;
|
||
|
||
procedure TfrmListMoreConent.F2DCodeShowState(Avalue: string); //显示读头状态
|
||
begin
|
||
AddLog(Avalue);
|
||
end;
|
||
|
||
procedure TfrmListMoreConent.ShowLotNoError(LotNoError:string);
|
||
begin
|
||
TThread.Synchronize(nil,
|
||
procedure
|
||
begin
|
||
TxtLotNoError.Text:=LotNoError;
|
||
if LotNoError<>'' then EditLotNo.SetFocus;
|
||
end);
|
||
end;
|
||
|
||
procedure TfrmListMoreConent.EditLotNoKeyDown(Sender: TObject; var Key: Word;
|
||
var KeyChar: Char; Shift: TShiftState);
|
||
var
|
||
sPartnumValue:string;
|
||
begin
|
||
if StringGrid1.Cells[1,StringGrid1.RowCount-1]=EditLotNo.Text then //重复
|
||
begin
|
||
TxtShowErrorInfo(TxtLotNoError,'批號重複輸入');
|
||
end
|
||
else
|
||
|
||
if (Key = $0D) and (EditLotNo.Text<>'') then
|
||
begin
|
||
TThread.CreateAnonymousThread(
|
||
procedure
|
||
var
|
||
sError:string;
|
||
sGoodsNo,sNum,sPc:string;
|
||
begin
|
||
CoInitialize(nil);
|
||
TRY
|
||
//检查批号
|
||
if (not Ksoap.XXCC_LOT_PC_F(EditLotNo.Text,TxtLineNum.Text,'1',sError)) then
|
||
begin
|
||
ShowLotNoError(sError);
|
||
Exit;
|
||
end;
|
||
|
||
//得料号
|
||
if not Ksoap.getPartnum(EditLotNo.Text,'',sGoodsNo,sNum,sPc,sPartnumValue,sError) then
|
||
begin
|
||
ShowLotNoError(sError);
|
||
Exit;
|
||
end;
|
||
finally
|
||
CoUninitialize;
|
||
end;
|
||
|
||
TThread.Synchronize(nil,
|
||
procedure
|
||
begin
|
||
AddRow(EditLotNo.Text,sGoodsNo,sNum);
|
||
ShowLotNoError('');
|
||
EditLotNo.Text:='';
|
||
//调整网格列宽
|
||
// StringColumn1.Width:=30;
|
||
StringColumn2.Width:=100;
|
||
StringColumn3.Width:=130;
|
||
// StringColumn4.Width:=50;
|
||
// StringColumn5.Width:=50;
|
||
// StringColumn6.Width:=50;
|
||
// StringColumn7.Width:=50;
|
||
// GlyphColumn1.Width:=50;
|
||
end);
|
||
end
|
||
).Start;
|
||
end;
|
||
end;
|
||
|
||
//添加主表
|
||
procedure TfrmListMoreConent.MainData();
|
||
var
|
||
sError:string;
|
||
LotNoRecord:TLotNoRecord;
|
||
vId:Integer;
|
||
begin
|
||
LotNoRecord:=TLotNoRecord.Create('-1'); //初始化记录
|
||
LotNoRecord.P_LOT:=ksoap.P_Lot;
|
||
LotNoRecord.P_LOT_TYPE:='正常板';
|
||
LotNoRecord.P_Enable:='Y';
|
||
LotNoRecord.P_ID:=0;
|
||
LotNoRecord.P_ORG_CODE:=ksoap.P_ORG_CODE; //廠區
|
||
LotNoRecord.P_NUM:=ksoap.P_WORK_NUM; //工號
|
||
LotNoRecord.P_PC:=ksoap.P_PC; //製程
|
||
LotNoRecord.P_LINE:=ksoap.P_LINE; //線別
|
||
LotNoRecord.P_LINE_NUM:=ksoap.P_LINE_NUM; //線別編號
|
||
|
||
LotNoRecord.P_CREATION_DATE:=FormatDateTime('yyyymmdd hh:mm:ss',Now);
|
||
|
||
sError:='';
|
||
vP_ID:=Ksoap.Thread_cf_traceability_seq_f(ksoap.P_ORG_CODE,sError);
|
||
LotNoRecord.P_ID:=vP_ID;
|
||
|
||
DataLog.MessageInfo('主表:%s,%s,%s,%s,%s',[vP_ID.ToString,ksoap.P_ORG_CODE,ksoap.P_WORK_NUM,ksoap.P_PC,ksoap.P_LINE_NUM]);
|
||
|
||
if vP_ID=0 then
|
||
BEGIN
|
||
dm.InsertMain(vId,LotNoRecord,true);
|
||
ShowInfoOK('連接數據庫服務器失敗數據暫存本地,正在生產中...');
|
||
// Result:=true;
|
||
END
|
||
ELSE
|
||
BEGIN
|
||
// //直接调用API,出错再保存本地
|
||
if not Ksoap.Thread_Insert_CM_WIP_PROCESS_LINE_HISTORY_NEW(LotNoRecord,sError) then //提交主表不成功
|
||
begin
|
||
if sError='連接數據庫服務器失败' then
|
||
begin
|
||
dm.InsertMain(vId,LotNoRecord,true);
|
||
ShowInfoOK('連接數據庫服務器失敗數據暫存本地,正在生產中...');
|
||
// Result:=true;
|
||
end
|
||
else
|
||
ShowError(sError);
|
||
end
|
||
END;
|
||
end;
|
||
|
||
procedure TfrmListMoreConent.EdtInput1KeyDown(Sender: TObject; var Key: Word;
|
||
var KeyChar: Char; Shift: TShiftState);
|
||
var
|
||
sError:string;
|
||
DetailRecord:TDetailRecord;
|
||
vId:Integer;
|
||
begin
|
||
Exit;
|
||
if (Key = 13) and (StringGrid1.RowCount>0) then
|
||
begin
|
||
// F2DCodeWork(Sender,EdtInput1.Text);
|
||
// Exit;
|
||
// EdtInput2.Text := StringGrid1.Cells[1,0];
|
||
with StringGrid3 do
|
||
begin
|
||
if Cells[0,RowCount-1]=EdtInput1.Text then //重复
|
||
begin
|
||
TxtShowErrorInfo(TxtInput1Error,'條碼重複輸入');
|
||
end
|
||
else
|
||
begin
|
||
// if NumEnce<>nil then
|
||
// begin
|
||
// NumEnce.SendStr('#011301');
|
||
// NumEnce.SendStr('#011401');
|
||
// Sleep(100);
|
||
// NumEnce.SendStr('#011300');
|
||
// NumEnce.SendStr('#011400');
|
||
// end;
|
||
|
||
TxtShowErrorInfo(TxtInput1Error,'');
|
||
BeginUpdate;
|
||
RowCount:=RowCount+1;
|
||
Cells[0,RowCount-1]:=EdtInput1.Text;
|
||
Cells[1,RowCount-1]:=FormatDateTime('yyyymmdd hh:mm:ss',Now);
|
||
SelectRow(RowCount-1);
|
||
EndUpdate;
|
||
inc(iCount);
|
||
// Text29.Text:=iCount.ToString;
|
||
//Ksoap.Insert_cc_wip_lot_bc_history(TxtLotNo.Text,EdtInput1.Text,'A#','正常板','-1','-1','-1',vP_Id.ToString,'',sError);
|
||
if IsFirst then //第一次,插入主
|
||
begin
|
||
MainData();
|
||
IsFirst:=false;
|
||
end;
|
||
DetailRecord.P_ORG_CODE:=ksoap.P_ORG_CODE; //廠區
|
||
DetailRecord.P_LOT:=StringGrid1.Cells[1,0];//TxtLotNo.Text;
|
||
DetailRecord.P_BC:=EdtInput1.Text; // 條碼(批號10碼+PNL3碼)
|
||
DetailRecord.P_PC:=ksoap.P_PC; //製程
|
||
DetailRecord.P_LINE:=ksoap.P_LINE; //線別
|
||
DetailRecord.P_LINE_NUM:=ksoap.P_LINE_NUM; //線別編號
|
||
DetailRecord.P_LOT_TYPE:='正常板';
|
||
DetailRecord.P_TROLLEY_NUM:='-1';
|
||
DetailRecord.P_COPPER_MODEL:='-1';
|
||
DetailRecord.P_BUFFER_TYPE:='-1';
|
||
DetailRecord.P_CREATION_DATE:=FormatDateTime('yyyymmdd hh:mm:ss',Now);
|
||
DetailRecord.P_ID:='0';
|
||
dm.InsertDetail(vId,DetailRecord);
|
||
end;
|
||
end;
|
||
EdtInput1.Text:='';
|
||
EdtInput1.SetFocus;
|
||
end;
|
||
|
||
if StringGrid4.Row>0 then
|
||
ExportToExcel(StringGrid1.Cells[1,0]+'-'+FormatDateTime('yyyymmddhhmmss',Now),StringGrid4);
|
||
end;
|
||
|
||
procedure TfrmListMoreConent.EdtInput2KeyDown(Sender: TObject; var Key: Word;
|
||
var KeyChar: Char; Shift: TShiftState);
|
||
begin
|
||
exit;
|
||
if Key = 13 then
|
||
begin
|
||
RfidWork(EdtInput2.Text);
|
||
Exit;
|
||
with StringGrid2 do
|
||
begin
|
||
if Cells[0,RowCount-1]=EdtInput2.Text then //重复
|
||
begin
|
||
TxtShowErrorInfo(TxtInput1Error,'條碼2重複輸入');
|
||
end
|
||
else
|
||
begin
|
||
TxtShowErrorInfo(TxtInput1Error,'');
|
||
BeginUpdate;
|
||
RowCount:=RowCount+1;
|
||
Cells[0,RowCount-1]:=EdtInput2.Text;
|
||
Cells[1,RowCount-1]:=FormatDateTime('yyyymmdd hh:mm:ss',Now);
|
||
SelectRow(RowCount-1);
|
||
EndUpdate;
|
||
|
||
//dm.InsertLotNo(); //
|
||
end;
|
||
end;
|
||
EdtInput2.Text:='';
|
||
EdtInput2.SetFocus;
|
||
end;
|
||
end;
|
||
|
||
procedure TfrmListMoreConent.FormCloseQuery(Sender: TObject;
|
||
var CanClose: Boolean);
|
||
begin
|
||
LogGridToFile();
|
||
end;
|
||
|
||
procedure TfrmListMoreConent.FormCreate(Sender: TObject);
|
||
var
|
||
sDevName,sIp,sPort:string;
|
||
tmpValue, tv_hpStr:string;
|
||
i:integer;
|
||
begin
|
||
TxtFactoryCode.Text:=FactoryCode; //厂区
|
||
TxtEmpNo.Text:=ksoap.P_WORK_NUM; //工号
|
||
TxtPc.Text:=ksoap.P_PC; //制程代码
|
||
TxtLine.Text:=ksoap.P_LINE; //制程名
|
||
TxtLineNum.Text:=ksoap.P_LINE_NUM; //线别
|
||
CheckBoxCode:= True;
|
||
|
||
TabControl1.Visible:= False;
|
||
TxtVerInfo.Text:=GetBuildInfo;
|
||
Memo1.Visible:=false;
|
||
Memo1.Width:=400;
|
||
Memo1.Lines.Clear;
|
||
iCount:= 0;
|
||
Ord_iCord2D:= 0;
|
||
Ord_iRfid:= 0;
|
||
BarCodeDic:=TStringList.Create;
|
||
BarCodeDic.Sorted:=true;
|
||
Clear();
|
||
tv_hpStr:=dm.MemTableReadKeyValue('主要参数','tv_hp');
|
||
tv_hp:= True;
|
||
if tv_hpStr='0' then
|
||
tv_hp:= False;
|
||
|
||
//根据配置加载设备
|
||
for i := 1 to 9 do
|
||
begin
|
||
tmpValue:=dm.MemTableReadKeyValue('读头','tv_line_speed'+i.ToString);
|
||
if tmpValue<>'' then
|
||
begin
|
||
if CheckParameter(tmpValue,sDevName,sIp,sPort) then
|
||
begin
|
||
if sameText(sDevName,'keyence') then //2D读头
|
||
begin
|
||
F2DCode:=T2DCode.Create(sIp,sPort.ToInteger);
|
||
F2DCode.OnWork:=F2DCodeWork;
|
||
F2DCode.OnShowState:=F2DCodeShowState;
|
||
F2DCode.Connect;
|
||
end;
|
||
|
||
if sameText(sDevName,'RFID') then //RFID
|
||
begin
|
||
Rfid:=TRfid.Create(sIp,sPort.ToInteger);
|
||
Rfid.OnWork:=RfidWork;
|
||
end;
|
||
|
||
if sameText(sDevName,'WJ95') then //采集器
|
||
begin
|
||
NumEnce:=TNumEnce.Create(sIp,sPort.ToInteger);
|
||
NumEnce.OnWork:=NumEnceWork;
|
||
end;
|
||
end;
|
||
end;
|
||
end;
|
||
TxtShowErrorInfo(TxtInput1Error,'');
|
||
// TxtShowErrorInfo(TxtInput2Error,'');
|
||
|
||
//调整网格列宽
|
||
// StringColumn9.Width:=StringGrid2.Width-StringColumn8.Width-25;
|
||
// StringColumn11.Width:=StringGrid3.Width-StringColumn10.Width-25;
|
||
IsFirst:=True;
|
||
end;
|
||
|
||
procedure TfrmListMoreConent.FormDestroy(Sender: TObject);
|
||
var
|
||
i:integer;
|
||
begin
|
||
for i := 0 to 9 do
|
||
begin
|
||
if F2DCode<>nil then
|
||
begin
|
||
F2DCode.Close;
|
||
Sleep(200);
|
||
FreeandNil(F2DCode);
|
||
end;
|
||
end;
|
||
if Rfid<>nil then FreeandNil(Rfid);
|
||
if NumEnce<>nil then FreeandNil(NumEnce);
|
||
BarCodeDic.Free;
|
||
end;
|
||
|
||
procedure TfrmListMoreConent.FormMouseDown(Sender: TObject;
|
||
Button: TMouseButton; Shift: TShiftState; X, Y: Single);
|
||
begin
|
||
Memo1.Visible:=false;
|
||
end;
|
||
|
||
procedure TfrmListMoreConent.FormResize(Sender: TObject);
|
||
begin
|
||
StringColumn2.Width:=(Rectangle33.Width-StringColumn1.Width-StringColumn4.Width-
|
||
StringColumn5.Width-StringColumn6.Width-GlyphColumn1.Width-40) /3;
|
||
StringColumn3.Width:=StringColumn2.Width;
|
||
StringColumn7.Width:=StringColumn2.Width;
|
||
end;
|
||
|
||
procedure TfrmListMoreConent.Rectangle21Click(Sender: TObject);
|
||
begin
|
||
Close;
|
||
end;
|
||
|
||
procedure TfrmListMoreConent.Rectangle28Click(Sender: TObject);
|
||
begin
|
||
Close;
|
||
end;
|
||
|
||
procedure TfrmListMoreConent.StringGrid1CellClick(const Column: TColumn;
|
||
const Row: Integer);
|
||
begin
|
||
if Column=GlyphColumn1 then
|
||
begin
|
||
if Row=0 then
|
||
begin
|
||
if ShowInfoOKCancel('真的要结批吗?') then //结批
|
||
begin
|
||
delrow(Row);
|
||
end;
|
||
end
|
||
else
|
||
begin
|
||
if ShowInfoOKCancel('真的要删除该批号数据吗?') then //结批
|
||
begin
|
||
delrow(Row);
|
||
end;
|
||
end;
|
||
end;
|
||
end;
|
||
|
||
procedure TfrmListMoreConent.StringGrid1DrawColumnCell(Sender: TObject;
|
||
const Canvas: TCanvas; const Column: TColumn; const Bounds: TRectF;
|
||
const Row: Integer; const Value: TValue; const State: TGridDrawStates);
|
||
var
|
||
Size: TSizeF;
|
||
MyBitmap:TBitmap;
|
||
Rect:TRectF;
|
||
begin
|
||
if Column=GlyphColumn1 then
|
||
begin
|
||
Canvas.BeginScene();
|
||
Size:=TSize.Create(128,40);
|
||
MyBitmap:=Imagelist1.Bitmap(Size,0);
|
||
Rect:=Bounds;
|
||
Rect.Top:=Rect.Top+4;
|
||
Rect.Bottom:=Rect.Bottom-4;
|
||
Canvas.DrawBitmap(MyBitmap,MyBitmap.BoundsF,Rect,1);
|
||
Canvas.Font.Style:=[TFontStyle.fsBold];
|
||
Canvas.Font.Size:=14;
|
||
if Row=0 then
|
||
begin
|
||
Canvas.FillText(Bounds,'結批',true,1,[TFillTextFlag.RightToLeft],TTextAlign.Center, TTextAlign.Center);
|
||
end
|
||
else
|
||
begin
|
||
Canvas.FillText(Bounds,'刪除',true,1,[TFillTextFlag.RightToLeft],TTextAlign.Center, TTextAlign.Center);
|
||
end;
|
||
Canvas.EndScene;
|
||
end;
|
||
end;
|
||
|
||
procedure TfrmListMoreConent.StringGrid1DrawColumnHeader(Sender: TObject;
|
||
const Canvas: TCanvas; const Column: TColumn; const Bounds: TRectF);
|
||
var
|
||
Rect:TRectF;
|
||
begin
|
||
Rect:=Bounds;
|
||
Rect.left:=Rect.left+1;
|
||
Rect.Right:=Rect.Right-1;
|
||
Rect.Bottom:=Rect.Bottom-1;
|
||
Canvas.BeginScene();
|
||
Canvas.ClearRect(Rect,TAlphaColors.White);
|
||
Canvas.Font.Size:=16;
|
||
Canvas.Fill.Color:=TAlphaColors.Black;
|
||
Canvas.FillText(Bounds,Column.Header,true,1,[TFillTextFlag.RightToLeft],TTextAlign.Center, TTextAlign.Center);
|
||
Canvas.EndScene();
|
||
end;
|
||
|
||
procedure TfrmListMoreConent.StringGrid1Tap(Sender: TObject;
|
||
const Point: TPointF);
|
||
begin
|
||
Memo1.Visible:=false;
|
||
end;
|
||
|
||
procedure TfrmListMoreConent.TabItem1Click(Sender: TObject);
|
||
begin
|
||
Memo1.Visible:= TabItem1.Visible;
|
||
TabControl1.Width:= 450;
|
||
end;
|
||
|
||
procedure TfrmListMoreConent.TabItem2Click(Sender: TObject);
|
||
begin
|
||
StringGrid4.Visible:= TabItem2.Visible;
|
||
TabControl1.Width:= 520;
|
||
end;
|
||
|
||
procedure TfrmListMoreConent.Text10Click(Sender: TObject);
|
||
begin
|
||
//
|
||
FrmLostDummy:= TFrmLostDummy.Create(nil);
|
||
try
|
||
FrmLostDummy.Position:=TFormPosition.MainFormCenter;
|
||
if FrmLostDummy.ShowModal=mrOk then
|
||
begin
|
||
AddRow('LOST','LOST',FrmLostDummy.edit4.Text);
|
||
end;
|
||
finally
|
||
FrmLostDummy.Free;
|
||
end;
|
||
end;
|
||
|
||
procedure TfrmListMoreConent.Text12Click(Sender: TObject);
|
||
begin
|
||
FrmLostDummy:= TFrmLostDummy.Create(nil);
|
||
try
|
||
FrmLostDummy.Position:=TFormPosition.MainFormCenter;
|
||
if FrmLostDummy.ShowModal=mrOk then
|
||
begin
|
||
AddRow('Dummy','Dummy',FrmLostDummy.edit4.Text);
|
||
end;
|
||
finally
|
||
FrmLostDummy.Free;
|
||
end;
|
||
end;
|
||
|
||
procedure TfrmListMoreConent.Text3Click(Sender: TObject);
|
||
begin
|
||
ShowTouchKeyBoard();
|
||
end;
|
||
|
||
procedure TfrmListMoreConent.Text4Click(Sender: TObject);
|
||
begin
|
||
memo1.Lines.Clear;
|
||
end;
|
||
|
||
procedure TfrmListMoreConent.Text5Click(Sender: TObject);
|
||
begin
|
||
//打开日志
|
||
TabControl1.Visible:=not TabControl1.Visible;
|
||
TabControl1.Height:= self.Height-100;
|
||
Memo1.Visible:= TabControl1.Visible;
|
||
end;
|
||
|
||
procedure TfrmListMoreConent.Timer1Timer(Sender: TObject);
|
||
begin
|
||
Text2.Text:= GetSysTimeByFormate;
|
||
end;
|
||
|
||
procedure TfrmListMoreConent.AddRow(sLotNo,sGoodsNo,sLotNoNum:string); //在末尾追加
|
||
begin
|
||
with StringGrid1 do
|
||
begin
|
||
BeginUpdate;
|
||
RowCount:= RowCount + 1;
|
||
Cells[0,RowCount-1]:=(RowCount).ToString;
|
||
Cells[1,RowCount-1]:=sLotNo;
|
||
Cells[2,RowCount-1]:=sGoodsNo;
|
||
Cells[3,RowCount-1]:=sLotNoNum;
|
||
Cells[4,RowCount-1]:=sLotNoNum;
|
||
Cells[5,RowCount-1]:='0';
|
||
Cells[6,RowCount-1]:=FormatDateTime('yyyymmdd hh:mm:ss',Now);
|
||
SelectRow(RowCount);
|
||
EndUpdate;
|
||
end;
|
||
end;
|
||
|
||
procedure TfrmListMoreConent.Button1Click(Sender: TObject);
|
||
begin
|
||
LogGridToFile();
|
||
end;
|
||
|
||
procedure TfrmListMoreConent.DelRow(const iRow:Integer);
|
||
var
|
||
i,j:Integer;
|
||
begin
|
||
with StringGrid1 do
|
||
begin
|
||
BeginUpdate;
|
||
for i := iRow to RowCount-1 do
|
||
begin
|
||
for j := 0 to ColumnCount-1 do
|
||
begin
|
||
Cells[j,i]:= Cells[j,i+1];
|
||
Cells[0,i]:=(i+1).ToString;
|
||
end;
|
||
end;
|
||
if RowCount>iRow then
|
||
RowCount:=RowCount-1;
|
||
EndUpdate;
|
||
end;
|
||
end;
|
||
//
|
||
//function ChrList(Avalue:string):String;
|
||
//var
|
||
// i: integer;
|
||
//begin
|
||
// if Avalue='' then Exit;
|
||
// for I := 1 to Length(Avalue) do
|
||
// begin
|
||
// if i mod 2 = 0 then
|
||
// begin
|
||
// Result:= Result+Chr(StrToInt(Copy(Avalue,i-1,2)));
|
||
// end;
|
||
// end;
|
||
//
|
||
//end;
|
||
|
||
procedure TfrmListMoreConent.NumEnceWork(Avalue: string);
|
||
var
|
||
iCord2D: Integer;
|
||
iRfid, i: Integer;
|
||
sDataList:string;
|
||
vDataList:array[0..14] of Integer;
|
||
begin
|
||
WorkLog.MessageInfo('采集器值:'+Avalue);
|
||
if StringGrid1.RowCount=0 then exit;
|
||
|
||
TxtPc11.Text:= (Avalue);
|
||
|
||
if Ord_Avalue= Avalue then //去掉重復的
|
||
begin
|
||
Exit;
|
||
end;
|
||
Ord_Avalue:= Avalue;
|
||
|
||
sDataList:= Avalue.Replace('>','').Replace(',','');
|
||
// WorkLog.MessageInfo('采集器值1:'+sDataList);
|
||
|
||
for I := 0 to 14 do
|
||
if Length(sDataList)>i then vDataList[i]:=StrToInt(sDataList[i+1]);
|
||
|
||
iCord2D:= vDataList[14];//右邊第一位
|
||
iRfid:= vDataList[13];//右邊第二位
|
||
|
||
if Ord_iCord2D<> iCord2D then //2D感應器處理
|
||
begin
|
||
Ord_iCord2D:= iCord2D;
|
||
if (iCord2D=1) then
|
||
begin
|
||
if StrToInt(StringGrid1.Cells[4,0])=StrToInt(StringGrid1.Cells[3,0]) then //第一片
|
||
begin
|
||
// if StrToInt(StringGrid1.Cells[4,0])=0 then
|
||
Clear();
|
||
end;
|
||
|
||
Label1.Text:= IntToStr(StrToInt(Label1.Text)+1);
|
||
LogGridAdd();
|
||
// EdtInput1.Text:='';
|
||
if CheckBoxCode then
|
||
begin
|
||
ReOpen2D();
|
||
WorkLog.Debug('ReOpen2D:%s',[IntToStr(iCord2D)]);
|
||
end
|
||
else
|
||
begin
|
||
AddWork('');
|
||
WorkLog.Debug('AddWork:%s',[IntToStr(iCord2D)]);
|
||
end;
|
||
end
|
||
else
|
||
begin
|
||
if EdtInput1.Text<>'' then
|
||
begin
|
||
ListDataIn(EdtInput1.Text);
|
||
AddLog('提交數據:'+EdtInput1.Text);
|
||
WorkLog.Debug('ListDataIn:%s,',[IntToStr(iCord2D),EdtInput1.Text]);
|
||
EdtInput1.Text:='';
|
||
end;
|
||
end;
|
||
end;
|
||
|
||
if Ord_iRfid<> iRfid then //采集器處理
|
||
begin
|
||
Ord_iRfid:= iRfid;
|
||
if (iRfid=1) then
|
||
begin
|
||
WorkLog.Debug('RfidData:%s',[IntToStr(iRfid)]);
|
||
|
||
if iCord2D=0 then
|
||
begin
|
||
LogGridAdd(); //没有感应到板子
|
||
end;
|
||
|
||
TThread.CreateAnonymousThread(
|
||
procedure
|
||
begin
|
||
CoInitialize(nil);
|
||
TRY
|
||
Rfid.ReadData();
|
||
finally
|
||
CoUninitialize;
|
||
end;
|
||
end
|
||
).Start;
|
||
end;
|
||
|
||
end;
|
||
|
||
end;
|
||
|
||
procedure TfrmListMoreConent.LogGridToFile();
|
||
begin
|
||
if StringGrid4.RowCount>300 then
|
||
begin
|
||
ExportToExcel(StringGrid1.Cells[1,0]+'-'+FormatDateTime('yyyymmddhhmmss',Now),StringGrid4);
|
||
|
||
StringGrid4.BeginUpdate;
|
||
StringGrid4.RowCount:= 0;
|
||
StringGrid4.EndUpdate;
|
||
end;
|
||
end;
|
||
|
||
procedure TfrmListMoreConent.LogGridAdd();
|
||
begin
|
||
if StringGrid4.RowCount>300 then
|
||
begin
|
||
LogGridToFile();
|
||
end;
|
||
|
||
with StringGrid4 do
|
||
begin
|
||
BeginUpdate;
|
||
RowCount:= RowCount + 1;
|
||
Cells[0,RowCount-1]:=(RowCount).ToString;
|
||
Cells[1,RowCount-1]:='';
|
||
Cells[2,RowCount-1]:='';
|
||
Cells[3,RowCount-1]:=FormatDateTime('yyyymmdd hh:mm:ss',Now);
|
||
Cells[4,RowCount-1]:='';
|
||
SelectRow(RowCount);
|
||
EndUpdate;
|
||
end;
|
||
end;
|
||
|
||
procedure TfrmListMoreConent.RfidWork(Avalue: string);
|
||
begin
|
||
EdtInput2.Text:= Avalue;
|
||
WorkLog.MessageInfo('Rfid值:'+Avalue);
|
||
if (StringGrid4.RowCount>0) AND (length(Avalue)>6) then
|
||
StringGrid4.Cells[2,StringGrid4.RowCount-1]:= Avalue;
|
||
|
||
if StringGrid1.RowCount=0 then exit;
|
||
|
||
RfidLen:= Avalue.Length>8;
|
||
|
||
if not RfidLen then
|
||
begin
|
||
if Ord_iRfid=1 then
|
||
begin
|
||
TThread.CreateAnonymousThread(
|
||
procedure
|
||
begin
|
||
CoInitialize(nil);
|
||
TRY
|
||
|
||
Rfid.ReadData();
|
||
finally
|
||
CoUninitialize;
|
||
end;
|
||
end
|
||
).Start;
|
||
end;
|
||
StringGrid4.Cells[2,StringGrid4.RowCount-1]:= '';
|
||
exit;//去掉不对的
|
||
end;
|
||
|
||
|
||
with StringGrid2 do
|
||
begin
|
||
if Cells[0,RowCount-1]=EdtInput2.Text then //重复
|
||
begin
|
||
TxtShowErrorInfo(TxtInput1Error,'條碼2重複輸入');
|
||
end
|
||
else
|
||
begin
|
||
//开启线程,提交数据到服务器,提交不成功,就保存在本地
|
||
TThread.CreateThreadX<string>(
|
||
procedure (Avalue:string)
|
||
var
|
||
sError:string;
|
||
bResult:boolean;
|
||
tmp:string;
|
||
begin
|
||
|
||
CoInitialize(nil);
|
||
try
|
||
//獲取治工具或者設備的狀態
|
||
if not Ksoap.Thread_Check_tool_or_equip_status_f(StringGrid1.Cells[1,0],TxtLineNum.Text,Avalue,'-1',sError) then
|
||
begin
|
||
TxtLotNumInfo.Text:= (sError);
|
||
Exit;
|
||
end;
|
||
|
||
finally
|
||
CoUninitialize;
|
||
end;
|
||
|
||
TThread.Synchronize( nil,
|
||
procedure
|
||
begin
|
||
AddLog(tmp);
|
||
|
||
TxtShowErrorInfo(TxtInput1Error,'');
|
||
BeginUpdate;
|
||
RowCount:=RowCount+1;
|
||
Cells[0,RowCount-1]:=EdtInput2.Text;
|
||
Cells[1,RowCount-1]:=FormatDateTime('yyyymmdd hh:mm:ss',Now);
|
||
SelectRow(RowCount-1);
|
||
EndUpdate;
|
||
|
||
FRfidLog.MessageInfo(EdtInput2.Text+' '+FormatDateTime('yyyymmdd hh:mm:ss',Now));
|
||
//dm.InsertLotNo(); //
|
||
|
||
end
|
||
);
|
||
end,Avalue
|
||
).Start;
|
||
|
||
|
||
|
||
end;
|
||
end;
|
||
end;
|
||
|
||
procedure TfrmListMoreConent.AddLog(sLog:string);
|
||
begin
|
||
if Memo1.Lines.Count>100 then
|
||
Memo1.Lines.Delete(0);
|
||
Memo1.Lines.Add(FormatDateTime('yyyymmdd hh:mm:ss.zzz ',Now)+sLog);
|
||
Memo1.SelStart:=Length(Memo1.Text);
|
||
Memo1.SelLength:=0;
|
||
end;
|
||
|
||
|
||
end.
|