วิธีแทนที่เหตุการณ์การคลิกของการควบคุม Firemonkey แบบกำหนดเอง

ฉันกำลังพยายามสร้างการควบคุม Firemonkey แบบกำหนดเองซึ่งสืบทอดมาจากการควบคุม TListView ฉันต้องการเพิ่มฟังก์ชันการทำงานบางอย่างให้กับตัวควบคุมซึ่งจะดำเนินการโดยอัตโนมัติเมื่อผู้ใช้คลิกที่ตัวควบคุม ดังนั้นเป้าหมายของฉันคือไม่ต้องระบุวิธีการ OnItemClick ในแบบฟอร์มการควบคุมของฉัน แต่ควรเพิ่มฟังก์ชันการทำงานลงในตัวควบคุมโดยตรง

ฉันกำลังดิ้นรนเพื่อทำความเข้าใจสิ่งที่ฉันต้องทำเพื่อใช้ประโยชน์จากตัวจัดการการคลิกสำหรับ TListView ในหัวของฉัน ฉันคิดว่าโซลูชันของฉันจะมีลักษณะคล้ายกับรหัสเทียมนี้:

//somewhere in the base TListView code
void __fastcall TListView::ClickHandler()
{
    //logic for handling a click on the list view
}

//somewhere in my custom list view control
void __fastcall TMyListView::ClickHandler()
{ 
    TListView::ClickHandler(); //call base click handler so all the normal stuff happens

    //my additional logic goes here
}

อย่างไรก็ตาม ดูเหมือนว่าฉันไม่พบสิ่งใดในเอกสารเกี่ยวกับวิธีการที่ฉันควรพยายามแทนที่ หรือฉันควรดำเนินการอย่างไรเกี่ยวกับเรื่องนี้เลย

ฉันพบข้อมูลนี้เกี่ยวกับการเรียกตัวจัดการ 'Click-event' ฉันยกตัวอย่างง่ายๆดังนี้:

void __fastcall TFmListView::Click()
{
    ShowMessage("This is the control's click");
}

มันใช้งานได้ดี แต่ตามเอกสารประกอบ:

ถ้าผู้ใช้ได้กำหนดตัวจัดการให้กับเหตุการณ์ OnClick ของตัวควบคุม การคลิกตัวควบคุมจะส่งผลให้เมธอดนั้นถูกเรียก

ดังนั้น ตรรกะเพิ่มเติมใดๆ ที่ฉันใส่ไว้ในเมธอด Click() ของตัวควบคุมจะหายไปหากมีการตั้งค่าคุณสมบัติเหตุการณ์เมื่อคลิกของตัวควบคุมตัวใดตัวหนึ่ง

วิธีที่เหมาะสมในการขยายฟังก์ชันการทำงานของสิ่งที่เกิดขึ้นเมื่อมีการคลิกตัวควบคุมแบบกำหนดเองคืออะไร


person James Hogle    schedule 29.10.2015    source แหล่งที่มา
comment
ดังนั้น ตรรกะเพิ่มเติมใดๆ ที่ฉันใส่ไว้ในเมธอด Click() ของตัวควบคุมจะหายไปหากมีการตั้งค่าคุณสมบัติเหตุการณ์คลิกของตัวควบคุมตัวใดตัวหนึ่ง นั่นไม่เป็นความจริง คุณกำลังอ่านเอกสารผิด เป็นคลาสพื้นฐาน Click() ที่เรียกใช้ตัวจัดการ OnClick หากมีการกำหนดไว้ หากผู้ใช้กำหนดตัวจัดการ OnClick และคุณแทนที่ Click() ตัวจัดการของผู้ใช้จะไม่ถูกเรียก เว้นแต่ Click() ของคุณจะเรียกคลาสพื้นฐาน Click() วิธีนี้ช่วยให้คุณสามารถดำเนินการเพิ่มเติมจากรหัสของผู้ใช้ เพื่อตัดสินใจว่ารหัสของคุณจะทำงานก่อน/หลังรหัสผู้ใช้หรือไม่ และแม้กระทั่งเพื่อข้ามรหัสของผู้ใช้   -  person Remy Lebeau    schedule 31.10.2015


คำตอบ (1)


นี่คือโซลูชัน C++ Builder สำหรับคุณ

นี่คืออินเทอร์เฟซคลาสและการใช้งาน:

class TMyListView : public TListView
{
protected:
    virtual void __fastcall DoItemClick(const TListViewItem *AItem);
};

...

/* TMyListView */

void __fastcall TMyListView::DoItemClick(const TListViewItem *AItem)
{
    // write here the logic that will be  executed
    // even if the OnItemClick handler is not assigned
    ShowMessage("Internal itemclick");

    // call the OnItemClick handler, if assigned
    TListView::DoItemClick(AItem);
}

จากนั้นคุณประกาศอินสแตนซ์ของคลาส TMyListView และตัวจัดการเหตุการณ์ที่จำเป็นในการประกาศแบบฟอร์ม:

TMyListView *LV;
void __fastcall MyOnItemClick(const TObject *Sender, const TListViewItem *AItem);

และนี่คือการใช้งานตัวจัดการเหตุการณ์และการสร้าง LV:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    LV = new TMyListView(this);
    LV->Parent = this;
    LV->Position->X = 1;
    LV->Position->Y = 1;
    LV->Width = 100;
    LV->Height = 100;

    LV->Items->Add()->Text = "111";

    LV->OnItemClick = &MyOnItemClick;
}

void __fastcall TForm1::MyOnItemClick(const TObject *Sender, const TListViewItem *AItem)
{
    ShowMessage("Assigned itemclick"); //or any other event handler action
}

ทั้งสองข้อความจะปรากฏขึ้น

person asd-tm    schedule 30.10.2015
comment
TListView มีกิจกรรมที่เผยแพร่แล้ว OnItemClick คุณไม่จำเป็นต้องสร้างการประกาศกิจกรรมของคุณเอง เพียงเรียกใช้เมธอดฐาน TListView::DoItemClick() เมื่อเมธอด DoItemClick() ที่ถูกแทนที่ของคุณพร้อมที่จะทริกเกอร์ตัวจัดการ OnItemClick ของผู้ใช้ BTW ในซีแอตเทิล TItemEvent ไม่ได้เป็นส่วนหนึ่งของ TCustomListView อีกต่อไป แต่ขณะนี้เป็นส่วนหนึ่งของ TAppearanceListView แล้ว และ DoItemClick() ถูกเปลี่ยนชื่อเป็น DoListItemClick() - person Remy Lebeau; 31.10.2015
comment
@RemyLebeau ขอบคุณสำหรับความคิดเห็นและการแก้ไขที่เป็นประโยชน์ โปรดอย่าลังเลที่จะแก้ไขโพสต์ใด ๆ ของฉัน - person asd-tm; 31.10.2015