Delphi-PRAXiS
Seite 2 von 2     12   

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)

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 23:29 Uhr.
Seite 2 von 2     12   

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