Entwickler-Ecke
Sonstiges (Delphi) - Dynamisch Prozeduren zuweisen
Arakis - Sa 06.07.02 21:04
Titel: Dynamisch Prozeduren zuweisen
Hi

,
weiß jemand von euch wie man zur Laufzeit sagen kann, welche Prozedur aufgerufen werden soll, falls eine definiert wurde.
So wie bei einem ganz normalen Ereignis:
Quelltext
1:
| Button1.onClick:=MeineOnClick_Proc; |
Nur mit dem Unterschied, dass ich erstmal einen "Ereignis" definieren muss, also, wie erstellt man selbst so ein "onClick"? Das ist nämlich eine Eigenschaft vom Typ TNotifyEvent.
Bis dann
FriFra - Sa 06.07.02 22:42
Da brauchst Du im Prinzip nur eine neue Procedure anzulegen, welche die gleichen Parameter hat, wie die "original"-Procedure. Diese eigene procedure kannst du nun jederzeit dem betreffenden Ereignis belibiger kompatibler Komponenten zuordnen.
Arakis - Sa 06.07.02 22:56
Hmmm, sagt mir jetzt ehrlich gesagt nix. Ich glaub, das Problem ist sogar noch etwas komlizierter. Also: Ich hab eine Komponente gemacht, die einen TWebbrowser enthält, und so mit Hilfe des DesignModus des IEs eine HTMLEdit-Kompo darstellt. So mit setBold, setItalic per per Prozedurauffuf und so. Jetzt hab ich eine zweite Komponente, die nur die Buttons enthält, d.h man kann dann halt die HTMLEdit-Kompo so bequem zu bedienen, ohne jedes mal einen Haufen Buttons auf dem Formular zu erstellen. Die HTMLEdit-Komponente soll jetzt ein Ereignis "onUpdate" haben, so dass die Button-Komponente dieses abfängt und die Buttons entsprechen aktiviert oder deaktiviert. Nur wie bekomme ich das hin? Ich hab mir schon überlegt, ob ich denn nicht einfach nur ein Zeiger übergebe, aber dazu müssen sich Units im Interface-Teil gegeseitig einbinden, was aber zu einem "Überkreuzender Bezug zweier Units auf 'HTMLEditControl'" führt.
Wer gut, wenn jemand ein kleines Beispiel oder so hätte.
Bis dann
Klabautermann - So 07.07.02 00:42
Hallo,
ich erkläre das jetzt anhand einer HitroySerchKombo die ich einmal erstellt habe. In anbetracht der fortgeschritenen Zeit habe ich keine Lust mehr das zu übertragen aber das solltest du auch hinbekommen ;).
Diese ComboBoc, generiert ein Ereigniss
OnAddToHistory welches immer dann ausgelöst wird wenn ein neuer Eintrag der History List hinzugefügt wird.
Zuerst, muss ein Prototyp für die Ereignisbehandlungsroutine erstellt werden. In meinem Fall sieht das so aus:
Quelltext
1:
| TOnAddedToHistory = procedure (VAR Text : STRING; VAR AddIt : BOOLEAN) OF OBJECT; |
Dieses geschieht völlig uabhängig von dem Objekt in dem es verwendung findet über der Dektaration dieses Objektes im Type abschnitt.
Danach deklarierts du unter Protected (oder Private) eine Variable von diesem Prototypen:
Quelltext
1:
| FOnAddToHistory: TOnAddedToHistory; |
Als dritten Schritt richtest du ein Property unter published ein:
Quelltext
1:
| property OnAddToHistory : TOnAddedToHistory read FOnAddToHistory write SetOnAddToHistory; |
Wobei du natülich wie bei jedem Property lesende wie schreibende Behandlunsroutinen definieren kannst, die im einfachsten Fall so aussehen:
Quelltext
1: 2: 3: 4: 5:
| procedure ToHistorySearchCombo.SetOnAddToHistory( const Value: TOnAddedToHistory); begin FOnAddToHistory := Value; end; |
Zu guter letzt, ist es natürlich noch nötig, dass du das Ereignis auslöst, wenn es denn eine Behandlungsroutine zugeordnet hat. Du musst also an den entsprechenden Stellen in deinem (komponenten) Code noch etwas äquialentes zu dem hier einfügen:
Quelltext
1: 2:
| IF Assigned(OnAddToHistory) THEN BEGIN OnAddToHistory(ToListText, AddIt); |
So, ich hoffe das Prinzieb ist klar geworden und ich konnte ein wenig helfen.
Gruß
Klabautermann
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!