void __fastcall TForm1::FileOpen1Accept(TObject *Sender) { String a = FileOpen1->Dialog->FileName; if (a!=""){ // Öffnen if (ExtractFileExt(a).UpperCase()!=".AD")a=a.SubString(1,a.Length()-ExtractFileExt(a).Length())+".ad"; TStringList *Liste = new TStringList(); Liste->LoadFromFile(a); Max = StrToInt(Liste->Strings[0]); Edit1->Text=Liste->Strings[1]; ListBox1->Clear(); Liste->Delete(0); Liste->Delete(0); for (int i=0;i<Max;i++){ ListBox1->Items->Add(Liste->Strings[i*67]); for (int b=0;b<66;b++){ Data[i][b] = StrToInt(Liste->Strings[i*67 + b + 1]); } } ListBox1->ItemIndex=0; Selected = ListBox1->ItemIndex; Load_Dat(Selected); } }
void Defines::RemoveFromList(String keyList, String data) { TStringList *s = GetList(keyList); if (s==0) return; int i=s->IndexOf(data); if (i>=0) s->Delete(i); SetList(keyList,s); delete s; }
//--------------------------------------------------------------------------- void __fastcall TLocationProfilesDialog::RemoveBookmark(TObject * Sender) { TBookmarkList * BookmarkList = GetBookmarkList(Sender); TTreeView * ProfilesView = GetProfilesView(Sender); TStringList * Folders = GetFolders(Sender); assert(ProfilesView->Selected); TTreeNode * Node = ProfilesView->Selected; if (Node->Data) { BookmarkList->Delete((TBookmark *)Node->Data); TTreeNode * ParentNode = Node->Parent; Node->Delete(); if (ParentNode && !ParentNode->Count) { assert(Folders->IndexOfObject(ParentNode) >= 0); Folders->Delete(Folders->IndexOfObject(ParentNode)); ParentNode->Delete(); } } else { UnicodeString Message = MainInstructions(LoadStr(DELETE_BOOKMARK_FOLDER)); if (MessageDialog(Message, qtConfirmation, qaYes | qaNo, HELP_LOCATION_PROFILE_DELETE) == qaYes) { assert(Node->Count); for (int i = 0; i < Node->Count; i++) { BookmarkList->Delete((TBookmark *)Node->Item[i]->Data); } assert(Folders->IndexOfObject(Node) >= 0); Folders->Delete(Folders->IndexOfObject(Node)); Node->Delete(); } } UpdateControls(); }
//--------------------------------------------------------------------------- void __fastcall TLocationProfilesDialog::BookmarkMove(TObject * Sender, TTreeNode * Source, TTreeNode * Dest) { TBookmarkList * BookmarkList = GetBookmarkList(Sender); TTreeView * ProfilesView = GetProfilesView(Sender); TStringList * Folders = GetFolders(Sender); assert(Source && Source->Data); TBookmark * Bookmark = (TBookmark *)Source->Data; TTreeNode * PrevFolderNode = Source->Parent; if (!Dest || !Dest->Data) { Bookmark->Node = Dest ? Dest->Text : UnicodeString(); BookmarkList->MoveTo(BookmarkList->Bookmarks[BookmarkList->Count - 1], Bookmark, false); ProfilesView->Selected->MoveTo(Dest, naAddChild); } else { TBookmark * DestBookmark = (TBookmark *)Dest->Data; Bookmark->Node = DestBookmark->Node; BookmarkList->MoveTo(DestBookmark, Bookmark, Source->AbsoluteIndex > Dest->AbsoluteIndex); if (Source->AbsoluteIndex > Dest->AbsoluteIndex) { Source->MoveTo(Dest, naInsert); } else if (Dest->getNextSibling() != NULL) { Source->MoveTo(Dest->getNextSibling(), naInsert); } else { Source->MoveTo(Dest, naAdd); } } if (PrevFolderNode && !PrevFolderNode->Count) { assert(Folders->IndexOfObject(PrevFolderNode) >= 0); Folders->Delete(Folders->IndexOfObject(PrevFolderNode)); PrevFolderNode->Delete(); } Source->MakeVisible(); UpdateControls(); }
bool __fastcall TMainForm::LoadHexToRAM(String fName, bool bLow) { // Load all the text lines from the .hex file into a String List for easy // manipulation TStringList *sList = new TStringList; if (fName.Pos("VendAX")) { GetVendAX(sList); } else { TFileStream *srcStream = new TFileStream(fName,fmOpenRead | fmShareDenyWrite); if (srcStream == NULL) return false; sList->LoadFromStream(srcStream); delete srcStream; } String tmp; int v; // Delete non-data records for (int i=sList->Count - 1; i>=0; i--) { if (sList->Strings[i].Length()) { tmp = sList->Strings[i].SubString(8,2); // Get the Record Type into v v = 0; HexToBin(tmp.c_str(),(char *)&v,1); v *= 2; if (v) sList->Delete(i); // Data records are type == 0 } } // Re-construct the strings to only contain the offset followed by the data for (int i=0; i<sList->Count; i++) { // Remove comments v = sList->Strings[i].Pos("//"); if (v) sList->Strings[i].SetLength(v-1); // Build string that just contains the offset followed by the data bytes if (sList->Strings[i].Length()) { // Get the offset String sOffset = sList->Strings[i].SubString(4,4); // Get the string of data chars tmp = sList->Strings[i].SubString(2,2); v = 0; HexToBin(tmp.c_str(),(char *)&v,1); v *= 2; String s = sList->Strings[i].SubString(10,v); // Replace the string in the list sList->Strings[i] = sOffset + s; } } if (bLow) ResetFX2(1); // Stop the processor FX2Device->ControlEndPt->ReqCode = bLow ? 0xA0 : 0xA3; FX2Device->ControlEndPt->Index = 0; FX2Device->ControlEndPt->Value = 0; // Go through the list, loading data into RAM String DataString = ""; WORD nxtoffset = 0; LONG xferLen = 0; WORD offset; int RamSize = 0x2000; // 8KB UCHAR buf[MAX_CTLXFER_SIZE]; char c; PCHAR pc; for (int i=0; i<sList->Count; i++) { // Get the offset tmp = sList->Strings[i].SubString(1,4); HexToBin(tmp.c_str(),(char *)&offset,2); pc = (char *) &offset; c = pc[0]; pc[0]=pc[1]; pc[1]=c; // Swap the bytes int sLen = sList->Strings[i].Length(); // Handle a line that straddles the 8KB boundary int bytes = (sLen - 4)/2; LONG lastAddr = offset + bytes; // This case is the last segment to be sent to low memory if (bLow && (offset < RamSize) && (lastAddr > RamSize)) bytes = RamSize - offset; // In this case, we found the first segment to be sent to the high memory if (!bLow && (offset < RamSize) && (lastAddr > RamSize)) { bytes = lastAddr - RamSize; String s = "xxxx"+sList->Strings[i].SubString(sLen - (bytes*2)+1,bytes*2); sList->Strings[i] = s; offset = RamSize; } if ((bLow && (offset < RamSize)) || // Below 8KB - internal RAM (!bLow && (offset >= RamSize)) ) { xferLen += bytes; if ((offset == nxtoffset) && (xferLen < MAX_CTLXFER_SIZE)) { DataString += sList->Strings[i].SubString(5,bytes*2); } else { LONG len = DataString.Length() / 2; if (len) { Hex2Bytes(DataString,buf); FX2Device->ControlEndPt->Write(buf, len); } FX2Device->ControlEndPt->Value = offset; // The destination address DataString = sList->Strings[i].SubString(5,bytes*2); xferLen = bytes; } nxtoffset = offset + bytes; // Where next contiguous data would sit } } // Send the last segment of bytes LONG len = DataString.Length() / 2; if (len) { Hex2Bytes(DataString,buf); FX2Device->ControlEndPt->Write(buf, len); } if (bLow) ResetFX2(0); // Start running this new code return true; }
//执行任务 bool __fastcall BeginJob( int JobMode, //工作模式.1:本地文件模式;2:FTP文件模式 AnsiString ListFileName, //列表文件名 AnsiString BillName, //话单类型名称 AnsiString DBName, //数据库连接名 AnsiString TableName, //表名 AnsiString LogFileName, //日志文件名 AnsiString TempPath, //临时目录 bool TransFieldValue, //是否对字段值进行翻译 int MaxError, //导入时允许的最大错误数 bool VerifyFile, //是否对文件进行格式检查 AnsiString FTPServer, //已配置好的FTP服务器名称,FTP文件模式 AnsiString DirList, //取文件的目录列表 int FTPRetryCount //列FTP文件时允许的最大重试次数 ) { SaveLog(("开始运行任务."\ "\n话单类型:" + BillName + "\n数据库连接:" + DBName + "\n导入到表:" + TableName + "\n日志文件:" + LogFileName + "\n导入数据库允许的最大错误数:" + IntToStr(MaxError) + "\n" "\n临时文件放置在:" + TempPath + "驱动器\n" ).c_str()); if(JobMode == 1) { SaveLog(("话单文件列表是" + ListFileName + ".\n").c_str()); } else if(JobMode == 2) { SaveLog(("搜索目录列表是" + DirList + "\n" + "FTP服务器:" + FTPServer).c_str()); } bool Result = false; frmMain = NULL; TStringList * FileList = NULL; TIdFTP * IdFTP = NULL; try { frmMain = new TfrmMain(Application); if(TempPath != "") { if(!DirectoryExists(TempPath) && !CreateDir(TempPath)) SaveLog(("指定的临时文件夹无效,已改为使用默认的临时文件夹:" + frmMain->TempDirectory + "\n").c_str()); else { if(TempPath.SubString(TempPath.Length(),1) != "\\") TempPath = TempPath + "\\"; frmMain->TempDirectory = TempPath; } } if(!frmMain->DBConfig->IsDBNameExists(DBName)) throw new Exception("在配置文件中找不到" + DBName + "的配置信息"); frmExportToDB = new TfrmExportToDB(NULL); frmExportToDB->txtDBServer->Text = frmMain->DBConfig->GetDBAttributeValue(DBName,"Server"); if(frmExportToDB->txtDBServer->Text == "") throw new Exception("没有为" + DBName + "配置服务器地址"); frmExportToDB->cbxDBType->ItemIndex = frmExportToDB->cbxDBType->Items->IndexOf( frmMain->DBConfig->GetDBAttributeValue(DBName,"DBType")); if(frmExportToDB->cbxDBType->ItemIndex < 0) { throw new Exception("为" + DBName + "配置的数据库类型不正确"); } FileList = new TStringList; if(JobMode == 1) { FileList->LoadFromFile(ListFileName); for(int n = FileList->Count - 1;n > -1;n--) { if(FileList->Strings[n] == "") FileList->Delete(n); } } else //FTP模式 { if(!frmMain->FTPConfig->IsFTPNameExists(FTPServer)) { throw new Exception("在FTP配置文件中找不到指定的FTP服务器"); } IdFTP = new TIdFTP(NULL); IdFTP->Host = frmMain->FTPConfig->GetFTPAttributeValue(FTPServer,"Server"); try { IdFTP->Port = StrToInt(frmMain->FTPConfig->GetFTPAttributeValue(FTPServer,"Port")); } catch(...) { IdFTP->Port = 21; } IdFTP->Username = frmMain->FTPConfig->GetFTPAttributeValue(FTPServer,"UserName"); IdFTP->Password = frmMain->FTPConfig->GetFTPAttributeValue(FTPServer,"Password",true); IdFTP->Passive = frmMain->FTPConfig->GetFTPAttributeValue(FTPServer,"Mode").UpperCase() == "PASV"; AnsiString FTPString = "ftp://" + frmMain->FTPConfig->EncryFTPString(IdFTP->Username) + ":" + frmMain->FTPConfig->EncryFTPString(IdFTP->Password) + "@" + IdFTP->Host + ":" + IntToStr(IdFTP->Port); AnsiString PasvString; if(IdFTP->Passive) PasvString = "|PASV|"; else PasvString = "||"; int ErrCount = 0; while(true) { AnsiString Status; TStringList * FTPDirList = new TStringList; AnsiString CurFTPPath = ""; AnsiString SearchFileName = ""; try { if(IdFTP->Connected()) IdFTP->Disconnect(); Status = "连接FTP服务器" + IdFTP->Host; SaveLog((Status + "\n").c_str()); IdFTP->Connect(true,FTPTimeout); Status = "获取FTP文件列表"; SaveLog((Status + "\n").c_str()); FTPDirList->Clear(); FTPDirList->LoadFromFile(DirList); AnsiString FileName; for(int n = FTPDirList->Count - 1;n > -1;n--) { if(FTPDirList->Strings[n] == "") FTPDirList->Delete(n); } FileList->Clear(); if(FTPDirList->Count == 0) FTPDirList->Add(""); for(int n = 0;n < FTPDirList->Count;n++) { CurFTPPath = FTPDirList->Strings[n]; if(CurFTPPath == "") { CurFTPPath = "/"; SearchFileName = ""; } else { int pos = StrRScan(CurFTPPath.c_str(),"/",-1); if(pos > -1) { SearchFileName = CurFTPPath.SubString(pos + 2,CurFTPPath.Length() - pos - 1); CurFTPPath = CurFTPPath.SubString(1,pos + 1); } else { SaveLog(("搜索路径[" + CurFTPPath + "]不正确,已跳过该行\n").c_str()); continue; } } Status = "获取文件列表" + CurFTPPath + SearchFileName; try { IdFTP->ChangeDir(CurFTPPath); } catch(Exception * E) { if(E->Message.Pos("No such file or directory.") > 0) { SaveLog(("搜索路径[" + CurFTPPath + "]不正确,服务器上没有找到该目录,已放弃对该目录的搜索\n").c_str()); continue; } else { throw new Exception(E->Message); } } if(SearchFileName != "" && SearchFileName.Pos("*") < 1 && SearchFileName.Pos("?") < 1) { //检查SearchFileName在FTP上是否是目录 IdFTP->List(NULL,"",true); for(int k = 0;k < IdFTP->DirectoryListing->Count;k++) { FileName = IdFTP->DirectoryListing->Items[k]->FileName; if(FileName == "." || FileName == "..") continue; if(FileName.LowerCase() == SearchFileName.LowerCase() && IdFTP->DirectoryListing->Items[k]->ItemType == ditDirectory) //SearchFileName是一个目录 { CurFTPPath = CurFTPPath + FileName + "/"; SearchFileName = ""; IdFTP->ChangeDir(CurFTPPath); break; } } } IdFTP->List(NULL,SearchFileName,true); int FileCount = 0; for(int k = 0;k < IdFTP->DirectoryListing->Count;k++) { FileName = IdFTP->DirectoryListing->Items[k]->FileName; if(FileName == "." || FileName == ".." || IdFTP->DirectoryListing->Items[k]->ItemType == ditDirectory) //目录 continue; FileList->Add(FTPString + CurFTPPath + PasvString + FileName); ++FileCount; } SaveLog((CurFTPPath + SearchFileName + " 找到" + IntToStr(FileCount) + "个文件").c_str()); } delete IdFTP; IdFTP = NULL; delete FTPDirList; FTPDirList = NULL; SaveLog(("共搜索到" + IntToStr(FileList->Count) + "个文件.\n").c_str()); for(int n = 0;n < FileList->Count;n++) { SaveLog(("找到文件:" + GetFullFTPFileName(FileList->Strings[n])).c_str()); } break; } catch(Exception * E) { ++ErrCount; if((FTPRetryCount > 0 && ErrCount > FTPRetryCount) || (FTPRetryCount == 0 && ErrCount > 1000)) { if(FTPDirList != NULL) { delete FTPDirList; FTPDirList = NULL; } ProcessExitCode = 5; throw new Exception(Status + "发生错误:" + E->Message); } else { SaveLog((Status + "发生错误:" + E->Message + " 重试" + IntToStr(ErrCount) + "\n").c_str()); } } } } frmExportToDB->txtDBUserName->Text = frmMain->DBConfig->GetDBAttributeValue(DBName,"UserName"); frmExportToDB->txtDBPassword->Text = frmMain->DBConfig->GetDBAttributeValue(DBName,"Password",true); frmExportToDB->cbxDataBases->Items->Add(frmMain->DBConfig->GetDBAttributeValue(DBName,"DataBase")); frmExportToDB->cbxDataBases->ItemIndex = 0; frmExportToDB->txtDBPort->Text = frmMain->DBConfig->GetDBAttributeValue(DBName,"Port"); frmExportToDB->txtTableName->Text = TableName; frmExportToDB->txtMaxError->Text = IntToStr(MaxError); frmExportToDB->cbxTransFieldValue->Checked = TransFieldValue; if(frmExportToDB->LoadFileList(FileList,BillName)) { if(SlentMode) { if(!frmExportToDB->ManualStartJob()) { if(frmExportToDB->TermByUser) { ProcessExitCode = 98; throw new Exception("任务被用户中止"); } else { throw new Exception("发生错误"); } } } else { frmExportToDB->btnStartClick(NULL); frmExportToDB->ShowModal(); } Result = true; } else { ProcessExitCode = 5; throw new Exception("加载文件列表失败"); } } catch(Exception * E) { ShowErrorMessage(Application->Handle,(E->Message).c_str(),false,99); if(ProcessExitCode == 0) ProcessExitCode = 99; Result = false; } SaveLog("*****************任务结束.*******************"); if(IdFTP != NULL) { delete IdFTP; IdFTP = NULL; } if(FileList != NULL) { delete FileList; FileList = NULL; } if(frmExportToDB != NULL) { delete frmExportToDB; frmExportToDB = NULL; } if(frmMain != NULL) { delete frmMain; frmMain = NULL; } return Result; }