Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Mehrere Controls zusammenfassen
zakoon - Mo 19.01.09 14:17
Titel: Mehrere Controls zusammenfassen
Hallo zusammen,
ich habe mehrere TabSheet, auf denen jeweils ziemlich viele Formularelemente (Edits, SpinEdits, Trackbars, etc...) verteilt sind. Wenn nun ein Wert irgend eines der Elemente verändert wird, soll eine procedure ausgeführt werden und zwar immer die selbe.
Für ein einzelnes Element schreibe ich dazu einfach die procedure in das OnChange-ereignis hinein. Muss ich das nun für jedes Element einzeln so machen, oder gibt es eine Möglichkeit, die OnChange-Ereignisse zusammen zu fassen, nach dem Motto "OnChange eines Wertes eines der Elemente auf dem TabSheet, tue procedure x", anstatt "OnChange von Element 1 tue x, Onchange von Element 2 tue x, OnChange Element 3 tue x,..."
Dankeschön!
matze - Mo 19.01.09 14:33
Schau einfach mal in deinen ObjectInspector. Wenn du unter "Ereignisse" das OnChange Ereignis anlegst, dann kannst du da auch nicht nur ein neues anlegen sondern auch dem Control ein zuvor erstelltes zuweisen. Damit kannst du erreichen, dass alle Controls das selbe OnChange Ereignis verwenden.
Und über den Parameter Sender kannst du dann im Quelltext abfragen, von welchem Control das Ereignis ausgeführt wurde.
zakoon - Mo 19.01.09 14:48
matze hat folgendes geschrieben : |
Schau einfach mal in deinen ObjectInspector. Wenn du unter "Ereignisse" das OnChange Ereignis anlegst, dann kannst du da auch nicht nur ein neues anlegen sondern auch dem Control ein zuvor erstelltes zuweisen. Damit kannst du erreichen, dass alle Controls das selbe OnChange Ereignis verwenden.
Und über den Parameter Sender kannst du dann im Quelltext abfragen, von welchem Control das Ereignis ausgeführt wurde. |
Danke, das weiß ich schon, aber dieses zuweisen muss ich wirklich für jedes Control einzeln machen? Und was ist dann, wenn ich das Ereignis zur Laufzeit zuweisen/ändern möchte? Dann muss ich das für jedes Control einzeln tun?
Delete - Mo 19.01.09 14:56
Du kannst das auch im Quelltext machen: in einer Schleife jedem Control, das das entsprechende Event unterstützt, die Methode zuweisen.
zakoon - Mo 19.01.09 14:58
DeddyH hat folgendes geschrieben : |
| Du kannst das auch im Quelltext machen: in einer Schleife jedem Control, das das entsprechende Event unterstützt, die Methode zuweisen. |
Genau sowas möchte ich machen! Aber wie spreche ich die Controls in der Schleife an? Im Moment habe ich z.B. editName, editStrasse, editHausnummer, etc... wie baue ich das in eine Schleife ein?
Nersgatt - Mo 19.01.09 15:01
Z.B. so:
Delphi-Quelltext
1: 2: 3: 4: 5:
| var i : Integer; begin for i := 0 to self.ComponentCount - 1 do showMessage(self.Components[i].Name); end; |
zakoon - Mo 19.01.09 15:08
Nersgatt hat folgendes geschrieben : |
Z.B. so:
Delphi-Quelltext 1: 2: 3: 4: 5:
| var i : Integer; begin for i := 0 to self.ComponentCount - 1 do showMessage(self.Components[i].Name); end; | |
Super, dann bekomme ich mit TabSheet1.Components meine Unterelemente. Da frage ich mich nur noch: was passiert bei den Componenten, die kein OnChange Ereignis haben? Damit meine ich for allem meine Labels, aber auch ander Elemente. Gibt es eine Funktion mit der ich etwas tun kann wie : if hatOnChangeEreignis (TabSheet1.Components[i]) then... ?
Delete - Mo 19.01.09 15:11
Über RTTI wäre das prinzipiell möglich, aber die einfache Methode wäre, mit dem is-Operator abzufragen, ob es sich z.B. um ein TEdit handelt.
zakoon - Mo 19.01.09 15:13
DeddyH hat folgendes geschrieben : |
| Über RTTI wäre das prinzipiell möglich, aber die einfache Methode wäre, mit dem is-Operator abzufragen, ob es sich z.B. um ein TEdit handelt. |
Okay, danke, das passt schon. Sind zwar 5, 6 unterschiedliche Controls, aber insgesamt spart mir das trotzdem ein Haufen Tipperei :)
EDIT: Ich merke gerade, dass es doch nicht ganz so funktioniert, wie ich es mir dachte:
Form1.TabSheet1.ComponentCount ist 0, d.h. es beinhaltet anscheinend nicht die darauf liegenden Objekte. Merkwürdig. Weiß da jemand was?
EDIT 2: Nochwas, das nicht so richtig funktioniert. Ich wollte es so machen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| for i:= 0 to FormSettings.ComponentCount-1 do begin if (FormSettings.Components[i] is TSpinEdit) or (FormSettings.Components[i] is TTrackbar) or (FormSettings.Components[i] is TJvFontComboBox) or (FormSettings.Components[i] is TColorbox) then FormSettings.Components[i].OnChange:= MeineProcedure; end; |
Aber der Compiler meldet unbekanntes OnChange. So einfach scheint es also nicht zu gehen. Weiß jemand Rat?
Delete - Mo 19.01.09 16:07
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| for i:= 0 to FormSettings.ComponentCount-1 do begin if (FormSettings.Components[i] is TSpinEdit) then TSpinEdit(FormSettings.Components[i]).OnChange:= MeineProcedure else if (FormSettings.Components[i] is TTrackbar) then TTrackbar(FormSettings.Components[i]).OnChange:= MeineProcedure else if... end; |
zakoon - Mo 19.01.09 16:52
DeddyH hat folgendes geschrieben : |
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| for i:= 0 to FormSettings.ComponentCount-1 do begin if (FormSettings.Components[i] is TSpinEdit) then TSpinEdit(FormSettings.Components[i]).OnChange:= MeineProcedure else if (FormSettings.Components[i] is TTrackbar) then TTrackbar(FormSettings.Components[i]).OnChange:= MeineProcedure else if... end; | |
Perfekt, so hat es funktioniert :) Danke vielmals an alle!
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 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!