AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

EventArgs

Offene Frage von "gordon2001"
Ein Thema von gordon2001 · begonnen am 4. Jan 2006 · letzter Beitrag vom 5. Jan 2006
Antwort Antwort
gordon2001

Registriert seit: 2. Jan 2006
Ort: Rostock
14 Beiträge
 
#1

EventArgs

  Alt 4. Jan 2006, 15:00
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....
  Mit Zitat antworten Zitat
Benutzerbild von JasonDX
JasonDX
(CodeLib-Manager)

Registriert seit: 5. Aug 2004
Ort: München
1.062 Beiträge
 
#2

Re: EventArgs

  Alt 4. Jan 2006, 15:26
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
Mike
Passion is no replacement for reason
  Mit Zitat antworten Zitat
gordon2001

Registriert seit: 2. Jan 2006
Ort: Rostock
14 Beiträge
 
#3

Re: EventArgs

  Alt 4. Jan 2006, 15:52
danke das hat mir sehr geholfen!
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#4

Re: EventArgs

  Alt 4. Jan 2006, 16:09
@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 . 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 .
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
gordon2001

Registriert seit: 2. Jan 2006
Ort: Rostock
14 Beiträge
 
#5

Re: EventArgs

  Alt 4. Jan 2006, 18:23
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...
  Mit Zitat antworten Zitat
Benutzerbild von JasonDX
JasonDX
(CodeLib-Manager)

Registriert seit: 5. Aug 2004
Ort: München
1.062 Beiträge
 
#6

Re: EventArgs

  Alt 5. Jan 2006, 09:46
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
Mike
Passion is no replacement for reason
  Mit Zitat antworten Zitat
gordon2001

Registriert seit: 2. Jan 2006
Ort: Rostock
14 Beiträge
 
#7

Re: EventArgs

  Alt 5. Jan 2006, 11:31
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?

aber danke für die mühe schon mal von mir!
  Mit Zitat antworten Zitat
Benutzerbild von JasonDX
JasonDX
(CodeLib-Manager)

Registriert seit: 5. Aug 2004
Ort: München
1.062 Beiträge
 
#8

Re: EventArgs

  Alt 5. Jan 2006, 12:02
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?
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
Mike
Passion is no replacement for reason
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:49 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