AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Label Text ändern aus einem Thread heraus

Ein Thema von CreativeMD · begonnen am 25. Sep 2014 · letzter Beitrag vom 27. Sep 2014
Antwort Antwort
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.659 Beiträge
 
Delphi 12 Athens
 
#1

AW: Label Text ändern aus einem Thread heraus

  Alt 25. Sep 2014, 18:58
Oder man regelt das über Events, oder man schickt die Messages an das Fensterhandle statt an das nicht vorhandene Label-Handle. Fehlt da übrigens nicht ein override beim Konstruktor?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von CreativeMD
CreativeMD

Registriert seit: 11. Okt 2011
127 Beiträge
 
Delphi XE2 Architect
 
#2

AW: Label Text ändern aus einem Thread heraus

  Alt 25. Sep 2014, 19:10
Erstmal dankeschön für eure schnellen Antworten.

@himitsu ich hab es schon mit den Methoden SendMessage/PostMessage probiert. Es könnte aber auch sein das es falsch war, könntet ihr mir mal ein SendMessage Beispiel geben?
P.S. der Code ist durcheinandergewürfelt weil ich momentan erstmal nur das Problem beheben will und der Rest erstmal egal ist.

@DeddyH Beispiel?
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.659 Beiträge
 
Delphi 12 Athens
 
#3

AW: Label Text ändern aus einem Thread heraus

  Alt 25. Sep 2014, 19:36
Schnell zusammengetippt, kann noch Fehler enthalten:
Delphi-Quellcode:
type
  TOnSomethingHappenedEvent = procedure(var OldValue: string; const NewValue: string) of object;
  
  TMyThread = class(TThread)
  private
    FText: string;
    FOnSomethingHappened: TOnSomethingHappenedEvent;
    procedure DoOnSomethingHappened;
    ...
  public
    ...
    property OnSomethingHappened: TOnSomethingHappenedEvent read FOnSomethingHappened write FOnSomethingHappened;
  end;
  
procedure TMyThread.DoOnSomethingHappened;
var
  OldValue: string;
begin
  if Assigned(FOnSomethingHappened) then
    begin
      FOnSomethingHappened(OldValue, FText);
      Log('Changed from ' + OldValue + ' to ' + FText);
    end;
end;

procedure TMyThread.Execute;
begin
  ...
  Synchronize(DoOnSomethingHappened);
end;
Nun kannst Du dem Thread eine Methode vom Typ TOnSomethingHappenedEvent als Eventhandler für OnSomethingHappened zuweisen, der dann synchronisiert ausgeführt wird. Allerdings musst Du den Thread nun Suspended erzeugen, damit er nicht gleich losrennt, bevor die Property belegt wurde.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von CreativeMD
CreativeMD

Registriert seit: 11. Okt 2011
127 Beiträge
 
Delphi XE2 Architect
 
#4

AW: Label Text ändern aus einem Thread heraus

  Alt 26. Sep 2014, 17:55
Schnell zusammengetippt, kann noch Fehler enthalten:
Delphi-Quellcode:
type
  TOnSomethingHappenedEvent = procedure(var OldValue: string; const NewValue: string) of object;
  
  TMyThread = class(TThread)
  private
    FText: string;
    FOnSomethingHappened: TOnSomethingHappenedEvent;
    procedure DoOnSomethingHappened;
    ...
  public
    ...
    property OnSomethingHappened: TOnSomethingHappenedEvent read FOnSomethingHappened write FOnSomethingHappened;
  end;
  
procedure TMyThread.DoOnSomethingHappened;
var
  OldValue: string;
begin
  if Assigned(FOnSomethingHappened) then
    begin
      FOnSomethingHappened(OldValue, FText);
      Log('Changed from ' + OldValue + ' to ' + FText);
    end;
end;

procedure TMyThread.Execute;
begin
  ...
  Synchronize(DoOnSomethingHappened);
end;
Nun kannst Du dem Thread eine Methode vom Typ TOnSomethingHappenedEvent als Eventhandler für OnSomethingHappened zuweisen, der dann synchronisiert ausgeführt wird. Allerdings musst Du den Thread nun Suspended erzeugen, damit er nicht gleich losrennt, bevor die Property belegt wurde.
Aber das wird auch nichts an der Tatsache ändern, dass das Label nicht updatet

@Medium daran liegt es nicht hab, dass updaten klappt auch wenn das Thread leer ist nicht

Mit der Form stimmt etwas nicht
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.659 Beiträge
 
Delphi 12 Athens
 
#5

AW: Label Text ändern aus einem Thread heraus

  Alt 26. Sep 2014, 18:07
Ob mit der Form was nicht stimmt, kannst Du ja testen, indem Du ohne Thread mal einfach in einem ButtonClick oder so die Beschriftung änderst.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von CreativeMD
CreativeMD

Registriert seit: 11. Okt 2011
127 Beiträge
 
Delphi XE2 Architect
 
#6

AW: Label Text ändern aus einem Thread heraus

  Alt 26. Sep 2014, 18:35
Ob mit der Form was nicht stimmt, kannst Du ja testen, indem Du ohne Thread mal einfach in einem ButtonClick oder so die Beschriftung änderst.
Guter Tipp

OnClick:
Delphi-Quellcode:
procedure TOverviewF.btn1Click(Sender: TObject);
begin
  lblTaskBackground.Caption := '';
  editLabel;
end;
Die editLabel funktion befindet sich in einer anderen Unit:
Delphi-Quellcode:
procedure editLabel;
begin
  OverviewF.lblTaskBackground.Caption := 'Test';
end;
Das Label zeigt keinen Text an, obwohl Test dort stehen müsste, es liegt also nicht am Thread sondern irgendetwas wird da blockiert

EDIT
hier mal mein Sourcecode, die Dateien heißen Overview.pas und Task.pas

Geändert von CreativeMD (26. Sep 2014 um 18:40 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.659 Beiträge
 
Delphi 12 Athens
 
#7

AW: Label Text ändern aus einem Thread heraus

  Alt 26. Sep 2014, 19:01
Das kann ich zwar in meinem Delphi nicht öffnen, aber setz doch mal einen Haltepunkt ins ButtonClick und steppe durch, ob editLabel auch tatsächlich dorthin springt, wo Du glaubst.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.688 Beiträge
 
Delphi 2007 Enterprise
 
#8

AW: Label Text ändern aus einem Thread heraus

  Alt 27. Sep 2014, 03:16
Was passiert, wenn du in deinem Test editLabel so änderst?
Delphi-Quellcode:
procedure editLabel;
begin
  if GetForegroundWindow() = OverviewF.Handle then
    ShowMessage('Ja, wirklich das richtige Formular.');
end;
Wenn die MessageBox nicht kommt, dann steht in deiner globalen Variablen "OverviewF" nicht das Fenster mit dem Label.

Wenn doch, dann mal Neuzeichnen erzwingen:
Delphi-Quellcode:
procedure TOverviewF.btn1Click(Sender: TObject);
begin
   lblTaskBackground.Caption := '';
   editLabel;
   Invalidate;
end;
Mit deiner originalen editLabel Prozedur.

Wenn alles nichts bringt, mache den Test bitte mal mit einem frischen, leeren Projekt. Wenn es dort geht, dann ist in deinem eigentlichen definitiv ein Fehler.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Antwort Antwort

 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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