Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Prism EventArgs (https://www.delphipraxis.net/60254-eventargs.html)

gordon2001 4. Jan 2006 15:00


EventArgs
 
Hallo,

ich möchte gerne aus einem ereigniss das so ausschaut:

Delphi-Quellcode:
procedure twinform.maus_rein(sender: System.Object; e: System.EventArgs);

begin
    grafik_maus(sender, [b][i]{HIER}[/i][/b] );
end;
eine prozedure aufrufen die so aussieht:

Delphi-Quellcode:
procedure twinform.grafik_maus(sender: System.Object; e: System.Windows.Forms.PaintEventArgs);
begin
 ...bla...
end;
wie übergeb ich das "e" bei "{HIER}" richtig!?!?

vielen dank....

JasonDX 4. Jan 2006 15:26

Re: EventArgs
 
Hallo
Bei deinem Problem gibts gibt 2 Möglichkeiten:
  1. Du bist sicher, dass der Parameter, der mitkommt, ein PaintEventArg ist, und es genügt ein Typecast: Einfach PaintEventArgs(e) mitgeben.
    Im Fall noch mit der Abfrage davor:
    Delphi-Quellcode:
    if (e is PaintEventArg) then
      grafik_maus(sender, PaintEventArgs(e))
    else
      MessageBox.Show('Autsch - keine PaintEventArgs');
  2. Du bist sicher, dass nicht immer ein PaintEventArgs kommen muss.
    In dem Fall musst du dir ne zusätzliche Instanz von PaintEventArgs anlegen und die davon gebrauchten Eigenschaften zusätzlich setzen, wie bspw. Graphics ect.
    Delphi-Quellcode:
    procedure twinform.maus_rein(sender: System.Object; e: System.EventArgs);
    var
      eArgs: System.Windows.Forms.PaintEventArgs;
    begin
      eArgs := System.Windows.Forms.PaintEventArgs.Create(...);
      grafik_maus(sender, eArgs);
      eArgs.Dispose(); //Glaub dass das so heißt, oder gibts immernoch Free()?
    end;
greetz
Mike

PS: Ich sitz leider nich an meinem rechner, und mit mit Delphi.NET nicht allzugut bewandt, und kann deswegen nich für Syntax ect. garantieren, dürfte aber schon mehr oder weniger stimmen ;)

gordon2001 4. Jan 2006 15:52

Re: EventArgs
 
danke das hat mir sehr geholfen! :-D

Khabarakh 4. Jan 2006 16:09

Re: EventArgs
 
@gordon: Du willst also einen Eventhandler aufrufen, ohne dass ein entsprechendes Event gefeuert wurde? Dafür gibt es keine gute Lösung, denn schon die Idee ist falsch :wink: . Wenn die Funktionalität deines Eventhandlers auch anderswo benötigt wird, solltest du ihn stattdessen in eine seperate Methode auszweigen. Beispiel:
Delphi-Quellcode:
procedure DrawSomething(g: Graphics);
begin
  [...]
end;

procedure TWinForm.grafik_maus(sender: System.Object; e: System.Windows.Forms.PaintEventArgs);
begin
  DrawSomething(e.Graphics);
end;

procedure TWinForm.maus_rein(sender: System.Object; e: System.EventArgs);
begin
  DrawSomething(...);
end;
@Chimaira: Die ganzen Event-Klassen implementieren kein IDisposable, also würde ich einfach gar nichts schreiben :wink: .

gordon2001 4. Jan 2006 18:23

Re: EventArgs
 
hm... ja das ist besser, aber ganz geht meine strategie nicht aus, leider. Also ich sag einfach mal was ich vor hatte.

Ich möchte zur lauf zeit mehre pictureboxes erzeugen die mit einer grundform gefüllt sind.
nun möchte ich aber das wenn die maus über eine picturebox geht das sie gekippt wird.

Mein quelltext sieht so aus, bisher...

Delphi-Quellcode:

procedure TWinForm.MenuItem7_Click(sender: System.Object; e: System.EventArgs);


begin
 picbox := system.Windows.Forms.PictureBox.Create;
 picbox.Name := 'picturebox2';
 picbox.Bounds := rectangle.Create(80,20,70,70);
 self.Controls.Add(picbox);

 Include(Self.Picbox.Paint, Self.grafik);
 Include(Self.Picbox.MouseEnter, self.maus_rein);
 Include(Self.Picbox.MouseLeave, Self.maus_raus);
end;

procedure TWinForm.PictureBox1_MouseLeave(sender: System.Object; e: System.EventArgs);
begin
 self.maus_raus(sender, e);
end;

procedure TWinForm.PictureBox1_MouseEnter(sender: System.Object; e: System.EventArgs);
begin
  self.maus_rein(sender, e);
end;



procedure TWinForm.PictureBox1_Paint(sender: System.Object; e: System.Windows.Forms.PaintEventArgs);


begin
  self.grafik(sender, e);
end;



procedure twinform.maus_raus(sender: System.Object; e: System.EventArgs);

begin
  self.Name := (sender as control).Name;
  winkel := 0;
  self.Refresh;
  self.Invalidate;
end;




procedure twinform.maus_rein(sender: System.Object; e: System.EventArgs);


begin
 
  self.Name := (sender as control).Name;
  winkel := -15;
  self.Refresh;
  self.Invalidate;

end;




procedure twinform.grafik(sender: System.Object; e: System.Windows.Forms.PaintEventArgs);
var rec: rectangle;
    rec2: rectangle;


begin
 
  e.Graphics.TranslateTransform(0,0);
  e.Graphics.Clear(self.BackColor);

  e.Graphics.TranslateTransform(30,30);
  e.Graphics.RotateTransform(winkel);

  rec := rectangle.Create(-22,-22,43,43);
  rec2 := rectangle.Create(-20,-20,43,43);
  e.Graphics.FillRectangle(solidbrush.Create(color.black),rec2);
  e.Graphics.FillRectangle(solidbrush.Create(color.gray),rec);
  e.Graphics.DrawRectangle(pen.create(color.Black),rec);
end;
komischer weiße wenn eine neue picturebox erzeugt wird drehen sich beide wenn man mit der maus über eines geht. Ich glaube weil ich mit dem include beim erzeugen das mit dem sender nicht übergeben habe???

thx bis hier, find ich echt cool hier... :-D :-D

JasonDX 5. Jan 2006 09:46

Re: EventArgs
 
Zitat:

Zitat von gordon2001
komischer weiße wenn eine neue picturebox erzeugt wird drehen sich beide wenn man mit der maus über eines geht. Ich glaube weil ich mit dem include beim erzeugen das mit dem sender nicht übergeben habe???

Das mit dem Sender passt schon alles ;)
bloß:
Wenn die Maus auf eine PictureBox gesetzt wird, zeichnest du das ganze Form neu (durch das Refresh). Dadurch werden auch die PictureBoxes neu gezeichnet, d.h. es wird Grafik(...) für jede PictureBox aufgerufen. Dort wird somit auch jede PictureBox gedreht gezeichnet. Deswegen drehen sich beide, wenn du mit der Maus über eine fährst.
mögliche Lösung des Problems: Im Maus_Rein speicherst du ab, welche PictureBox gedreht werden soll. (Steht ja in 'sender' drinnen).
In der Grafik-Methode überprüfst du dann, ob die zu zeichnende PictureBox auch die zu drehende PictureBox ist, und springst andernfalls aus der Methode einfach raus.
Damit dürfts dann klappen, und ich hoff, dass die kurze Beschreibung reicht, zu mehr is mein Kopf so früh am Morgen noch nicht fähig ;)

greetz
Mike

gordon2001 5. Jan 2006 11:31

Re: EventArgs
 
hm... ja aber dabei ist ja das problem das das paint ereigniss andauert von selbst ausgelöst wird ich kan ja nicht bestimmen wann! oder hab ich dich falsch verstanden? :gruebel:

aber danke für die mühe schon mal von mir! :-D

JasonDX 5. Jan 2006 12:02

Re: EventArgs
 
Zitat:

Zitat von gordon2001
hm... ja aber dabei ist ja das problem das das paint ereigniss andauert von selbst ausgelöst wird ich kan ja nicht bestimmen wann! oder hab ich dich falsch verstanden? :gruebel:

Das Paint-Ereignis wird oft ausgelöst, und das kannst du nicht einschränken, stimmt. Deshalb musst du auch einschränken, wann die PictureBox gedreht wird. Wie? Du legst dir ne zusätzliche Variable an, sowas wie DiePictureBoxDieIchDrehenMuss oder so...
Im Maus_rein-ereignis setzt du die Variable auf den inhalt von 'sender'. Darin steht ja jene Picturebox, über dem sich die Maus befindet, also jene, die sich drehen soll.
und im Maus_raus-Ereignis setzt du sie auf null.
Jetzt musst du in der Grafik-Methode noch abfragen: zeichnest du grad die PictureBox, die gedreht werden soll (Die steht übrigens im 'sender' ;) ): ja? dreh sie. nein? dreh sie nich...
in Quellcode ausgedrückt siehts noch einfacher aus:
Delphi-Quellcode:
type
  twinform = class(...)
    //irgendwo, ws unter Private:
    DiePictureBoxDieIchDrehenMuss: System.Object;
  end;




procedure twinform.maus_rein(sender: System.Object; e: System.EventArgs);
begin
  DiePictureBoxDieIchDrehenMuss := sender;
//...
end;

//im twinform.maus_raus die Var auf null setzen überlass ich dir ;)

procedure twinform.grafik(sender: System.Object; e: System.Windows.Forms.PaintEventArgs);
//...
  if DiePictureBoxDieIchDrehenMuss = sender then
  begin
    //so, hier kommt der Code rein, den du brauchst, um die PictureBox gedreht zu zeichnen
  end;
//...
greetz
Mike


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:23 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz