簡體   English   中英

TStringGrid與BOTH編輯和范圍選擇?

[英]TStringGrid with BOTH editing AND range selection?

題:

任何人都可以指向如何在TStringGrid中提供BOTH編輯和范圍選擇的文章或代碼示例嗎?

是的,我知道有第三方網格可以做到這一點,但內置網格缺乏這種基本功能令人沮喪。

背景:

期望能夠編輯網格中的單元格以及選擇一系列單元格(例如復制操作)是很正常的。

交付時,TStringGrid不會這樣做。 它是/或。 事實上,文檔告訴我們關於網格選項,“當goEditing包含在選項中時,goRangeSelect沒有效果”。

但是,看起來無論如何都可以在TStringGrid中進行編輯和范圍選擇! 通過仔細使用mousedown,mouseup,selectcell和exit事件,您可以通過在正確的時間打開和關閉編輯元素來關閉。 但我仍然沒有完美,只能用於鼠標,而不是鍵盤更改。

我沒有使用過TStringGrid ,所以我無法提供具體的答案。 但我是否正確地假設您可以手動(在代碼中)啟動正在編輯的單元格 該鏈接意味着即使網格沒有在其Options包含goEditing也是可能的。 (如果不是這樣,請參見下文解決此問題。)

如果是這樣,我建議采用以下方法:

組合選擇和編輯行為

我發現這是一種很好的,Windows標准行為的方法:

  • 將網格保留為選擇模式,因此鼠標和鍵盤交互選擇單元格

  • 根據某些標准觸發正在編輯的單元格(我認為您正在按照上一段中所述的方式執行此操作。)有一些常用的觸發編輯方法,以下標准是我的程序所遵循的標准他們做了類似的其他控件:

    • 選擇是正常的。 即,單擊選擇,單擊並拖動以進行多選,使用鍵盤箭頭和Shift或Control進行選擇等。

    • 當以下任何一個單元格進入編輯模式

      1. 選擇一個單元格,用戶按EnterF2 EnterF2是標准的“重命名”或“編輯”快捷鍵,可在多個程序中使用)

      2. 用戶在單元格上“慢速雙擊” - 即,在已經選擇的單元格上暫停后,慢速雙擊以選擇和編輯或再次單擊。 這模仿了資源管理器的行為,如果選擇了一個文件並稍后單擊它,它將進入內聯編輯/重命名模式。 要實現此功能,請記錄上次單擊(並選擇)單元格的時間。如果再次單擊該單元格,並且如果時間大於GetDoubleClickTime則它們會慢慢單擊兩次,然后進入編輯模式。 這使您可以區分第一次單擊以選擇,雙擊(執行某種操作)和慢速第二次單擊,以進入編輯模式。

        我也傾向於檢查鼠標位置,這樣如果一個對象慢速雙擊並且沒有首先被選中(即,這兩個選擇對象然后進入編輯模式)我驗證鼠標沒有移動許多。 我使用GetSystemMetrics查找雙擊距離,並檢查慢速雙擊是否在此框內。 (因為它不是真正的雙擊,我實際檢查距離時間2.我的動作代碼是:

        const int iMAX_MOVE_AMOUNT = ::GetSystemMetrics(SM_CYDOUBLECLK) * 2; (對不起,C ++不是Delphi,但應該可以輕松轉換!)

        但我實際上不確定這是否完全和完全100%的Windows指南。 在實踐中,用戶發現它的工作正如他們所期望的那樣。)

這應該讓您在適當的時候用鍵盤和鼠標在選擇和編輯之間進行切換。

雜想

通過TStringGrid並創建新組件,您可能會發現其中一些更TStringGrid ,更容易實現。 這將允許您在普通代碼中實現它並覆蓋內置行為(而不是事件處理程序),同時使其對表單代碼不可見。 它還將為您提供對鼠標事件或Windows消息的低級訪問,而不僅僅是通過OnMouseDown等事件公開。 最后,如果在Options包含goEditing時顯示編輯器時出現問題,這將允許您更改該行為。 如果您希望代碼響應某些事情,例如創建OnBeginEdit事件,您也可以添加自己的事件。

創建自己的組件通常被認為是一個高級Delphi主題,但一旦你知道如何 ,它實際上非常容易! 這個網站有一些很好的主題,一般會向你介紹這個主題,如果你走這條路並遇到問題,Stack Overflow當然是一個提問的好地方:) Embarcadero Delphi»VCL»Writing Components新聞組/論壇也是一個很好的資源,實際上甚至可能比這個特定主題的SO更好。

希望有所幫助!

是的,這是舊的帖子,但問題仍然存在於Delphi XE3上。 為了管理這個功能,我在SelectCell過程中使用了下一個“技巧”: if (ARow = StringGridParam.Row) then begin StringGridParam.Options:= StringGridParam.Options + [goEditing] - [goRowSelect]; end else begin StringGridParam.Options:= StringGridParam.Options + [goRowSelect] - [goEditing]; end; if (ARow = StringGridParam.Row) then begin StringGridParam.Options:= StringGridParam.Options + [goEditing] - [goRowSelect]; end else begin StringGridParam.Options:= StringGridParam.Options + [goRowSelect] - [goEditing]; end;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM