Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi TRadioGroup klickt falsch (https://www.delphipraxis.net/85385-tradiogroup-klickt-falsch.html)

stahli 30. Jan 2007 07:10


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

Jürgen Thomas 30. Jan 2007 08:40

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

stahli 30. Jan 2007 09:51

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

Jürgen Thomas 30. Jan 2007 11:13

Re: TRadioGroup klickt falsch
 
Hallo,

ich meinte nicht, dass der Formular-Code angepasst werden sollte, sondern etwas in der Art:
Delphi-Quellcode:
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;
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.

Viel Erfolg! Jürgen

stahli 30. Jan 2007 18:53

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

raiguen 30. Jan 2007 21:37

Re: TRadioGroup klickt falsch
 
Zitat:

Zitat von Jürgen Thomas
... und ich weiß auch nicht, was zuerst kommt: der unerwünschte Click oder Form.Active.

Kommt darauf an, wo der RadioGroup ein entsprechender ItemIndex zugewiesen wird; das kann schon im FormCreate passieren...
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;

stahli 30. Jan 2007 23:01

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:
procedure TDBRadioGroupSql.WndProc(var Message: TMessage);
begin
  info('Message.Msg='+IntToStr(Message.Msg)+' ('+IntToHex(Message.Msg,4)+')');
Dann habe ich die Unit ExtCtrls in mein Projekt als XxxExtCtrls kopiert und den Quelltext debugt. Das half nur etwas.
Ich habe zumindest festgestellt, dass UpdateButtons durch die GroupButton selbst "provoziert" wird
Delphi-Quellcode:
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;
Aber die Ereignisbehandlung auch noch zu kontrollieren und alles neu abzuleiten ist ja auch nicht praktikabel.

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 15:53 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz