![]() |
Label => "Change"
Hallo alle.
Ein Edit hat eine "Change" eingeschaft. Kann man soetwas "indirekt" auch irgentwie mit einem Label veranschaulichen? Ich habe einen Timer der überprüfen sollte ob das Caption eines Labels sich ändert. Nur habe ich keine Ahnung wie :? |
Re: Label => "Change"
Merke dir doch den Inhalt und überprüfe den mit dem aktuellen.
|
Re: Label => "Change"
mhh.. ich probiers grade mal
Edit: Hab nen kleinen Hänger, deswegen ist die Zeile X so doof:
Delphi-Quellcode:
if OldString = OldString then // Zeile X
begin // Zeile Y , nix tun weil OldString immernoch gleich OldString ist end else begin ListBox1.Items.Add(OldString) // Das hier könnte ja wenn Zeile X nicht doof wär bei zeile Y stehen end; |
Re: Label => "Change"
Zitat:
Delphi-Quellcode:
[...]
type TForm1 = class(TForm) [...] public { Public-Deklarationen } OldCaption : String; end; [...] procedure TForm1.TimerTimer(Sender: TObject); begin { Wenn Variable OldCaption noch nicht gesetzt } if OldCaption = '' Then OldCaption := Label1.Caption; { Neue Caption? } if Label1.Caption <> OldCaption Then Begin; ShowMessage('Label1.Caption wurde geändert!!!'); OldCaption := Label1.Caption; // Neue Caption der Variablen zuweisen... End; end; [...] end. |
Re: Label => "Change"
Hallo,
der Trick ist immer der gleiche - eine nachträgliche Erweiterung des betreffenden Controls:
Delphi-Quellcode:
Gruß Hawkeye
type
TLabel = class (StdCtrls.TLabel) private FOnChange : TNotifyEvent; procedure CMTextChanged (var Message: TMessage); message CM_TEXTCHANGED; public property OnChange: TNotifyEvent read FOnChange write FOnChange; end; TForm1 = class (TForm) {...} procedure FormCreate (Sender: TObject); private procedure LabelChanged (Sender: TObject); end; procedure TLabel.CMTextChanged (var Message: TMessage); begin inherited; if Assigned(FOnChange) then FOnChange (Self); end; procedure TForm1.FormCreate (Sender: TObject); begin Label1.OnChange := LabelChanged; end; procedure TForm1.LabelChanged (Sender: TObject); begin Self.Caption := (Sender as TLabel).Caption; end; |
Re: Label => "Change"
Delphi-Quellcode:
Ich blicke da nicht mehr durch..
procedure TForm1.Timer4Timer(Sender: TObject);
var a: Integer; begin // Wenn Variable OldSongTitel noch nicht gesetzt {if OldSongTitel = '' then begin }// OldSongTitel := InterpretTitel1.Caption; // end; // Neue Caption? if InterpretTitel1.Caption <> OldSongTitel then begin // ShowMessage('Titel wurde geändert!!!'); for a := 1 to 2 do begin ListBox1.Items.Add(OldSongTitel); end; // Neue Caption der Variablen zuweisen... OldSongTitel := InterpretTitel1.Caption; end; end; Der timer steht auf 1000 ms. Der Timer schreibt aber alle 1000ms OldSongTitel in die ListBox. Aber er soll das doch nur machen wenn InterpretTitel1.Caption sich geändert hat..... |
Re: Label => "Change"
Delphi-Quellcode:
procedure TForm1.Timer4Timer(Sender: TObject);
begin // Caption geändert? if InterpretTitel1.Caption <> OldSongTitel then ListBox1.Items.Add(OldSongTitel); // Caption merken OldSongTitel := InterpretTitel1.Caption; end; |
Re: Label => "Change"
ohne es auszuprobieren behaupte ich jetzt mal, dass er dann aber alle 500 ms (timerintrval) den Text ins listBox macht.
ich habs jetzt UMSTÄNDLICH aber anders gemacht: InterpretenText wird in ein edit gechrieben und wenn das edit 'gechanged' wird wid was in die listbox geschrieben.. so. umständlich, doof und blöd aber klappt. |
Re: Label => "Change"
Zitat:
|
Re: Label => "Change"
Was soll denn der Quatsch mit dem Timer :wall:
Hawkeye bietet doch die wunderbare Lösung. Also erstell dir eine neue Komponente, installier sie in ein Package und nutze diese neue Label. |
Re: Label => "Change"
Zitat:
das sehe ich genauso. Zitat:
Zitat:
Das Einzige was man jetzt noch mache muss, ist das onChange Event zur Laufzeit zuzuweisen. Das ist praktisch Copy & Paste Code. Zitat:
|
Re: Label => "Change"
Und ich bin der Meinung, das alles Qutasch ist, was ihr da macht. Wenn sich die Caption ändert, muss irgendwo im Quelltext stehen:
Delphi-Quellcode:
Und jetzt die alles entscheidende Frage? Wann hat sich die Caption geändert? Richtig, naqh dem obige Zeile ausgeführt wurde. Warum führt man den Code, der bei einer Änderung ausgeführt werden soll, danach nicht einfach aus?
Label1.Caption := 'neuer Text';
Wenn ich am Fernseher den Sender umschalte, dann muss ich doch aiuch nicht ständig gucken, ob ich umgeschaltet habe, weil ich weiß wann ich umgeschaltet habe, weil ich ja selber umgeschaltet habe. :wall: |
Re: Label => "Change"
Luckie hat Recht, denn ein Caption von einem Label wird schliesslich nicht direkt von einem Benutzer geändert. Bei einem TEdit ist das anders.
Dennoch ist es eine Ansichtssache, ob man sowas zentral über ein Event abwicklen will oder nicht. Schliesslich kann sich die Caption an mehreren Stellen im Programm ändern. Vergisst man dann, einmal die CheckCaptionChanged Prozedur aufzurufen, ist somit nicht garantiert, dass bei jeder Änderung der Caption eine entsprechende Reaktion passieren soll. Darüber hinaus: Wenn ich mein Form aus einem anderem Form aufrufe, muss ich auch dort sicherstellen, dass die besagte CheckCaptionChanged Prozedur aufgerufen wird. Dies liegt aber unter Umständen nicht mehr in der Verantwortung des Programmierers des 2. Forms. Deshalb tendiere ich dennoch zu einer Event-Lösung, da ich da sicher bin, dass ich wirklich jede Änderung mitbekomme. Besser noch: Wenn ich solch eine Funktionalität in einer späteren Phase des Programms benötige, müsste ich ohne Event-Lösung den gesamten Quellcode durchgehen und alle Stellen herauskristalisieren, an denen ich die Caption des besagten Label ändere und entsprechend die CheckCaptionChanged Prozedur aufrufen. |
Re: Label => "Change"
Zitat:
Allerdings ist auch in diesem konkrten Fall von Tommy1988 das Design schon sehr schlecht. Anscheinend ist hier auszuführender Code von der GUI abhängig. Irgendwo im Code muss, ja entschieden werden, oder es tritt ein Ereignis ein, dass jetzt eine Statusänderung erfolgt ist (die über das Label dem Benutzer angezeigt werden soll). Warum wird der von der Statusänderung abhängige Code nicht dort ausgeführt, wo sich der Status ändert? Beispiel: Ein Komponente kennt das Ereignis OnConnect, welches nach dem Erstellen einer Verbindung ausgelöst wird. Wenn ich Code nach dem Erstellen einer Verbindung ausführen will, dann gucke ich doch nicht, wann ich den Statustext ändere, sondern führe den Code direkt in dem Ereignis aus. Ich meine, wenn ich weiß, wann ich den Statustext ändern muss, dann weiß ich auch, wann ich meinen Code ausführen muss. :? |
Re: Label => "Change"
Zitat:
Delphi-Quellcode:
procedure tForm1.ChangeeLabelCaption(const s: string);
begin label1.caption := s; // Weitere Anweisungen... end; |
Re: Label => "Change"
Zitat:
Wo finde ich diese Datei die ich nachträglich erweitern muss bzw. wonach muss ich suchen? |
Re: Label => "Change"
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
was für eine Datei? |
Re: Label => "Change"
hier mal ein beispiel...
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type tMyLabel = class(tLabel) private fOnChange: tNotifyEvent; function GetText: TCaption; procedure SetText(const Value: TCaption); published property Caption: TCaption read GetText write SetText; property OnChange: tNotifyEvent read fOnChange write fOnChange; end; TForm1 = class(TForm) procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private-Deklarationen } myLabel: tMyLabel; procedure SetToTest(sender: tobject); public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} { tMyLabel } function tMyLabel.GetText: TCaption; begin inherited; end; procedure tMyLabel.SetText(const Value: TCaption); begin if inherited caption <> value then begin inherited caption := value; if assigned(fOnchange) then fOnChange(self); end; end; procedure TForm1.FormCreate(Sender: TObject); begin myLabel := tMyLabel.Create(self); myLabel.Parent := self; myLabel.Left := 20; myLabel.Top := 20; myLabel.OnChange := SetToTest; myLabel.Caption := 'test'; end; procedure TForm1.FormDestroy(Sender: TObject); begin if mylabel <> NIL then FreeAndNil(MyLabel); end; procedure TForm1.SetToTest(sender: tobject); begin myLabel.Caption := 'nix da'; end; end. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:43 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz