Avatar billede espeholt_jr Nybegynder
06. marts 2005 - 13:21 Der er 18 kommentarer

eventhandler fra andet object

Hej..

Hvordan gør jeg så
object1.click

er det samme som
object2.click?

når jeg siger det samme, så mener jeg ikke, at de bare skal bruge den samme eventhandler, men at når man klikker på object1, så skal det se ud som om object2 klikker
Avatar billede kalp Novice
06. marts 2005 - 13:27 #1
Du skal have en reference i objekt1 til objekt2... så kan du i objekt1 kalde objekt2 click efterfølgende
Avatar billede espeholt_jr Nybegynder
06. marts 2005 - 13:29 #2
eksempel?
Avatar billede kalp Novice
06. marts 2005 - 13:48 #3
Jeg kan ikke lave det C# uden nogen kode... programmere nemlig ikke C# men det er samme tankegang.

Hvis du viser mig konstuktøren til objekt1 så kan jeg måske bedre fejlede..

men det er noget i stil med dette.


Objeck2 tmp;

public objeckt1(Object2 obj)
{
tmp = obj;
}


så kan du i objekt1 nu skrive

tmp.metodenIobjeckt2SomKalder knap klik();
Avatar billede espeholt_jr Nybegynder
06. marts 2005 - 13:52 #4
nope... det skal være sådan at object1 klikker for object2
Avatar billede kalp Novice
06. marts 2005 - 13:57 #5
Men det gør objeckt1 jo også... du smider følgende ind i den kode der bliver afviklet når der klikkes på objeckt1's knap

tmp.metodenIobjeckt2SomKalder knap klik();

så klikker den i objeckt2
Avatar billede espeholt_jr Nybegynder
06. marts 2005 - 14:01 #6
så fatter jeg ikke lige dit eksempel...
Avatar billede kalp Novice
06. marts 2005 - 14:05 #7
Er klasserne meget store? hvis ikke kan du poste her så kan jeg rette til.
Du kan umuligt klikke i objekt2 uden at objekt1 kender til objeckt2:) derfor skal der oprettes en reference til det..
Avatar billede espeholt_jr Nybegynder
06. marts 2005 - 14:10 #8
public SetBox(Panel myPanel, TreeNodeCollection myObjectTree, Panel page)
        {
            //
            // TODO: Add constructor logic here
            //
            this.myPanel = myPanel;
            text = new RichTextBox();
                        text.Click = myPanel.Click <-- her, text skal klikke for myPanel... koden er bare noget så du ved hvor det er...
        }
Avatar billede kalp Novice
06. marts 2005 - 14:15 #9
Okay... først scroll op til dine attributter i setBox (objekt 1 går jeg ud fra)

lav en reference til et objekt at typen objekt 2.

OBJECT2 minRef;



public SetBox(Panel myPanel, TreeNodeCollection myObjectTree, Panel page)
        {

skal være

public SetBox(Panel myPanel, TreeNodeCollection myObjectTree, Panel page, OBJECT2 object2)
        {

minRef = object2;


gør først dette.. før vi går videre..

du kan for sjov prøve at skrive

minRef.

og se listen af metoder der kommer frem.. der burde være en klik metode til til object2.
Avatar billede espeholt_jr Nybegynder
06. marts 2005 - 14:23 #10
object2=myPanel
object1=text

;)
Avatar billede burningice Nybegynder
06. marts 2005 - 14:45 #11
kalp>> Click er ikke en metode, det er et event og kan ikke bare kaldes uden videre. Til hvert event er der en On<eventnavn> som man skal kalde for at udløse eventet, men da denne som oftest er protected kan du ikke kalde den med mindre du subclasser.

espeholt_jr>> det du skal gøre er at simulere et click på myPanel i eventhandleren for  text.Click. Jf. at Click ikke er en metode, det er ikke noget man kan kalde.

Windows er et MessageDriven OS, dvs. at hver gang der skal ske noget et eller andet sted i Windows bliver der sendt en besked afsted. Det gør sig også gældende når at man flytter rundt på musen eller trykker på en knap. Det kan man udnytte til at snyde ens panel og få det til at tro at der blev trykket på det. Alt man skal gøre er at få fat i en Handle til panelet og vide hvilke beskeder man skal sende afsted. I dette tilfælde er det WM_LBUTTONDOWN og WM_LBUTTONUP.

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Runtime.InteropServices;

namespace _597385
{
    /// <summary>
    /// Summary description for Form1.
    /// </summary>
    public class Form1 : System.Windows.Forms.Form
    {
        [DllImport("user32.dll", CharSet=CharSet.Auto, SetLastError=true)]
        public static extern bool SendMessage(
            IntPtr hWnd,
            uint Msg,
            IntPtr wParam,
            IntPtr lParam);

        const uint WM_LBUTTONDOWN = 0x0201;
        const uint WM_LBUTTONUP = 0x0202;

        private System.Windows.Forms.Panel panel1;
        private System.Windows.Forms.Button button1;
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.Container components = null;

        public Form1()
        {
            //
            // Required for Windows Form Designer support
            //
            InitializeComponent();

            //
            // TODO: Add any constructor code after InitializeComponent call
            //
        }

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        protected override void Dispose( bool disposing )
        {
            if( disposing )
            {
                if (components != null)
                {
                    components.Dispose();
                }
            }
            base.Dispose( disposing );
        }

        #region Windows Form Designer generated code
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.panel1 = new System.Windows.Forms.Panel();
            this.button1 = new System.Windows.Forms.Button();
            this.SuspendLayout();
            //
            // panel1
            //
            this.panel1.Location = new System.Drawing.Point(24, 96);
            this.panel1.Name = "panel1";
            this.panel1.TabIndex = 0;
            this.panel1.Click += new System.EventHandler(this.panel1_Click);
            //
            // button1
            //
            this.button1.Location = new System.Drawing.Point(32, 24);
            this.button1.Name = "button1";
            this.button1.TabIndex = 1;
            this.button1.Text = "button1";
            this.button1.Click += new System.EventHandler(this.button1_Click);
            //
            // Form1
            //
            this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
            this.ClientSize = new System.Drawing.Size(292, 273);
            this.Controls.Add(this.button1);
            this.Controls.Add(this.panel1);
            this.Name = "Form1";
            this.Text = "Form1";
            this.ResumeLayout(false);

        }
        #endregion

        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.Run(new Form1());
        }

        private void panel1_Click(object sender, System.EventArgs e)
        {
            MessageBox.Show("Der blev klikke på panelet");
        }

        private void button1_Click(object sender, System.EventArgs e)
        {
            IntPtr buttonHandle = panel1.Handle;
            SendMessage(buttonHandle, WM_LBUTTONDOWN, new IntPtr(0x00000001), new IntPtr(0x000e002d));
            SendMessage(buttonHandle, WM_LBUTTONUP, IntPtr.Zero, new IntPtr(0x00090030));

            this.panel1.Focus();
        }
    }
}
Avatar billede espeholt_jr Nybegynder
06. marts 2005 - 14:58 #12
http://pastebin.com/250021 <- funker ikke helt :/ nok mig der har gjort noget galt... den klikker ikke, og der kommer ingen fejl
Avatar billede burningice Nybegynder
06. marts 2005 - 15:04 #13
har du defineret nogen eventhandler for panel'et?
Avatar billede espeholt_jr Nybegynder
06. marts 2005 - 15:18 #14
jeps...
Avatar billede espeholt_jr Nybegynder
06. marts 2005 - 15:19 #15
panelet er et jeg har "importeret" fra min main form...
Avatar billede burningice Nybegynder
06. marts 2005 - 15:33 #16
og dens eventhandler bliver ikke udført?... træls... i det eksempel jeg kom med kommer der en MessageBox BÅDE når man trykker på selve panelet og når man trykker på knappen.

