Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - OnChange unterbinden


AXMD - Mo 21.03.05 12:12
Titel: OnChange unterbinden
Morgen :)!

Ich suche eine Möglichkeit, kurzzeitig alle OnChange-Events der Controls eines Formulars zu unterbinden; Grund: Das OnChange-Event jeder reagiert ja auf Änderungen, und das soll es aus Performancegründen beim OnCreate nicht, da hier Werte in die Controls geschreiben werden, was natürlich jedes Mal ein OnChange hervorruft. Natürlich könnt ich jetzt in jedem OnChange sowas schreiben

Delphi-Quelltext
1:
if not dontchange then Machwas;                    

aber das ist mir für fast 50 OnChange-Events etwas viel. Ebenso ist mir sowas wie

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
var
  n1: TNotifyEvent;
begin
  ...
  n1 := Edit1OnChange;
  Edit1.OnChange := nil;
  ...
  Werte_zuweisen;
  ...
  Edit1.OnChange := n1;
  ...
end;

zu aufwendig. Jemand eine Idee, wie ich das besser und v.a. schneller lösen könnte?

AXMD


raziel - Mo 21.03.05 12:27

Mir war grad langweilig, da hab ich ein bissl was gebastelt ;)

Ohne Gewähr, allerdings funktionierts bei mir bei 4 Edits:

Unit TypInfo nicht vergessen!

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
procedure TForm1.FormCreate(Sender: TObject);
var
  j: Integer;
  p: PPropInfo;
  list: array of TMethod;
  niler: TMethod;
begin
  SetLength(list, ComponentCount);
  niler.Code := nil;
  niler.Data := nil;

  for j := 0 to ComponentCount-1 do
  begin
    p := GetPropInfo(Components[j].ClassInfo, 'OnChange');
    if (p <> niland (p^.setProc <> nilthen
    begin
      list[j] := GetMethodProp(Components[j], p);
      SetMethodProp(Components[j], p, niler); // das hier auskommentieren, um das OnChange geschehen zu lassen...
    end
    else
      list[j] := niler;
  end;

  edit1.Text := 'ds';
  edit2.Text := 'ds';
  edit3.Text := 'ds';
  edit4.Text := 'ds';

  for j := 0 to ComponentCount-1 do
  begin
    p := GetPropInfo(Components[j].ClassInfo, 'OnChange');
    if (p <> niland (p^.setProc <> nilthen
    begin
      SetMethodProp(Components[j], p, list[j]);
    end;
  end;
end;


Gruß,
raziel