[gelöst] TLabeledEdit und Onchage

Rund um die LCL und andere Komponenten
Antworten
Benutzeravatar
kralle
Lazarusforum e. V.
Beiträge: 989
Registriert: Mi 17. Mär 2010, 14:50
OS, Lazarus, FPC: Linux Mint 20 , FPC 3.3.1 , Lazarus 2.1.0 -Win10 & XE7Pro
CPU-Target: 64Bit
Wohnort: Bremerhaven
Kontaktdaten:

[gelöst] TLabeledEdit und Onchage

Beitrag von kralle »

OS: Windows 8.1 Pro und Lazarus 1.6

Moin,

Wenn ich im Create eines Frames

Code: Alles auswählen

constructor TFrameAllgemein.Create(AOwner: TComponent);
folgendes mache:

Code: Alles auswählen

LabeledEdit1.Text:="Test";

Dann wird im weiteren Ablauf des Programmes das "OnChange"-Ereignis von "LabelEdit1" ausgelöst. :x
Trage ich den Wert "Test" zur Entwicklungszeit im Objektinspektor in die Eigenschaft "Text" des TLabeledEdit ein, wird beim Programmablauf kein "OnChange"-Event ausgelöst. :|

a) Warum ist das so?
b) Wie kann ich im Quelltext Werte vorgeben ohne, dass das "OnCreate"-Event aktiv wird.

Solche Werte mittels Objektinspektor vorgeben, finde ich sehr unüberischtlich. Man findet die Werte nicht im Quelltext wieder.

Gruß Heiko
Zuletzt geändert von kralle am So 6. Nov 2016, 08:01, insgesamt 2-mal geändert.
OS: Manjaro Linux, Debian und Windows 10
FPC-Version: 3.2.2 , Lazarus 3.0
+ Delphi XE7SP1

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: TLabeledEdit und Onchage

Beitrag von wp_xyz »

(a) Ich denke, dass du im Designmode Code für das OnChange-Ereignis des LabelEdit-Controls eingegeben hast. Wenn du später zur Laufzeit den Text des Edit änderst, wird der OnChange-Code ausgeführt; genau dafür das das OnChange da. Zur Designzeit wird dagegen nichts ausgeführt, weil die IDE damit gar nichts anfangen kann, dein OnChange-Code ist ja noch nicht kompiliert.

(b) Ich verstehe die Frage nicht: warum redest du plötzlich von OnCreate - das gibt es bei Frames doch gar nicht... Ich nehme an, du willst verhindern, dass das OnChange des Edit-Controls ausgelöst wird. Setze dazu einfach den OnChange-Handler auf nil, bevor du LabelEdit1.Text änderst, und setze ihn anschließend wieder auf die entsprechende Methode zurück:

Code: Alles auswählen

procedure TFrame1.LabelEdit1Change(Sender: Nil);
begin
  // ... tu was...
end;
 
constructor TForm1.Create(AOwner: TComponent);
begin
  // ...
  LabelEdit1.OnChange := nil;
  LabelEdit1.Text := 'irgendwas';
  LabelEdit1.OnChange := @LabelEdit1Change;
end;
 
{oder allgemeiner:
constructor TForm1.Create(AOwner: TComponent);
var
  OldOnChange: TNotifyEvent;
begin
  // ...
  OldOnChange := @LabelEdit1.OnChange;
  LabelEdit1.OnChange := nil;
  LabelEdit1.Text := 'irgendwas';
  LabelEdit1.OnChange := OldOnChange;
end;}

Benutzeravatar
kralle
Lazarusforum e. V.
Beiträge: 989
Registriert: Mi 17. Mär 2010, 14:50
OS, Lazarus, FPC: Linux Mint 20 , FPC 3.3.1 , Lazarus 2.1.0 -Win10 & XE7Pro
CPU-Target: 64Bit
Wohnort: Bremerhaven
Kontaktdaten:

Re: TLabeledEdit und Onchage

Beitrag von kralle »

Moin,
wp_xyz hat geschrieben:(a) Ich denke, dass du im Designmode Code für das OnChange-Ereignis des LabelEdit-Controls eingegeben hast.

Ja.

wp_xyz hat geschrieben:Wenn du später zur Laufzeit den Text des Edit änderst, wird der OnChange-Code ausgeführt; genau dafür das das OnChange da.

Schon klar, nur war mir nicht bewusst, das das Ereignis auch ausgelöst wird, wenn man nichts in das Editfeld eingibt, sondern der Eigenschaft Text einen neuen Wert gibt.

wp_xyz hat geschrieben: Zur Designzeit wird dagegen nichts ausgeführt, weil die IDE damit gar nichts anfangen kann, dein OnChange-Code ist ja noch nicht kompiliert.

Das ist auch klar (jetzt noch klarer)

wp_xyz hat geschrieben:(b) Ich verstehe die Frage nicht: warum redest du plötzlich von OnCreate - das gibt es bei Frames doch gar nicht...

Doch, wenn man es selber strickt :D

wp_xyz hat geschrieben: Ich nehme an, du willst verhindern, dass das OnChange des Edit-Controls ausgelöst wird.

Wäre wohl der sicherste Weg oder macht man das wirklich, das man Vorgebewerte mittels Objektinspektor zur Entwurfszeit vorgibt?

wp_xyz hat geschrieben: Setze dazu einfach den OnChange-Handler auf nil, bevor du LabelEdit1.Text änderst, und setze ihn anschließend wieder auf die entsprechende Methode zurück:.

Version 1 scheint mir da etwas Betriebssystem unabhängiger zu sein?
Oder gibt es "TNotifyEvent" auf allen von Lazarus unterstützen Systemen?

Gruß Heiko
OS: Manjaro Linux, Debian und Windows 10
FPC-Version: 3.2.2 , Lazarus 3.0
+ Delphi XE7SP1

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: TLabeledEdit und Onchage

Beitrag von wp_xyz »

kralle hat geschrieben:
wp_xyz hat geschrieben: Ich nehme an, du willst verhindern, dass das OnChange des Edit-Controls ausgelöst wird.

Wäre wohl der sicherste Weg oder macht man das wirklich, das man Vorgebewerte mittels Objektinspektor zur Entwurfszeit vorgibt?

Ich denke, da verstehst du mich nicht: In dem Augenblick, wenn du im Designmodus auf die drei Punkte neben dem OnChange im Objektinspector klickst und den vorgeschlagenen Code-Rahmen mit eigenem Code vervollständigst, wird dieser Code der OnChange-Prozedurvariablen zugewiesen. Später, zur Laufzeit, werden im Constructor alle Eigenschaften aus der lfm-Datei gelesen, dabei wird auch der Zeiger auf OnChange auf deinen Code gesetzt. Ab jetzt ist das Ereignis "scharf" und wird bei jeder folgenden Änderung von Text aufgerufen.

kralle hat geschrieben:
wp_xyz hat geschrieben: Setze dazu einfach den OnChange-Handler auf nil, bevor du LabelEdit1.Text änderst, und setze ihn anschließend wieder auf die entsprechende Methode zurück:.

Version 1 scheint mir da etwas Betriebssystem unabhängiger zu sein?
Oder gibt es "TNotifyEvent" auf allen von Lazarus unterstützen Systemen?

Das hat nichts mit dem Betriebssystem zu tun. TNotifyEvent ist in Classes deklariert und sitzt damit ganz tief im Innersten der Lazarus/FPC-Klassenstruktur, lang bevor irgendwelche Widgetsets oder Betriebssystem-Eigenheiten ins Spiel kommen.

Ich habe die zweite Methode nur deshalb erwähnt, weil man manchmal Event-Prozeduren verwendet, die einen anderen als den vorgeschlagenen Namen tragen.

Benutzeravatar
kralle
Lazarusforum e. V.
Beiträge: 989
Registriert: Mi 17. Mär 2010, 14:50
OS, Lazarus, FPC: Linux Mint 20 , FPC 3.3.1 , Lazarus 2.1.0 -Win10 & XE7Pro
CPU-Target: 64Bit
Wohnort: Bremerhaven
Kontaktdaten:

Re: TLabeledEdit und Onchage

Beitrag von kralle »

Moin,

wp_xyz hat geschrieben:Ich denke, da verstehst du mich nicht: In dem Augenblick, wenn du im Designmodus auf die drei Punkte neben dem OnChange im Objektinspector klickst und den vorgeschlagenen Code-Rahmen mit eigenem Code vervollständigst, wird dieser Code der OnChange-Prozedurvariablen zugewiesen. Später, zur Laufzeit, werden im Constructor alle Eigenschaften aus der lfm-Datei gelesen, dabei wird auch der Zeiger auf OnChange auf deinen Code gesetzt. Ab jetzt ist das Ereignis "scharf" und wird bei jeder folgenden Änderung von Text aufgerufen.

Das habe ich auch so verstanden.

wp_xyz hat geschrieben:Das hat nichts mit dem Betriebssystem zu tun. TNotifyEvent ist in Classes deklariert und sitzt damit ganz tief im Innersten der Lazarus/FPC-Klassenstruktur, lang bevor irgendwelche Widgetsets oder Betriebssystem-Eigenheiten ins Spiel kommen.

Okay. So tief stecke ich in den Abhängigkeiten und der Hierachie nicht drin. Danke.

wp_xyz hat geschrieben:Ich habe die zweite Methode nur deshalb erwähnt, weil man manchmal Event-Prozeduren verwendet, die einen anderen als den vorgeschlagenen Namen tragen.

Das leuchtet mir jetzt auch ein.

Was mir jetzt noch unklar ist, ist die Frage:
.. macht man das wirklich, das man Vorgabewerte mittels Objektinspektor zur Entwurfszeit vorgibt?

Oder ist das kein guter Stil? Andererseits, macht es die eigentlichen Quellcode kleiner. Nur findet man auf Anhieb immer wieder wo man einen Wert vorgegeben hat?

Gruß Heiko
OS: Manjaro Linux, Debian und Windows 10
FPC-Version: 3.2.2 , Lazarus 3.0
+ Delphi XE7SP1

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: TLabeledEdit und Onchage

Beitrag von wp_xyz »

kralle hat geschrieben:Was mir jetzt noch unklar ist, ist die Frage:
.. macht man das wirklich, das man Vorgabewerte mittels Objektinspektor zur Entwurfszeit vorgibt?

Oder ist das kein guter Stil? Andererseits, macht es die eigentlichen Quellcode kleiner. Nur findet man auf Anhieb immer wieder wo man einen Wert vorgegeben hat?

Das ist der Vorteil der visuellen Programmierung. Wenn du im Design-Modus das Edit-Control im Formular an die gewünschte Stelle schiebst, werden automatisch die Eigenschaften Left und Top verändert, bei der Größenanpassung auch Top und Width. usw - du siehst schon im Entwurf, wie das Formular später aussehen wird. Aber: wie du selbst feststellst, verteilst du den Code damit auf die pas und die lfm-Datei (in letzterer stecken die Design-Modus-Angaben). Das hat klar Nachteile, vor allem wenn man z.B. bei Datenbank-Anwendungen die Pfade zur Datenbank schon im Design-Modus fest verdrahtet. Alles hat seine Vor- und Nachteile... Schlechter Programmierstil ist es definitiv nicht, Delphi und Visual Basic sind damals wegen gerade der visuellen Programmierung so erfolgreich geworden.

Antworten