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

TStringGrid的固定欄位無法編輯?

答題得分者是:daldal
brook
資深會員


發表:57
回覆:323
積分:371
註冊:2002-07-12

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-03-08 16:10:17 IP:118.168.xxx.xxx 訂閱
各位大大:
我使用的欄位很多,如編號,姓名,...
當我欄位向右拉時,想同時看到編號,姓名,
所以把固定欄位設為2,但我發現固定欄位設2時,
姓名卻無法修改,我該如何處理呢?還是用其他元件?
daldal
高階會員


發表:6
回覆:102
積分:226
註冊:2007-06-18

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-03-08 18:50:35 IP:220.130.xxx.xxx 訂閱
目前小弟是這樣子處理,不知道合不合用

1. 在Grid的On Mouse Down事件中,用MouseToCell(X,Y,Col,Row)找到使用者關注的Grid
2. if (Col==1)是你想要讓使用者改的地方,則動態new一個TEdit元件對應到Col,Row的位置
3. 動態TEdit元件,預先寫一個On Key Down的事件偵測Enter來判斷使用者修改完畢
4. 將TEdit->Text放回Col,Row位置
5. 釋放動態TEdit元件, 完成!

good luck!
編輯記錄
daldal 重新編輯於 2008-03-08 18:51:17, 註解 無‧
daldal
高階會員


發表:6
回覆:102
積分:226
註冊:2007-06-18

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-03-10 18:06:16 IP:220.130.xxx.xxx 訂閱
吃飯時間寫個簡單的sample code 

先建立新的Application,裡面放上StringGrid
StringGrid1的Fixed Col改成2 (所以現在第二列為固定欄位)
Form1事件 : On Close
StringGrid1事件: On Mouse Down
vcl事件: On Exit , On Key Press


程式內容如下 .cpp部分
[code cpp]
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
StringGrid1->DoubleBuffered = true;

//初始化給使用者變更用的EditBox
vcl = new TEdit(StringGrid1);
vcl->Visible = false;
vcl->Parent = StringGrid1;
vcl->BorderStyle = bsNone;
vcl->Width = StringGrid1->DefaultColWidth;
vcl->Height = StringGrid1->DefaultRowHeight;
vcl->OnExit = EditExit; //偵測使用者離開編輯框
vcl->OnKeyPress = EditKeyPress; //偵測Enter,ESC等等
}
//---------------------------------------------------------------------------

void __fastcall TForm1::StringGrid1MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
StringGrid1->MouseToCell(X,Y,Col,Row);

if (Col==1)
{
//寫入當下Cell資料
vcl->Visible = true;
vcl->Top = StringGrid1->CellRect(Col,Row).Top;
vcl->Left = StringGrid1->CellRect(Col,Row).Left;
vcl->Hint = StringGrid1->Cells[Col][Row]; //暫存原來資料
vcl->Text = vcl->Hint;
vcl->SetFocus();
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::EditExit(TObject *Sender)
{
//寫回去前可以先檢查字串是否為合法姓名
//vcl->Text = CheckName(vcl->Text);
StringGrid1->Cells[Col][Row] = vcl->Text;
vcl->Visible = false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::EditKeyPress(TObject *Sender, char &Key)
{
switch (Key)
{
//Enter 變更後離開
case 13: vcl->Visible = false;
break;

//ESC 不更改離開
case 27: vcl->Text = vcl->Hint;
vcl->Visible = false;
break;
}
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
//釋放元件
delete vcl;
}
//---------------------------------------------------------------------------

[/code]


.h部分
[code cpp]

class TForm1 : public TForm
{
__published: // IDE-managed Components
TStringGrid *StringGrid1;
void __fastcall StringGrid1MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y);
void __fastcall EditExit(TObject *Sender);
void __fastcall EditKeyPress(TObject *Sender, char &Key);
void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
private: // User declarations
int Col,Row;
TEdit *vcl;
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
[/code]
編輯記錄
daldal 重新編輯於 2008-03-10 18:08:12, 註解 無‧
系統時間:2024-11-22 22:47:45
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!