![]() |
AW: Windows Message bei Änderung?
Zitat:
Zitat:
Zitat:
Weiter oben schreibst du noch etwas, was in mir den Eindruck verstärkt, dein Konzept sei zumindest noch mal zu überdenken: Zitat:
Zitat:
Zitat:
Zitat:
|
AW: Windows Message bei Änderung?
Ich glaube du wirst nicht drumherum kommen alles selbst zu machen. Edit-Komponenten kennen zwar die Eigenschaft Modifed, aber das kennen nur die Edit-Komponenten.
Auch kennt die TForm die Eigenschaft KeyPreview. Das bedeutet, dass das Formular alle Tastaturanschläge vor dem Steuerelement erhält. Somit könnte man mit einem OnKeyDown des Formulars ein Dutzend Editfelder "überwachen". Aber es funktioniert nur bei Tastauranschlägen. |
AW: Windows Message bei Änderung?
@himitsu
Das Ableiten von eigenen Komponenten steht auf meiner to-do List. Wenn es eine Windowsmessage 'somethinghaschanged' geben würde, die bei jeder Änderung des Inhalts eines beliebigen Wincontrol gefeuert würde, dann würde ich mich schon darauf verlassen wollen, dass die bei jeder Art von Wincontrol und bei jeder Änderung des Inhalts uch in zukünftigen Windows-Versionen gefeuert wird. Nachdem es die nicht gibt, sind weitere Überlegungen in der Richtung ohnedies hinfällig. Die Verwendung eines neuen/anderen Komponententyps kommt ungleich seltener vor als die Einführung eines neuen z.B. Editfelds. Wenn ich in meiner Form einen neuen Komponententyp verwende, den ich bisher in der Überprüfung von Änderungen noch nicht berücksichtigt habe, dann muss ich mich um den natürlich kümmern, aber das ist doch eher eine seltene Ausnahme. @perlsau Zitat:
Delphi-Quellcode:
Die Namen der visuellen Komponenten der Form entsprechen den Namen der Datenfelder in der Datenbank (mit einem Prefix), sodass ich mich dabei um nichts weiter kümmern muss. Nur wenn das in seltenen Ausnahmefällen nicht möglich ist, muss ich extra Code schreiben, aber in den Fällen weiss ich dann auch, dass ich besonders aufpassen muss.
for i:=0 to componentcount-1 do
if form.component[i] is Tedit then ... else if form.component[i] is Tradiogroup then ... else ... Zitat:
Zitat:
Zitat:
Zitat:
Solange es keine Änderung gibt, gibt es einen Button "Schliessen" und der Button "abbrechen" ist disabled. Wenn etwas geändert wurde, dann wird aus dem Button "Schliessen" ein Button "Speichern" (es ist der gleiche Button mit einer anderen Caption) und der Button "Abbrechen" wird enabled. Werden alle Änderungen der Form rückgängig gemacht, sodass in der Form genau das angezeigt wird, was in der DB gespeichert ist, dann wird aus "Speichern" wieder "schliessen" und "abbrechen" wird wieder disabled. Zitat:
@Popov Ja, ich fürchte, du hast Recht. :-D |
AW: Windows Message bei Änderung?
Alle Ereignisse werden automatisch ausgelöst, wenn ihre Bedingung zutrifft. OnChange reagiert auf alle Benutzer-Eingaben automatisch - zumindest in meinem Delphi 2009. Vielleicht ist das ja bei dir anders ...
Wieso verwendest du nicht einfach DB-sensitive Komponenten, wenn bereits deine Eingabe-Felder direkt mit Datenbank-Feldern korrespondieren? Aber egal, du mußt nicht antworten, ich geb's hier sowieso auf und überlasse dich deinen – aus meiner Sicht – merkwürdigen Programmierkonzepten :cry: |
AW: Windows Message bei Änderung?
Zitat:
Ich glaube nicht, dass das bei dir anders ist. Zitat:
|
AW: Windows Message bei Änderung?
Wieso weist du nicht beim Erstellen/Anzeigen des Formulars oder beim Befüllen der Komponenten das OnChange zu? So mache ich das jedenfalls. Klar kann man da die eine oder andere Komponente vergessen, aber das fällt doch sofort auf, wenn sich der Speichern-Button nicht ändert beim Ändern eben dieser Komponente.
[EDIT] Ich benutze sowas in der Art:
Delphi-Quellcode:
Alles ist zentral in dieser Methode. Das hat sogar den Vorteil, dass man temporär alle Behandlungsroutinen abschalten kann, wenn man es braucht (z.B. Speichervorgang).
procedure TForm1.ToggleChangeEventHandlers(Enable: Boolean);
var tne: TNotifyEvent; begin if Enable then tne:= SetPropertiesChanged else tne:= nil; //--- Set all OnChange/OnClick event handlers editName.OnChange:= tne; editCommandLine.OnChange:= tne; checkEnabled.OnClick:= tne; editComments.OnChange:= tne; comboShowWindow.OnChange:= tne; comboLocation.OnChange:= tne; end; MfG Dalai |
AW: Windows Message bei Änderung?
@idefix2
Hast du von dem Flugzeugunglück über dem Pazifik gehört, bei dem sich drei erfahrene Piloten mit einem unwichtigem Lämpchen beschäftigt haben und deshalb keiner von ihnen mitbekommen haben, dass sich das Passagierflugzeug gerade im Sturzflug befindet? Da gab es auch ein Flugzeugunglück über den USA, wo sich auch drei Piloten mit einem defekten Lämpchen für das Fahrwerk beschäftigt haben und keiner mitbekommen hat, dass der Sprit alle wurde? Manchmal ist es so, dass sich Menschen auf etwas verbeißen, was evtl. nicht so wichtig ist, und nicht auf das eigentliche konzentrieren. Sich mit WinControl zu beschäftigen ist nicht falsch, aber warum beschäftigst du dich damit? Du scheinst jede Komponente auf WinControl zu reduzieren. Übrigens, wie soll WinControl wissen ob es eine Änderung in ihr gab? Ist eine Texteingabe in TEdit eine Änderung? Klar. Ist das Setzen der CheckBox eine Änderung? Klar. Ist das Bewegen des Mauszeigers von rechts nach links über ein Panel eine Änderung? In Smartphones ist das eine Funktion. Woher soll also WinControl wissen was eine Änderung ist. Das eine Texteingabe eine Änderung ist, das weiß TEdit, aber nicht WinControl. Denn wie gesagt, woher soll es wissen was du unter einer Änderung verstehst. Auch das Bewegen des Mauszeigers kann eine Änderung sein. |
AW: Windows Message bei Änderung?
Irgendwie hab ich den Eindruck, dir ist die Arbeitsweise eines Delphi-Programms nicht so recht klar ... mein ganz persönlicher subjektiver Eindruck, den mußt du ja nicht teilen und solltest dich auch nicht darüber ärgern, daß ich das so sehe, wie auch ich mich nicht darüber ärgere, daß du dir Umstände machst, wo das nicht wirklich notwendig wäre.
Zitat:
Letztendlich mußt du auch bei deiner "Lösung" eine Ereignisbehandlung schreiben, denn das Timer-Ereignis tut auch erstmal gar nichts außer eben auszulösen. Oder mit anderen Worten: Der Kampf gegen Windmühlen war schon immer ein aussichtsloser :lol: Ich denke, du solltest das so machen, wie du denkst, und auf keinen Fall dumme Ratschläge von erfahrenen Programmieren annehmen, ja nicht einmal darüber nachdenken, warum die überhaupt was vorschlagen ... um vielleicht zu einem späteren Zeitpunkt den Holzweg, auf den du dich – meiner bescheidenen subjektiven Ansicht nach – begeben hast, erkennen zu können. Macht ja nix, ich muß ja deinen Code weder warten noch erweitern und auch nicht mit deiner Anwendung arbeiten :) Aber ich kann mich noch gut daran erinnern, daß ich früher – heute etwas weniger – zahlreiche umständliche Klimmzüge veranstaltet habe, weil mir so manche Funktion von Delphi einfach noch nicht bekannt oder ich falsch darüber informiert war, wie sie funktioniert. Wenn man dann gleichzeitig an den eigenen Mythos vom gewieften Programmierer glauben will oder muß, hat man da ein echtes Problem am (oder im) Hals :vernupft: Achso, bevor ich's vergesse: Mich würde noch immer interessieren, wieso du keine datensensitiven Komponenten verwendest, wenn du schon mit einer Datenbank arbeitest und die Komponenten doch, wie du schriebst, direkt mit diversen DB-Feldern assoziiert sind. Da würden nämlich alle Änderungen sofort ohne Timer oder OnChange-Ereignisbehandlung gespeichert werden. Ob ich das noch erfahren werde in diesem Leben? Ach was soll's, das Leben geht weiter :-D Ich habe heute auf jeden Fall eines gelernt: OnChange ist für manche Programmierer ganz ganz böse :dancer: In Wirklichkeit hab ich natürlich was ganz anderes gelernt ... aber du mußt ja nicht alles wissen :angel: |
AW: Windows Message bei Änderung?
Zitat:
|
AW: Windows Message bei Änderung?
Zitat:
Zitat:
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:11 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