Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   RadioButton aus Thread nicht Löschbar (https://www.delphipraxis.net/197479-radiobutton-aus-thread-nicht-loeschbar.html)

Metschu 9. Aug 2018 08:11

Delphi-Version: 10.2 Tokyo

RadioButton aus Thread nicht Löschbar
 
Hallo zusammen,

ich habe eine RadioGroup und möchte hier je einen Button raus löschen:

Delphi-Quellcode:
InfoForm.Positionen.Items.Delete(2)


Wenn ich dies aus einem Thread heraus machen möchte, bekomme ich die Fehlermeldung

"Im Projekt ist eine Exception der Klasse EOSError mit der Meldung 'Systemfehler. Code: 5.
Zugriff verweigert' aufgetreten.
"

Spaßeshalber habe ich einen Button auf die MainForm gelegt und hier auch den Befehl rein gesetzt.
Klicke ich den Button bei laufendem Thread, wird der RadioButton gelöscht.
Wird die Procedure des Buttons durch den Thread aufgerufen, habe ich den gleichen Fehler wieder...

Wo liegt mein Problem?

Danke schon mal.

Gruß

Torsten

Uwe Raabe 9. Aug 2018 08:18

AW: RadioButton aus Thread nicht Löschbar
 
Zitat:

Zitat von Metschu (Beitrag 1410194)
Wo liegt mein Problem?

Du greifst auf VCL-Objekte aus einem anderen Thread als dem Hauptthread zu.

Für solche Dinge gibt es Synchronize.

Metschu 9. Aug 2018 10:06

AW: RadioButton aus Thread nicht Löschbar
 
Hallo Uwe,

vielen dank für den Tipp, das hat Funktioniert.

Für mich war es nur seltsam, das ich die Texte der Radio-Buttons ändern konnte ohne Fehlermeldung - nur beim löschen kam diese immer wieder...

Gruß

Torsten

Uwe Raabe 9. Aug 2018 10:17

AW: RadioButton aus Thread nicht Löschbar
 
Zitat:

Zitat von Metschu (Beitrag 1410205)
Für mich war es nur seltsam, das ich die Texte der Radio-Buttons ändern konnte ohne Fehlermeldung

Nur weil etwas funktioniert, ist es noch lange nicht richtig.

himitsu 9. Aug 2018 10:26

AW: RadioButton aus Thread nicht Löschbar
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1410206)
Zitat:

Zitat von Metschu (Beitrag 1410205)
Für mich war es nur seltsam, das ich die Texte der Radio-Buttons ändern konnte ohne Fehlermeldung


Ein SendMessage/Perform an ein WinControl ist auch aus anderen Threads möglich, da Messages von Windows automatisch in den Thread synchronisiert werden, in welchem diese Komponente erstellt wurde.

Wenn beim Setzen der Caption im Setter aber noch mehr gemacht wird, wie z.B. direkt auf Variablen/Felder dieser Komponente oder auf verbundene "globale" bzw. verbundene Komponenten/Listen/... zuzugreifen, dann kann wird es schnell schief laufen,
so wie man es beim Delete/Free leidlich bemerkt.


Zitat:

Delphi-Quellcode:
property Caption: TCaption read GetText write SetText stored IsCaptionStored;

procedure TControl.SetText(const Value: TCaption);
begin
  if GetText <> Value then
    SetTextBuf(PChar(Value));
end;

function TControl.GetText: TCaption;
var
  Len: Integer;
begin
  Len := GetTextLen;
  SetString(Result, PChar(nil), Len);
  if Len <> 0 then
    GetTextBuf(PChar(Result), Len + 1);
end;

procedure TControl.SetTextBuf(Buffer: PChar);
begin
  Perform(WM_SETTEXT, 0, Buffer);
  Perform(CM_TEXTCHANGED, 0, 0);
end;

function TControl.GetTextLen: Integer;
begin
  Result := Perform(WM_GETTEXTLENGTH, 0, 0);
end;

function TControl.GetTextBuf(Buffer: PChar; BufSize: Integer): Integer;
begin
  Result := Perform(WM_GETTEXT, BufSize, Buffer);
end;

Aber dennoch bei sowas nicht immer drauf verlassen, dass es immer so implementiert bleibt, sondern direkt die Messages verschicken.

KodeZwerg 9. Aug 2018 10:56

AW: RadioButton aus Thread nicht Löschbar
 
offtopic
Zitat:

Zitat von himitsu (Beitrag 1410210)
Aber dennoch bei sowas nicht immer drauf verlassen, dass es immer so implementiert bleibt, sondern direkt die Messages verschicken.

Top-Tipp, der löst bei mir auch ein GUI Thread Problem, Vielen Dank dafür!:thumb::thumb:

jaenicke 9. Aug 2018 14:00

AW: RadioButton aus Thread nicht Löschbar
 
Zitat:

Zitat von KodeZwerg (Beitrag 1410214)
Top-Tipp, der löst bei mir auch ein GUI Thread Problem, Vielen Dank dafür!:thumb::thumb:

Es gibt ja auch von mir ein neues Projekt genau das Prinzip einfach zu verwenden:
https://github.com/jaenicke/MTCL
Das Interesse scheint sich in Grenzen zu halten. Aber dort wollte ich auch genau die Möglichkeit hinzufügen, dass man aus Threads auch mit VCL-Komponenten transparent interagiert. Mal schauen wann ich dafür mal wieder etwas Zeit habe.

KodeZwerg 9. Aug 2018 17:26

AW: RadioButton aus Thread nicht Löschbar
 
Mit dem Delphi Starter von Dir bin ich super klargekommen, ich werde bei dem MTCL auf jeden Fall mal einen Blick rauf werfen was da so passiert und obs es für D2009 geeignet ist.

jaenicke 9. Aug 2018 18:17

AW: RadioButton aus Thread nicht Löschbar
 
Zitat:

Zitat von KodeZwerg (Beitrag 1410255)
ich werde bei dem MTCL auf jeden Fall mal einen Blick rauf werfen was da so passiert und obs es für D2009 geeignet ist.

Ist es, auch wenn Delphi 2009 so buggy war, dass ich da glaube ich leider nur den Modus für Delphi 7 usw. nutzen konnte per IFDEF... Generics waren damals leider noch extrem buggy und kaum nutzbar.

Nimm doch die Community Edition, falls die Rahmenbedingungen passen. ;-)

KodeZwerg 9. Aug 2018 22:03

AW: RadioButton aus Thread nicht Löschbar
 
Zitat:

I recommend using Delphi 2010 or higher, because only with generics you do not need to cast everywhere. And it is faster because TDictionary is used instead of simply searching in a list for a control. Delphi 2009 does not work, because generics were not powerful enough there.
Wenn es nur die Performance betrifft, bin ich mit 2009 glücklich aber ich Suche bereits hier und da nach einer gebrauchten 2010er Lizenz.
Das Problem mit der CE ist bei mir der Wiederverwendbarkeitsfaktor, also was die Übertragenen Dateien betrifft, ein reiner WebInstall ist für mich ein no-go solange ich mein System noch nicht neu bespielt habe. Dann installiere ich die CE in eine VM, ab da ist mir mein no-go von oben egal da ich die VM duplizieren kann.

Ich teste mal das MTCL aus, bei Bedarf erstelle ich Dir ein Update für neuere Versionen wie ichs mit dem Starter-Tool getan habe.
Mein GitHub ist allerdings irgendwie für mich selbst nicht mehr veränderbar.... Seitdem ich von Win7 auf Win10 bin ist zwar der Zugang und ein Verzeichnisse anlegen möglich, ein löschen bzw datei-uploaden klappt gar nicht mehr. Dazu in einem anderen Thread, sowie meinerseits bedarf besteht, mehr.

Danke auf jeden Fall für die Information das es bereits eine Komponente gibt die sich um solche Dinge kümmern könnte!!:thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:51 Uhr.
Seite 1 von 2  1 2      

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