Entwickler-Ecke
Sonstiges (Delphi) - [Komponente Entwickeln] Ereignisse
hui1991 - Do 10.05.07 17:56
Titel: [Komponente Entwickeln] Ereignisse
Hallo,
ich brauche hilfe bei meinem TCheckTreeView, das ich doch geschafft habe zu programmieren. Etz will ich es in einer Komponente packen. Blos die Komponente sollte bei OnChange, OnMouseDown eine Procedure ausführen. Blos ich weis leider nicht wie es geht. Die Anleitung auf dsdt.info (
http://dsdt.info/tutorials/kompentwickeln/?page=6) klappt bei mir leider nicht. Jetzt suche ich Rat, wie macht man sowas? Ich will, wenn der Benutzer auf das TreeView klick, wird der Komponente in eine Procedure die X und Y werte gesendet und vllt noch den Sender (falls nötig). Blos ich kann darauf nicht zugreifen. Code habe ich keinen da, weil ja des nicht geht.
Ich bitte um Rat^^
MfG
hui1991
BenBE - Fr 11.05.07 08:20
Nicht funktionierender Code kann manchma sehr hilfreich sein ;-)
Im Allgemeinen hast Du aber bei den Basis-Komponenten eine Reihe von Protected-Attributen, und -Methoden, die Du für deine Arbeit überschreiben kannst. Siehe Hilfe ...
hui1991 - Fr 11.05.07 14:40
Also ich habe im protected das hier stehen:
Delphi-Quelltext
1:
| procedure Change(Sender: TObject; Node: TTreeNode); |
und
Delphi-Quelltext
1: 2: 3: 4:
| procedure TCheckTreeView.Change(Sender: TObject; Node: TTreeNode); begin Node.StateIndex:=1; end; |
Problem ist das das hier kommt:
[Error] Unit1.pas(14): Unsatisfied forward or external declaration: 'TForm1.CheckTreeView1Change'
Kann es sein, dort wo die Komponente drin ist, schon Change ausgeführt wird und deswegen der Fehler da ist?
---------
Habe Fehlermeldung behoben, habe es in Unit rein Getan und net in Kompounit und dann wars doppelt drin.
Naja aber so wie ich das etz sehe wird die Prozedure nicht ausgeführt.
Warum?
HelgeLange - Fr 11.05.07 15:23
Wenn man eine Komponente baut, die sich von einer anderen ableitet, nimmt man NICHT die Ereignisse der Vorfahren-Komponente, um auf Situationen zu reagieren !
Du musst schauen, wo in TTreeView die Ereignisse gefuert werden und diese Methoden sind oftmals virtual, so dass du sie überschreiben kannst. Das Ereignis bleibt so dem Anwender vorbehalten und du kannst trotzdem Deinen Code ausführen
hui1991 - Fr 11.05.07 17:20
Tja, da kann ich es wieder in den Sand stecken, wenn das wieder so kompliziert ist :(
Ich will doch nur darauf reagieren und nicht die Ursprungsdatei verändern.
ABer wenn das net geht, dann muss ich das wohl lassen :cry:
HelgeLange - Fr 11.05.07 18:02
argl.. du änderst doch nicht die ursprungsdatei, sondern du leitest ab.
hui1991 - Fr 11.05.07 20:24
Aber so wie ich das mache, funktioniert es leider nicht :(
ICh habe keinen Plan warum und wie das funktioniert.
Deswegen komme ich hier nicht weiter.
HelgeLange - Fr 11.05.07 21:00
dann schau doch mal, wo in der Ursprungskomponente dein Event aufgerufen wird, überschreib diese function, setz ein inherited rein und mach deinen kram dazu.
hui1991 - Sa 12.05.07 18:49
Das heißt ich kann diese Unit auch net veröffentlichen.
Ach mist...
Würde es in einer Komponente sein, mache ich mir nur einmal die Arbeit und es passt sich selber an.
Und so muss ich es immer rumkopieren. :(
MfG
hui1991
hui1991 - So 13.05.07 22:11
Gibt es doch eine Lösung?
Weil ohne das kann ich auch net weiter machen.
Andere haben es doch auch geschafft, warum will mir keiner das veratten.
Ich will doch nur wissen wie man das macht.
Weil google mag mich nicht :(
Vllt. bin ich einfach nur zu blöd um etwas darüber in Google zu finden.
Hoffe das ich unter dem nächsten Stein die Lösung finde.
HelgeLange - So 13.05.07 22:48
Such doch mal, wie man von vorhandenen Klassen Ableitungen machen kann (Vererbung) und dabei Methoden überschreiben... Das sollte doch nicht sooo schwer sein
hui1991 - Di 15.05.07 17:45
Ich weis ja net was ich falsch mache, aber keine Ahnung ich finde es nicht so.
Und wenn ja verstehe ich es net, warum das net geht.
Ich habe wirklich keine Ahnung.
Soll ich das wirklich in den Sand stecken?
Wenn ich "Delphi Komponente vererben ereignisse überschreiben" ist nur ein Treffer gut und das ist diese Seite im Forum:
http://www.delphi-forum.de/viewtopic.php?p=440226
Der Rest ist irgendwie Müll, ich bin denke ich wirklich zu blöd oder die aufgabe ist zu schwer :cry:
HelgeLange - Di 15.05.07 20:56
die Direktive zum überschreiben ist "override", damit kann man virtuelle methode von Komponenten überschreiben, um ihne zusätzliche Funktionen in einem abgeleiteten Object beizubringen (dazu innerhalb der Methode "inherited" aufrufen). Oder man kann auch eine neue komponente die Methode so überschreiben lassen, dass der Code der alten methode nicht mehr ausgeführt wird ("inherited" eben nicht aufrufen).
Und jetzt schau mal in der hilfe unter "inherited", "virtuell" und "override", da wirst Du bestimmt fündig
hui1991 - Di 15.05.07 21:24
Ich bin wirklich zu blöd dazu :(
Ich habe das gemacht:
Delphi-Quelltext
1:
| procedure Change(Sender: TObject; Node: TTreeNode); override; |
und
Delphi-Quelltext
1: 2: 3: 4:
| procedure TCheckTreeView.Change(Sender: TObject; Node: TTreeNode); begin Node.StateIndex:=1; end; |
und dann kam das
Delphi-Quelltext
1:
| [Error] CheckTreeView.pas(17): Declaration of 'Change' differs from previous declaration |
Ich denke das heißt, er will was überschreiben was es, aber davor noch nicht gab.
Hm.. ich kann das auch net genau sagen, da ich das Englisch nur grob verstehe.
Naja.. danke für den Ansatz, aber das hatte ich doch schon probiert, blos immer vergessen hier zu schrieben.
Ich schau mir mal die Hilfe genauer an und suche mal was auf Deutsch. ^^
HelgeLange - Di 15.05.07 21:56
die Methode Change hat bestimmt keinen "Sender: TObject" ;)
Du musst beim TreeView selbst schauen, wie das definiert ist
hui1991 - Mi 16.05.07 17:49
Danke,
habe das weg getan und man kann es ausführen, problem ist das Change nicht ausgeführt wird, wenn eine Zeile sich ändert oder hinzugefügt wird sondern, wenn man des anklickt. Naja ich habe das dann weg getan und das bei der Eingabe Procedure auf 1 gesetzt. Naja und dann habe ich MouseMove verwendet für die Änderugen ^^
Dies habe ich im Normalen Projekt auch schon mal gemacht.
Beim Normalen Projekt geht es
Bei dem mit der Kompon net :(
Naja muss ich halt schauen warum ^^
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!