![]() |
Event Zuweisung und Modifikation in eigenen Komponenten
Seas,
bin gerade dabei meine erste eigene Komponente zu schreiben und bei mir sind ein paar fehler aufgetreten. Zuerst mein Quellcode - Ausschnitt:
Delphi-Quellcode:
1. Alle drei Procedures in der Protected section werden mit "Deklaration unterscheidet sich von vorheriger Deklaration" bemängelt. Was ist hier falsch?
type
TMp3Grid = class(TStringGrid) private FBeforeEdit:string; protected procedure DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); override; procedure SetEditText(Sender: TObject; ACol, ARow: Integer;const Value: string); override; procedure SelectCell(Sender: TObject; ACol, ARow: Integer;var CanSelect: Boolean); override; public constructor Create(AOwner:TComponent); override; procedure SelfSize; published property OnMouseWheelDown; property OnMouseWheelUp; property OnDragOver; property OnSetEditText; property OnSelectCell; end; 2. Wenn ich in meiner Form der Komponente, per Klick auf das Ereignis OnMouseWheelDown, eine Event Handler Procedure zuweiße so wird diese nicht ausgeführt. Was ist hier falsch? 3. Verständnisfrage:
Delphi-Quellcode:
Diese Procedure ist eine der "überschriebenen" procedures in meiner neuen Komponente.
procedure TMp3Grid.DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean); begin accept:=true; inherited DragOver(sender,source,x,y,state,accept); end; Wenn ich jetzt noch zusätzlich in der Form drin eine Eventhandler procedure deklariere, wie sieht dann der Abarbeitungsblock aus? Zitat:
MfG |
Re: Event Zuweisung und Modifikation in eigenen Komponenten
Hi,
mir fällt erst mal folgendes auf die Schnelle auf.
Delphi-Quellcode:
Ich denke, du erkennst den Unterschied.
// aus TComponent
procedure DragOver(Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); dynamic; // deine methode procedure DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); override; Weiterhin sind die Methoden OnMouseWheelDown, OnMouseWheelUp, OnDragOver ... bereits als Published definiert (TDrawGrid). Also, pass die Methoden an und lass die bereits als Published definierten Members in deiner Klasse weg. Frank |
Re: Event Zuweisung und Modifikation in eigenen Komponenten
Zitat:
Delphi-Quellcode:
1. bleibt bestehen für den punkt "select cell"
type
TMp3Grid = class(TStringGrid) private FBeforeEdit:string; protected procedure DragOver(Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); override; // sender entfernt procedure SetEditText(ACol, ARow: Integer;const Value: string); override; // sender entfernt procedure SelectCell(ACol, ARow: Integer;var CanSelect: Boolean); // sender auch entfernt aber override bringt hier immernoch fehler public constructor Create(AOwner:TComponent); override; procedure SelfSize; published // deklarationen entfernt end; 2. hat sich nichts geändert.. frage steht weiterhin. 3. auch nichts geändert neue frage: 4. wenn ich das package neu kompiliere wird dann auch immer sofort die kompo in delphi aktualisiert? //edit: 5. komischer bug bei mir.. ab und zu wenn die delphi kontexthilfe aufgerufen wird, wird irgendwie meine tastatur blockiert, sodass ich in delphi gar nichts mehr tippen kann.. nach einem delphi neustart gehts wieder... wie kann das sein? |
Re: Event Zuweisung und Modifikation in eigenen Komponenten
Wie kommst du auf canSelect als Parameter? Den gibt es nicht.
|
Re: Event Zuweisung und Modifikation in eigenen Komponenten
äh?
doppelklick auf select cell bei einem normalen tstringgrid und du erhälst diese parameter für die event procedure... :wink: Zitat:
|
Re: Event Zuweisung und Modifikation in eigenen Komponenten
Coder1990, könntest Du bitte diesen TOFU-Unsinn lassen? Ist ja übel.
|
Re: Event Zuweisung und Modifikation in eigenen Komponenten
wtf?!
Vorrausgesetzt du sprichst hier nicht von einer weißlichen masse aus sojabohnen, versteh ich deinen "flame" nicht falls du mein zitieren meines eigenen posts meinst, dann sei dir gesagt dass ich das nur getan habe um das thema auf die GESAMTE fragestellung zurückzulenken... bis auf dataspider konnte mir ja bisher noch niemand weiterhelfen deswegen entschuldigt meinen missmut und meine ungeduld .. es ist nunmal essentiell für mein projekt dass ich diese probleme erst aus dem weg schaffe bevor ich weiterarbeiten kann. und nun back to topic!! nicht dass das hier wieder in einer offtopic diskussion endet also nun bitte sinnvolle lösungsvorschläge oder hinweiße... danke MfG |
Re: Event Zuweisung und Modifikation in eigenen Komponenten
Zitat:
zu 2: ich habe hier leider gerade keinen Rechner mit Mausrad und kann das leider nicht testen. Zitat:
So und jetzt nochmal zum 1. Punkt: Das ist gar nicht so leicht zu beantworten, weil ich keine Gedanken lesen kann. Wenn die überschriebenen Methoden wirklich so sein sollen wie du sie in deinem ersten Post deklariert hat, dann musst du sie hart überschreiben.
Delphi-Quellcode:
und in den Methoden kannst du dann immer noch ein inherited verwenden, aber eben nur mit den Parametern der übergeordneten Methode...
TMp3Grid = class(TStringGrid)
private FBeforeEdit:string; protected procedure DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); reintroduce; procedure SetEditText(Sender: TObject; ACol, ARow: Integer;const Value: string); reintroduce; procedure SelectCell(Sender: TObject; ACol, ARow: Integer;var CanSelect: Boolean); reintroduce;
Delphi-Quellcode:
Oder aber du willst die Methoden nur überschreiben und ihren Aufbau unverändert lassen, dann musst du sie mit override überschreiben. Aber auch gefälligst den gleichen Aufbau beibehalten.
procedure TMp3Grid.DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
begin inherited DragOver(Source, X, Y, State, Accept); end; procedure TMp3Grid.SelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean); begin if inherited SelectCell(ACol, ARow) then begin end; end; procedure TMp3Grid.SetEditText(Sender: TObject; ACol, ARow: Integer; const Value: string); begin inherited SetEditText(ACol, ARow, Value); end;
Delphi-Quellcode:
und in den Methoden kannst du dann einfach inherited verwenden, um die übergeordneten Methode aufzurufen...
TMp3Grid = class(TStringGrid)
private FBeforeEdit:string; protected procedure DragOver(Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); override; procedure SetEditText(ACol, ARow: Integer;const Value: string); override; function SelectCell(ACol, ARow: Longint): Boolean; override;
Delphi-Quellcode:
Und noch ein paar Gedanken...
procedure TMp3Grid.DragOver(Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean); begin inherited; end; function TMp3Grid.SelectCell(ACol, ARow: Integer): Boolean; begin Result:=inherited SelectCell(ACol, ARow); end; procedure TMp3Grid.SetEditText(ACol, ARow: Integer; const Value: string); begin inherited; end; Um in einem Projekt eine Komponente mehrfach einzusetzen ist es nicht unbedingt nötig eine eigene, abgeleitete Klasse zu erstellen. Dies würde auch problemlos über einen Frame gehen. Dort die Komponente drauf und schon sind alle Methoden in eine eigene Unit ausgelagert und man kann visuell seine speziellen Erweiterungen einmal schreiben und kann diese in seinem Projekt auch mehrfach einsetzen. Dann gibt es auch keine Probleme mit neukompilieren, installieren und in anderen Delphi-Varianten, die keine eigenen Komponenten in die IDE integrieren können. |
Re: Event Zuweisung und Modifikation in eigenen Komponenten
Wow da hast du dir viel arbeit gemacht .. danke
1. Ich wollte eigentlich nur einfach ein paar extra Befehlszeilen z.b. eine Variablenzuweisung von der Komponente selbst da einbauen.. also die standart procedure beibehalten und meinen eigenen text einfügen. Mit deinen Worten: Ich will nur die Methoden überschreiben! Ich wollte ja eigentlich den Aufbau genau gleich lassen, aber ich weiß nicht wo man den Originalaufbau einer Methode herbekommt bzw. wo man den auslesen kann.. deswegen hab ich einfach die procedure heads aus der form kopiert wenn man dort ein neues event einträgt .. Hätte mich vll deutlich ausdrücken sollen :roll: Werde ich morgen testen usw. 3. hmm ich bin da nicht so arg in der theorie drin .. ich meine halt wenn z.b. ein standart event wie onclick abgearbeitet wird wie dass dann aussieht.. @ deine paar Gedanken: kA was ein Frame ist, ich lerne Object Pascal über die Schule und die Lehrerin bringt uns die grundbegriffe nicht bei .. eine eigene komponente war für mich nunmal einfach das naheliegenste weil ich sowas wie frames gar nicht MfG - Danke |
Re: Event Zuweisung und Modifikation in eigenen Komponenten
Zitat:
Zitat:
Bevor Du dich weiter im Schreiben eigener Komponenten versuchst, lernst Du vielleicht erstmal etwas Geduld, Benimm und Freundlichkeit. Danach lernst du LESEN und SCHREIBEN, denn die bisherigen Fragen, die Dir omata in seiner typisch fundierten Art beantwortet hat, hättest Du durch geduldiges Studium der OH, Internetrecherche o.ä. selbst rausfinden können. Ich kann nur immer wieder auf die üblichen Formen hinweisen, die korrekte Rechtschreibung (aus Respekt vor den potentiellen Antwortern) und etwas Zurückhaltung gepaart mit instantaner Selbstkritik beinhalten. Es ist ja nicht so, das wir uns hier drum prügeln, anderen zu helfen, gelle? And nuh wieder back to the eigentliche Problem: Ich würde eine Komponente erst verändern, wenn ich genügend Erfahrung im Customizing gesammelt habe (von OOP ganz zu schweigen). Normalerweise sollte die von Dir gewünschte Funktionalität (welche eigentlich?) durch Überschreiben der Ereignisse zu erreichen sein. Wenn du dann damit zufrieden bist, bleibt Dir immer noch die Möglichkeit, eine eigene Komponente zu schreiben. Das Stichwort 'Frame' ist schon gefallen, insofern wäre das sicherlich der einfachere Weg (statt einer Komponente). Es ist i.A. besser, zu erzählen, WAS man erreichen will, anstatt die Sackgasse zu zeigen, in der man sich verannt hat. Vermutlich ist der Weg dorthin schon der Falsche. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:55 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 by Thomas Breitkreuz