| Autor |
Beitrag |
zakoon
      
Beiträge: 60
|
Verfasst: Mo 19.01.09 14:17
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
      
Beiträge: 4613
Erhaltene Danke: 24
XP home, prof
Delphi 2009 Prof,
|
Verfasst: 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.
_________________ In the beginning was the word.
And the word was content-type: text/plain.
|
|
zakoon 
      
Beiträge: 60
|
Verfasst: 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?
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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 
      
Beiträge: 60
|
Verfasst: 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
      
Beiträge: 1581
Erhaltene Danke: 279
Delphi 10 Seattle Prof.
|
Verfasst: 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; |
_________________ Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
|
|
zakoon 
      
Beiträge: 60
|
Verfasst: Mo 19.01.09 15:08
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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 
      
Beiträge: 60
|
Verfasst: 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?
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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 
      
Beiträge: 60
|
Verfasst: Mo 19.01.09 16:52
|
|