Autor Beitrag
zakoon
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 60



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 4613
Erhaltene Danke: 24

XP home, prof
Delphi 2009 Prof,
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 60



BeitragVerfasst: Mo 19.01.09 14:48 
user profile iconmatze hat folgendes geschrieben Zum zitierten Posting springen:
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



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 60



BeitragVerfasst: Mo 19.01.09 14:58 
user profile iconDeddyH hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: Mo 19.01.09 15:01 
Z.B. so:

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 60



BeitragVerfasst: Mo 19.01.09 15:08 
user profile iconNersgatt hat folgendes geschrieben Zum zitierten Posting springen:
Z.B. so:

ausblenden 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... ?
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 60



BeitragVerfasst: Mo 19.01.09 15:13 
user profile iconDeddyH hat folgendes geschrieben Zum zitierten Posting springen:
Ü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:

ausblenden 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



BeitragVerfasst: Mo 19.01.09 16:07 
ausblenden 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... //usw.
  end;
zakoon Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 60



BeitragVerfasst: Mo 19.01.09 16:52 
user profile iconDeddyH hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden 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... //usw.
  end;


Perfekt, so hat es funktioniert :) Danke vielmals an alle!