Har prøvet at udvide mit eksempel lidt så det ligner mere dit scenarie, og det virker stadigvæk

Form1:

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;

namespace _597385
{
    /// <summary>
    /// Summary description for Form1.
    /// </summary>
    public class Form1 : System.Windows.Forms.Form
    {
        private Something something;
        private System.Windows.Forms.Panel panel1;
        private System.Windows.Forms.Button button1;
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.Container components = null;

        public Form1()
        {
            //
            // Required for Windows Form Designer support
            //
            InitializeComponent();

            something = new Something(this.panel1);
        }

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        protected override void Dispose( bool disposing )
        {
            if( disposing )
            {
                if (components != null)
                {
                    components.Dispose();
                }
            }
            base.Dispose( disposing );
        }

        #region Windows Form Designer generated code
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.panel1 = new System.Windows.Forms.Panel();
            this.button1 = new System.Windows.Forms.Button();
            this.SuspendLayout();
            //
            // panel1
            //
            this.panel1.Location = new System.Drawing.Point(24, 96);
            this.panel1.Name = "panel1";
            this.panel1.TabIndex = 0;
            this.panel1.Click += new System.EventHandler(this.panel1_Click);
            //
            // button1
            //
            this.button1.Location = new System.Drawing.Point(32, 24);
            this.button1.Name = "button1";
            this.button1.TabIndex = 1;
            this.button1.Text = "button1";
            this.button1.Click += new System.EventHandler(this.button1_Click);
            //
            // Form1
            //
            this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
            this.ClientSize = new System.Drawing.Size(292, 273);
            this.Controls.Add(this.button1);
            this.Controls.Add(this.panel1);
            this.Name = "Form1";
            this.Text = "Form1";
            this.ResumeLayout(false);

        }
        #endregion

        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.Run(new Form1());
        }

        private void panel1_Click(object sender, System.EventArgs e)
        {
            MessageBox.Show("Der blev klikke på panelet");
        }

        private void button1_Click(object sender, System.EventArgs e)
        {
            something.Click();
        }
    }
}


Something:

using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace _597385
{
    /// <summary>
    /// Summary description for Something.
    /// </summary>
    public class Something
    {
        [DllImport("user32.dll", CharSet=CharSet.Auto, SetLastError=true)]
        public static extern bool SendMessage(
            IntPtr hWnd,
            uint Msg,
            IntPtr wParam,
            IntPtr lParam);

        const uint WM_LBUTTONDOWN = 0x0201;
        const uint WM_LBUTTONUP = 0x0202;

        private Panel panel;

        public Something(Panel panel)
        {
            this.panel = panel;
        }

        public void Click()
        {
            IntPtr handle = this.panel.Handle;
            SendMessage(handle, WM_LBUTTONDOWN, new IntPtr(0x00000001), new IntPtr(0x000e002d));
            SendMessage(handle, WM_LBUTTONUP, IntPtr.Zero, new IntPtr(0x00090030));

            this.panel.Focus();
        }
    }
}
Avatar billede espeholt_jr Nybegynder
06. marts 2005 - 16:11 #17
kan det være den både den får myPanel på? at det ikke bliver en referrence?
Avatar billede burningice Nybegynder
10. marts 2005 - 11:20 #18
alle klasser i .Net er referencetypes så der bliver altid kopieret pointere rundt. Ud fra den kode du har vist mig kan jeg ikke se hvad der gør at det ikke skulle virke når at mit eksempel gør.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester