Autor Beitrag
LonghornUser
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 796



BeitragVerfasst: Mi 01.03.06 22:26 
Ich habe mal eine Frage zu meiner Form mit relativ vielen Komponenten.
Es ist eine Art Editor, welcher immer beim Klick auf "Schließen" (also das x) prüfen soll, ob etwas geändert wurde. Jetzt könnte man natürlich es so machen, dass im OnChanged Event jeder Komponente steht: change:=true; o.ä. Aber das ist doch ziemlich müßig bei weit über 100 Komponenten (Edits, Felder, ...) und frisst auch viel Größe, soll doch die EXE möglichst klein werden.
Nun hier die Frage: Gibt es einen Befehl, der ca. so läuft:
ausblenden Delphi-Quelltext
1:
2:
AllEditsOnChanged:
Change:=true;

?

Danke schonmal für alle Hinweise.

Ciao LHUser

Moderiert von user profile iconChristian S.: Code- durch Delphi-Tags ersetzt
Lannes
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: Do 02.03.06 01:16 
Hallo,

ein Stichwort: TCustomEdit.Modified
Das betrifft alle von TCustomEdit abgeleiteten Komponenten : TEdit, TMemo, TRichEdit ...

_________________
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
Logikmensch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 390

Win XP
Delphi 2007 Prof., XE2, XE5
BeitragVerfasst: Do 02.03.06 11:11 
Hallo!

Wenn ich Dich richtig verstehe, willst Du Dir sparen, für jede Deiner Komponenten ein eigenes OnChange-Ereignis zu schreiben und das quasi mit einer einzigen Routine erschlagen. Nun, Du könntest in Deiner Form eine neue Methode schreiben:

ausblenden Delphi-Quelltext
1:
procedure AllChanged(Sender:TObject)					


und diese allen Komponenten Deiner Form zuweisen, die diese Eigenschaft zur Verfügung stellen, also alle von TCustomEdit abgeleiteten Klassen

ausblenden Delphi-Quelltext
1:
2:
3:
for i:=0 to componentcount-1 do
  if components[i] is TCustomEdit then 
    TCustomEdit(components[i]).onchange:=AllChanged;


Innerhalb von AllChanged kannst Du ja Deine globale Variable Change:=true setzen. Ich hoffe, das funzt.

Liebe Grüße,

Claus.
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Do 02.03.06 11:22 
Das geht doch viel einfacher.
Für eine der Komponenten definierst du im Source, was gemacht werden soll.
Für alle anderen weist du dann im Objekt-Inspektor beim OnChange-Ereignis auf dieses eine.
Du darfst dann nur nicht mehr(z.B.):
ausblenden Delphi-Quelltext
1:
ShowMessage(Edit1.Text);					

schreiben, sondern:
ausblenden Delphi-Quelltext
1:
2:
3:
ShowMessage((Sender as TCustomEdit).Text);
//oder (je nachdem, wie du das brauchst)
ShowMessage((Sender as TEdit).Text);

da ja nicht mehr klar ist, welches Edit das Ereignis auslöst.
LonghornUser Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 796



BeitragVerfasst: Do 02.03.06 19:07 
Ich habe das jetzt so gemacht. Aber er sagt mir 2 Fehler:
ausblenden Quelltext
1:
2:
[Fehler] Unit1.pas(40): Undefinierter Bezeichner: 'onchange'
[Fehler] Unit1.pas(40): Nicht genügend wirkliche Parameter


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure AllChanged(Sender:TObject);
begin
  showmessage('JJJ');
end;

procedure TForm1.FormCreate(Sender: TObject);
var i:integer;
begin
for i:=0 to componentcount-1 do
  if components[i] is TCustomEdit then
    TCustomEdit(components[i]).onchange:=AllChanged;
end;
Logikmensch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 390

Win XP
Delphi 2007 Prof., XE2, XE5
BeitragVerfasst: Fr 03.03.06 07:28 
Hallo Longhornuser,

tut mir leid, ich habe mich blind auf die Angaben im Delphi-Hilfetext verlassen. Leider lässt sich nicht, wie im Hilfetext angegeben, für TCustomEdit das OnChange-Ereignis setzen - dies wird erst in den abgeleiteten Klassen verfügbar gemacht. Allerdings habe ich ausprobiert:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
var
  i:integer;
  c:TComponent;
begin
  for i:=0 to componentcount-1 do begin
    c:=components[i];
    if c is TEdit then TEdit(c).OnChange:=allchange
      else
    if c is TLabeledEdit then TLabeledEdit(c).OnChange:=allchange
      else //ab hier weitere Tests anhängen!
  end{if}
end;


Das funzt, ist aber auch etwas umständlich. Vielleicht ist die Variante, die Jasocul vorschlägt doch die bessere. Aber das musst Du selbst entscheiden. Weiterhin viel Erfolg!

Claus.
LonghornUser Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 796



BeitragVerfasst: Fr 03.03.06 15:50 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
procedure AllChanged(Sender:TObject);
begin
  showmessage('JJJ');
end;


procedure TForm1.FormCreate(Sender: TObject);
var
  i:integer;
  c:TComponent;
begin
  for i:=0 to componentcount-1 do begin
    c:=components[i];
    if c is TEdit then TEdit(c).OnChange:=AllChanged
      else
    if c is TLabeledEdit then TLabeledEdit(c).OnChange:=allchanged
      else //ab hier weitere Tests anhängen!
  end{if}
end;


:( Das geht auch nicht. Ich bekomme die Fehler:
ausblenden Quelltext
1:
2:
3:
[Fehler] Unit1.pas(44): Inkompatible Typen: 'Methodenzeiger und reguläre Prozedur'
[Fehler] Unit1.pas(45): Undefinierter Bezeichner: 'TLabeledEdit'
[Fehler] Unit1.pas(45): Operator oder Semikolon fehlt
Martin1966
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1068

Win 2000, Win XP
Delphi 7, Delphi 2005
BeitragVerfasst: Fr 03.03.06 16:17 
Du musst aus der Procedure AllChanged eine Methode machen.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
Procedure TForm1.AllChanged;
begin
  showmessage('JJJ');
end;


Und nicht vergessen die Methode auch in TForm1 zu definieren. Zum Beispiel in der Private-Sekton.

Lg Martin

_________________
Ein Nutzer der Ecke ;-)
LonghornUser Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 796



BeitragVerfasst: Fr 03.03.06 16:27 
Jo, funktioniert. Danke ! :)
Logikmensch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 390

Win XP
Delphi 2007 Prof., XE2, XE5
BeitragVerfasst: Do 09.03.06 10:54 
Hallo LongHornUser,

ja, war mein Fehler. Gefunzt hatte es auch bei mir aber beim Einbauen in den Beitrag habe ich die Klassenangabe vergessen. Ünrigens, wenn es jetzt funzt, kannste die Frage auch als beantwortet setzen? ;-)

Liebe Grüße,

Claus.
LonghornUser Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 796



BeitragVerfasst: Do 09.03.06 14:26 
Klar :-)