![]() |
In Thread Zeile(n) zu Memo bzw. RichEdit hinzufügen
Hi,
So weit ich weiss darf man in Threads ja nicht direkt auf VCL-Controls zugreifen. Wie kann man es dann am besten machen? Hatte da an Memo.Perform() gedacht. Würde es damit gehen? Wenn ja, wie? Es geht nicht um einen TThread, sondern um einen "normalen" mit BeginThread() erstellen Thread. |
Re: In Thread Zeile(n) zu Memo bzw. RichEdit hinzufügen
Gleiches Problem. Wenn du nur Perform aufrufen willst, solltest du SendMessage mit dem Handle des Controls als dem ersten Parameter nehmen. Das macht genau das Gleiche wie Perform, aber synchronisiert vorher die Threads.
|
Re: In Thread Zeile(n) zu Memo bzw. RichEdit hinzufügen
OK, Danke.
Doch welche Nachricht muss ich benutzen, um eine Zeile hinzuzufügen? ![]() |
Re: In Thread Zeile(n) zu Memo bzw. RichEdit hinzufügen
Hoppla, ich dachte, du wüsstest die Nachricht schon - da habe ich den Ausgangspost nicht gründlich genug gelesen.
Nimm lieber TThread.Synchronize. Du musst dich dazu nicht in einem TThread befinden, es gibt auch einen statischen Overload. |
Re: In Thread Zeile(n) zu Memo bzw. RichEdit hinzufügen
Zitat:
|
Re: In Thread Zeile(n) zu Memo bzw. RichEdit hinzufügen
Das ist alles ziemliches Neuland für mich.
Ich habe es zum Testen jetzt mal so versucht:
Delphi-Quellcode:
Das ist die Thread-Prozedur.
procedure tp;
procedure test; var i:integer; begin for i:= 1 to 100 do form1.memo1.lines.add(inttostr(i)); end; begin tthread.Synchronize(nil,test); end; ABer da gibt es die Meldung: Zitat:
|
Re: In Thread Zeile(n) zu Memo bzw. RichEdit hinzufügen
Kannst du noch kurz die Zeile mit Beginthread zeigen?
Edit: Und vielleicht begründen, warum du es ohne Klasse (egal ob mit oder ohne TThread) machen willst. |
Re: In Thread Zeile(n) zu Memo bzw. RichEdit hinzufügen
Am einfachsten ist es wohl so:
Delphi-Quellcode:
type TMyClass = class
procedure Method; end; procedure TMyClass.Method; var i:integer; begin //nicht auf Self zugreifen for i:= 1 to 100 do form1.memo1.lines.add(inttostr(i)); end; procedure Foo; begin TThread.Synchronize(nil, TMyClass(nil).Method); end; |
Re: In Thread Zeile(n) zu Memo bzw. RichEdit hinzufügen
super Danke. Das funktioniert! :thumb:
@sirius Also aufrufen tue ich es einfach so
Delphi-Quellcode:
Ich glaube eine Klasse wäre für mein Vorhaben ein wenig überladen, obwohl ich jetzt ja auch eine habe :angel2:
beginthread(nil,0,@tp,nil,0,c);
|
Re: In Thread Zeile(n) zu Memo bzw. RichEdit hinzufügen
Ich habe doch noch eine Frage.
Wenn ich der Methode Parameter übergeben will, wie kann ich das am besten machen? Muss ich dafür Felder in der Klasse anlegen und vor dem Aufruf der Methode diese befüllen, oder geht das auch besser? |
Re: In Thread Zeile(n) zu Memo bzw. RichEdit hinzufügen
Genau so solltest du vorgehen - sofern du nicht Delphi 2009 mit anonymen Methoden besitzt. Wenn du allerdings Felder in die Klasse einführst, kannst du den TMyClass(nil)-Trick nicht mehr verwenden. Du musst dann also tatsächlich eine Instanz erstellen und freigeben.
|
Re: In Thread Zeile(n) zu Memo bzw. RichEdit hinzufügen
Das habe ich schon gemacht. Danke nochmal! :wink:
|
Re: In Thread Zeile(n) zu Memo bzw. RichEdit hinzufügen
Und warum nimmst du nicht TThread, wenn du jetzt eh schon bei Klassen bist?
|
Re: In Thread Zeile(n) zu Memo bzw. RichEdit hinzufügen
Ja, hast Recht. Ich werde es dann evtl. demnächst auf TThread umstellen.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:53 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 by Thomas Breitkreuz