Programowanie w języku Delphi » FAQ

StringGrid - formatowanie komórek

  • 2007-03-06 08:10
  • 2 komentarze
  • 1439 odsłon
  • Oceń ten tekst jako pierwszy
Przykład formatowania komórek StringGrida. TSetup_SG opisuje wszystkie komórki. Procedura WysokoscStringGridaDostosujDoWidocznychCalkiemWierszy jest zastosowana ze względów czysto estetycznych. Procedurę FormatujSG należy umieścić w OnDrawCell StringGrida

type
 
     Twyrownanie_w_komorce=  (leftK,rightK,topK,bottomK,h_centerK,v_centerK);
 
     Tsetup_komorki=record
                    fontSG_name:string;
                    fontSG_size:Integer; //lub tylko fontSG:TFont
                    fontSG_style:TFontStyles;
                    fontSG_color:TColor;
                    brush_colorSG:TColor;
                    zawijaj_wierszeSG:Boolean;
                    margLSG:Integer;//piks
                    margRSG:Integer;
                    margTSG:Integer;
                    margBSG:Integer;
                    widthSG:Integer;
                    heightSG:Integer;
                    wyrownanie_w_komorceSG: set of Twyrownanie_w_komorce;
                    end;
 
     Tsetup_SG = array of array of Tsetup_komorki;
 
procedure WysokoscStringGridaDostosujDoWidocznychCalkiemWierszy(SG:TStringGrid);
var
   w,vis_rows1,vis_rows2,sg_height,vis_height,rows_height,delta_height,scoll_height:Integer;
begin
   vis_rows1:=SG.VisibleRowCount;
   if vis_rows1 > 1 then
   begin
      sg_height:=SG.Height;
      scoll_height:=SG.Height-SG.ClientHeight;
 
      vis_height:=0;
      for w:=0 to SG.VisibleRowCount do
      vis_height:=vis_height+SG.RowHeights[w];
 
      delta_height:=SG.Height-scoll_height-vis_height;
      if delta_height > 0 then
      begin
         repeat
            SG.Height:=SG.Height-1;
            if sg_height-SG.Height > 40 then
            begin
               SG.Height:=sg_height;
               vis_rows2:=vis_rows1;
               Break;
            end;
            vis_rows2:=SG.VisibleRowCount;
         until vis_rows2<>vis_rows1;
         if vis_rows2<>vis_rows1 then
         SG.Height:=SG.Height+1+SG.GridLineWidth;
      end;
   end;
end;
 
procedure FormatujSG(SG:TStringGrid;xCol,xRow:Integer; rect_komorki:TRect;XState:TGridDrawState;
                     var setup_SG:Tsetup_SG);
var
   wys,wyrownanie: Integer;
begin
   wyrownanie:=Dt_Noprefix;
 
   with SG.Canvas,setup_SG[xCol][xRow] do
   begin
      if zawijaj_wierszeSG then
      begin
         if wyrownanie_w_komorceSG=[leftK,v_centerK] then
         wyrownanie:=wyrownanie or Dt_Left or Dt_WordBreak
         else
         if wyrownanie_w_komorceSG=[h_centerK,v_centerK] then
         wyrownanie:=wyrownanie or Dt_Center or Dt_WordBreak
         else
         if wyrownanie_w_komorceSG=[rightK,v_centerK] then
         wyrownanie:=wyrownanie or Dt_Right or Dt_WordBreak;
      end
      else
      if not zawijaj_wierszeSG then
      begin
         if wyrownanie_w_komorceSG=[leftK,topK] then
         wyrownanie:=wyrownanie or Dt_SingleLine or Dt_Left or Dt_Top
         else
         if wyrownanie_w_komorceSG=[leftK,v_centerK] then
         wyrownanie:=wyrownanie or Dt_SingleLine or Dt_Left or Dt_VCenter
         else
         if wyrownanie_w_komorceSG=[leftK,bottomK] then
         wyrownanie:=wyrownanie or Dt_SingleLine or Dt_Left or Dt_Bottom
 
         else
         if wyrownanie_w_komorceSG=[h_centerK,topK] then
         wyrownanie:=wyrownanie or Dt_SingleLine or Dt_Center or Dt_Top
         else
         if wyrownanie_w_komorceSG=[h_centerK,v_centerK] then
         wyrownanie:=wyrownanie or Dt_SingleLine or Dt_Center or Dt_VCenter
         else
         if wyrownanie_w_komorceSG=[h_centerK,bottomK] then
         wyrownanie:=wyrownanie or Dt_SingleLine or Dt_Center or Dt_Bottom
 
         else
         if wyrownanie_w_komorceSG=[rightK,topK] then
         wyrownanie:=wyrownanie or Dt_SingleLine or Dt_Right or Dt_Top
         else
         if wyrownanie_w_komorceSG=[rightK,v_centerK] then
         wyrownanie:=wyrownanie or Dt_SingleLine or Dt_Right or Dt_VCenter
         else
         if wyrownanie_w_komorceSG=[rightK,bottomK] then
         wyrownanie:=wyrownanie or Dt_SingleLine or Dt_Right or Dt_Bottom;
      end
      else
      wyrownanie:=wyrownanie or Dt_SingleLine or Dt_Left or Dt_Top;
 
      if gdSelected in XState then
      Brush.Color:=$00F9F0A2
      else
      Brush.Color:=brush_colorSG;
      FillRect(rect_komorki);
 
      rect_komorki.Left:=rect_komorki.Left+margLSG;
      rect_komorki.Top:=rect_komorki.Top+margTSG;
      rect_komorki.Right:=rect_komorki.Right-margRSG;
      rect_komorki.Bottom:=rect_komorki.Bottom-margBSG;
 
      Font.Name:=fontSG_name;
      Font.Size:=fontSG_size;
      Font.Style:=fontSG_style;
      Font.Color:=fontSG_color;
 
      if TextHeight('My')+margTSG+margBSG > heightSG then
      begin
         heightSG:=TextHeight('My')+margTSG+margBSG;
         SG.RowHeights[XRow]:=heightSG;
         WysokoscStringGridaDostosujDoWidocznychCalkiemWierszy(SG);
      end;
 
      if zawijaj_wierszeSG then
      begin
         wys:=DrawText(Handle,PChar(SG.Cells[xCol,xRow]),-1,rect_komorki,wyrownanie or DT_CALCRECT);
         if wys+margTSG+margBSG > heightSG then
         begin
            heightSG:=wys+margTSG+margBSG;
            SG.RowHeights[XRow]:=heightSG;
            WysokoscStringGridaDostosujDoWidocznychCalkiemWierszy(SG);
         end;
      end;
      DrawText(Handle,PChar(SG.Cells[XCol,XRow]),-1,rect_komorki,wyrownanie);
   end;
end;

2 komentarze

Ludomir 2007-03-08 23:33

SG - obiekt do formatowania
xCol,xRow - kolumna, wiersz (adres komórk do formatowaniai)
rect_komork - 'rect_komorki'
XState - kombinajca zbioru: gdSelected, gdFocused, gdFixed
setup_SG - struktura z informacją jak sformatować

123tomek 2007-02-28 12:08

UWAGA:
JEST  if vis_rows1&gt;1 then   MA BYC  if vis_rows1 > 1 then
zreszta wszedzie gdzie jest &gt; (znaczek and gt srednik)  zamienic trzeba na > (znak wiekszosci)


Moze ktos podac jak wywolywac te procedury? Co podac jako parametry procedury FormatujSG.