Autor |
Beitrag |
Bergmann89
      
Beiträge: 1742
Erhaltene Danke: 72
Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
|
Verfasst: Do 18.09.08 14:25
HI
ich wollt ma fragen, wie man Ereignisse für selbst erstellte Objekte erstellen kann?
Also z.B. das mein Objekt ein OnkeyDown-Ereigniss besitz und auslöst.
Wäre toll wenn mir das jmd erklären könnte.
Mfg Bergmann.
_________________ Ich weiß nicht viel, lern aber dafür umso schneller^^
|
|
baka0815
      
Beiträge: 489
Erhaltene Danke: 14
Win 10, Win 8, Debian GNU/Linux
Delphi 10.1 Berlin, Java, C#
|
Verfasst: Do 18.09.08 14:28
Wenn du ein Ereignis für dein Objekt erstellst, musst du dich auch selbst darum kümmern, dass es ausgelöst wird.
Wenn du z.B. ein ThreadObjekt erstellst, und diesem ein OnThreadEnded Event erstellst, musst du auch am Ende des Threads den OnThreadEnded Event feuern.
In deinem Beispiel müsstest du also prüfen ob eine Taste gedrückt wurde während deine Komponente den Focus hat und dann den OnKeyDown-Event feuern.
|
|
elundril
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Do 18.09.08 15:51
das könnte helfen, indem du dir von der komponente eine eigene ableitest: www.delphi-treff.de/...ponenten-entwicklen/
außerdem solltest du dir diverse freewarekomponenten ansehen (den quelltext) da das dir auch dabei helfen könnte. so hab ich das meiste über komponentenentwicklung gelernt.
lg elundril
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
Bergmann89 
      
Beiträge: 1742
Erhaltene Danke: 72
Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
|
Verfasst: Do 18.09.08 17:35
Hi,
hab mir das ma durchgelesen, is nich so wie ich mir das vorgestellt hab.
Ich dachte ich kann dann einfach wie bei der TForm sowas wie OnKeyPress machen, aber wenn ich das vorher eh alles selber machen muss dann kann ich mir das Event auch sparen ^^
Trotzdem Danke!
MfG Bergmann.
_________________ Ich weiß nicht viel, lern aber dafür umso schneller^^
|
|
Tilman
      
Beiträge: 1405
Erhaltene Danke: 51
Win 7, Android
Turbo Delphi, Eclipse
|
Verfasst: Do 18.09.08 20:29
Beschreib mal konkret was du machen willst. KeyDown ließe sich relativ einfach realisieren soweit ich sehe, KeyPress hingegen ist wesentlich schwieriger.
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| procedure WMKeyDown(var Message: TWMKeyDown); message WM_KEYDOWN; [..] procedure WMKeyDown; begin end; |
(Natürlich brauchst du noch ein Property und must den Ereignistypen deklarieren).
Am einfachsten wäre es aber von einer KOmponente abzuleiten, welche das gewünschte Eregnis bereits enthält, etwa TWinControl.
BTW: falls du's noch nicht hast: lade dir TurboDelphi runter. Ob du es benutzt ist deine Sache, aber es enthält im Gegensatz zu D7 PE die Sources, und diese sind für Komponentenentwickler so ziemlich unentbehrlich.
_________________ Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)
|
|
Bergmann89 
      
Beiträge: 1742
Erhaltene Danke: 72
Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
|
Verfasst: Do 18.09.08 23:14
HI,
ich bin grad dabei sowas wie n 3D-Chat zu bauen, mit OpenGL und hab mir da ne extra Klasse für das Hauptmenü geschrieben. Aber für Texteingaben hab ich bis jetzt immer das OnKeyPress-Ereigniss der Form verwendet und da dachte ich mir, das ich evtl. auch ein OnKeyPress-Event für meine Klasse schreiben könnte. Denn alles über IsKeyDown([Key]) zu erledigen is irgendwie umständlich!
MfG Bergmann.
_________________ Ich weiß nicht viel, lern aber dafür umso schneller^^
|
|
Tilman
      
Beiträge: 1405
Erhaltene Danke: 51
Win 7, Android
Turbo Delphi, Eclipse
|
Verfasst: Do 18.09.08 23:16
Naja, du kannst eine "eigene Klasse" nicht so ohne weiteres mit einem OnKeyIrgendwas-Ereignis ausstatten. Diese Tastaturereignisse sind an Komponenten mit Fensterhandle gebunden, und daher geht es eigentlich nur wenn du von TWinControl ableitest.
_________________ Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)
|
|
Dunkel
      
