AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Event wenn enabled/disabled wird

Ein Thema von Getox · begonnen am 28. Okt 2016 · letzter Beitrag vom 7. Nov 2016
Antwort Antwort
Seite 1 von 2  1 2      
Getox

Registriert seit: 28. Dez 2012
155 Beiträge
 
Delphi XE3 Professional
 
#1

Event wenn enabled/disabled wird

  Alt 28. Okt 2016, 12:05
Hallo,

ich habe ein Problem. Ich habe hier sehr viele verschiedene Komponenten in sehr großer Anzahl, welche als einzige gemeinsame Basis TControl haben. Nun möchte ich bei jeder dieser Komponenten erreichen, dass ein Event ausgelöst wird, wenn diese Komponente enabled oder disabled wird. Hat jemand eine Idee die ich dieses bewerkstelligen könnte?

Danke im Vorraus
Ist ein Nilpferd ein Pferd, das nicht vorhanden ist?
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.733 Beiträge
 
Delphi 6 Enterprise
 
#2

AW: Event wenn enabled/disabled wird

  Alt 28. Okt 2016, 12:34
Da das zur Design-Zeit ja keinen Sinn macht, gehe ich davon aus, dass das Disablen/Enablen zur Laufzeit passiert. Dementsprechend passiert das ja wohl in deinem Code, sprich der Anwender gibt was ein oder drückt einen Knopf (oder ...) und in deinem Code steht dann "ControllXY.Enabled:=true;" oder so.

Du könntest nun an allen diesen Stellen halt noch deine zusätzliche Prozedur aufrufen (statt diese als Event zu verwursten). Oder du schreibst eine Prozedur, die ein Control bekommt und dies Enabled und dann noch das weitere macht was sonst in deinem Event passieren würde.
Ralph
  Mit Zitat antworten Zitat
Getox

Registriert seit: 28. Dez 2012
155 Beiträge
 
Delphi XE3 Professional
 
#3

AW: Event wenn enabled/disabled wird

  Alt 28. Okt 2016, 12:45
Ich arbeite an einem recht großen, "historisch gewachsenen" Projekt mit wirklich sehr vielen Forms und endlos vielen Feldern. Ich hatte gehofft nicht alle Stellen einzeln suchen zu müssen, aber scheinbär bleibt mir nichts anderes übrig

Ich hatte gehofft, dass ich einfach beim erstellen von den einzelnen Forms einfach alle Komponenten in einer Schleife durchlaufen und jedem tControl irgendwie automatisch ein Event zuweisen könnte. Aber manchmal geht es halt nicht einfach
Ist ein Nilpferd ein Pferd, das nicht vorhanden ist?
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.336 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Event wenn enabled/disabled wird

  Alt 28. Okt 2016, 12:57
Mal anders gefragt: Was soll in dem Event veranlasst werden?

Soll das dann eher DIESES CONTROL betreffen und immer gleich sein oder soll in der Ereignisbehandlung irgendwas spezielles ihm Rahmen der Geschäftslogik geregelt werden.

Hintergrund der Frage: Man kann Controls dynamisch durch eigene Ableitungen ersetzen (z.B. TPanel wird zu TPanel, welches in einer eigenen Unit implementiert ist und etwas am Panel erweitert oder verändert).
Das ist dann aber nicht im Formular (dfm) abgebildet, sondern wird erst zum Projektstart umgestellt.

Beschreib mal, was Du genau erreichen willst.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.115 Beiträge
 
Delphi 12 Athens
 
#5

AW: Event wenn enabled/disabled wird

  Alt 28. Okt 2016, 13:15
Wenn es um TControl.Enabled geht:
* mit Debug-DCUs kompilieren und TControl.SetEnabled einen Haltepunkt rein setzen
* oder das Selbe bei TControl.CMEnabledChanged (siehe TControl.SetEnabled > CM_ENABLEDCHANGED)
* oder in der gewünschten abgeleiteten Klasse das SetEnabled überschreiben und da eine entsprechende Behandlung rein
* oder in der gewünschten abgeleiteten Klasse eine Behandlung für CM_ENABLEDCHANGED implementieren (siehe CMEnabledChanged oder WndProc)
* oder ins Messagehandling von Windows einklinken und auf WM_ENABLE und/oder CM_ENABLEDCHANGED reagieren
* oder nicht statisch überschreiben (override), sondern sich zur Laufzeit in die oben genannten virtuellen Methoden einklinken (siehe Delphi-Referenz durchsuchenTVirtualMethodInterceptor)

Dort wo die Klassen/Komponenten erstellt/geladen werden, kann man sie durch gleichnamige Ableitung überdecken und so eine Ableitung mit überschiebenen Settern reinschieben.
siehe http://www.delphipraxis.net/141895-t...phi-other.html
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Getox

Registriert seit: 28. Dez 2012
155 Beiträge
 
Delphi XE3 Professional
 
#6

AW: Event wenn enabled/disabled wird

  Alt 28. Okt 2016, 14:04
Ich habe verschiedenste Editfelder. Hinter diesen liegt ein Shape mit rotem Rahmen, der im onCreate durch eine Funktion erstellt und positioniert wird. Dieser Rahmen dient als Pflichtfeldmarkierung und wird jeweils im onChange Event eingeblendet oder ausgeblendet, wofür auch eine globale Funktion zuständig ist, welche dort aufgerufen wird. Die Pflichtfeldmarkierung soll jetzt aber auch ausgeschaltet werden, wenn das dazu gehörige Feld deaktiviert wird oder halt eingeschaltet werden, wenn das Feld aktiviert wird. Ich darf aber auch keine Komponenten ableiten.

Das ist eine gegebene Situation und ich muss das jetzt mit möglichst geringem Aufwand bewerkstelligen. Es wäre halt ein mords Aufwand alle Stellen zu suchen wo solche Felder aktiviert oder deaktiviert werden.
Ist ein Nilpferd ein Pferd, das nicht vorhanden ist?
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.336 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Event wenn enabled/disabled wird

  Alt 28. Okt 2016, 14:43
Der geringste Aufwand wäre wohl - soweit ich das bis hierher einschätze - die globale Funktion nochmal aufzurufen und dabei neben der Wert-Validitätsprüfung noch auf aControl.Enabled zu prüfen.

Die Frage ist, wie man diesen erneuten Aufruf triggert.
Vielleicht einfach in einem Timer auf Änderungen prüfen?

Du könntest die betreffenden Controls in einer Liste sammeln und beim nächsten mal prüfen, ob deren Enabled sich geändert hat.

Es ist halt nicht so ganz einfach, der VCL eine solche Funktionalität nachträglich zu verpassen, ohne Controls abzuleiten.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Bambini
(Gast)

n/a Beiträge
 
#8

AW: Event wenn enabled/disabled wird

  Alt 28. Okt 2016, 15:01
Es ist halt nicht so ganz einfach, der VCL eine solche Funktionalität nachträglich zu verpassen, ohne Controls abzuleiten.
So wie himitsu schon zeigte, kann man sich schon in entsprechende TObjectMethode einklinken. Wie man das macht sieht man hier:
http://blog.barrkel.com/2010/09/virt...erception.html
Das hat nur den Pferdefuß, dass das dann u.a. alle Methodenaufrufe abfägt und nicht nur die TControl.SetEnabled.
Da man sich aber zur Laufzeit erst einklinkt sollte man sich den Zeitpunkt gut auswählen an dem man das Startet
und vielleicht kann man sich eine Liste der betroffenen TControls schon vorher zusammenstellen und prüfen.

Geändert von Bambini (28. Okt 2016 um 15:07 Uhr)
  Mit Zitat antworten Zitat
Jim Carrey
(Gast)

n/a Beiträge
 
#9

AW: Event wenn enabled/disabled wird

  Alt 28. Okt 2016, 16:40
Zitat:
Ich habe verschiedenste Editfelder. Hinter diesen liegt ein Shape mit rotem Rahmen, der im onCreate durch eine Funktion erstellt und positioniert wird. Dieser Rahmen dient als Pflichtfeldmarkierung und wird jeweils im onChange Event eingeblendet oder ausgeblendet, wofür auch eine globale Funktion zuständig ist, welche dort aufgerufen wird. Die Pflichtfeldmarkierung soll jetzt aber auch ausgeschaltet werden, wenn das dazu gehörige Feld deaktiviert wird oder halt eingeschaltet werden, wenn das Feld aktiviert wird. Ich darf aber auch keine Komponenten ableiten.
So etwas oin der Art habe ich auch gemacht und benutze es auch erfolgreich.

Bei mir ist es jedoch sehr viel einfacher. Bei dir würde ich vorschlagen, einfach eine Prozedur zu schreiben, welcher du den Namen des Edits übergibst. Die rufst du dann im OnChange jedes Edits mit Rahmen auf.
Anhand des Namens des Edits kannst du dann den für das Edit zuständigen Rahmen finden. Das setzt aber eine ordentliche Benennung der Edits und der Rahmen voraus.

Immer dieser ständige Ableiten von Komponenten und hin und her. Warum so verdammt kompliziert (aber richtig, keine Frage), wenn es auch einfach und funktionabel geht?

Also etwa so

Delphi-Quellcode:
Edit OnChange
begin
 MacheDiesUndDasInDiesemEdit;

 PflichtFeld(EditX);
end;

procedure PflichtFeld(DeinEdit: TEdit);
begin
 // Selbstverständlich mit Überprüfungen, ob es den Rahmen auch gibt usw
 (DeinForm.FindComponent(DeinEdit.Name + '_Rahmen') as TShape).Enabled := true/false;
end;
Wie gesagt. Ich verwende auch soetwas nur komplett automatisiert und sehr sehr viel einfacher.

Geändert von Jim Carrey (28. Okt 2016 um 16:43 Uhr)
  Mit Zitat antworten Zitat
Getox

Registriert seit: 28. Dez 2012
155 Beiträge
 
Delphi XE3 Professional
 
#10

AW: Event wenn enabled/disabled wird

  Alt 3. Nov 2016, 15:43
Also ich gehe nun auf die Suche nach jeder Stelle im Code wo so ein Pflichtfeld enabled oder disabled wird.

Die Abfrage ob das Feld aktiv ist in die normale Pflichtfeld-Prüfmethode einzubauen ist auch nur bedingt sinnvoll - oft habe ich mehrere Edits auf einer Groupbox. An diesen Stellen wird die Groupbox disabled, wodurch die Edits zwar inaktiv sind, aber trotzdem noch auf enabled stehen.

Ich habe mir jetzt eine Funktion geschrieben, die ich einfach an hunderten Stellen im Code aufrufe. Ich hoffe ich erwische alle.

Aber trotzdem danke für die Gedanken, die ihr euch gemacht habt
Ist ein Nilpferd ein Pferd, das nicht vorhanden ist?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:37 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