2005年05月16日

void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol,
      int ARow, TRect &Rect, TGridDrawState State)
{
    TRect ARect;  //paint cell range
    ARect = StringGrid1->CellRect(ACol,ARow);

    AnsiString CurrStr = StringGrid1->Cells[ACol][ARow] ;

    if (CurrStr.Length()<10)
    {
        //StringGrid1->Canvas->Brush->Color = clRed ;//Setting Cell color
        //StringGrid1->Canvas->FillRect(ARect);
        //StringGrid1->Canvas->Font->Color = clBlack;//Setting Cell Contents Font Color
        StringGrid1->Canvas->TextRect(ARect,ARect.Left+2,ARect.Top+2,StringGrid1->Cells[ACol][ARow]);

    }
    else
    {
        //StringGrid1->Canvas->Brush->Color = clWhite;
        //StringGrid1->Canvas->FillRect(ARect);
        //StringGrid1->Canvas->Font->Color = clBlack;
        StringGrid1->Canvas->TextOut(ARect.Left+2,ARect.Top+2,StringGrid1->Cells[ACol][ARow].SubString(1,10));
        StringGrid1->Canvas->TextOut(ARect.Left+2,ARect.Top+17,StringGrid1->Cells[ACol][ARow].SubString(11,20));
    }
}

2005年05月14日

<iframe width=157 height=240 frameborder=0 scrolling=NO

src=’http://appnews.qq.com/cgi-bin/news_qq_search?city=郑州’></iframe>

StringGrid使用全书( 一)

procedure QuickSort(Grid: TStringGrid; iLo, iHi: Integer);
var
  Lo, Hi : Integer;
  Mid: String ;
begin
  Lo := iLo ;
  Hi := iHi ;
  Mid := Grid.Cells[ACol,(Lo + Hi) div 2];
  repeat
    if Order and not NumOrStr then //按正序、字符排
    begin
      while Grid.Cells[ACol,Lo] < Mid do Inc(Lo);
      while Grid.Cells[ACol,Hi] > Mid do Dec(Hi);
    end ;
    if not Order and not NumOrStr then //按反序、字符排
    begin
      while Grid.Cells[ACol,Lo] > Mid do Inc(Lo);
      while Grid.Cells[ACol,Hi] < Mid do Dec(Hi);
    end;

    if NumOrStr then
    begin
      if Grid.Cells[ACol,Lo] = ” then Grid.Cells[ACol,Lo] := ‘0′ ;
      if Grid.Cells[ACol,Hi] = ” then Grid.Cells[ACol,Hi] := ‘0′ ;
      if Mid = ” then Mid := ‘0′ ;
      if Order then
      begin //按正序、数字排
        while StrToFloat(Grid.Cells[ACol,Lo]) < StrToFloat(Mid) do Inc(Lo);
        while StrToFloat(Grid.Cells[ACol,Hi]) > StrToFloat(Mid) do Dec(Hi);
      end else
      begin //按反序、数字排
        while StrToFloat(Grid.Cells[ACol,Lo]) > StrToFloat(Mid) do Inc(Lo);
        while StrToFloat(Grid.Cells[ACol,Hi]) < StrToFloat(Mid) do Dec(Hi);
      end;
    end ;
    if Lo <= Hi then
    begin
      MoveStringGridData(Grid, Lo, Hi) ;
      Inc(Lo);
      Dec(Hi);
    end;
  until Lo > Hi;
  if Hi > iLo then QuickSort(Grid, iLo, Hi);
  if Lo < iHi then QuickSort(Grid, Lo, iHi);
end;

begin
try
  QuickSort(Grid, Grid.FixedRows, Grid.RowCount – 1 ) ;
except
on E: Exception do
  Application.MessageBox(Pchar(‘系统在排序数据的时候遇到异常:’#13+E.message+#13′请重试,如果该问题依然存在请与程序供应商联系!’),’系统错误’,MB_OK+MB_IConERROR) ;
end;
end;

procedure StringGridTitleDown(Sender: TObject;
Button: TMouseButton;  X, Y: Integer);
(******************************************************************************)
(*  函数名称:StringGridTitleDown                                             *)
(*  函数功能:取鼠标点StringGrid 的列                _/_/     _/_/  _/_/_/_/_/ *)
(*  参数说明:                                          _/   _/        _/      *)
(*            Sender                                     _/          _/       *)
(*                                                (*                                                                           
  (******************************************************************************)
var
I: Integer ;
begin
if (Y > 0 ) and (y < TStringGrid(Sender).DefaultRowHeight * TStringGrid(Sender).FixedRows ) then
begin
  if  Button = mbLeft then
  begin
    I := X div  TStringGrid(Sender).DefaultColWidth ;
    //这个i 就是要排序得行了
    // 下面调用上面的排序函数就可以了,
    GridQuickSort(TStringGrid(Sender), I, False, True) ;
  end;
end;
end;

   用上面的两个函数就能解决你的问题了。在TStringGrid 的MouseDown事件中调用StringGridTitleDown 函数就可以。你可能要修改一下StringGridTitleDown函数来修改排序得方式及其字符类型。
   提醒你一下对于日期、时间、布尔等类型数据均可按字符方式排序。
例如:

procedure TForm_Main.StringGrid1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
StringGridTitleDown(Sender,Button,X,Y);
end;

 
 

2005年05月13日

//—————————————————————————
void __fastcall TF_Tab_OrderInfo::StringGrid1DrawCell(TObject *Sender,
      int ACol, int ARow, TRect &Rect, TGridDrawState State)
{
    TRect ARect;  //paint cell range
    ARect = StringGrid1->CellRect(ACol,ARow);
    if (ACol==3)
    {
        StringGrid1->Canvas->Brush->Color = clRed ;//Setting Cell color
        StringGrid1->Canvas->FillRect(ARect);
        //StringGrid1->Canvas->Font->Color = clBlack;//Setting Cell Contents Font Color
        StringGrid1->Canvas->TextRect(ARect,ARect.Left+2,ARect.Top+2,StringGrid1->Cells[ACol][ARow]);

    }
    else
    {
        StringGrid1->Canvas->Brush->Color = clWhite;
        StringGrid1->Canvas->FillRect(ARect);
        //StringGrid1->Canvas->Font->Color = clBlack;
        StringGrid1->Canvas->TextRect(ARect,ARect.Left+2,ARect.Top+2,StringGrid1->Cells[ACol][ARow]);
    }
}
//—————————————————————————

选中StringGrid的一块区域,如何把内容复制到剪贴板;如何把剪贴板的内容复制到StringGrid中

首先你得定义一个结构来存储自己相关的信息
struct {
int col;
int row
string data;
}


//—————————————————————————
void GridCopyToClipboard(TStringGrid *grid, bool symbol)//将表格的选择区域的内容复制到剪贴板
{
if( grid == NULL ) return;

AnsiString SymbolString = "JetKingLAU-NewFlow-GridClipboard";
TStringGrid *GridClipboard = grid;
TGridRect GridRectClipboard = GridClipboard->Selection;
TStringList *list = new TStringList();
if( symbol ) {
list->Add(SymbolString);
list->Add(GridRectClipboard.Left);
list->Add(GridRectClipboard.Right);
list->Add(GridRectClipboard.Top);
list->Add(GridRectClipboard.Bottom);
for(int r=Min(GridRectClipboard.Top,GridRectClipboard.Bottom);r<=Max(GridRectClipboard.Top,GridRectClipboard.Bottom);r++)
for(int c=Min(GridRectClipboard.Left,GridRectClipboard.Right);c<=Max(GridRectClipboard.Left,GridRectClipboard.Right);c++)
list->Add(GridClipboard->Cells[c][r]);
Clipboard()->Clear();
Clipboard()->AsText = list->Text;
}
else {
AnsiString string = "";
for(int r=0;r<GridClipboard->FixedRows;r++) {
string = "";
for(int c=0;c<GridClipboard->FixedCols;c++)
string = string + (GridClipboard->Cells[c][r]==NULL||GridClipboard->Cells[c][r]==""?AnsiString(" "):GridClipboard->Cells[c][r]) + "\t";
for(int c=Min(GridRectClipboard.Left,GridRectClipboard.Right);c<=Max(GridRectClipboard.Left,GridRectClipboard.Right);c++)
string = string + (GridClipboard->Cells[c][r]==NULL||GridClipboard->Cells[c][r]==""?AnsiString(" "):GridClipboard->Cells[c][r]) + (c==Max(GridRectClipboard.Left,GridRectClipboard.Right)?"":"\t");
list->Add(string);
}
for(int r=Min(GridRectClipboard.Top,GridRectClipboard.Bottom);r<=Max(GridRectClipboard.Top,GridRectClipboard.Bottom);r++) {
string = "";
for(int c=0;c<GridClipboard->FixedCols;c++)
string = string + (GridClipboard->Cells[c][r]==NULL||GridClipboard->Cells[c][r]==""?AnsiString(" "):GridClipboard->Cells[c][r]) + "\t";
for(int c=Min(GridRectClipboard.Left,GridRectClipboard.Right);c<=Max(GridRectClipboard.Left,GridRectClipboard.Right);c++)
string = string + (GridClipboard->Cells[c][r]==NULL||GridClipboard->Cells[c][r]==""?AnsiString(" "):GridClipboard->Cells[c][r]) + (c==Max(GridRectClipboard.Left,GridRectClipboard.Right)?"":"\t");
list->Add(string);
}
Clipboard()->Clear();
Clipboard()->AsText = list->Text;
}
delete list;
}
//—————————————————————————
void GridPasteFromClipboard(TStringGrid *grid)//从剪贴板粘贴数据到表格控件
{
if( grid == NULL ||
!Clipboard()->HasFormat(CF_TEXT) )
return;

AnsiString SymbolString = "JetKingLAU-NewFlow-GridClipboard";
TStringGrid *GridClipboard = grid;
TGridRect GridRectClipboard = GridClipboard->Selection;

TStringList *list = new TStringList();
list->Text = Clipboard()->AsText;
if( list->Count >= 6 &&
list->Strings[0] == SymbolString &&
list->Strings[2].ToIntDef(-2) >= list->Strings[1].ToIntDef(-1) &&
list->Strings[4].ToIntDef(-2) >= list->Strings[3].ToIntDef(-1) &&
list->Strings[1].ToIntDef(-1) >= 0 &&
list->Strings[3].ToIntDef(-1) >= 0 ) {
int left = list->Strings[1].ToInt();
int right = list->Strings[2].ToInt();
int top = list->Strings[3].ToInt();
int bottom = list->Strings[4].ToInt();
if( GridRectClipboard.Right – GridRectClipboard.Left == right – left &&
GridRectClipboard.Bottom – GridRectClipboard.Top == bottom – top &&
(right – left + 1) * (bottom – top + 1) == list->Count – 5 ) {
for(int c=0;c<=GridRectClipboard.Right-GridRectClipboard.Left;c++)
for(int r=0;r<=GridRectClipboard.Bottom-GridRectClipboard.Top;r++) {
GridClipboard->Cells[GridRectClipboard.Left+c][GridRectClipboard.Top+r] =
list->Strings[5 + r * (right - left + 1) + c];
}
}
}
delete list;
}
//—————————————————————————




然后将信息写入后,定义一个剪贴版类型,然后将该结构数组写入,反之写出