Autor |
Beitrag |
LonghornUser
      
Beiträge: 796
|
Verfasst: 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:
Delphi-Quelltext 1: 2:
| AllEditsOnChanged: Change:=true; |
?
Danke schonmal für alle Hinweise.
Ciao LHUser
Moderiert von Christian S.: Code- durch Delphi-Tags ersetzt
|
|
Lannes
      
Beiträge: 2352
Erhaltene Danke: 4
Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
|
Verfasst: 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
      
Beiträge: 390
Win XP
Delphi 2007 Prof., XE2, XE5
|
Verfasst: 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:
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
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
      
Beiträge: 6393
Erhaltene Danke: 147
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: 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.):
Delphi-Quelltext 1:
| ShowMessage(Edit1.Text); |
schreiben, sondern:
Delphi-Quelltext 1: 2: 3:
| ShowMessage((Sender as TCustomEdit).Text); ShowMessage((Sender as TEdit).Text); |
da ja nicht mehr klar ist, welches Edit das Ereignis auslöst.
|
|
LonghornUser 
      
Beiträge: 796
|
Verfasst: Do 02.03.06 19:07
|
|
Logikmensch
      
Beiträge: 390
Win XP
Delphi 2007 Prof., XE2, XE5
|
Verfasst: 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:
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 end; 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 
      
Beiträge: 796
|
Verfasst: Fr 03.03.06 15:50
|
|
Martin1966
      
Beiträge: 1068
Win 2000, Win XP
Delphi 7, Delphi 2005
|
Verfasst: Fr 03.03.06 16:17
Du musst aus der Procedure AllChanged eine Methode machen.
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 
      
Beiträge: 796
|
Verfasst: Fr 03.03.06 16:27
Jo, funktioniert. Danke ! 
|
|
Logikmensch
      
Beiträge: 390
Win XP
Delphi 2007 Prof., XE2, XE5
|
Verfasst: 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 
      
Beiträge: 796
|
Verfasst: Do 09.03.06 14:26
Klar 
|
|