Beiträge: 682
Mac OS X Snow Leopard
Xcode 3.1
|
Verfasst: Do 18.09.08 23:29
Ereignisse benachrichtigen das Eltern-Control (bzw. alle Ereignis-behandelnden Controls) über Vorkommnisse; sei es jetzt ein "Hallo! Die Maus wurde bewegt!", ein "Hallo! Eine Taste wurde gedrückt!" oder sonst was. TWinControl stellt Dir eine Reihe von Standard-Ereignissen zur Verfügung. Wenn Du ohne TWinControl (oder abgeleitetes) Ereignisse zur Verfügung stellen möchtest, dann musst Du die Messages (Windows schickt Dir nahezu pausenlos Nachrichten, über jedes erdenkliche Ereignis) abfangen (bzw. verarbeiten) und selbstständig ein Ereignis feuern.
Visuelle Komponenten lässt man deswegen am besten von TWinControl erben, das erspart einem einiges an Arbeit.
_________________ Ich streite einsam mich mit dieser Oberflächenwelt
Gutes sei ein löblich Brot von dem ich zehre - bis zum Tod [Das Ich - Im Ich]
|
|
Bergmann89 
      
Beiträge: 1742
Erhaltene Danke: 72
Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
|
Verfasst: So 21.09.08 16:46
HI,
ich versuch's jetzt mit TWinControl, und hab schon die 1. Probleme. Ich hab den Fokus auf mein Hauptmenü gesetzt, aber meine OnKeyPress Prozedur wird nicht ausgelöst. so hab ich das gemacht:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33:
| type TMainMenu = class(TWinControl) procedure MainMenuKeyPress(Sender: TObject; var Key: Char); private [...] fOnKeyPress: TKeyPressEvent; [...] public property OnKeyPress: TKeyPressEvent read fOnKeyPress write fOnKeyPress; [...] end;
constructor TMainMenu.Create(FontContextID: tsContextID); var FontFilename: String; begin inherited Create(nil); Parent := Form1;
fOnKeyPress := MainMenuKeyPress; [...] end;
procedure TMainMenu.MainMenuKeyPress(Sender: TObject; var Key: Char); begin ShowMessage(Key); end;
procedure TForm1.FormShow(Sender: TObject); begin MainMenu := TMainMenu.Create(FontContextID); MainMenu.SetFocus; end; |
das 2. Problem ist, das ich hinter meine constructor (Create) kein override setzen kann, da meckert der debuger:
Quelltext 1:
| [Fehler] MainMenu.pas(30): Deklaration von 'Create' unterscheidet sich von vorheriger Deklaration |
und das override brauch ich doch, oder?
kann mir da jmd weiter helfen?
€: Problem 1 hab ich grad selbst gelöst:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| type TMainMenu = class(TWinControl) procedure MainMenuKeyPress(Sender: TObject; var Key: Char); private [...] public [...] end;
constructor TMainMenu.Create(FontContextID: tsContextID); var FontFilename: String; begin inherited Create(nil); self.Parent := Form1; self.OnKeyPress := MainMenuKeyPress; [...] end;
procedure TMainMenu.MainMenuKeyPress(Sender: TObject; var Key: Char); begin ShowMessage(Key); end; |
MfG Bergmann.
_________________ Ich weiß nicht viel, lern aber dafür umso schneller^^
|
|
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: So 21.09.08 21:16
Wenn du deine Klasse von TWinControl abgeleitet hast, genügt es, eine entsprechende Methode zu überschreiben.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| type TMainMenu = class(TWinControl) protected procedure KeyPress(Sender: TObject; var Key: Char); override; end;
procedure TMainMenu.KeyPress(Sender: TObject; var Key: Char); begin ShowMessage(Key); end; |
Ich bin mir gerade nicht sicher, ob die Parameter stimmen. Müsstest du nochmal nachschauen.
|
|
Bergmann89 
      
Beiträge: 1742
Erhaltene Danke: 72
Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
|
Verfasst: So 21.09.08 23:24
na das geht ja eben nich^^ siehe fehlermeldung oben! ich will die Create-Methode überschreiben...
_________________ Ich weiß nicht viel, lern aber dafür umso schneller^^
|
|
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Mo 22.09.08 15:43
Bergmann89 hat folgendes geschrieben: | na das geht ja eben nich^^ siehe fehlermeldung oben! ich will die Create-Methode überschreiben... |
Oh, das Sender: TObject muss natürlich raus.
Compilieren geht, Starten will bei mir gerade nicht. Avast! meint, jedes Delphi-Projekt wäre ein Trojaner. Wie den auch sei; ohne Sender dürfte das klappen.
|
|
Bergmann89 
      
