![]() |
TRadioGroup klickt falsch
Hallo alle,
ich habe von TRadioGroup eine datenbanksensitive Komponente abgeleitet, die Daten aus einer Datenbank anzeigen und ändern kann (jeweils durch Auswählen eines Eintrages). Auch "Übersetzungen" sind möglich, also kann kann man festlegen, dass z.B. der Eintrag "grün" aus der Box dem Wert "g" in der Datenbank entspricht etc. Das funktioniert soweit wunderbar :-) Das Problem ist die Methode Click. Wenn meine Kompo den Fokus hat und das übergeordnete Formular geschlossen und später wieder geöffnet wird, wird das Click-Ereignis ausgeführt (wodurch meine Kompo den aktuell selktierten Eintrag in die Datenbank schreibt). Das kann aber nach einem Datensatzwechsel ein ungültiger Eintrag sein :-( Ich behelfe mir vorläufig damit, dass ich beim Öffnen des Formulars (OnActivate) einer anderen Komponente den Fokus übergebe. Das ist natürlich noch keine allgemeingültige Lösung des Problems. Letztlich wird der falsche RadioGroup-Click beim Anzeigen des Formulars durch die Methode UpdateButtons aufgerufen (was ich tatsächlich ziemlich unnsinnig finde, da ja hier niemand etwas anklickt). Diese und die damit zusammenhängenden Methoden lassen sich aber nicht überschreiben, so dass ich darauf nicht gesondert reagieren kann. Ich möchte auch gern vermeiden, die komplette Unit ExtCtrls neu zu erfinden... Kann ich also innerhalb meiner Kompo irgendwie erkennen, dass das Formular, in dem sich diese befindet, geschlossen oder geöffnet wird? Kann man dazu ein Ereignis abfragen? Paint, Update und Refresh funktionieren nicht, da Click bereits vorher aufgerufen wird. Danke Stahli |
Re: TRadioGroup klickt falsch
Hallo Stahli,
eine direkte Hilfe habe ich nicht. Aber suche mal nach etwas wie Mode oder State für die Komponente oder (sicherer) für das Formular: Der Inhalt von Click soll erst ausgeführt werden, wenn das Formular endgültig aktiviert ist. Vielleicht wirst Du in dieser Richtung fündig. Viel Erfolg! Jürgen |
Re: TRadioGroup klickt falsch
Hallo Jürgen,
ComponentState hat mir leider nicht weitergeholfen, da die Komponente beim Einblenden des Formulars ja nicht erzeugt wird o.ä. Ereignisbehandlungen im Formular selbst möchte ich gern vermeiden, da die Komponente in jedem normalen Formular funktionieren soll. Stahli |
Re: TRadioGroup klickt falsch
Hallo,
ich meinte nicht, dass der Formular-Code angepasst werden sollte, sondern etwas in der Art:
Delphi-Quellcode:
So kann es noch nicht klappen: Ich erinnere mich nicht mehr, wie ich auf die Schnelle das Container-Formular zu einer Komponente erhalte; und ich weiß auch nicht, was zuerst kommt: der unerwünschte Click oder Form.Active. Aber in dieser Richtung kannst Du ausprobieren.
procedure TRadioGroupSpecial.ButtonClick(Sender: TObject);
var TForm: frm; begin frm := (Sender as TRadioGroupSpecial).ParentForm; if frm.Active then begin // erst jetzt kommen die gewünschten Maßnahmen end; end; Viel Erfolg! Jürgen |
Re: TRadioGroup klickt falsch
Hallo Jürgen,
so funktioniert es leider nicht da Click aus UpdateButtons aufgerufen wird, bevor das Formular aktiviert wird :-( Kennt jemand ein Ereignis WM_ParentFormWird(De)Aktiviert? Stahli |
Re: TRadioGroup klickt falsch
Zitat:
Wo ich greade bei FormCreate bin: um den unerwünschten RadioGroupClick zu unterbinden, setze im FormCreate die Anweisung DBRadioGroup1.OnClick := nil (natürlich möglichst am Anfang, auf jeden Fall aber VOR dem entsprechenden Ereignis, was den Click auslöst); im FormActivate als letzte Anweisung dann DBRadioGroup1.OnClick := DBRadioGroup1Click; |
Re: TRadioGroup klickt falsch
So, ich habe einiges versucht und wenig herausgefunden:
Zuerst habe ich ermittelt, welche Botschaften meine Kompo erhält. Die sind aber nicht signifikant anders, wenn die "problematische Öffnung" des Formulars erfolgt.
Delphi-Quellcode:
Dann habe ich die Unit ExtCtrls in mein Projekt als XxxExtCtrls kopiert und den Quelltext debugt. Das half nur etwas.
procedure TDBRadioGroupSql.WndProc(var Message: TMessage);
begin info('Message.Msg='+IntToStr(Message.Msg)+' ('+IntToHex(Message.Msg,4)+')'); Ich habe zumindest festgestellt, dass UpdateButtons durch die GroupButton selbst "provoziert" wird
Delphi-Quellcode:
Aber die Ereignisbehandlung auch noch zu kontrollieren und alles neu abzuleiten ist ja auch nicht praktikabel.
procedure TGroupButton.CNCommand(var Message: TWMCommand);
begin if not FInClick then begin FInClick := True; try if ((Message.NotifyCode = BN_CLICKED) or (Message.NotifyCode = BN_DOUBLECLICKED)) and TCustomRadioGroupXxx(Parent).CanModify then inherited; except Application.HandleException(Self); end; FInClick := False; end; end; Fazit: - TRadioGroup ist nicht gerade sauber programmiert (Click heißt eben für mich Clickl!) - Meine Kompo wird mit einer kleinen Besonderheit zu behandeln sein, wenn man sie in ein- und ausblendbaren Formularen einsetzt (Ist aber nicht meine Schuld!!! ;-)) Stahli @raiguen: Danke für Deinen Hinweis. Dazu muss man aber eben in jeder Anwendung wieder etwas im Formular beachten, was ich gern vermeiden wollte. Das geringste Übel ist wohl, bei der Formaktivierung den Fokus auf eine unproblematische Komponennte zu setzen... Dann Klickt TRadioGroup nicht mehr sinnlos herum. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:51 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