AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Label => "Change"

Ein Thema von Tommy1988 · begonnen am 29. Jul 2007 · letzter Beitrag vom 9. Sep 2007
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von bitsetter
bitsetter

Registriert seit: 17. Jan 2007
1.169 Beiträge
 
Turbo Delphi für Win32
 
#11

Re: Label => "Change"

  Alt 29. Jul 2007, 20:59
Zitat von Jelly:
Was soll denn der Quatsch mit dem Timer
Hallo,
das sehe ich genauso.


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 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 von Hawkeye219:
Delphi-Quellcode:
procedure TForm1.FormCreate (Sender: TObject);
begin
  Label1.OnChange := LabelChanged;
end;
Gruß bitsetter
"Viele Wege führen nach Rom"
Wolfgang Mocker (geb. 1954), dt. Satiriker und Aphoristiker
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#12

Re: Label => "Change"

  Alt 29. Jul 2007, 21:09
Und ich bin der Meinung, das alles Qutasch ist, was ihr da macht. Wenn sich die Caption ändert, muss irgendwo im Quelltext stehen:
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#13

Re: Label => "Change"

  Alt 29. Jul 2007, 21:59
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.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#14

Re: Label => "Change"

  Alt 29. Jul 2007, 23:25
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#15

Re: Label => "Change"

  Alt 29. Jul 2007, 23:26
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;
  Mit Zitat antworten Zitat
Tommy1988
(Gast)

n/a Beiträge
 
#16

Re: Label => "Change"

  Alt 4. Sep 2007, 14:23
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?
  Mit Zitat antworten Zitat
Benutzerbild von bitsetter
bitsetter

Registriert seit: 17. Jan 2007
1.169 Beiträge
 
Turbo Delphi für Win32
 
#17

Re: Label => "Change"

  Alt 9. Sep 2007, 12:59
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?
Angehängte Dateien
Dateityp: zip labeltextchanged_101.zip (5,9 KB, 17x aufgerufen)
Gruß bitsetter
"Viele Wege führen nach Rom"
Wolfgang Mocker (geb. 1954), dt. Satiriker und Aphoristiker
  Mit Zitat antworten Zitat
grenzgaenger
(Gast)

n/a Beiträge
 
#18

Re: Label => "Change"

  Alt 9. Sep 2007, 13:44
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:27 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz