![]() |
Von Thread auf Edit-Feld zugreifen?
Hallo delphipraxis
Ich hab da mal eine Frage. Und zwar erstelle ich eine Form.
Code:
Das funktioniert soweit.
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; 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? |
AW: Von Thread auf Edit-Feld zugreifen?
Wenn nirgendwo in Deinem Code
Delphi-Quellcode:
funktioniert das Konstrukt eh nur zufällig, wenn es also so ähnlich wie hier aussehen sollte
form:= TTest.Create;
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. |
AW: Von Thread auf Edit-Feld zugreifen?
Erst einmal danke für deine Antwort.
Nun habe ich es so: (Form1/Unit1)
Code:
(Form2/Unit2)
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;
Code:
var
Form2: TForm2; form: TTest; implementation
Code:
Form2.Edit1.Text ist ja völlig falsch, das ist klar.
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; 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:
|
AW: Von Thread auf Edit-Feld zugreifen?
Synchronize benötigt eine Prozedur als Übergabeparameter.
Delphi-Quellcode:
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.
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; |
AW: Von Thread auf Edit-Feld zugreifen?
Zitat:
Ansonsten kann niemand sagen, was derjenige falsch macht. :glaskugel: |
AW: Von Thread auf Edit-Feld zugreifen?
Danke euch, aber habs nun so gemacht, dass ich das Editfeld zur Laufzeit erstelle.
So funktioniert es. |
AW: Von Thread auf Edit-Feld zugreifen?
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 |
AW: Von Thread auf Edit-Feld zugreifen?
Zitat:
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. :stupid: |
AW: Von Thread auf Edit-Feld zugreifen?
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. :D |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:38 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