Beiträge: 1742
Erhaltene Danke: 72
Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
|
Verfasst: Di 23.09.08 17:49
ne so mein ich das auch net^^
ich hab mir n eigenen constructor geschrieben. der Standart-Constructor erwartet nur aOwner: TComponent als übergabewert.
wenn ich jetzt in meinem eigenen constructor nur den aOwner: TComponent übergeb, dann kann ich das override; dahinter setzen, wenn ich aber noch andere Variablen übergeben will, dann meckert er rum:
Quelltext 1:
| [Fehler] GameScene.pas(35): Deklaration von 'Create' unterscheidet sich von vorheriger Deklaration |
und wenn ich das override; weg lass, dann gehts zwar, aber er bringt ne warnung:
Quelltext 1:
| [Warnung] GameScene.pas(35): Methode 'Create' verbirgt virtuelle Methode vom Basistyp 'TControl' |
und irgendeinen sinn muss die warnung ja haben, und deshalb will ich die weg haben!
Hoffe jetzt wisst ihr was ich meine
MfG Bergmann.
_________________ Ich weiß nicht viel, lern aber dafür umso schneller^^
|
|
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Di 23.09.08 17:58
|
|
Nico72
      
Beiträge: 50
Win XP, Vista
Delphi 7, Delphi 2006
|
Verfasst: Di 23.09.08 18:01
Hallo,
was du suchst ist reintroduce...:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| type TBlabla = class(TControl) ... constructor Create(AOwner:TComponent; Param1, Param2:Integer); reintroduce; end;
...
constructor TBlabla.Create(AOwner:TComponent; Param1, Param2:Integer); begin inherited Create(AOwner); ... end; |
|
|
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Di 23.09.08 18:50
Nico72 hat folgendes geschrieben: | was du suchst ist reintroduce...: |
Du sagst es. Auf das wollte ich hinaus. 
|
|
Bergmann89 
      
Beiträge: 1742
Erhaltene Danke: 72
Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
|
Verfasst: Di 23.09.08 22:05
aber reintroduce unterdrückt die Warnung ja bloß, ich will sie ja weg haben, oder is das ega?!
_________________ Ich weiß nicht viel, lern aber dafür umso schneller^^
|
|
Nico72
      
Beiträge: 50
Win XP, Vista
Delphi 7, Delphi 2006
|
Verfasst: Mi 24.09.08 08:38
reintroduce unterdrückt die Warnung nicht, sondern behebt den Grund der Warnung (die in diesem Fall sogar ein Fehler ist).
Mit Reintroduce kannst du eine Methode auch in ihrer Parameterliste überschreiben. Du solltest dann die geerbte Methode aber mit der alten Parameterliste aufrufen (inherited Create(AOwner)). Lässt du das weg, wird dein Programm ein schweres Bäuerchen machen, da im Konstruktor von TControl einige Objekte erzeugt werden, die du bestimmt brauchst, z.B. Font.
|
|
baka0815
      
Beiträge: 489
Erhaltene Danke: 14
Win 10, Win 8, Debian GNU/Linux
Delphi 10.1 Berlin, Java, C#
|
Verfasst: Mi 24.09.08 11:00
Wenn du den Konstruktor zusätzlich erstellen möchtest, musst du diesen natürlich in deiner Deklaration erwähnen.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| type TMainMenu = class(TWinControl) procedure MainMenuKeyPress(Sender: TObject; var Key: Char); private [...] fOnKeyPress: TKeyPressEvent; [...] public constructor Create(FontContextID: tsContextID); override; property OnKeyPress: TKeyPressEvent read fOnKeyPress write fOnKeyPress; [...] end; |
(das Highlight gilt eigentlich für die ganze Zeile, keine Ahnung warum er beim dem Create rumzickt)
|
|
Bergmann89 
      
Beiträge: 1742
Erhaltene Danke: 72
Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
|
Verfasst: Mi 24.09.08 16:39
tach.
@ Nico72: OK, danke. da werd ich das jetzt so einbauen.
@ baka0815: Das hab ich ja so gemacht, aber das ging ja eben nich, weil ich andere Parameter übergeben wollte, als die in der Standart-Methode. Und deshalb geht da auch kein override;.
Nochma Dannke an alle! Dann wäre das hier abgehakt.
MfG Bergmann.
_________________ Ich weiß nicht viel, lern aber dafür umso schneller^^
|
|
|