VCL How To - Additional 元件篇 |
|
bruce0211
版主 發表:157 回覆:668 積分:279 註冊:2002-06-13 發送簡訊給我 |
元件名稱:Chart (圖表元件)
文件版本:for BCB 5.0
文件作者:bruce0211 2002.05 ●前言
首先先在 Form 中放一個 Tchar 物件
什麼屬性都不要設
再放一個 button , 然後在 Button 的 OnClick 事件中加入下段程式碼
你就知道大概如何手動控制 Tchar 了 , 其他請舉一反三 void __fastcall TForm1::Button1Click(TObject *Sender)
{
Chart1->RemoveAllSeries(); // 清除Chart1上所有舊 Series Chart1->View3D=false; // 不要 3D 立體
Chart1->Legend->Visible=false; // 不秀圖例說明 ●設定此 char Title 名稱
Title 是 StringList 型態 , 不是 String 型態 , 所以不能用 Chart1->Title->Text="xxx" ... Chart1->Title->Text->Clear();
Chart1->Title->Text->Add("test"); ●動態宣告一個 THorizBarSeries 型態的 Series
其它的 Series 型態有哪些 請看 TChartSeries 之 Help Series1=new THorizBarSeries(Chart1) ;
Series1->ParentChart=Chart1; Series1->Marks->Visible=true; // 設定要提示說明
Series1->Marks->Style=smsValue; // 提示說明內容為 Label
//(註) Series1->Marks->Style 內容請參考 TSeriesMarksStyle 之 Help Series1->SeriesColor=clBlue; // 設線條1為藍色,不設則自動給色 ●輸入假資料
int V; // Value
String L; //Label
for (int i = 1; i <= 8; i )
{
V=i; // Series 值
L="V" IntToStr(i); // 軸名稱
Series1->Add( V , L , clTeeColor );
} 發表人 - bruce0211 於 2002/08/11 15:51:25
|
bruce0211
版主 發表:157 回覆:668 積分:279 註冊:2002-06-13 發送簡訊給我 |
元件名稱:StringGrid
文件版本:for Delphi
文件作者:bruce0211 1998/01
●固定行及固定列:
StringGrid.FixedCols:=固定行之數;
StringGrid.FixedRows:=固定列之數;
StringGrid. FixedColor:=固定行列之顏色;
StringGrid.Color:=資料區之顏色; ●資料行列之寬高度:
StringGrid.DefaultColWidth:=內定全部之寬度;
StringGrid.DefaultRowHeight:=內定全部之高度;
StringGrid.ColWidths[Index:Longint]:=某一行整行之寬度;
StringGrid.RowHeights[Index:Longint]:=某一列整列之高度; ●資料區(CELL)指定:
將某一行列停在畫面之資料區最左上角:
StringGrid.LeftCol:=某一行號;
StringGrid.TopRow:=某一列號;
焦點移至某一格(CELL)內:
StringGrid.Row:=?;
StringGrid.Col:=?;
設定資料行列數:(包含固定行、列亦算在內)
StringGrid.RowCount:=?;
StringGrid.ColCount:=?;
寫一字串至某一格(CELL)內:
StringGrid.Cells[Col值 , Row值]:=字串;
判斷滑鼠指標目前在哪一格(CELL)範圍內:
在StringGrid之Mouse事件中(UP,DOWN或MOVE)下:
VAR C , R : Longint;
Begin
StringGrid.MouseToCell(X,Y,C,R); {X,Y由MOUSE事件傳入}
{取回 C , R 即為目前之Col , Row值 }
...... ●StringGrid之Options屬性:
若要於程式執行中開啟或關閉Options某一功能如 ‘goTABS’
開: StringGrid.Options:= StringGrid.Options + [goTABS];
關: StringGrid.Options:= StringGrid.Options - [goTABS]; goFixedHorzLine 固定列間之水平線
goFixedVertLine 固定行間之垂直線
goHorzLine 資料格間水平線
goVertLine 資料格間垂直線
goRangeSelect 滑鼠可多重選擇
goDrawFocusSelected 多重選擇時,第一資料項反白
goRowSizing 滑鼠可改變列高
goColSizing 滑鼠可改變行寬
goRowMoving 滑鼠可搬資料列
goColMoving 滑鼠可搬資料行
goEditing 可編輯(與滑鼠可多重選擇互斥)
goAlwaysShowEditor 須有goEditing,不用按F4或ENTER即有等待輸入游標
goTabs 允許TAB及Shift-TAB移動游標
goRowSelect 用滑鼠點一下可選取整列(亦與滑鼠可多重選擇互斥)
goThumbTracking 捲軸動時GRID跟著動,否則捲軸動完放開,GRID才動 ●其它應用: ◎用ENTER鍵替代TAB鍵在格(CELL)內移動:
在StringGrid之KeyDown 事件中下
if KEY=13 then
SendMessage(StringGrid.Handle,WM_KEYDOWN,VK_TAB,0);
◎若要在StringGrid最後一行最後一列按ENTER鍵時增加一列:
在StringGrid之KeyDown 事件中下:
if KEY=13 then
begin
if (StringGrid.ROW= StringGrid.ROWCOUNT-1) and
(StringGrid.COL= StringGrid.COLCOUNT-1) then
begin
StringGrid.RowCount:= StringGrid.RowCount +1;
SendMessage(StringGrid.Handle,WM_KEYDOWN,VK_TAB,0);
End;
end;
◎在格(CELL)內畫圖線:
在StringGrid之DrawCell 事件中下:( Rect變數 由事件產生)
StringGrid.Canvas.Pen.Color:=clBlack; {指定顏色}
StringGrid.Canvas.Rectangle( Rect.Left, Rect.Top,
Rect.Right, Rect.Bottom); ◎要準確的抓取每一CELL之RECT座標值要用CellRect方法
不要藉用OnDrawCell事件:
例 procedure TForm1.Button1Click(Sender: TObject);
var Rectangle: TRect;
begin
Rectangle := StringGrid1.CellRect(3, 2);
Label1.Caption := IntToStr(Rectangle.Top) + ' is the
top';
Label2.Caption := IntToStr(Rectangle.Bottom) + ' is the
bottom';
Label3.Caption := IntToStr(Rectangle.Left) + ' is the
left side';
Label4.Caption := IntToStr(Rectangle.Right) + ' is the
right side';
end; ◎若要偵測CELL新位置變動 ( 即希望有一OnCellChange事件 ) 可由
OnSelectCell事件中抓其傳回之 Col , Row
不可抓 StringGrid.Col 及StringGrid.Row , 因會慢半拍
但若跳出此StringGrid 再跳回此StringGrid 之原 Cell 位置
則不會觸發此OnSelectCell事件
OnEnter 時所抓之StringGrid.Col 及StringGrid.Row 非滑鼠所點之
位置,而是未進入此StringGrid 前所停留之 Cell 位置 ●附錄 ——— 將StringGrid內容存檔或取出之程序寫法 <存檔> 例:_StrGridSaveToFile(StringGrid1,’C:\TEST.TXT’);
<取檔> 例:_StrGridLoadFromFile(StringGrid1,’C:\TEST.TXT’); (程序原始碼如後)
procedure _StrGridSaveToFile(StrG: TStringGrid ; FileName: String);
var
i, j: LongInt;
ss: string;
f: TextFile;
begin
AssignFile(f, FileName);
Rewrite(f);
ss := IntToStr(StrG.ColCount) + ',' + IntToStr(StrG.RowCount);
Writeln(f, ss); for i := 0 to (StrG.RowCount - 1) do
begin
for j := 0 to (StrG.ColCount - 1) do
begin
if _RTRIM(StrG.Cells[j, i]) <> '' then
begin
ss := IntToStr(j) + ',' + IntToStr(i) + ',' + StrG.Cells[j, i];
Writeln(f, ss);
end;
end;
end;
CloseFile(f);
end;
procedure _StrGridLoadFromFile(StrG: TStringGrid ; FileName: String);
var
X, Y: Integer;
ss, ss2: string;
f: TextFile;
begin
if not FileExists(FileName) then exit; AssignFile(f, FileName);
Reset(f);
Readln(f, ss);
if ss <> '' then
begin
StrG.ColCount := _strtoint(_strseg(ss,1));
StrG.RowCount := _strtoint(_strseg(ss,2));
_StrGridClear(StrG);
end; while not Eof(f) do
begin
Readln(f, ss);
StrG.Cells[_strtoint(_strseg(ss,1)),
_strtoint(_strseg(ss,2))] :=_strseg(ss,3);
end;
CloseFile(f);
end; {以下為上例中會用到的自寫函式} {-------------------------------------------------------------------------------}
FUNCTION _STRTOINT(S:STRING):LONGINT;
{與 DELPHI 之 STRTOINT() 不同,格式不對其傳回 0 , 而不是錯誤訊息}
BEGIN
RESULT:=_INT(_VALUE(S)); END;
{-------------------------------------------------------------------------------}
FUNCTION _INT(R:REAL):LONGINT;
{與 DELPHI 之 INT() 不同,其傳回 LONGINT , 而非 REAL ( 如123.0 ) }
VAR RR:STRING;
BEGIN
RR:=FLOATTOSTR(INT(R));
RESULT:=STRTOINT(RR);
END;
{-------------------------------------------------------------------------------}
FUNCTION _VALUE(S:STRING):EXTENDED;
VAR I:LONGINT; {88.01.20 修改}
CODE:INTEGER;
SS:STRING;
begin
S:=_ALLTRIM(S); {將字串前後空白去掉} IF _STRNUM(S,'.')=0 THEN
BEGIN
VAL(S,I,CODE);
RESULT:=I;
EXIT;
END
ELSE
BEGIN
IF _STRNUM(S,'.')>1 THEN
BEGIN
RESULT:=0;
EXIT;
END; SS:=S;
DELETE(SS,(POS('.',SS)),1); VAL(SS,I,CODE); IF I=0 THEN
BEGIN
RESULT:=0;
EXIT;
END; RESULT:=STRTOFLOAT(S); END;
end;
{-------------------------------------------------------------------------------}
FUNCTION _AllTrim(cText: String): String; { 將字串中左右所有的空白字元刪除 }
var
i, nlen: integer;
begin
{Result := '';
nlen := Length(cText);
for i := 1 to nlen do
if cText[i] <> ' ' then
Result := Result + cText[i]; } RESULT := _LTRIM(_RTRIM(cTEXT));
end;
{-------------------------------------------------------------------------------}
FUNCTION _LTRIM(S:STRING):STRING; { 去字串 左空白}
VAR I:INTEGER;
R:STRING;
BEGIN
R:='';
IF (S<>'') AND (S<>' ') THEN
BEGIN
FOR I :=1 TO LENGTH(S) DO
IF COPY(S,I,1)<>' ' THEN BREAK; R:=COPY(S,I,(LENGTH(S)-I+1));
IF R=' ' THEN R:=''; END;
RESULT:=R;
END;
{-------------------------------------------------------------------------------}
FUNCTION _RTRIM(S:STRING):STRING; {同 Clipper RTRIM() 去掉字串右邊空白}
VAR I:INTEGER;
R:STRING;
BEGIN
R:='';
IF (S<>'') AND (S<>' ') THEN
BEGIN
FOR I :=LENGTH(S) DOWNTO 1 DO
IF COPY(S,I,1)<>' ' THEN BREAK;
R:=COPY(S,1,I);
IF R=' ' THEN R:='';
END;
RESULT:=R;
END;
{-------------------------------------------------------------------------------}
FUNCTION _StrSeg(S:STRING;I:INTEGER):STRING; {取出 S 字串中第 I 節字串(以逗點分)}
VAR T :TstringLIST;
BEGIN
IF (S='') OR (I<=0) THEN
BEGIN
{RESULT:='NIL';}
RESULT:='';
EXIT;
END; T:=TstringLIST.CREATE;
_StrToStrList(S,T); IF I>T.COUNT THEN RESULT:=''
ELSE
RESULT:=T[I-1]; T.FREE;
END;
{-------------------------------------------------------------------------------}
PROCEDURE _StrToStrlist(S:STRING; VAR T:TStringList);
{將含有逗點之字串轉換成TstringLIST}
VAR P,I : INTEGER;
BEGIN
T.CLEAR;
P:=_STRNUM(S,',');{計算傳入字串中有幾個逗點} IF P=0 THEN
BEGIN
T.ADD(S);
EXIT;
END; FOR I := 1 TO (P+1) DO
BEGIN
IF I=(P+1) THEN
T.ADD(S)
ELSE
T.ADD(_LEFT(S,POS(',',S)-1)); S:=_CUTLEFT(S,POS(',',S));
END; END;
{-------------------------------------------------------------------------------}
FUNCTION _STRNUM(S,SUBS:STRING):INTEGER; {取字串中出現某一子字串之次數 }
VAR L,N,I : INTEGER;
BEGIN
IF (LENGTH(S)=0) OR (LENGTH(SUBS)=0) THEN
BEGIN
RESULT:=0;
EXIT;
END; N:=0;
L:=LENGTH(SUBS);
{
FOR I:=1 TO (LENGTH(S)-L+1) DO
BEGIN
IF COPY(S,I,L)=SUBS THEN N:=N+1;
END;} i:=1; {1999/06/21 修正,如此才不會將_STRNUM('EEE','EE') 當成2,應為1才對(算過的不算) }
while i<=(length(S)-L+1) do
begin
if copy(S,I,L)=SUBS then
begin
N:=N+1;
i:=i+L;
end
else
i:=i+1;
end; result:=N;
END;
{-------------------------------------------------------------------------------}
FUNCTION _LEFT(S:STRING;L:INTEGER):STRING; {同 Clipper LEFT() }
VAR I:INTEGER;
R:STRING;
BEGIN
R:=''; IF (S<>'') AND (L
|
bruce0211
版主 發表:157 回覆:668 積分:279 註冊:2002-06-13 發送簡訊給我 |
元件名稱:StringGrid 進階應用
文件版本:for BCB 5.0
文件作者:BCB 源碼任務 (http://home.kimo.com.tw/bruce0829) 2002/08/11 ●前言
StringGrid 的應用很廣泛 , 今天介紹其特技應用 , 也就是最重要的兩個事件應用 :
OnSelectCell : 焦點移入某一格內時會觸發 , 類似 Edit 物件之 OnEnter
OnDrawCell : 物件描繪時觸發 (幾乎隨時都會觸發), 可抓出當時描繪之 Cell 的基本資料 ,
如 Cell 行列位置 , Cell 的面積座標 今天就來示範兩個特效
●StringGrid 格(Cells)內變色特效程式範例 1.首先在 Form 上放入一個 StringGrid1
2.照下列方法在 StringGrid1 之 OnDrawCell 事件中寫入程式碼
3.觀察格內變色特效結果
//--------------------------------------------------------------------------- #include●具編輯物件之 StringGrid 程式範例 本範例之 StringGrid 第 0 行(Col) 有圖形顯示(如國旗圖示) StringGrid 第 1 行(Col) 為性別欄 , 焦點(Focus)移入時動態出現 ComboBox 元件 StringGrid 第 2 行(Col) 為日期欄 , 焦點(Focus)移入時動態出現 DateTimePicker 元件 說明 : 當焦點移入某一格內時 , 程式先抓出該格的四個頂角位置座標 然後判斷判斷格(Cell)的行位置 , 選擇出適合的編輯物件(動態產生) 再將這個編輯物件的座標位置放在該格的四個頂角位置座標間 這樣原來的格(Cell)就被蓋住了 , User 會以為還在 格(Cell)上編輯 其實是在動態產生的編輯物件上編輯 , User 在編輯完資料後離開動態物件 動態物件再把編輯資料塞回原來的格(Cell)內 //--------------------------------------------------------------------------- #include發表人 - bruce0211 於 2002/08/11 15:52:12 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |