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

TListView元件裡OnEdited相關問題

尚未結案
隆妹
一般會員


發表:6
回覆:12
積分:8
註冊:2003-10-02

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-01-10 17:30:40 IP:203.204.xxx.xxx 未訂閱
請問如果編輯一個Item後 如果發生輸入的名稱為空白或是以重複則應該回到編輯的狀態 要編輯Item的Caption 不是只要再執行 Item->EditCaption() 即可嗎 但是卻無法做編輯動作 視窗會卡在那不動呢 不知這是什麼情況 請各位給於指教 謝謝
m8815010
版主


發表:99
回覆:372
積分:289
註冊:2003-11-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-01-13 12:29:02 IP:61.63.xxx.xxx 未訂閱
隆妹你好:            你的問題乍看很簡單,但是實作後發現還真的       有你說的問題,且滿有趣的,值得思索原委。           不幸的,目前我只能用替代方案可以解決你所       要的功能要求,並對於這個問題做一些初步的分析       ,希望有興趣的人可以繼續想下去。      -------------------問題所在----------------------- *我想你的問題可能是這樣子產成的,那如果不是的話也就  可以不必再看下去了。    根據描述,你是要在使用者input任一個ListView Item的 caption之後,判斷這個caption是否是重覆或是為空字串 。所以我想你的判斷碼應該寫在這個事件下: void __fastcall TForm1::ListView1Edited     (TObject *Sender, TListItem *Item, AnsiString &S) {  if (S是重覆或空的字串)       Item->EditCaption(); } 但是Item->EditCaption()這一行卻無法使它順利回到edit的 狀態,對吧! -------------------問題所在-----------------------    -------------------問題分析----------------------- 首先測試Item->EditCaption()是否可以正常運作,假設放 在一個button click事件內發現可以正常運作,可以回到 edit狀態。ex: void __fastcall TForm1::Button1Click(TObject *Sender) {  //一般寫法  if (!ListView1->Items->Item[0]->EditCaption())      ShowMessage("無法回到edit狀態!");      //SDK寫法      ListView1->SetFocus();  if (!SendMessage(ListView1->Handle,LVM_EDITLABEL,0,0))      ShowMessage("無法回到edit狀態!"); } 但是,在原本事件中卻是不work的,不論那一種寫法都是return false的。ex: void __fastcall TForm1::ListView1Edited     (TObject *Sender, TListItem *Item, AnsiString &S) {  if (!ListView1->Items->Item[0]->EditCaption())      ShowMessage("無法回到edit狀態!");    ListView1->SetFocus();  if (!SendMessage(ListView1->Handle,LVM_EDITLABEL,0,0))      ShowMessage("無法回到edit狀態!"); } 所以證明Item->EditCaption()這一行在直接加入又不動手腳的 情況下是無法work的。    在BCB中void __fastcall TForm1::ListView1Editing事件觸發時 會有產生一個edit control,然後Item進入可編輯模式,當 void __fastcall TForm1::ListView1Edited觸發時,表示編輯完 畢,而當void __fastcall TForm1::ListView1Edited事件結束時 ,這個edit control會被取消,表示編輯完畢,也就是說在 void __fastcall TForm1::ListView1Edited事件中雖然有 Item->EditCaption()這樣的程式碼將Item設為可編輯模式,但是當 整個事件結束後,由於edit control被取消,導至Item自動恢復不 可編輯模式。    由於void __fastcall TForm1::ListView1Editing事件 由LVN_BEGINLABELEDIT觸發     void __fastcall TForm1::ListView1Edited事件 由LVN_ENDLABELEDIT觸發(應該是如此) 所以也可以試著去攔截ListView所在的Form之LVN_ENDLABELEDIT 訊息(注意它是包在WM_NOTIFY訊息內的)去試著將Item改為可編 輯模式,結果也是不行的(範例過多,不在此列出)。    -------------------問題分析-----------------------    -------------------替代方案----------------------- * 注意void __fastcall TForm1::ListView1Edited事件的   特性是有"新編輯"且完成後觸發   #include  #pragma hdrstop #include "Unit1.h" //---------------------------------------------------------------#pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; // 變數宣告 // int Itm; bool chk; ~~~~~ void __fastcall TForm1::ListView1Edited(TObject *Sender, TListItem *Item, AnsiString &S) { for (int cnt=0;cntItems->Count;cnt ) { if (S=="" || S==ListView1->Items->Item[cnt]->Caption) { Itm=Item->Index; Timer1->Enabled=true; return; } } } //--------------------------------------------------------------- void __fastcall TForm1::Timer1Timer(TObject *Sender) { ListView1->Items->Item[Itm]->EditCaption(); Timer1->Enabled=false; } -------------------替代方案----------------------- 發表人 - m8815010 於 2004/01/13 12:31:46
隆妹
一般會員


發表:6
回覆:12
積分:8
註冊:2003-10-02

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-01-21 11:40:39 IP:203.204.xxx.xxx 未訂閱
謝謝教學唷 有些問題想再問問 為何用 > 再來就是轉回編輯模式時 大約會停頓一秒 但將 > 最後還是要說聲新年快樂< >
m8815010
版主


發表:99
回覆:372
積分:289
註冊:2003-11-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-01-30 11:43:51 IP:61.63.xxx.xxx 未訂閱
引言: 隆妹你好: 過了一個年都忘了這一個題目了!發現之前回覆的那一篇寫的沒條理,而 且程式碼又沒排列整齊,所以應該很難看的懂! 問題一:觀念還是同前篇回覆的! 就是在ListView1Edited()事件結束後,這個edit control(上篇中提到) 會被自動消除,而這個item也會恢復不可編輯模式(目前研究是這樣,可 能並不盡然)。所以如果有下列的程式碼:
void __fastcall TForm1::ListView1Edited(TObject*Sender,TListItem *Item, AnsiString &S)
{
 //其它程式碼     ListView1->Items->Item[0]->EditCaption();     //其它程式碼
}
則當中的那一行是無用的,因為雖然有開啟編輯模式,但是事件結束後還 是被自動恢復不可編輯模式!做了等於白做。 所以就用一個做假的方法,就是一樣在ListView1Edited()事件中做item 輸入是否合理的判斷,只要不合理,就結束ListView1Edited()事件,並 開啟Timer1事件(用程式碼Timer1->Enabled=true),而Timer1事件中 就會將item再設為可編輯模式。目的完全就是為了要跳過〝被自動恢復不 可編輯模式〞這一段。 結論是只要在ListView1Edited()事件結束後再將item再設為可編輯模式 即可成功! 問題二: 你可以不用Timer去做,只要能實做上述論述的方法都行。有時 Timer感覺是一個簡單的Thread。 另外如果覺得Timer太慢,就可如你所說的把1000調成500,或是調成更 小10等等…感覺沒有由1秒變0.5秒應該是錯覺吧,要不然你調成5000試 試看,絕對讓你等5秒。< face="Verdana, Arial, Helvetica">
aquarius
資深會員


發表:3
回覆:347
積分:330
註冊:2003-05-21

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-02-02 11:13:10 IP:211.23.xxx.xxx 未訂閱
用 TIMER 感覺沒那麼聰明, 試試用 MESSAGE 的方式, 我用 DELPHI 寫了一個範例, 希望你看得懂... ;)    
unit Unit1;    interface    uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ComCtrls;    type
  TForm1 = class(TForm)
    ListView1: TListView;
    procedure ListView1Edited(Sender: TObject; Item: TListItem;
      var S: String);
  private
    { Private declarations }
    procedure WMU(var msg:TMessage) ; message WM_USER;
  public
    { Public declarations }
  end;    var
  Form1: TForm1;    implementation    {$R *.DFM}    procedure TForm1.ListView1Edited(Sender: TObject; Item: TListItem;
  var S: String);
begin
  if s='' then
    begin
    PostMessage(handle,WM_USER,0,0) ;
    abort ;
    end ;
end;    procedure TForm1.WMU(var msg: TMessage);
begin
  ListView1.Selected.EditCaption ;
end;    end.
 
...Aquarius
------
水瓶男的blog: http://791909.blogspot.com
m8815010
版主


發表:99
回覆:372
積分:289
註冊:2003-11-13

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-02-03 10:00:54 IP:61.63.xxx.xxx 未訂閱
引言: 用 TIMER 感覺沒那麼聰明, 試試用 MESSAGE 的方式, 我用 DELPHI 寫了一個範例, 希望你看得懂... ;) ...etc.
aquarius兄你好: 看了你的範例,不是很了解delphi的語法,大致拿捏一下,寫成BCB的範例,如下:
In Unit1.h
~~
class TForm1 : public TForm
{
 ~~
 void __fastcall FormHookWindowProc(TMessage &Message);
 TWndMethod FormParentWindowProc;
 ~~    In Unit1.cpp    //---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
 FormParentWindowProc=Form1->WindowProc;
 Form1->WindowProc=FormHookWindowProc;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormHookWindowProc(TMessage &Message)
{
 if (Message.Msg==WM_USER 123) {
     ListView1->Selected->EditCaption();     <-----行一
 }     FormParentWindowProc(Message);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ListView1Edited(TObject *Sender, TListItem *Item,
      AnsiString &S)
{
 if (S=="") {
     PostMessage(Handle,WM_USER 123,0,0);
     return;      <-----行二
 }
}
//---------------------------------------------------------------------------
結果是可行的,有達到問題的效果,但是隨即發現關鍵點,不是 class="code">//--------------------------------------------------------------------------- void __fastcall TForm1::ListView1Edited(TObject *Sender, TListItem *Item, AnsiString &S) { if (S=="") { ListView1->Selected->EditCaption(); return; } } //--------------------------------------------------------------------------- 這樣就會回到之前的問題,是不行work的。 所以問題就來了,雖然我們用的是PostMessage,它是Post出去後不等WndProc執行結束後就往下做下一行程式碼,那如果Post出去的訊息剛好還是立刻被執行了,並比return這一行快(也就是說行一比行二快執行),就會造成同上述程式的效果。 aquarius兄你如何能確定這樣的事情不會發生呢
aquarius
資深會員


發表:3
回覆:347
積分:330
註冊:2003-05-21

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-02-03 14:25:04 IP:211.23.xxx.xxx 未訂閱
請參考 PostMessage 的說明    The PostMessage function places (posts) a message in the message queue associated with the thread that created the specified window and then returns without waiting for the thread to process the message.  Messages in a message queue are retrieved by calls to the GetMessage or PeekMessage function. PostMessage 之後並不會馬上被執行, 而是放到 Message Queue 中. 除非你在 OnEdited 中呼叫 Application-> ProcessMessages ; 否則在這個副程式中並不會去處理 Message Queue 的內容, 也就是說可以保證那個 Message 一定會在 OnEdited 之後才被執行. 當然你若是在 OnEdited 中叫用 ProcessMessages 那就另當別論. ...Aquarius
------
水瓶男的blog: http://791909.blogspot.com
m8815010
版主


發表:99
回覆:372
積分:289
註冊:2003-11-13

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-02-03 16:38:29 IP:61.63.xxx.xxx 未訂閱
引言: The PostMessage function places (posts) a message in the message queue associated with the thread that created the specified window and then returns without waiting for the thread to process the message. Messages in a message queue are retrieved by calls to the GetMessage or PeekMessage function. PostMessage 之後並不會馬上被執行, 而是放到 Message Queue 中. 除非你在 OnEdited 中呼叫 Application-> ProcessMessages ; 否則在這個副程式中並不會去處理 Message Queue 的內容, 也就是說可以保證那個 Message 一定會在 OnEdited 之後才被執行.
Aquarius兄你好: 這篇也看了好幾次了,可能有看沒有懂吧! 你的相關論述我大概測試過了,應該都對,只是光由上面 >< >< >
aquarius
資深會員


發表:3
回覆:347
積分:330
註冊:2003-05-21

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-02-03 17:38:16 IP:211.23.xxx.xxx 未訂閱
詳情請自行參考 Windows SDK programming. 關於 Message 的部份. 至於簡單的說明--- 在沒有呼叫 GetMessage 或 PeekMessage , 系統並不會自動去處理 Message Queue 的內容. 什麼時候會處理呼叫到這兩個 FUNCTION 呢? 一是在呼叫 Application->ProcessMessages, 一是在系統 Idle 時(這種說法不大對, 但我一時想不到更好的表達方法). 所以只要在你的 Event 中沒叫用到會呼叫到會去用到處理Message的function, 就可以保證 Message Queue 中的內容不會被存取. 更簡單的說法就是, 你 PostMessage 完, 就跳出 Event 了, 當然不會有被插隊的可能. ...Aquarius
------
水瓶男的blog: http://791909.blogspot.com
m8815010
版主


發表:99
回覆:372
積分:289
註冊:2003-11-13

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-02-04 10:13:11 IP:61.63.xxx.xxx 未訂閱
引言: 在沒有呼叫 GetMessage 或 PeekMessage , 系統並不會自動去處理 Message Queue 的內容. 什麼時候會處理呼叫到這兩個 FUNCTION 呢? 一是在呼叫 Application->ProcessMessages, 一是在系統 Idle 時(這種說法不大對, 但我一時想不到更好的表達方法). 所以只要在你的 Event 中沒叫用到會呼叫到會去用到處理Message的function, 就可以保證 Message Queue 中的內容不會被存取. 更簡單的說法就是, 你 PostMessage 完, 就跳出 Event 了, 當然不會有被插隊的可能.
是啊是啊!aquarius兄你說到重點了,我就是要問這個答案〝一是在系統 Idle 時〞(雖然可能不是你最好的表達)。因為我們在Post出Message後並沒有手動從queue中取出執行,而這個Message最後還是被執行了,所以顯然OS有幫我們做這件事了,那OS什麼時候做就成了關鍵了。 因為之前我不認為OS是在Idle時做了這件事(Because it doesn't show in API reference),所以我覺得下列是可能的:
//---------------------------------------------------------------------------
void __fastcall TForm1::ListView1Edited(TObject *Sender, TListItem *Item,
      AnsiString &S)
{
 if (S=="") {
     PostMessage(Handle,WM_USER 123,0,0);                                 <-------OS剛好在這time slice執行了queue內我們的那個Message
     return;     
 }
}
//---------------------------------------------------------------------------
那如果如你所說的OS在Idle時做這件事,那麼當然是在這個ListView1Edited事件後才有可能執行我們的Message了(by Def. of "Idle" of BCB:An application is idle when it is not processing code.) 嗯,快要結案了…可惜我不能結案< >< >< >< >< >< >! 對了,不曉得 class="code">void __fastcall TForm1::ListView1Edited(TObject*Sender,TListItem *Item, AnsiString &S) { //其它程式碼 ListView1->Items->Item[0]->EditCaption();<----這行下在本事件內是有等於沒有作用的 //其它程式碼 }
aquarius
資深會員


發表:3
回覆:347
積分:330
註冊:2003-05-21

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-02-04 15:32:56 IP:211.23.xxx.xxx 未訂閱
請參考 TListView 的 SOURCE CODE. OnEdited 是在 LVN_ENDLABELEDIT 中被呼叫到, 這時的 Edit Mode 應該還沒被結束. 而 EditCaption 則是送一個訊息到 TListView 中. 表示轉換為 Edit 模式. 但在 OnEdited 時, 本來就還在 Edit 模式, 所以這個動作自動被略過. 使用 Timer 或 Message 去叫用 EditCaption 的目的就是要讓 TListView 先結束 Edit Mode, 然後再收到 EditCaption 時, 再重新將狀態設為 Edit Mode. ...Aquarius
------
水瓶男的blog: http://791909.blogspot.com
隆妹
一般會員


發表:6
回覆:12
積分:8
註冊:2003-10-02

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-02-08 10:59:47 IP:203.204.xxx.xxx 未訂閱
請問 WM_USER 是不是不一定要加 123 呢? 而只要在 WM_USER through 0x7FFF 就可以?    真沒想到過完年回應那麼多 不過 aquarius 所提供的方法還不是很懂 看來得加油了
m8815010
版主


發表:99
回覆:372
積分:289
註冊:2003-11-13

發送簡訊給我
#13 引用回覆 回覆 發表時間:2004-02-09 15:28:35 IP:61.63.xxx.xxx 未訂閱
引言:請問 WM_USER 是不是不一定要加 123 呢? 而只要在 WM_USER through 0x7FFF 就可以? 真沒想到過完年回應那麼多 不過 aquarius 所提供的方法還不是很懂 看來得加油了 < face="Verdana, Arial, Helvetica"> 隆妹你好: WM_USER是Windows讓使用者自訂使用訊息用的,以讓使用訊息更有空間,從WM_USER、WM_USER 1、WM_USER 2…下去都可以,但要注意使用自訂訊息時,收和送方定義值要一樣,才會收送的到。至於有沒有上限我就沒去查了,你可以試試,! >> class="code">void __fastcall TForm1::ListView1Edited(TObject *Sender, TListItem *Item, AnsiString &S) { if (S=="") { <-----如果發現是空白的話 //Item->EditCaption(); <-----這一行不能起作用 PostMessage(Item->Handle,LVM_EDITLABEL,Item->Index,0); <-----換成這一行就能起作用了 //SendMessage(Item->Handle,LVM_EDITLABEL,Item->Index,0); <-----但不可以換成這樣 } } 如果你比較沒有常用SendMessage、PostMessage之類的function,你可能要再熟一點,才知道在做什麼,如果你已經滿熟這些事了,那麼上面這一段最簡短的寫法,你應該可以很解的 。 發表人 -
aquarius
資深會員


發表:3
回覆:347
積分:330
註冊:2003-05-21

發送簡訊給我
#14 引用回覆 回覆 發表時間:2004-02-10 13:35:53 IP:211.23.xxx.xxx 未訂閱
呵呵呵... 發現了...  一開始只想著要用 > ...
------
水瓶男的blog: http://791909.blogspot.com
隆妹
一般會員


發表:6
回覆:12
積分:8
註冊:2003-10-02

發送簡訊給我
#15 引用回覆 回覆 發表時間:2004-02-13 16:32:10 IP:203.204.xxx.xxx 未訂閱
謝謝2位的說明 PostMessage 之類的function 大致上以了解 但了好幾次的回覆 原來只要一行就可以了 >> > 上列那行僅適用 > 我用了下列這一行 >>>>
m8815010
版主


發表:99
回覆:372
積分:289
註冊:2003-11-13

發送簡訊給我
#16 引用回覆 回覆 發表時間:2004-02-17 10:54:16 IP:61.63.xxx.xxx 未訂閱
引言: 謝謝2位的說明 PostMessage 之類的function 大致上以了解 但了好幾次的回覆 原來只要一行就可以了 < face="Verdana, Arial, Helvetica"> 嗯,沒辦法,一行解決也不是一開始就知道的,也是好幾次的來回討論、實測才明朗的! <>< face="Verdana, Arial, Helvetica">引言: PostMessage(Item->Handle, LVM_EDITLABEL, Item->Index, 0); 請問 LVM_EDITLABEL 應該解釋成進入編輯或是編輯完成所發出的 message 呢 < face="Verdana, Arial, Helvetica"> 嗯,簡單的說,一般正常情況下,你如果要讓一個ListView的item進入編輯狀態,是先用滑鼠去點那個item,然後這個item就跳入可編輯狀態。
這樣的流程是:                           (若干過程)
               OS收到mouse event --------------->Send出 LVM_EDITLABEL 這個Message
               
               item收到Message後,做出對應,切為可編輯狀態。                      所以這個LVM_EDITLABEL是告知某item〝進入編輯模式〞
但其實你應該直接查LVM_EDITLABEL的說明看個仔細才對! <>< face="Verdana, Arial, Helvetica">引言: 想再問下列幾行程式碼 void __fastcall TForm1::FormHookWindowProc(TMessage &Message) { if (Message.Msg==WM_USER 123) { ListView1->Selected->EditCaption(); } FormParentWindowProc(Message); } 為何還要多加一行 FormParentWindowProc(Message); 有何用意呢?
嗯,就是程式中內定對Message(all Messages of the Form)的處理function,前幾行是我們自已加上對這Messasge的additional處理程式碼,但最後還是要切回做一遍它本來該做的。 最簡單的測試,把這行那掉試試就知道有什麼問題了! 無法說的太細,建議有問題的話直接 >! <>< face="Verdana, Arial, Helvetica">引言: 上列那行僅適用ListView 那 TreeView 呢 我用了下列這一行 <>>>> 但是卻無法像>< face="Verdana, Arial, Helvetica"> 嗯,隆妹還是建議你有問題要先試著查看BCB...etc.有的說明文件。 明顯的,針對>>>> 但是實測後( class="code"> void __fastcall TForm1::Button1Click(TObject *Sender) { //TreeView1->Items->Item[0]->EditText(); <---測試這行可不可以用下列send message的方式去改寫 TreeView1->SetFocus(); SendMessage(TreeView1->Handle,TVM_EDITLABEL,0,(LPARAM)TreeView1->Items->Item[1]->Handle); 這裏你想用回PostMessage也可以,依然沒反應,儘管return值有差 } //--------------------------------------------------------------------------- 對,實測是失敗的,跟本SendMessage就不成功(return是0),而用PostMessage是return 1,但item也沒反應。 有兩個重點: 1. 用PostMessage return 1,看似成功,why item沒反應? 2. 上面的測試碼理應無關SendMessage和PostMessage,實測不然,why? 嗯,問題抓了兩天了,目前還抓不出來,可能要aquarius兄一起看看了!
aquarius
資深會員


發表:3
回覆:347
積分:330
註冊:2003-05-21

發送簡訊給我
#17 引用回覆 回覆 發表時間:2004-02-18 11:53:06 IP:211.23.xxx.xxx 未訂閱
這種問題就是去看看他的 Source Code 是怎麼寫的囉!! 換成這一行就可以了. SendMessage(TreeView1->Items->Item[0]->Handle,TVM_EDITLABEL,0,(LPARAM)TreeView1->Items->Item[0]->itemid); ...Aquarius
------
水瓶男的blog: http://791909.blogspot.com
m8815010
版主


發表:99
回覆:372
積分:289
註冊:2003-11-13

發送簡訊給我
#18 引用回覆 回覆 發表時間:2004-02-18 18:05:27 IP:61.63.xxx.xxx 未訂閱
引言: 這種問題就是去看看他的 Source Code 是怎麼寫的囉!! 換成這一行就可以了. SendMessage(TreeView1->Items->Item[0]->Handle,TVM_EDITLABEL,0,(LPARAM)TreeView1->Items->Item[0]->itemid); ...Aquarius
耶,帥哦…可惡,被唬爛了,真是噁心< >< >: < src="http://delphi.ktop.com.tw/loadfile.php?TOPICID=14126642&CC=315938"> aquarius兄可不可以請教一下你說看看它的source code怎麼寫的,是要去那看呀,.hpp or sth... < >,沒人教,麻煩教一下< >!
隆妹
一般會員


發表:6
回覆:12
積分:8
註冊:2003-10-02

發送簡訊給我
#19 引用回覆 回覆 發表時間:2004-02-19 09:53:31 IP:203.204.xxx.xxx 未訂閱
原來是參數下錯阿 本以為 >
yangshengfa
一般會員


發表:1
回覆:16
積分:3
註冊:2003-09-06

發送簡訊給我
#20 引用回覆 回覆 發表時間:2004-02-19 12:53:33 IP:218.169.xxx.xxx 未訂閱
試試下列的程式碼
    if (S.IsEmpty()) {
        S = Item->Caption;  /* 恢復為原來的數值 */
        DefWindowProc(Item->Handle, WM_CANCELMODE, 0, 0);
        ShowMessage("輸入錯誤!");
        PostMessage(Item->Handle, LVM_EDITLABEL, Item->Index, 0);
    }
aquarius
資深會員


發表:3
回覆:347
積分:330
註冊:2003-05-21

發送簡訊給我
#21 引用回覆 回覆 發表時間:2004-02-23 09:41:14 IP:211.23.xxx.xxx 未訂閱
我是沒注意 BCB 的 VCL SOURCE CODE 放那個目錄下, DELPHI 的話是在硬碟的安裝目錄下, 有一個 SOURCE 的目錄, 裏頭放了一堆 VCL 的 SOURCE(Pro 版以上才提供 Source code) ...Aquarius
------
水瓶男的blog: http://791909.blogspot.com
m8815010
版主


發表:99
回覆:372
積分:289
註冊:2003-11-13

發送簡訊給我
#22 引用回覆 回覆 發表時間:2004-02-23 10:09:51 IP:61.63.xxx.xxx 未訂閱
引言: 我是沒注意 BCB 的 VCL SOURCE CODE 放那個目錄下, DELPHI 的話是在硬碟的安裝目錄下, 有一個 SOURCE 的目錄, 裏頭放了一堆 VCL 的 SOURCE(Pro 版以上才提供 Source code) ...Aquarius
so…果然BCB也有一個Source的目錄!一找就看到了,只是都沒找過, >!
yl_huang
一般會員


發表:6
回覆:6
積分:2
註冊:2004-11-24

發送簡訊給我
#23 引用回覆 回覆 發表時間:2004-11-24 01:57:59 IP:61.222.xxx.xxx 未訂閱
下列引言中, "行一" 一定比 "行二" 慢被執行的原因是否為: ListView1Edited() 與 FormHookWindowProc() 皆被同一 thread 所執行, 也就是說, thread A 呼叫 ListView1Edited() PostMessage() (給自己), 再於 FormHookWindowProc() 中處理此 Message.    
引言:
 
//---------------------------------------------------------------------------
void __fastcall TForm1::FormHookWindowProc(TMessage &Message)
{
 if (Message.Msg==WM_USER 123) {
     ListView1->Selected->EditCaption();     <-----行一
 }     FormParentWindowProc(Message);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ListView1Edited(TObject *Sender, TListItem *Item,
      AnsiString &S)
{
 if (S=="") {
     PostMessage(Handle,WM_USER 123,0,0);
     return;      <-----行二
 }
}
//--------------------------------------------------------------------------- 
系統時間:2024-04-26 8:31:11
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!