Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Listview.Count liefert 0 trotz zweier Einträge (https://www.delphipraxis.net/171848-listview-count-liefert-0-trotz-zweier-eintraege.html)

hyype 28. Nov 2012 11:20

Listview.Count liefert 0 trotz zweier Einträge
 
Hallo Community!

Ein sehr interessantes Problem:
Ich habe ein Panel.
Dieses Panel hat als Caption die Anzahl an Einträgen eines ListViews eines anderen Formulars,
wobei dieses andere Formular einen Pointer auf das Panel des 1. Formulars hat.
Delphi-Quellcode:
  //aus Form1 aufgerufen
  Form2.Form1Panel := Panel1;
Delphi-Quellcode:
  //aus Form2 aufgerufen - regelmäßig in nem Timer
  Form1Panel.Caption := ListView1.Items.Count;
Das Panel hat außerdem ein OnClick-Event, welches das andere Formular anzeigt.
Delphi-Quellcode:
procedure TForm1.Panel1Click(Sender: TObject);
begin
  Form2.Show;
end;
(Code entsprechend angepasst, also die Komponenten haben sinnvollere Namen)
Jetzt zum Punkt:
In dem Panel steht 0, wenn ich auf's Panel draufklicke, wird mir das Formular mit dem ListView mit 2 Einträgen angezeigt.
Und: In dem Moment, wo ich geklickt habe, wird auch die Caption auf 2 geändert, wie es richtig ist.
Frage: Wieso stand vorher 0 drin, also wieso war er der Meinung, das ListView hätte keine Einträge.
Noch eine Info:
Das Programm läuft auf einem Server. Der Fehler tritt auf, wenn man eine Remotedesktop-Verbindung zu dem Server offen hat,
dann von einem anderen Rechner sich mit dem Server verbindet und dies erst mit falschen und dann mit richtigem Login tut.

p80286 28. Nov 2012 11:28

AW: Listview.Count liefert 0 trotz zweier Einträge
 
ganz lapidar, ein .Repaint könnte dem abhelfen.

Delphi-Quellcode:
    Form1Panel.Caption := ListView1.Items.Count;
    form1Panel.Repaint;
Gruß
K-H

himitsu 28. Nov 2012 12:06

AW: Listview.Count liefert 0 trotz zweier Einträge
 
Die Zuweisung an Caption sollte eigentlich (intern) ein Repaint auslösen.

Wie und wo wird denn Form2 erzeugt?
Bei den bösen globalen Variablen hat man einen Spaß, wenn da zwei Forms erstellt und darin gespeichert werden ... da sieht man dann gerne mal was Anderes, als das, worauf man über diese Variable zugreift. :stupid:

hyype 28. Nov 2012 12:19

AW: Listview.Count liefert 0 trotz zweier Einträge
 
das Form1 ist das MainForm der Anwendung
das Form2 wird auch bei Programmstart erzeugt per
Application.CreateForm

Hintergrund des ganzen ist:
Es gibt 2 Server und auf jedem dieser Server laufen 2 Programme dieser Art.
Diese 4 Programme synchronisieren sich via TCP.
Die Verbindungsinformationen bestehender Verbindungen werden in dem ListView angezeigt.
Wenn nun dieser Bug auftritt, welcher u.U. nur ein Anzeige-Bug ist,
funktioniert automatisch der Datenaustausch zwischen den Programmen nicht mehr.
Wenn ich dann das Form mit dem ListView anzeige, wird nicht nur die Caption des Panels korrigiert,
sondern der Datenversand zwischen den Programmen läuft wieder, der vorher definitiv nicht lief!
Ich denke, dass das Anzeige-Problem und das TCP-Problem zusammenhängen, daher habe ich das Anzeige-Problem hier thematisiert.

Bernhard Geyer 28. Nov 2012 12:22

AW: Listview.Count liefert 0 trotz zweier Einträge
 
Läuft den alles im Haupthread? Wenn ich hier TCP und Server höre da könnte es sein das die TCP-Kommunikation in einem Thread abläuft welche nicht einfach auf GUI-Elemente zugreifen darf.

hyype 28. Nov 2012 13:25

AW: Listview.Count liefert 0 trotz zweier Einträge
 
das läuft theoretisch alles im mainthread, praktisch erzeugt delphi aber mehrere threads daraus.
im quellcode der anwendung wird aber nirgends ein thread erzeugt,
auch die tcp-komponente erzeugt keinen eigenen thread pro connection.

himitsu 28. Nov 2012 14:29

AW: Listview.Count liefert 0 trotz zweier Einträge
 
Nicht nur theoretisch ... das muß auch praktisch immer im Hauptthread laufen. :warn:
Wenn nicht, dann mußt du synchronisieren.

Zitat:

Zitat von hyype (Beitrag 1193414)
auch die tcp-komponente erzeugt keinen eigenen thread pro connection.

Eher selten ... das tun die meisten dieser Komponenten intern dennoch machen.

prüf es doch einfach und bau in die Aufrufe Folgendes ein:
Delphi-Quellcode:
Assert(MainThreadID = GetCurrentThreadId, 'nee, is doch''n Thread');


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