Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Label.Caption ändert sich bei nicht aktiv immer auf 1
Kaze91 - Di 21.02.12 18:01
Titel: Label.Caption ändert sich bei nicht aktiv immer auf 1
Hey Leute ich habe vor ein paar Monaten mit Delphi Angefangen , hatte auch einige Probleme aber alle gelöst bekommen. Nur 1 leider nicht.
Deshalb möchte ich mich erst mal als neuer in diesem Forum vorstellen. Ich bin 20 Jahre , mache mein Fachabitur und liebe alles was mit Technik zu tun hat.
Jetzt zu meinem Problem :
Ich würde gerne überprüfen ob sich die Linienanzahl meines Memo Feldes verändert, wenn meine Form nicht aktiv ist. Wenn sie sich geändert soll das Fenster blinken.
Wie ihr seht habe ich zum Überprüfen die Zeilenanzahl in ein Label geschrieben. Funktioniert auch , aber leider setzt er den Label sobald das Fenster inaktiv ist auf 1 =( .
Ich hoffe ihr könnt mir helfen.
Hier der Code
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:
| procedure TForm1.Timer2Timer(Sender: TObject); var oldline : Integer; newline : Integer; oldlines : String; newlines : String;
begin newline := dialog.Lines.Count; newlines := IntToStr(newline); oldlines := Label3.Caption;
if not Application.Active then begin if oldlines>newlines then begin FlashWindow(self.Handle, True); end end;
if Application.Active then oldline := dialog.Lines.Count; Label3.Caption := IntToStr(oldline);
end; |
Moderiert von
Narses: Code- durch Delphi-Tags ersetzt
Moderiert von
Narses: Topic aus Sonstiges (Delphi) verschoben am Di 21.02.2012 um 17:16
Moderiert von
Narses: Emoticon aus dem Titel entfernt.
jaenicke - Di 21.02.12 18:20
Hallo und :welcome: im Forum!
Wenn du den Quelltext ordentlich einrücken würdest, würdest du leichter sehen, dass da ein begin..end fehlt. ;-)
Kaze91 hat folgendes geschrieben : |
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:
| procedure TForm1.Timer2Timer(Sender: TObject); var oldline : Integer; newline : Integer; oldlines : String; newlines : String; begin newline := dialog.Lines.Count; newlines := IntToStr(newline); oldlines := Label3.Caption;
if not Application.Active then begin if oldlines > newlines then begin FlashWindow(self.Handle, True); end end;
if Application.Active then oldline := dialog.Lines.Count;
Label3.Caption := IntToStr(oldline); end; | |
Die markierte Zeile gehört nicht mehr zu dem vorhergehenden if dazu, sondern wird immer ausgeführt. Das soll vermutlich nicht so sein. ;-)
Kaze91 - Di 21.02.12 20:14
jaenicke hat folgendes geschrieben : |
Die markierte Zeile gehört nicht mehr zu dem vorhergehenden if dazu, sondern wird immer ausgeführt. Das soll vermutlich nicht so sein. ;-) |
Hey erstmal danke für die Antwort, doch das ist schon richtig so sonst wären die beiden Zahlen oben ja immer gleich ;)
Noch jemand eine Idee?
Edit: Allerdings scheint es nach dem vergessenen Begin und end zu klappen =) vielen Dank !
Narses - Di 21.02.12 20:52
Moin!
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| var oldline : Integer; newline : Integer; oldlines : String; newlines : String; if oldlines > newlines then |
Du vergleichst da zwei Strings, meinst aber vermutlich Integers. Bei Strings ist "10" > "200" wahr! :idea: :shock:
cu
Narses
Xion - Di 21.02.12 22:06
Kaze91 hat folgendes geschrieben : |
| Hey erstmal danke für die Antwort, doch das ist schon richtig so sonst wären die beiden Zahlen oben ja immer gleich ;) |
In dem Fall, dass das Fenster inaktiv ist, ist aber oldline unbestimmt (da du ihm zuvor nichts zugewiesen hast und es eine lokale Variable ist!). Dann wird "irgendwas" ausgegeben.
Kaze91 - Di 21.02.12 23:51
Narses hat folgendes geschrieben : |
Du vergleichst da zwei Strings, meinst aber vermutlich Integers. Bei Strings ist "10" > "200" wahr!
|
Ok aber mit Iteger sagt er mir , dass er diesen Operator (<) nicht verwenden kann. Gibt es sowas wie Value? Obwohl ich iwie dachte es funktioniert.
Xion hat folgendes geschrieben : |
In dem Fall, dass das Fenster inaktiv ist, ist aber oldline unbestimmt (da du ihm zuvor nichts zugewiesen hast und es eine lokale Variable ist!). Dann wird "irgendwas" ausgegeben.
|
Wenn das Fesnter inaktiv ist wird oldline ja auch nicht benötigt sondern oldline
s
Xion - Mi 22.02.12 11:20
Kaze91 hat folgendes geschrieben : |
Ok aber mit Iteger sagt er mir , dass er diesen Operator (<) nicht verwenden kann. Gibt es sowas wie Value? |
Machs doch so: Du machst eine "globale" Variable
var oldLines: Integer. Dann kürzt sich dein Code auf:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| procedure TForm1.Timer2Timer(Sender: TObject); var newlines : Integer; begin newlines := dialog.Lines.Count;
if oldlines<>newlines then begin if not (Application.Active) then FlashWindow(self.Handle, True); else oldLines := newLines; Label3.Caption := IntToStr(oldLines ); end; end; |
Du solltest nicht einen Integer in ein Label schreiben um anschließend aus dem Label wieder den Integer auszulesen. Als nächstes willst du dann im Label "42 Zeilen" anzeigen lassen und schon gibts Probleme.
Mit StrToInt kann man einen String wieder in einen Integer umwandeln (falls es ein gültiger Integer ist, sonst gibt es eine Exception). Mit TryStrToInt kannst du das nebenbei noch testen.
Edit:
Wenn du unbedingt den im Label angezeigten Wert im Label speichern willst (als Integer) kannst du es auch in Label.Tag speichern statt in einer globalen Variablen OldLines. Das find ich aber ziemlich unsauber ;)
Kaze91 - Mi 22.02.12 13:19
Ok ersteinmal vielen Dank ich werde es sobald wie möglich austesten.
Den Label hab ich ja nur zum Testen genommen weil es nie funktioniert hat, danach kommt der weg .
Mfg
Kaze91 - Fr 24.02.12 18:24
Moderiert von
Narses: Komplett-Zitat von
Xions letztem Beitrags entfernt.
So hab ich jetzt probiert , allerdings blinkt es jetzt immer wenn ich das Fenster nicht aktiv habe =(
Xion - Fr 24.02.12 21:05
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| procedure TForm1.Timer2Timer(Sender: TObject); var newlines : Integer; begin newlines := dialog.Lines.Count;
if (Application.Active) then oldLines := newLines else if oldlines<>newlines then begin FlashWindow(self.Handle, True); Label3.Caption := IntToStr(oldLines ); end; end; |
;)
Ob das funktioniert hängt von deiner Timerschleife ab (die müsste dann sehr kurz sein). Du solltest oldLines nochmal setzen, wenn das Fenster aktiv wird, dann bist du auf der sicheren Seite.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!