使用研華USB-4711 AD - 存取 Analog Input 值為DAT檔~ |
尚未結案
|
chabear
一般會員 發表:1 回覆:5 積分:1 註冊:2007-09-11 發送簡訊給我 |
以下研華的BCB範例~
我修改的部份會用 ///*********************** //************************ 這個記號圈起來~ 這是抓取Analog Input 的程式 ~ 我現在有三個輸入~ 範例好像是存到一個矩陣~ 然後一個一個抓取矩陣的值SHOW出來~ 我原來存成 .DAT 就是抓取他SHOW的值一一存起來~ 但是我需要30KHZ以上的速度抓值~ 這個SHOW值很花我的時間~要一.二十分鐘~ 我把這個SHOW的部份砍掉~但是逃不掉FOR迴圈~ 我想要把那個矩陣直接存成.DAT~ 但是BCB都跟我說格式不是 string ~ 所以存不起來~問題大約在程式中後半段~粗體字那邊~ 請各位朋友幫幫忙~萬分感謝!!! 程式開始~ //--------------------------------------------------------------------------- #include #pragma hdrstop #include "Init.h" #include "DataShow.h" #include "Convert.h" #include "GainListForm.h" #include "stdio.h" #include "..\..\..\include\driver.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TFrmInit *FrmInit; const MaxEntries = 255; DEVLIST DeviceList[MaxEntries 1]; DEVFEATURES DevFeatures; PT_DeviceGetFeatures ptDevGetFeatures; DEVCONFIG_AI Devconfig_AI; PT_AIGetConfig ptAIGetConfig; PT_EnableEvent ptEnableEvent; // Enable event PT_CheckEvent ptCheckEvent; // Check event PT_FAIIntScanStart ptFAIStart; PT_FAITransfer ptFAITransfer; // FAITransfer table int gwDevice = 0; // The selected device in DeviceList[] USHORT usStartChan; // Start channel(physical) USHORT usChanNum; // The count of channels(logical) long DeviceHandle; long ErrCde; char szErrMsg[80]; USHORT usGainCode[64]; USHORT usGainIndx[64]; ///Logical Channel Gain Code Index int giMaxLogChanNum; int giEvtFlag=1; // event enable(0) int giFifoEnable=0; // Fifo int giFifoSize; // Fifo Size HGLOBAL hBuf,hUserBuf; ULONG gulConvNum; ULONG gdwPacerRate; USHORT usEventType=0; USHORT guDataType = 1; // display type : FLOAT(1) USHORT gwOverrun; ULONG ulIntCounter = 0; // counter by adInterruptEvent ULONG ulBfChgCounter = 0; ULONG ulOverrunCounter = 0; bool gbThreadFlag = false; // li.zhe add USHORT gwExtTrig = 0; // 0 = internal trigger ///***************************************************************************** String filename,data_ch0,data_ch1,data_ch2; int counter=0; int counter1=0; int mod=0; ///***************************************************************************** long ChkErr(long lErrCde) { if (lErrCde != 0) { DRV_GetErrorMessage(lErrCde, szErrMsg); Application->MessageBox(szErrMsg, "Error!!", MB_OK); return 1; } else return 0; } int PhyChanToLogChan(DEVCONFIG_AI * pDevCfg,int PhyChan) { int i; int result = 0; if(pDevCfg->ulChanConfig == 1) { return PhyChan; } for(i = 0; i<=(PhyChan>31?31:PhyChan);i ) { if(pDevCfg->ulChanConfig & (1< i ; result ; } if(PhyChan >= 32) { for(i = 32; i<=PhyChan;i ) { if(pDevCfg->ulChanConfigEx[0] & (1<<(i-32))) i ; result ; } } return result - 1; } int GetMaxLogChanNum(DEVCONFIG_AI * pDevCfg,DEVFEATURES *pDevFeature) { int i; int result = 0; if (pDevCfg->ulChanConfig == 1) { return pDevFeature->usMaxAIDiffChl; } for(i = 0; i< pDevFeature->usMaxAISiglChl ; i ) { if(i<32) if(pDevCfg->ulChanConfig & (1< i ; else if(pDevCfg->ulChanConfigEx[0] & (1<<(i-32))) i ; result ; } return result; } void TFrmInit::GainCodeFilling() { for (int i=0 ; i< 64 ; i ) usGainIndx[i] =cmbOverallGain->ItemIndex; } //--------------------------------------------------------------------------- __fastcall TFrmInit::TFrmInit(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TFrmInit::FormCreate(TObject *Sender) { int i; short gnNumOfDevices; int MaxEntries; short nOutEntries; MaxEntries = 100; // Add type of PC Laboratory Card ErrCde = DRV_DeviceGetList(&DeviceList[0], MaxEntries, &nOutEntries); if (ChkErr(ErrCde)) return; // Return the number of devices which you install in the system using // Device Installation ErrCde = DRV_DeviceGetNumOfList(&gnNumOfDevices); if (ChkErr(ErrCde)) return; for (i = 0; i < gnNumOfDevices; i ) { lstDevice->Items->Add(DeviceList[i].szDeviceName); } giEvtFlag = 1; // event enable(0) giFifoEnable = 0; // Fifo disable(0) giFifoSize = FIFO_SIZE; lstDevice->ItemIndex = 0; lstDeviceClick(Sender); } //--------------------------------------------------------------------------- void __fastcall TFrmInit::lstDeviceClick(TObject *Sender) { int i; int tempNum; long dwDeviceNum; // cmbOverallGain->Enabled = true; butConvert->Enabled = false; // Clear gain code selection items cmbOverallGain->Clear(); gwDevice = lstDevice->ItemIndex; // Open selected device for getting more informations dwDeviceNum = DeviceList[lstDevice->ItemIndex].dwDeviceNum; ErrCde = DRV_DeviceOpen(dwDeviceNum, &DeviceHandle); if (ChkErr(ErrCde)) return; // Device's informations is stored as Features and configurations ptDevGetFeatures.buffer = &DevFeatures; ErrCde = DRV_DeviceGetFeatures(DeviceHandle, &ptDevGetFeatures); if (ChkErr(ErrCde)) { DRV_DeviceClose(&DeviceHandle); return; } // Add Gain code selection list's items tempNum = DevFeatures.usNumGain; if (tempNum > 0) { for (i = 0; i < tempNum; i ) { cmbOverallGain->Items->Add(DevFeatures.glGainList[i].szGainStr); } } ///***************************************************************************** cmbOverallGain->ItemIndex = 1; ///預設值為0(正負10V) ///***************************************************************************** // Reset Gain code setting for (i = 0; i <64; i ) usGainIndx[i] = 0; GainCodeFilling(); // Add analog input start channel items cmbStartChl->Clear(); ptAIGetConfig.buffer = &Devconfig_AI; ErrCde = DRV_AIGetConfig(DeviceHandle, &ptAIGetConfig); if (ChkErr(ErrCde)) { DRV_DeviceClose(&DeviceHandle); return; } giMaxLogChanNum = GetMaxLogChanNum(&Devconfig_AI,&DevFeatures); if(Devconfig_AI.ulChanConfig == 1) tempNum = DevFeatures.usMaxAIDiffChl; else if(DevFeatures.usMaxAIDiffChl > DevFeatures.usMaxAISiglChl) tempNum = DevFeatures.usMaxAIDiffChl; else tempNum = DevFeatures.usMaxAISiglChl; if (tempNum > 0) { for (i = 0; i < tempNum; i ) { cmbStartChl->Items->Add(IntToStr(i).c_str()); } ///***************************************************************************** cmbStartChl->ItemIndex = 0; ///預設CHANNEL為0 ///***************************************************************************** cmbStartChlClick(Sender); } // Close device DRV_DeviceClose(&DeviceHandle); radOverall->Enabled = true; butConvert->Enabled = true; } //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- void __fastcall TFrmInit::cmbStartChlClick(TObject *Sender) { int tempNum; int i; // Add analog input channel count item cmbChlCount->Clear(); for (i = 1; i <= giMaxLogChanNum; i ) cmbChlCount->Items->Add(IntToStr(i).c_str()); // Default selection ///***************************************************************************** cmbChlCount->ItemIndex = 2; ///預設值為0(一組輸出) ///***************************************************************************** } //--------------------------------------------------------------------------- void __fastcall TFrmInit::butConvertClick(TObject *Sender) { frmDataShow->Message1->Text=" "; filename=InputBox("檔名","請輸入檔名","") ; data_ch0=""; data_ch1=""; data_ch2=""; counter=0; ///**** PT_EnableEvent ptEnableEvent; int i, j; ulIntCounter = 0; // counter by adInterruptEvent ulBfChgCounter = 0; ulOverrunCounter = 0; gulConvNum = editConv->Text.ToInt(); gdwPacerRate = editPacerRate->Text.ToInt(); guDataType = (USHORT)chkFloatData->Checked; // 1. Open device ErrCde = DRV_DeviceOpen(DeviceList[lstDevice->ItemIndex].dwDeviceNum, &DeviceHandle); if (ChkErr(ErrCde)) return; ptAIGetConfig.size = sizeof(LPDEVCONFIG_AI); ptAIGetConfig.buffer = &Devconfig_AI; ErrCde = DRV_AIGetConfig(DeviceHandle, &ptAIGetConfig); if (ErrCde != SUCCESS) { DRV_GetErrorMessage(ErrCde,(LPSTR)szErrMsg); Application->MessageBox((char *)szErrMsg, "Driver Message", MB_OK); } // 2. Set gain list usStartChan=cmbStartChl->Text.ToInt(); usChanNum= cmbChlCount->Text.ToInt(); int logChan = PhyChanToLogChan(&Devconfig_AI,usStartChan); for (int i=0 ; i< usChanNum ; i ) { usGainCode[i] = DevFeatures.glGainList[usGainIndx[(i logChan) % giMaxLogChanNum]].usGainCde; } ptEnableEvent.EventType = ADS_EVT_INTERRUPT | ADS_EVT_BUFCHANGE | ADS_EVT_OVERRUN | ADS_EVT_TERMINATED; ptEnableEvent.Enabled = giEvtFlag; giFifoSize = editFifo->Text.ToInt(); if (chkFifo->Checked && giFifoSize > 0) ptEnableEvent.Count = giFifoSize; else ptEnableEvent.Count = 1; ErrCde = DRV_EnableEvent(DeviceHandle, &ptEnableEvent); if (ChkErr(ErrCde)) return; // 3. Start AI interrupt funciton // 3.1 Fill element of PT_FAIIntScanStart ptFAIStart.TrigSrc = gwExtTrig; // Ext trig mode li.zhe modify ptFAIStart.SampleRate = editPacerRate->Text.ToInt(); ptFAIStart.NumChans = cmbChlCount->Text.ToInt(); ptFAIStart.StartChan = cmbStartChl->Text.ToInt(); ptFAIStart.GainList = usGainCode; ptFAIStart.count = gulConvNum; ptFAIStart.cyclic = chkCyclic->Checked; if (giFifoEnable == 1 && giFifoSize > 0) ptFAIStart.IntrCount = giFifoSize; else ptFAIStart.IntrCount = 1; // Allocate memory hBuf = GlobalAlloc(GHND, sizeof(USHORT) * gulConvNum); if(hBuf == 0) { strcpy(szErrMsg, "Not enough memory for buffer"); Application->MessageBox(szErrMsg, "Driver Message", MB_OK); DRV_DeviceClose(&DeviceHandle); return; } ptFAIStart.buffer = (USHORT far *) hBuf; // allocate data memory if((hUserBuf=(FLOAT far *)GlobalAlloc(GHND, sizeof(FLOAT) * gulConvNum)) == 0) { lstrcpy((char *) szErrMsg, "Not enough memory for buffer"); DRV_DeviceClose((LONG far *)&DeviceHandle); Application->MessageBox((char *)szErrMsg, "Driver Message", MB_OK); return; } ptFAITransfer.DataBuffer = (FLOAT far *)GlobalLock(hUserBuf); // 3.2 Call advantech API function DRV_FAIIntScanStart ErrCde = DRV_FAIIntScanStart(DeviceHandle, &ptFAIStart); if (ChkErr(ErrCde)) { ErrCde = DRV_DeviceClose(&DeviceHandle); GlobalFree(hBuf); return; } if( giEvtFlag ) { pThread = new CheckThread(false); gbThreadFlag = true; // set the thread flag } // 4. Entering converting form FrmConvert->txtInt->Text=IntToStr(0); FrmConvert->txtBuffChange->Text=IntToStr(0); FrmConvert->Show(); frmDataShow->Show(); frmDataShow->Hide(); FrmInit->Hide(); FrmConvert->prgsDataCounts->Max = editConv->Text.ToInt(); FrmConvert->tmrDataCounts->Enabled = True; } //--------------------------------------------------------------------------- void __fastcall TFrmInit::butGainListClick(TObject *Sender) { usStartChan=cmbStartChl->Text.ToInt(); usChanNum= cmbChlCount->Text.ToInt(); frmGainList->SetGainList(); frmGainList->Show(); } //--------------------------------------------------------------------------- void __fastcall TFrmInit::butExitClick(TObject *Sender) { GlobalFree(hBuf); Application->Terminate(); } //--------------------------------------------------------------------------- void __fastcall TFrmInit::chkEventEnableClick(TObject *Sender) { giEvtFlag = chkEventEnable->Checked; } //--------------------------------------------------------------------------- void __fastcall TFrmInit::chkFifoClick(TObject *Sender) { long lFifoSize; giFifoEnable = chkFifo->Checked; if (giFifoEnable == 1) { editFifo->Enabled = True; // Step 1: Device open ErrCde = DRV_DeviceOpen(DeviceList[lstDevice->ItemIndex].dwDeviceNum, &DeviceHandle); if (ChkErr(ErrCde)) return; // Step 2: Get FIFO size ErrCde = DRV_GetFIFOSize(DeviceHandle, &lFifoSize); if (ChkErr(ErrCde)) return; // Step 3: Close device DRV_DeviceClose (&DeviceHandle); giFifoSize = lFifoSize / 2; // divide by 2 for conversion from byte to word editFifo->Text = giFifoSize; editConv->Text = IntToStr(lFifoSize); } else { editFifo->Enabled = False; editFifo->Text = "0"; } } //--------------------------------------------------------------------------- bool TFrmInit::CheckEvent() { //TODO: Add your source code here ptCheckEvent.EventType = &usEventType; if (chkCyclic->Checked ) { ptCheckEvent.Milliseconds = INFINITE; } else { ptCheckEvent.Milliseconds = 1000 * (gulConvNum / gdwPacerRate) 2000; } if ((ErrCde = DRV_CheckEvent(DeviceHandle, (LPT_CheckEvent)&ptCheckEvent)) != 0) { Application->MessageBox("Check Event Error !","Thread Message",MB_OK); return false; } // Process interrupt event if (usEventType & ADS_EVT_INTERRUPT) { ulIntCounter ; } // Process buffer change event if (usEventType & ADS_EVT_BUFCHANGE) { ulBfChgCounter ; } // Process overrun event if (usEventType == ADS_EVT_OVERRUN) { ulOverrunCounter ; } FrmConvert->txtInt->Text=IntToStr(ulIntCounter); FrmConvert->txtBuffChange->Text=IntToStr(ulBfChgCounter); // Process terminate event if (usEventType & ADS_EVT_TERMINATED) { // process terminate event Terminate(); return false; } return true ; } void TFrmInit::StopThread() { //TODO: Add your source code here gbThreadFlag = false; } void TFrmInit::Terminate() { //TODO: Add your source code here LPVOID temp; FrmConvert->tmrDataCounts->Enabled = false; gbThreadFlag = false; ptFAITransfer.ActiveBuf = 0; // Single buffer ptFAITransfer.DataType = guDataType; ptFAITransfer.start = 0; ptFAITransfer.count = gulConvNum; ptFAITransfer.overrun = &gwOverrun; if ((ErrCde = DRV_FAITransfer(DeviceHandle, (LPT_FAITransfer)&ptFAITransfer)) != 0) { DRV_GetErrorMessage(ErrCde,(LPSTR)szErrMsg); GlobalUnlock(hBuf); GlobalUnlock(hUserBuf); GlobalFree(hBuf); GlobalFree(hUserBuf); DRV_DeviceClose((LONG far *)&DeviceHandle); Application->MessageBox((char *)szErrMsg, "Driver Message", MB_OK); return; } if ((ErrCde = DRV_FAITerminate(DeviceHandle)) != 0) { DRV_GetErrorMessage(ErrCde,(LPSTR)szErrMsg); GlobalUnlock(hBuf); GlobalUnlock(hUserBuf); GlobalFree(hBuf); GlobalFree(hUserBuf); DRV_DeviceClose((LONG far *)&DeviceHandle); Application->MessageBox((char *)szErrMsg, "Driver Message", MB_OK); } // Display Data frmDataShow->Show(); frmDataShow->lstData->Clear(); // if (guDataType == 0) // temp = (USHORT far *)ptFAITransfer.DataBuffer; // else temp = (FLOAT far *)ptFAITransfer.DataBuffer; ///************************************************************* ///************************************************************* //char szbuff[100]; for(ULONG i = 0; i < gulConvNum; i) { // if (guDataType == 0) // sprintf(szbuff,"Buff[%2.2d] = %X",i,((USHORT far *)temp)[i]); // else // sprintf(szbuff,"Buff[%2.2d] = .6f",i,((float far *)temp)[i]); ///***************************************************************************** String Data=((float far *)temp)[i]; String Data1=Data.SubString(1,8); switch(mod) {case 0 : {data_ch0= data_ch0 Data1 ",";mod=1; break;} case 1 : {data_ch1= data_ch1 Data1 ",";mod=2; break;} case 2 : {data_ch2= data_ch2 Data1 ",";mod=0; break;} } if (i==60000) frmDataShow->Message->Text="33%"; if (i==120000) frmDataShow->Message->Text="66%"; ///***************************************************************************** } ///********************************************** TStringList *s1=new TStringList(); s1->Add(data_ch0); s1->SaveToFile("C:\\bcb\\" filename "_AI0-before-IC1.dat"); delete s1; TStringList *s2=new TStringList(); s2->Add(data_ch1); s2->SaveToFile("C:\\bcb\\" filename "_AI1-before-IC14.dat"); delete s2; TStringList *s3=new TStringList(); s3->Add(data_ch2); s3->SaveToFile("C:\\bcb\\" filename "_AI2-after.dat"); delete s3; data_ch0=""; data_ch1=""; data_ch2=""; FrmConvert->Close(); ///取樣值跑完才關掉 frmDataShow->Message->Text=""; frmDataShow->Message1->Text=" OK "; ///********************************************* ///********************************************** if(pThread!=NULL) { pThread->Terminate(); DWORD dwExitCode; GetExitCodeThread( (void *)pThread->Handle ,&dwExitCode) ; if(dwExitCode == STILL_ACTIVE ) TerminateThread( (void *)pThread->Handle, dwExitCode); pThread = NULL; } // Free buffer GlobalUnlock(hBuf); GlobalUnlock(hUserBuf); GlobalFree(hBuf); GlobalFree(hUserBuf); } void __fastcall TFrmInit::cmbOverallGainChange(TObject *Sender) { GainCodeFilling(); } //--------------------------------------------------------------------------- void __fastcall TFrmInit::radOverallClick(TObject *Sender) { GainCodeFilling(); butGainList->Enabled = False; cmbOverallGain->Enabled = True; } //--------------------------------------------------------------------------- void __fastcall TFrmInit::radGainListClick(TObject *Sender) { butGainList->Enabled = True; cmbOverallGain->Enabled = False; } //--------------------------------------------------------------------------- // li.zhe add 2004/11/5 void __fastcall TFrmInit::radExtTrigClick(TObject *Sender) { gwExtTrig = 1; radExtTrig->Checked = true; radIntTrig->Checked = false; } //--------------------------------------------------------------------------- void __fastcall TFrmInit::radIntTrigClick(TObject *Sender) { gwExtTrig = 0; radIntTrig->Checked = true; radExtTrig->Checked = false; } // end li.zhe 2004/11/5 //--------------------------------------------------------------------------- |
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
//************************
我想要把那個矩陣直接存成.DAT~ 陣列存成.dat可以參考下面連結 http://delphi.ktop.com.tw/board.php?cid=168&fid=913&tid=87768 副檔名換成.dat即可 但是BCB都跟我說隔時不是 string ~ 是格式嗎? 發問請注意錯別字以免造成誤會 |
chabear
一般會員 發表:1 回覆:5 積分:1 註冊:2007-09-11 發送簡訊給我 |
|
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
|
chabear
一般會員 發表:1 回覆:5 積分:1 註冊:2007-09-11 發送簡訊給我 |
===================引 用 taishyang 文 章=================== 能否舉例說明你的資料內容是什麼,結果需要的是什麼? 動機:這是一個研華的AD Converter,我需要用三個類比輸入要同時取值(雖然說是同時,但硬體還是會有前後), 我利用它的多輸入範例,他會跳出一個視窗,並且顯示出他取的值, 比如說我設定 1KHZ 的取樣值,我有三個輸入,需要取 10 秒鐘,所以範例會有 30K 的資料, 然後SHOW值的動作是使用FOR迴圈 只要小於30000就一值SHOW某矩陣的值, 我當初並沒有去仔細看範例程式內容,只是單純把它SHOW出的值一一抓取,並分到三個擋去存, 就像 矩陣[0],[3],[6],[9]...存到data1, 矩陣[1],[4],[7],[10]...存到data2, 矩陣[2],[5],[8],[11]...存到data3, 但是這個FOR迴圈實在跑太久,所以直接想從矩陣存檔,要分開三筆資料以後再用程式去分。 因為這個存檔的動作是在醫院測量病人,所以不能拖太久,麻煩各位朋友幫忙。萬分感謝!!! |
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
|
chabear
一般會員 發表:1 回覆:5 積分:1 註冊:2007-09-11 發送簡訊給我 |
|
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
我的意思是,你之前提到
-------------------------------------- 我的矩陣是float格式~ T大提到的方法~我會遇到BCB錯誤訊息~ cannot convert 'float * ' to 'unsigned char[1]' 但是使用FloatToStr (矩陣)又會遇到BCB錯誤訊息~ cannot convert 'float * ' to 'long double' -------------------------------------- 要問的是你這段是怎麼寫的? 把這段程式PO出來, 一開始PO的程式太長,而且沒有你的硬體,很難模擬出你的情況 你應該把有問題的部份PO出來就好,並指出哪裏出現問題,這樣問題比較好收斂 |
chabear
一般會員 發表:1 回覆:5 積分:1 註冊:2007-09-11 發送簡訊給我 |
===================引 用 taishyang 文 章=================== 我的意思是,你之前提到 -------------------------------------- 我的矩陣是float格式~ T大提到的方法~我會遇到BCB錯誤訊息~ cannot convert 'float * ' to 'unsigned char[1]' 但是使用FloatToStr (矩陣)又會遇到BCB錯誤訊息~ cannot convert 'float * ' to 'long double' -------------------------------------- 要問的是你這段是怎麼寫的? 把這段程式PO出來, 一開始PO的程式太長,而且沒有你的硬體,很難模擬出你的情況 你應該把有問題的部份PO出來就好,並指出哪裏出現問題,這樣問題比較好收斂 我現在把問題統整起來~ 範例程式AD CONVERTER 可以把我外部三個輸入轉成一個矩陣~假設矩陣有50K個轉換後的值~ 而那些值是用FLOAT的格式存取~ 範例是利用一個FOR迴圈 1跑到50K來SHOW值~每次迴圈會將矩陣裡面的FLOAT值指定到一個定義為CHAR的值裡面~ 我絕得這個FOR迴圈幕必要SHOW值~但是我不需要~我只需要將所有資料存為一個DAT檔便可。 並且以 矩陣[0],[3],[6],[9]...存到data1, 矩陣[1],[4],[7],[10]...存到data2, 矩陣[2],[5],[8],[11]...存到data3, 這樣的存取方法~ T大所提到的方法~好像矩陣裡面就是字元,所以才能直接存嗎? 因為我將程式碼照貼就是會有 cannot convert 'float * ' to 'unsigned char[1]' 的問題! |
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
|
chabear
一般會員 發表:1 回覆:5 積分:1 註冊:2007-09-11 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |