AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Von Thread auf Edit-Feld zugreifen?
Thema durchsuchen
Ansicht
Themen-Optionen

Von Thread auf Edit-Feld zugreifen?

Ein Thema von TheFirstChoice · begonnen am 2. Dez 2012 · letzter Beitrag vom 3. Dez 2012
Antwort Antwort
TheFirstChoice

Registriert seit: 10. Mär 2011
3 Beiträge
 
#1

Von Thread auf Edit-Feld zugreifen?

  Alt 2. Dez 2012, 18:50
Hallo delphipraxis
Ich hab da mal eine Frage.
Und zwar erstelle ich eine Form.

Code:
type
  TTest = Class
    fForm: TForm2;
  End;

  form: TTest;
begin
      form.fForm := TForm2.Create(nil);
      form.fForm.Left := Random(Screen.Width - form.fForm.Width) + 1;
      form.fForm.Top := Random(Screen.Height - form.fForm.Height) + 1;
      form.fForm.Show;
Das funktioniert soweit.
Auf der Form habe ich dann ein Edit Feld, auf das ich in einem Thread der durch "form.show" gestartet wird zugreifen möchte.
Aber alles was ich bisher ausprobiert habe, ist in die Hose gegangen.

Versteht ihr was ich meine? Habt ihr eine Idee wie das machbar ist?
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#2

AW: Von Thread auf Edit-Feld zugreifen?

  Alt 2. Dez 2012, 18:59
Wenn nirgendwo in Deinem Code
  form:= TTest.Create; funktioniert das Konstrukt eh nur zufällig, wenn es also so ähnlich wie hier aussehen sollte
Delphi-Quellcode:
type
  TTest = Class
    fForm: TForm6;
  End;

procedure TForm6.Button1Click(Sender: TObject);
var
  form: TTest;
begin
      form.fForm := TForm6.Create(nil);
      form.fForm.Left := Random(Screen.Width - form.fForm.Width) + 1;
      form.fForm.Top := Random(Screen.Height - form.fForm.Height) + 1;
      form.fForm.Show;


end;

greifst Du mit form.fForm := irgendwo in den Stack ....

Aus einem Thread auf VCL-Komponenten greifst Du per synchronize zu.
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
TheFirstChoice

Registriert seit: 10. Mär 2011
3 Beiträge
 
#3

AW: Von Thread auf Edit-Feld zugreifen?

  Alt 2. Dez 2012, 19:21
Erst einmal danke für deine Antwort.

Nun habe ich es so:

(Form1/Unit1)
Code:
  form := TTest.Create;

  form.fForm := TForm2.Create(nil);
  form.fForm.Left := Random(Screen.Width - Form2.Width) + 1;
  form.fForm.Top := Random(Screen.Height - Form2.Height) + 1;
  form.sInfo := 'Info String';
  form.fForm.show;
(Form2/Unit2)
Code:
var
  Form2: TForm2;
  form: TTest;

implementation
Code:
procedure TestThread();
var
  s: string;
begin
  s := form.sinfo;
  // Hier soll das Editfeld den Wert von "s" bekommen.
end;

procedure TForm2.FormShow(Sender: TObject);
var
  id:dword;
begin
  beginthread(nil, 0, @TestThread, nil, 0, id);
end;
Form2.Edit1.Text ist ja völlig falsch, das ist klar.
Ist der Anfang so richtig? Habe bisher nicht viel mit Threads gearbeitet, sorry also

Edit:
Beim Aufruf von Synchronize bekomme ich ständig die Meldung:
Zitat:
[DCC Fehler] Unit2.pas(47): E2066 Operator oder Semikolon fehlt

Geändert von TheFirstChoice ( 2. Dez 2012 um 19:35 Uhr)
  Mit Zitat antworten Zitat
nuclearping

Registriert seit: 7. Jun 2008
708 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

AW: Von Thread auf Edit-Feld zugreifen?

  Alt 3. Dez 2012, 02:43
Synchronize benötigt eine Prozedur als Übergabeparameter.

Delphi-Quellcode:
interface

type
  TTest = class(TThread)
  private
    FEdit: TEdit;
    FEditValue: String;

    procedure SetEditText;
  published
    property Edit: TEdit read FEdit write FEdit; // Edit-Property musst du von aussen das Edit-Feld zuweisen, bevor der Thread gestartet wird. Alternativ kannst du es auch im Constructor mitübergeben, wenn du ihn entsprechend umbaust
  end;

...

implementation

procedure TTest.SetEditText;
begin
  FEdit.Text := FEditValue;
end;

procedure TTest.Execute;
begin
  while not Terminated do
    begin
      FEditValue := 'irgendwas';
      Synchronize(SetEditText);
      Sleep(1);
    end;
end;
Alternativ kannst du auch das FEditValue Property publishen und von aussen über einen Timer oder so den Wert auslesen, statt in dem Thread das Edit zu setzen.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.116 Beiträge
 
Delphi 12 Athens
 
#5

AW: Von Thread auf Edit-Feld zugreifen?

  Alt 3. Dez 2012, 03:52
Beim Aufruf von Synchronize bekomme ich ständig die Meldung:
Zitat:
[DCC Fehler] Unit2.pas(47): E2066 Operator oder Semikolon fehlt
Es hätte natürlich jemand uns mal zeigen können, wie er versucht das Synchronize aufzurufen.
Ansonsten kann niemand sagen, was derjenige falsch macht.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 3. Dez 2012 um 03:53 Uhr) Grund: faule RedBox ... oder ich hätte schneller tippen sollen
  Mit Zitat antworten Zitat
TheFirstChoice

Registriert seit: 10. Mär 2011
3 Beiträge
 
#6

AW: Von Thread auf Edit-Feld zugreifen?

  Alt 3. Dez 2012, 04:15
Danke euch, aber habs nun so gemacht, dass ich das Editfeld zur Laufzeit erstelle.
So funktioniert es.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.116 Beiträge
 
Delphi 12 Athens
 
#7

AW: Von Thread auf Edit-Feld zugreifen?

  Alt 3. Dez 2012, 04:33
Was ist zur Laufzeit?

Doch nicht etwa Thread?
Wenn die Form im Hauptthread ist, muß das Edit auch dort erstellt werden,
abgesehn davon, daß die VCL nicht threadsave ist, sind WinControls threadabhängig und müssen da erstelt werden, wo die/eine Message-Loop läuft.


Und egal wo das erstellt wird, der Zugriff muß dennoch synchronisiert werden!
Wie gesagt ... nicht threadsave
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#8

AW: Von Thread auf Edit-Feld zugreifen?

  Alt 3. Dez 2012, 06:49
Beim Aufruf von Synchronize bekomme ich ständig die Meldung:
Zitat:
[DCC Fehler] Unit2.pas(47): E2066 Operator oder Semikolon fehlt
Ansonsten kann niemand sagen, was derjenige falsch macht.
Ich schon.
Man benötigt für folgende Analyse natürlich 30 Jahre Programmiererfahrung, is klar:
Er hat vergessen, einen Operator oder ein Semikolon anzugeben. Oder was anderes.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.116 Beiträge
 
Delphi 12 Athens
 
#9

AW: Von Thread auf Edit-Feld zugreifen?

  Alt 3. Dez 2012, 09:09
Ich glaub ich kann mich in diesem Jahrtausend nicht dran erinnern diesen "ich hab alle Parameter vergessen"-Fehler mal gesehn zu haben,
aber OK, es sind noch keine 30 Jahre.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort


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 16:59 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