![]() |
Procedure als Event definieren? Wenn ja, wie?
Hallo leute...
Ich möchte gerne eine einfache Procedure (enthalten in einer Unit) einem Event einer Komponente zuweisen... Da mein projekt schon recht weit ist kann ich diese Procedure leider nicht einfach in irgend eine Klasse schmeißen und diese erzeugen... Wie kann ich das machen? Währe über Anregungen sehr dankbar stho |
Re: Procedure als Event definieren? Wenn ja, wie?
Die Signatur der Methode muss passen. Welcher Klasse sie gehört ist egal
|
Re: Procedure als Event definieren? Wenn ja, wie?
Zitat:
|
Re: Procedure als Event definieren? Wenn ja, wie?
@mkinzler:
Was genau meinst du mit Signatur? |
Re: Procedure als Event definieren? Wenn ja, wie?
Delphi-Quellcode:
type
TEvent1 = function(index:integer):boolean; TEvent2 = procedure(index:integer); : : function EventHandler1(i:integer):boolean; begin end; procedure EventHandler2(i:integer); begin end; procedure StartEvent; var Event1:TEvent1; Event2:TEvent2; begin Event1:=EventHandler1; Event2:=EventHandler2; if Event1(1) then begin end; Event2(1); end; |
Re: Procedure als Event definieren? Wenn ja, wie?
Zitat:
Wie prüfe ich eine "Signatur" oder füge eine hinzu? EDIT: @omata sorry, war net schnell genug. ist nett das du etwas hinzu bringst aber leider verstehe ich nicht wie mir das bei der zuweisung helfen soll :-( Vielleicht bin ich eindach doof? |
Re: Procedure als Event definieren? Wenn ja, wie?
Zitat:
Wenn das Ereignis einen Methodenzeiger will, dann mußt du auch eine Methode übergeben. Signatur = Typen der Parameter und des Results und die Aufrufkonvention (ala stdcall) Zitat:
Zu welchem Objekt sie gehört ist egal.
Code:
Das Fette sind die Signaturen.
type
// Deklaration eines Prozedur-Zeigers TEvent1 = [b]function[/b](index: [b]integer[/b]): [b]boolean[/b]; [b]stdcall[/b]; [b]function[/b] EventProc(i: [b]integer[/b]): [b]boolean[/b]; [b]stdcall[/b]; begin end; type // Deklaration eines Methoden-Zeigers TEvent1 = [b]procedure[/b](index: [b]integer[/b]) of [i]object[/i]; [b]procedure[/b] [i]TMyClass[/i].EventMethod(i: [b]integer[/b]); begin end; |
Re: Procedure als Event definieren? Wenn ja, wie?
Unter Signatur versteht man den Typ der Rückgabe und die Anzahl und die Typen der Parameter
|
Re: Procedure als Event definieren? Wenn ja, wie?
Mach doch einfach aus der Prozedur eine Methode des Formulars (ich gehe mal davon aus, dass Du ein Formular hast).
|
Re: Procedure als Event definieren? Wenn ja, wie?
häääääääääää??????
Der bahnhof in meinem kopf ist grad nochmal größer geworden... :wall: Ich habe eine Procedure "Procedure BeforeInsert(Dataset : TDataset);" Und ich habe das Objekt "Command" vom Typ "TASQLite3Query". Ich möchte diese Procedure mit dem "Command.BeforeInsert" - event verbinden... leider verstehe ich nichtmal ansatzweise was ihr mit methoden und dem ganzen zeug sagen wollt... :gruebel: sorry... Nein, leider kein Formular... Das Objekt und die Procedure liegen einsam und alleine in einer eigenen Unit (Damit sie sich vielleicht mal näher kommen ^^) EDIT: So, jetzt muss ich erstmal lesen. hab zu lange mit dem schreiben gebraucht |
Re: Procedure als Event definieren? Wenn ja, wie?
Zitat:
Genauso muß nun deine Procedur oder Methode aufgerbaut sein. Steht hinter dessen Typendeklaration ein "of object", dann muß es eine Methode werden, also innerhalb "irgendeiner" Klasse, bzw. eines instanziierten Objektes liegen. Hierfür kannst du notfalls auch eine eigene Klasse anlegen, davon ein Objekt erstellen und die Methode dieses Objektes nun dem Event zuweisen. |
Re: Procedure als Event definieren? Wenn ja, wie?
wenn ich das event auf einer form anspreche schauts so aus:
Delphi-Quellcode:
das ist natürlich nur ein auszug...
TMain = class(TForm)
procedure ASQLite3Query1BeforeInsert(DataSet: TDataSet); end; implementation procedure TMain.ASQLite3Query1BeforeInsert(DataSet: TDataSet); begin [...] end; Aber da das objekt dynamisch in einer Unit erzeugt wird ists net so einfach für mich -.- Was macht eigentlich das "stdcall"? |
Re: Procedure als Event definieren? Wenn ja, wie?
Zitat:
Zitat:
Zitat:
Im Pascal werden Parameter vorzugsweise in die Register gelegt, wärend beim StdCall die Parameter im Stack landen. (wie es oftmal in C++ und der WinAPI der Fall ist) Was genau passiert ist aber für dich nicht wichtig, sondern nur daß dieses übereinstimmt. PS: Wenn die Signatur nicht stimmt, dann meckert Delphi, bzw. der Compiler schon rum. |
Re: Procedure als Event definieren? Wenn ja, wie?
ich komm echt net weiter!!!
Ach so eine SCHEI*E... -.- ich habe diese funktion:
Delphi-Quellcode:
egal was ich mache, ich kriegs net hin :cry: :cry: :cry: :cry: :cry:
procedure BeforeInsert(DataSet: TDataSet);
begin Showmessage(Command.SQL.Text); end; ich will doch nur
Delphi-Quellcode:
(Command vom Typ TASQLite3Query)
command.BeforeInsert := BeforeInsert(nil);
-> Inkompatible Typen: TDataSetNotifyEvent und procedure... ich könnte heulen weil ich nicht ein Wort hier verstehe und mich, selbst nach eurem einsatz der sehr lobenswert ist, immer noch net schlauer fühle... |
Re: Procedure als Event definieren? Wenn ja, wie?
Delphi-Quellcode:
Du musst also eine Methode zuweisen (of object)
type TDataSetNotifyEvent = procedure(
DataSet: TDataSet ) of object; => Dummy Klassse erstellen, mit einer Methode und zuweisen (bei der Zuweisung keine Parameter!) Alternativ gibt es auch einen kleinen Hack, der es ermöglicht eine Prozedur als Event zu verpacken und dann zuzuweisen, da muss ich nochmal kurz gucken ... ich glaub das war von himi Doch nicht himi sondern Mirage: ![]() |
Re: Procedure als Event definieren? Wenn ja, wie?
komm ich mir nur dumm vor oder bin ich es?
Delphi-Quellcode:
ergeben noch immer den selben fehler -.-
type
TDummeKlasse = Class(TObject) Procedure BeforeInsert(DataSet: TDataSet); End; [...] command.BeforeInsert := TDummeklasse.BeforeInsert; // oder command.BeforeInsert := BeforeInsert; ich versteh glaube echt nicht was ihr mir hier erklären wollt... |
Re: Procedure als Event definieren? Wenn ja, wie?
Delphi-Quellcode:
type
TDummyKlasse = Class(TObject) Procedure BeforeInsert(DataSet: TDataSet); End; [...] var temp = TDummyKlasse.Create(); command.BeforeInsert := temp.BeforeInsert; // ggf. absichtliches Speicherleck |
Re: Procedure als Event definieren? Wenn ja, wie?
Oder so...
Delphi-Quellcode:
type
TDummy = class class procedure BeforeInsert(DataSet:TDataSet); end; { TDummy } class procedure TDummy.BeforeInsert(DataSet: TDataSet); begin end; : : begin command.BeforeInsert:=TDummy.BeforeInsert; end; |
Re: Procedure als Event definieren? Wenn ja, wie?
Zitat:
Delphi-Quellcode:
irgendwie springt er trotzdem nicht in das sch**ß event rein :-(
type
TDummeKlasse = Class(TObject) Procedure BeforeInsert(DataSet: TDataSet); End; --- procedure TDummeKlasse.BeforeInsert(DataSet: TDataSet); begin Showmessage(Command.SQL.Text); end; --- function GlobalInit : Boolean; var X : TDummeKlasse; begin result := false; X := TDummeKlasse.create; [...] command.BeforeInsert := X.BeforeInsert; [...] end; Was mach ich noch alles falsch?! |
Re: Procedure als Event definieren? Wenn ja, wie?
Zitat:
und ja, ein paar Mal hatte ich es auch erwähnt. Aber es hatt seinen Grund, warum ich (und auch Andere) hier mehrmals den offiziellen Weg und nicht den Hack erwähnte. Zitat:
Und den anderen Trick, der mit dem NIL-Objekt, erwähn ich besser auch nicht. So, das was jfheins schieb, hatten wir jetzt mehrmals beschrieben ... was ist daran also bitte so schwer, daß man es nicht versteht? Zitat:
Du gibst X aber nicht zu früh frei? |
Re: Procedure als Event definieren? Wenn ja, wie?
Zitat:
ich kann verstehen das du langsam die geduld verlierst... -.- mir würde es sicher net anderst gehen. dann betrachte mich gerne als etwas zurückgeblieben wenn nötig. aber nein, ich versteh nicht WAS ICH AN DEM EBEN GENANNTEN CODE falsch mache... ich verlange ja nicht das ich das "of object" oder "Procedure-zeiger" oder sonst was verstehen. (Hey, immerhin habe ich dank dir den aufruf "stdcall" verstanden. auch wenn ich net weiß wann und wo man ihn einsetzt!) Ich lese das was ihr schreibt und versucht es zu verstehen! den meisten code den ihr hier postet ist entweder unkommentiert oder mit so viel fachgesimpel voll das ich ihn net verstehe -.- ich will auch keinen "sogenannten" "hack" anwenden. ich will nur das das programm macht was es soll. das ist alles... ich verlange ja nicht die welt sondern nur das das was ich bisher gemacht habe funktioniert oder, was toll währe, wenn ihr mir sagt das ich schei*e verzapfe, am besten WO ich mist mache und WAS daran falsch ist! Ich bin bereit zu lesen, kopf ein zu setzen und aus zu probieren... was soll ich denn noch machen????????? Sag es mir und ich versuche es!!!!!! |
Re: Procedure als Event definieren? Wenn ja, wie?
Also dein Code aus der #19 sollte so eigentlich funktionieren.
An deinem gezeigten Beispielcode dürfte es noch nichtmal ein Problem geben, selbst wenn du "ausversehn" der Dummy-Objekt in deiner Initprozedur wieder freigibst. Zitat:
Delphi-Quellcode:
Wie gesagt, so ist es eigentlich richtig,
// Hierfür kannst du notfalls auch eine eigene Klasse anlegen,
type TDummeKlasse = Class(TObject) Procedure BeforeInsert(DataSet: TDataSet); End; procedure TDummeKlasse.BeforeInsert(DataSet: TDataSet); begin Showmessage(Command.SQL.Text); end; --- function GlobalInit : Boolean; var X : TDummeKlasse; begin result := false; // davon ein Objekt erstellen X := TDummeKlasse.create; [...] // und die Methode dieses Objektes nun dem Event zuweisen. command.BeforeInsert := X.BeforeInsert; [...] end; // X besser globaler deklarieren // und erst freigeben, wenn "command" gelöscht wurde // oder wenn TDummeKlasse.BeforeInsert nicht mehr benötigt wird. also muß der Fehler, warum es immernoch nicht geht, irgendwo anders sein. |
Re: Procedure als Event definieren? Wenn ja, wie?
Zitat:
![]() |
Re: Procedure als Event definieren? Wenn ja, wie?
Zitat:
|
Re: Procedure als Event definieren? Wenn ja, wie?
Zitat:
Die Instanz x der Dummyklasse muß nicht unbedingt erstellt sein, da auf keine members zugegriffen wird. Also die Zeile
Delphi-Quellcode:
braucht es nicht. Dann muß man sich auch nicht um die Freigabe kümmern.
X := TDummeKlasse.create;
blauweiss |
Re: Procedure als Event definieren? Wenn ja, wie?
@Medium:
So, fertig mit lernen -.- Aber so eine Aussage ist nen bissel unpassend wie ich finde. Zu den Grundlagen zählt dieses Problem sicherlich nicht: Eine bestehende Procedure einem Objekt-Event zu zu weisen. Oder? Wenn doch, bitte zeige mir einen Link wo ich dieses gehobene Wissen erlangen kann damit ich der Gemeinschaft nicht mehr auf den sack gehe... --- @uligerhardt: So, mit Hilfe von omatas Code (den ich absichtlich nicht benutzt habe) geht es jetzt. Aber mal eine Rückfrage dazu: Was sagt eigentlich das "class" vor der procedure? "class procedure XYZ(I : Integer);" Sowas hab ich bisher noch nicht gesehen... Und wieso muss man dort kein Objekt erzeugen? Wie kann ich also auf den inhalt eines objektes zugreifen wenn ich es ja nirgends erzeugt habe? :gruebel: das ist mir nicht ganz schlüssig... |
Re: Procedure als Event definieren? Wenn ja, wie?
Zitat:
Deshalb gehört die Methode nicht zu einem speziellen erzeugten Objekt sondern zur Klasse. Heißt im Umkehrschluss natürlich, dass du nicht auf andere Elemente ohne das "class" zugreifen kannst, da die zu einer Instanz gehören. Um es mal anders zu erklären: Stell dir ein Auto vor. Eine Methode "Tür schließen" bezieht sich auf ein spezielles Auto. Diese werden erzeugt / gebaut und die Methode kann man nicht ohne ein spezielles Auto-Objekt benutzen. Jetzt nimm aber die Funktion "Bremsweg berechnen". Der übergibst du einfach die Geschwindigkeit und du bekommst den Bremsweg zurück. Dabei brauchst du kein spezielles Auto, sondern es reicht, dass du sagst, dass du das bei einem Auto, also der Klasse TAuto z.B. berechnen willst. (Oder eben bei TKreuzfahrtschiff. :mrgreen:) |
Re: Procedure als Event definieren? Wenn ja, wie?
Zitat:
![]() |
Re: Procedure als Event definieren? Wenn ja, wie?
Zitat:
Einen Link muss ich Dir nicht geben, denn ich glaube, mit 'OOP', 'OOP Delphi', 'Grundlagen OOP Delphi', 'Delegat OOP', 'Delegat Delphi' usw. kommst Du schon recht weit. Du willst objektorientiert programmieren, aber ohne die Grundlagen zu kennen und regst Dich auf, wenn man dir das so sagt. Nun ja. Du hast also ein TDataset-Derivat und willst sein BeforeInsert-Ereignis/Delegat belegen? 1. Im Designer klickst Du auf dein TDataset (TASQLListe-Dingsda) 2. Dann wechsest Du im Objektinspektor auf die Ereignisseite 3. Nun doppelklickst Du in den Eintrag rechts vom 'BeforeInsert' 4. Wupps, hat Delphi ein Delegat erstellt und du kannst das nun mit Leben füllen. Nun weisst Du, wie das Delegat aussehen muss. Manuell zuweisen geht so:
Delphi-Quellcode:
Wir helfen hier im Forum jedem gerne, aber Grundlage hierfür ist der Wille zum Lernen. Und schnippische kleine Zicken können wir hier gar nicht leiden. :zwinker:
...
MyDataset.BeforeInsert := MyBeforeInsertDelegate; // Ohne Parameter, ohne Klammern, nix. // Und wenn das Delegat zu einem anderen Objekt gehört: MyDataset.BeforeInsert := TheOtherObjet.MyBeforeInsertDelegate; |
Re: Procedure als Event definieren? Wenn ja, wie?
Zicke? :shock:
das ist ja bööööööse.... :( nun, grundlagen habe ich gelesen. und was OOP bedeutet ist mir auch klar... ich bin bereit zu lesen und zu lernen. sonst würde ich ja keine Fragen hier im Forum stellen... Meine "Hausaufgaben" soll ja auch keiner von euch machen und ja, ich rege mich auf wenn man mir das so sagt. -.- Ich habe Grundlagen gelernt und mitlerweile 2 Delphi-bücher durch geackert... das ich dabei nicht auf das angesprochene gestoßen bin kann an mehreren punkten liegen: - Ich habs einfach überlesen oder vergessen (überlesen ist aber warscheinlicher) - das buch war schwer verständlich - da es sich um ein anfänger-buch gehandelt hat war das vielleicht nicht mit drinne? nun auch egal, es hat geklappt und das ich noch einiges lernen muss weiß ich auch so... :( Dafür macht man ja eine ausbildung... |
Re: Procedure als Event definieren? Wenn ja, wie?
Zitat:
Bücher sind auch von unterschiedlicher Qualität. Zitat:
Bereit sein zu lesen und zu lernen ist eine Sache, Hilfe dabei zu erkennen und annehmen zu können offenbar eine andere. |
Re: Procedure als Event definieren? Wenn ja, wie?
ich sag nix mehr...
vielen dank -.- |
Re: Procedure als Event definieren? Wenn ja, wie?
Zitat:
Zitat:
Zitat:
|
Re: Procedure als Event definieren? Wenn ja, wie?
Oh, ich hab's zwar auf alzaimars Posting bezogen verstanden, aber den Zicken-Satz wohl überlesen :oops:. Dass der - auch gern ohne Zwinkergelbling - nicht ganz unberechtigt war, hat stho ja eins über dir jetzt schön bewiesen :).
|
Re: Procedure als Event definieren? Wenn ja, wie?
Ich habe nie nicht niemanden Zicke genannt.
Ich habe nur gesagt, das wir die nicht leiden können. So wie schmollende Sumpfdohlen. Oder ignorrante Kalbsschädel. Zum Beispiel. |
Re: Procedure als Event definieren? Wenn ja, wie?
Oder anziehende Fettnäpfchen.
|
Re: Procedure als Event definieren? Wenn ja, wie?
Hallo,
was mich an der ganzen Sache wundert.
Delphi-Quellcode:
Wenn ich ein Compiler wäre, würde ich sagen
procedure TDummeKlasse.BeforeInsert(DataSet: TDataSet);
begin Showmessage(Command.SQL.Text); end; Command not found Wenn schon, dann DataSet.Command Heiko |
Re: Procedure als Event definieren? Wenn ja, wie?
Zitat:
|
Re: Procedure als Event definieren? Wenn ja, wie?
Hallo,
naja ;) aber was macht das für einen Sinn. Er will ja, dass das Insert-Statement des jeweiligen DataSets angezeigt wird. Solte das DataSet wirlich "global" irgendwo rumlungern, bezeichne ich das mal als "Weg zum Bug" ;) Heiko |
Re: Procedure als Event definieren? Wenn ja, wie?
Hallo,
ich würde doch gern mal wissen, woher der TE weiss, dass das ShowMessage nicht "angesprungen wird", vielleicht wird ja nur '' zurückgeben. Ein bissel mehr Quellcode wäre nett. Heiko |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:26 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz