最近做了一個小程式,用到了SQLite,後台用Python寫的剖析器,將資料插入(更新)到SQLite資料庫中,Delphi的程式周期顯示資料庫的內容。Delphi訪問SQLite採用的Aducom組件。Python插入的資料編碼都是採用的UTF-8,而Delphi的DBGrid、cxGrid控制項顯示的卻是亂碼,主要是因為Delphi7不支援Unicode造成的,因此要想辦法讓他支援。
嘗試了多種方法,包括使用據說支援Unicode的TMS Unicode Component、SUIPack等,都不好使。最後還是用了簡單的方法,在資料集組件的需要顯示的欄位的OnGetText事件,在事件處理中,對資料進行Unicode到GB的轉換。
procedure unicode2gb(const unicodestr:string; var GbStr:String);var SourceLength:integer; DoneLength:integer; AscNo:integer; Byte1,Byte2,Byte3:integer;begin GbStr:=''; if Trim(unicodestr)='' then exit; SourceLength:=Length(UnicodeStr); DoneLength:=1; repeat AscNo:=ord(UnicodeStr[DoneLength]); case (AscNo and $E0) of $E0:begin Byte1:=(AscNo and $0f) shl 12; Inc(DoneLength); if DoneLength>SourceLength then break; AscNo:=ord(UnicodeStr[DoneLength]); Byte2:=(AscNo and $3f) shl 6; Inc(DoneLength); if DoneLength>SourceLength then break; AscNo:=ord(UnicodeStr[DoneLength]); Byte3:=AscNo and $3f; end; $C0:begin Byte1:=(AscNo and $1f) shl 6; Inc(DoneLength); if DoneLength>SourceLength then break; AscNo:=ord(UnicodeStr[DoneLength]); Byte2:=(AscNo and $3f); Byte3:=0; end; 0..$bf:begin Byte1:=AscNo; Byte2:=0; Byte3:=0; end; end;//case; GbStr:=GBStr+widechar(Byte1+Byte2+Byte3); Inc(DoneLength); if DoneLength>SourceLength then break; until DoneLength>=SourceLength;end;
另外,在用cxGrid進行顯示的時候,要根據欄位的值進行顏色的設定,這個可以在TableView的Styles的OnGetContentStyle事件中進行處理,如下所示:
procedure TFormMain.cxGrid1DBTableView1StylesGetContentStyle( Sender: TcxCustomGridTableView; ARecord: TcxCustomGridRecord; AItem: TcxCustomGridTableItem; out AStyle: TcxStyle);var attention : integer;begin attention := ARecord.Values[5]; if attention > 0 then begin AStyle := styleAttention; exit; end; if ARecord.Values[4] = 0 then begin AStyle := styleRed; end else begin AStyle := styleDefault; end;end;
其中styleAttention、styleDefault等是放在cxStyleRepository1中的設定好的各種Style。