Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Fehler beim Erstellen des Fenster - GeräteKontextes (https://www.delphipraxis.net/143087-fehler-beim-erstellen-des-fenster-geraetekontextes.html)

simmi 9. Nov 2009 17:12


Fehler beim Erstellen des Fenster - GeräteKontextes
 
Hallo,

ich habe eine Anwendung die mit vielen Elementen TPageControl und TRadioGroup ausgestattet ist. Ich habe hein Thread geschrieben, der nach dem Starten der Anwendung und der Anmeldung des Nutzers die Radiogroups mit Items füllt.

Nachdem der Thread durchgelaufen ist, sind die Radiogroups die von ihm gefüllt wurden nicht mehr sichtbar und es wird die o.g. Fehlermeldung ausgelöst. Ich bin den Quelltext Schrittweise durchgegangen und der Thread macht was er soll. Wo kann das Problem liegen?

Delphi-Quellcode:
procedure DVLThread.Execute;

var RadiogroupX : TRadiogroup;

begin
DataModule9.Table1.Filtered:=false;
DataModule9.Table1.First;
while not DataModule9.Table1.Eof do
  begin
   {Ermitteln der Radiogroup}
   if not rg_zuweisen(DataModule9.Table1.fieldbyname('kern').AsInteger,DataModule9.Table1.fieldbyname('teil').AsInteger,
         DataModule9.Table1.fieldbyname('gruppe').AsInteger, DataModule9.Table1.fieldbyname('typ').AsInteger, RadiogroupX) then
      begin
        {Auflisten der nicht zuweisbaren Einträge aus der DB}
        form1.Memo2.Lines.Add(DataModule9.Table1.fieldbyname('hinweis').AsString);
      end
                    else
      begin
       {Einschränkung der Anzeige nach Nutzerrecht, rechte_xl ist eine globale Variable die
        bei der Anmeldung gesetzt wurde} 
       if (rechte_xl='AL') and (DataModule9.Table1.fieldbyname('recht').asinteger=0) then
         begin
          RadiogroupX.Items.Add(DataModule9.Table1.fieldbyname('hinweis').AsString);
         end
                   else
         begin
          RadiogroupX.Items.Add(DataModule9.Table1.fieldbyname('hinweis').AsString);
         end;
      end;
   DataModule9.Table1.Next;
  end;
end;

himitsu 9. Nov 2009 17:21

Re: Fehler beim Erstellen des Fenster - GeräteKontextes
 
Man greift nicht unsynchronisiert von einem Thread auf die VCL zu, :!:
denn dann passieren die komischsten Dinge.




auch wenn es mit dem Thema nichts zu tun hat ... was ist hier bitte der Unterschied?
Delphi-Quellcode:
begin
  RadiogroupX.Items.Add(DataModule9.Table1.fieldbyname('hinweis').AsString);
end
else
begin
  RadiogroupX.Items.Add(DataModule9.Table1.fieldbyname('hinweis').AsString);
end;

simmi 9. Nov 2009 17:27

Re: Fehler beim Erstellen des Fenster - GeräteKontextes
 
Hallo,

die Bedingung
Delphi-Quellcode:
(rechte_xl='AL') and (DataModule9.Table1.fieldbyname('recht').asinteger=0)
einer darf alles sehen und der andere nur einen Ausschnitt. Das kommt aus der Anmeldung heraus und funktioniert auch.

Zitat:

Man greift nicht unsynchronisiert von einem Thread auf die VCL zu, Exclamation
denn dann passieren die komischsten Dinge.
Jetzt stehe ich im dunkeln. Das war mein erster Versuch mit einem Thread. Wie syncornisiert man das Teil???? In dem Tutorial habe ich dazu nichts gefunden.

himitsu 9. Nov 2009 17:39

Re: Fehler beim Erstellen des Fenster - GeräteKontextes
 
Zitat:

Zitat von simmi
einer darf alles sehen und der andere nur einen Ausschnitt. Das kommt aus der Anmeldung heraus und funktioniert auch.

Nja, die Abfrage ist schon klar, aber die beiden Alternativen sind genau gleich :zwinker:
Delphi-Quellcode:
RadiogroupX.Items.Add(DataModule9.Table1.fieldbyname('hinweis').AsString);
RadiogroupX.Items.Add(DataModule9.Table1.fieldbyname('hinweis').AsString);
Zitat:

Zitat von simmi
Jetzt stehe ich im dunkeln. Das war mein erster Versuch mit einem Thread. Wie syncornisiert man das Teil???? In dem Tutorial habe ich dazu nichts gefunden.

Die VCL ist nicht threadsicher, daß bedeutet, daß gleichzeitige Zugriffe (die VCL greift auch noch auf sich selber zu, wenn z.B. die Form und ihre Komponenten dargestellt wird) zu Problemen führen können.

Das ist so, als wenn zwei Autos ohne Licht und in entgegengesetzten Richtungen durch einen dunkeln Tunnel wollen ... irgendwann kracht es halt.

Die Lösung währe theoretisch Delphi-Referenz durchsuchenSynchronize,
aber da du in sehr kurzen Abständen und verhältnismäßig oft auf die VCL zugreifen willst, wäre hier der Thread so "sinnlos", da Synchronize die Befehle in den Kontext des Hauptthreads verlegt (wo die VCL drinnen läuft)

Einzige Lösung mit Thread wäre, wenn in dem Thread die DB abgefragt würde,
erstmal alles zwischengespeichert würde (z.B. in Stringlisten/Arrays innerhalb des Threads
und dann am Ende (eventuell auch schon ein paar Male zwischendurch, wenn es länger dauert und man auch schon Teilergebnisse sehn will) einmal via Synchronize die Werte aus diesen Zwischenspeichern in die VCL-Komponenten übertragen würde.

simmi 10. Nov 2009 07:45

Re: Fehler beim Erstellen des Fenster - GeräteKontextes
 
Hallo,

danke für den Hinweis und die Erklärung dazu. Werde die Stelle umbauen und demnächst einfach vermeiden auf die VCL zuzugreifen.

simmi 11. Nov 2009 12:19

Re: Fehler beim Erstellen des Fenster - GeräteKontextes
 
Nachtrag:

Die Bedingung war tatsächlich absoluter Müll, danke für den Hinweis... :wall:

Luckie 11. Nov 2009 12:24

Re: Fehler beim Erstellen des Fenster - GeräteKontextes
 
Zitat:

Zitat von simmi
Wie syncornisiert man das Teil???? In dem Tutorial habe ich dazu nichts gefunden.

Du liest die falschen Tutorials. ;)
http://delphitutorials.michael-puff.de


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:50 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