Autor Beitrag
AXMD
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 4006
Erhaltene Danke: 7

Windows 10 64 bit
C# (Visual Studio 2019 Express)
BeitragVerfasst: Mo 21.03.05 12:12 
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
ausblenden 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
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2453

Arch Linux
JS (WebStorm), C#, C++/CLI, C++ (VS2013)
BeitragVerfasst: 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!
ausblenden volle Höhe 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

_________________
JSXGraph