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 user profile iconNarses: Code- durch Delphi-Tags ersetzt
Moderiert von user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Di 21.02.2012 um 17:16
Moderiert von user profile iconNarses: 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. ;-)
user profile iconKaze91 hat folgendes geschrieben Zum zitierten Posting springen:

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

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:

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

user profile iconKaze91 hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile iconNarses hat folgendes geschrieben Zum zitierten Posting springen:

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.

user profile iconXion hat folgendes geschrieben Zum zitierten Posting springen:

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 oldlines


Xion - Mi 22.02.12 11:20

user profile iconKaze91 hat folgendes geschrieben Zum zitierten Posting springen:

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); //veränderte Zeilenzahl bei inaktivem Fenster: Flash
      else
         oldLines := newLines;
      Label3.Caption := IntToStr(oldLines ); //die Zeilenzahl ausgeben, die der User zuletzt gesehen hat
    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 user profile iconNarses: Komplett-Zitat von user profile iconXions 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.