Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Von Thread auf Edit-Feld zugreifen? (https://www.delphipraxis.net/171927-von-thread-auf-edit-feld-zugreifen.html)

TheFirstChoice 2. Dez 2012 18:50


Von Thread auf Edit-Feld zugreifen?
 
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?

Bummi 2. Dez 2012 18:59

AW: Von Thread auf Edit-Feld zugreifen?
 
Wenn nirgendwo in Deinem Code
Delphi-Quellcode:
  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.

TheFirstChoice 2. Dez 2012 19:21

AW: Von Thread auf Edit-Feld zugreifen?
 
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

nuclearping 3. Dez 2012 02:43

AW: Von Thread auf Edit-Feld zugreifen?
 
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.

himitsu 3. Dez 2012 03:52

AW: Von Thread auf Edit-Feld zugreifen?
 
Zitat:

Zitat von TheFirstChoice (Beitrag 1194031)
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. :glaskugel:

TheFirstChoice 3. Dez 2012 04:15

AW: Von Thread auf Edit-Feld zugreifen?
 
Danke euch, aber habs nun so gemacht, dass ich das Editfeld zur Laufzeit erstelle.
So funktioniert es.

himitsu 3. Dez 2012 04:33

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

Furtbichler 3. Dez 2012 06:49

AW: Von Thread auf Edit-Feld zugreifen?
 
Zitat:

Zitat von himitsu (Beitrag 1194057)
Zitat:

Zitat von TheFirstChoice (Beitrag 1194031)
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. :glaskugel:

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. :stupid:

himitsu 3. Dez 2012 09:09

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 19:01 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