Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Label => "Change" (https://www.delphipraxis.net/96697-label-%3D-change.html)

Tommy1988 29. Jul 2007 11:15


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 :?

mkinzler 29. Jul 2007 11:17

Re: Label => "Change"
 
Merke dir doch den Inhalt und überprüfe den mit dem aktuellen.

Tommy1988 29. Jul 2007 11:18

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;

scrat1979 29. Jul 2007 11:37

Re: Label => "Change"
 
Zitat:

Zitat von Tommy1988
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;

Was Du uns da sagen möchtest verstehe ich ehrlich gesagt überhaupt nicht, aber was Dein Problem angeht versuch doch folgendes:

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.

Hawkeye219 29. Jul 2007 11:51

Re: Label => "Change"
 
Hallo,

der Trick ist immer der gleiche - eine nachträgliche Erweiterung des betreffenden Controls:

Delphi-Quellcode:
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;
Gruß Hawkeye

Tommy1988 29. Jul 2007 18:13

Re: Label => "Change"
 
Delphi-Quellcode:
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;
Ich blicke da nicht mehr durch..
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.....

Namenloser 29. Jul 2007 18:40

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;

Tommy1988 29. Jul 2007 18:56

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.

Namenloser 29. Jul 2007 19:39

Re: Label => "Change"
 
Zitat:

Zitat von Tommy1988
ohne es auszuprobieren behaupte ich jetzt mal, dass er dann aber alle 500 ms (timerintrval) den Text ins listBox macht.

Dann probiers halt aus und überzeug dich davon, dass es nicht so ist :lol:

Jelly 29. Jul 2007 19:50

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.

bitsetter 29. Jul 2007 19:59

Re: Label => "Change"
 
Zitat:

Zitat von Jelly
Was soll denn der Quatsch mit dem Timer :wall:

Hallo,
das sehe ich genauso.


Zitat:

Zitat von Jelly
Hawkeye bietet doch die wunderbare Lösung. Also erstell dir eine neue Komponente, installier sie in ein Package und nutze diese neue Label.

Zitat:

Zitat von Hawkeye219
Delphi-Quellcode:
type
  TLabel = class (StdCtrls.TLabel)

Er braucht noch nicht mal eine Komponente installieren, denn alle TLabel die sich auf dem Formular befinden, haben jetzt schon das onChange Event.

Das Einzige was man jetzt noch mache muss, ist das onChange Event zur Laufzeit zuzuweisen. Das ist praktisch Copy & Paste Code.
Zitat:

Zitat von Hawkeye219
Delphi-Quellcode:
procedure TForm1.FormCreate (Sender: TObject);
begin
  Label1.OnChange := LabelChanged;
end;


Luckie 29. Jul 2007 20:09

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:
Label1.Caption := 'neuer Text';
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?

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:

Jelly 29. Jul 2007 20:59

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.

Luckie 29. Jul 2007 22:25

Re: Label => "Change"
 
Zitat:

Zitat von Jelly
Schliesslich kann sich die Caption an mehreren Stellen im Programm ändern.

Dann habe ich einen Designfehler, da ich redundanten Code in meiner anwendung habe. Statt dessen schreibe ich mir eine Methode UpdateCaption und kann dort zentral behandlen was nach einer Änderung passieren soll.

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. :?

Namenloser 29. Jul 2007 22:26

Re: Label => "Change"
 
Zitat:

Zitat von Jelly
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.

In diesem Fall kann man sich ja eine eigene Procedure schreiben:
Delphi-Quellcode:
procedure tForm1.ChangeeLabelCaption(const s: string);
begin
  label1.caption := s;
  // Weitere Anweisungen...
end;

Tommy1988 4. Sep 2007 13:23

Re: Label => "Change"
 
Zitat:

Zitat von Hawkeye219
Hallo,

der Trick ist immer der gleiche - eine nachträgliche Erweiterung des betreffenden Controls:

Delphi-Quellcode:
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;
Gruß Hawkeye

Dazu eine Frage:
Wo finde ich diese Datei die ich nachträglich erweitern muss bzw. wonach muss ich suchen?

bitsetter 9. Sep 2007 11:59

Re: Label => "Change"
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Tommy1988

Dazu eine Frage:
Wo finde ich diese Datei die ich nachträglich erweitern muss bzw. wonach muss ich suchen?

Hi,

was für eine Datei?

grenzgaenger 9. Sep 2007 12:44

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