全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:986
推到 Plurk!
推到 Facebook!

請大家幫忙~資料比對問題?

答題得分者是:gemi0305
kenbcb
中階會員


發表:171
回覆:129
積分:60
註冊:2003-07-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-08-18 17:19:16 IP:61.222.xxx.xxx 未訂閱
請教各位,我下面的程式是要從socket收到資料,會先去比對client[20]中,有無相同ID,有的話則取代,無則加入;然後在將client[20]的資料反應到tstringgrid中,但我卻無法存到client[20]中~ 請各位幫忙~謝謝各位    typedef struct{         char    ID[10];         char    Description[80];         char    Status; }client_Type;    client_Type client[20];    void __fastcall TfrmAdmin::ClientSocket1Read(TObject *Sender,       TCustomWinSocket *Socket) {   //the function process data write to buffer by socket      int len,i;   char buffer[200]={0},ID[10];      len = Socket->ReceiveLength();   Socket->ReceiveBuf(buffer,len);                memmove((char *)&ID,(char *)&buffer,sizeof(ID));   for(i=0;i<20;i ) { if(ID == client[i].ID) { memmove((char *)&client[i],(char *)&buffer,sizeof(client[i])); } for(i=0;i<20;i ) { if(client[1].ID=="") memmove((char *)&client[i],(char *)&buffer,sizeof(client[i])); } sgrdPMap->OnDrawCell; } void __fastcall TfrmAdmin::sgrdPMapDrawCell(TObject *Sender, int ACol, int ARow, TRect &Rect, TGridDrawState State) { switch(Pclient[ACol*sgrdPMap->ColCount ARow].Status) { case '1': sgrdPMap->Canvas->Brush->Color = clGreen; sgrdPMap->Canvas->FillRect(Rect); break; case '0': sgrdPMap->Canvas->Brush->Color = clRed; sgrdPMap->Canvas->FillRect(Rect); break; default: sgrdPMap->Canvas->Brush->Color = clWindow; sgrdPMap->Canvas->FillRect(Rect); break; } UINT format = DT_CENTER | DT_VCENTER; AnsiString text = sgrdPMap->Cells[ACol][ARow]; DrawText(sgrdPMap->Canvas->Handle,text.c_str(),text.Length(),&Rect,format); }

中階會員


發表:36
回覆:142
積分:70
註冊:2003-07-24

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-08-18 18:20:58 IP:211.23.xxx.xxx 未訂閱
kenbcb 您好: 關於您所問的是想比對 ID 這部份我是用元件 ListBox 去完成 這會對您的資料比較好處理,也不是拘束為20個ID 若有上限的話,也是可以處理的,有需要再給您code 而 ListBox 在程式執行時可隱藏 假設欲比對的資料變數名稱為 ID for(int i=0 ; i < ListBox1->Items->Count ; i ) { if(ListBox1->Items->Strings[i] != ID) ListBox1->Items->Add(ID); } 上述程式代表 for 迴圈判斷過程中,只要出現有 ListBox 裡沒有的ID 就將 ID 加到您的 ListBox 中 希望這會使您滿意 發表人 - 流 於 2003/08/18 18:22:31
gemi0305
版主


發表:81
回覆:564
積分:629
註冊:2003-05-11

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-08-19 00:15:39 IP:61.224.xxx.xxx 未訂閱
只有針對寫入client[i]來改,而TStringGrid因為我不清楚你想怎麼顯示, 所以我就先用一個Memo來暫時作為顯示~    請注意以下的地方:  
 
 void __fastcall TForm1::ClientSocket1Read(TObject *Sender,
      TCustomWinSocket *Socket)
{
     bool ID_Exist = false;   //用一個旗標判斷id是否存在         int len,i;
     char buffer[200]={0},ID[10];  //因為buffer可以直接轉型,所以可以不使用ID[10]         len = Socket->ReceiveLength();
     Socket->ReceiveBuf(buffer,len);         memmove(&ID,&buffer,sizeof(ID));  //使用mem不用加(char*)         for(i=0;i<20;i  )
        if(AnsiString((char*)buffer) == AnsiString((char*)client[i].ID)) //這裡我忘了修改,要轉型才能比較
           {
              memmove(&client[i],&buffer,sizeof(client_Type));
              ID_Exist=true;           //此id是存在的
            }         if(!ID_Exist)                     //如果id不存在,才寫入id
        for(i=0;i<20;i  )
           {     //要把client[].ID轉成string才能和""比對   
               if(AnsiString((char*)client[i].ID)=="")
                  {   
                     memmove(&client[i],&buffer,sizeof(client_Type));
                                      
 
                            break;   //已找到空的位置寫入之後,就可直接跳出迴圈
                     } 
           }         //用memo把client[20]的內容顯示出來
     for(int j =0; j<=20; j  )
     Memo1->Lines->Add(AnsiString((char*)client[j].ID) 
                          AnsiString((char*)client[j].Description) 
                          AnsiString((char*)client[j].Status));    }
國泰平安 發表人 - Gemi0305 於 2003/08/19 12:47:51 發表人 - Gemi0305 於 2003/08/19 13:25:00
kenbcb
中階會員


發表:171
回覆:129
積分:60
註冊:2003-07-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-08-19 09:46:59 IP:61.222.xxx.xxx 未訂閱
我是想把資料存入陣列後,觸發tstringgrid的drawcell事件,依照資料某一個值給予每一個cell的一種顏色
gemi0305
版主


發表:81
回覆:564
積分:629
註冊:2003-05-11

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-08-19 13:19:37 IP:210.66.xxx.xxx 未訂閱
我剛剛看了一下程式,發現有些小錯誤, 用看的改了一下,可是沒實際去跑...要等下班才比較空,sorry~ 我有修改的地方,寫在上篇的程式碼上,用紅色表示~ 你只要照包前輩的那個> class="code"> void __fastcall TForm1::ClientSocket1Read(TObject *Sender, TCustomWinSocket *Socket) { bool ID_Exist = false; int len,i; char buffer[200]={0}; len = Socket->ReceiveLength(); Socket->ReceiveBuf(buffer,len); for(i=0;i<20;i ) if(AnsiString((char*)buffer) == AnsiString((char*)client[i].ID)) { memmove(&client[i],&buffer,sizeof(client_Type)); StringGrid1->Repaint(); ID_Exist=true; } if(!ID_Exist) for(i=0;i<20;i ) { if(AnsiString((char*)client[i].ID)=="") { memmove(&client[i],&buffer,sizeof(client_Type)); StringGrid1->Repaint(); break; } } //---------用memo來秀,如果不需要,可以刪之不用-------- for(int j =0; j<=20; j ) Memo1->Lines->Add(AnsiString((char*)client[j].ID) AnsiString((char*)client[j].Description) AnsiString((char*)client[j].Status)); } 國泰平安
Schuamcher
一般會員


發表:30
回覆:42
積分:14
註冊:2004-11-18

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-03-23 17:31:41 IP:220.130.xxx.xxx 未訂閱
請問一下如果ID的個數很多的時侯的,當我寫入 client,我可以用ValueListEditor去直接去核對記憶體位址嗎,請問一下用該如何去核對,另外又有什麼更好的方法去使用嗎,謝謝各位大大的解答
系統時間:2024-05-19 14:42:56
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!