AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Listview.Count liefert 0 trotz zweier Einträge

Ein Thema von hyype · begonnen am 28. Nov 2012 · letzter Beitrag vom 28. Nov 2012
Antwort Antwort
hyype

Registriert seit: 5. Nov 2008
97 Beiträge
 
Delphi XE2 Professional
 
#1

Listview.Count liefert 0 trotz zweier Einträge

  Alt 28. Nov 2012, 12:20
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.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#2

AW: Listview.Count liefert 0 trotz zweier Einträge

  Alt 28. Nov 2012, 12:28
ganz lapidar, ein .Repaint könnte dem abhelfen.

Delphi-Quellcode:
    Form1Panel.Caption := ListView1.Items.Count;
    form1Panel.Repaint;
Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#3

AW: Listview.Count liefert 0 trotz zweier Einträge

  Alt 28. Nov 2012, 13:06
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (28. Nov 2012 um 13:16 Uhr)
  Mit Zitat antworten Zitat
hyype

Registriert seit: 5. Nov 2008
97 Beiträge
 
Delphi XE2 Professional
 
#4

AW: Listview.Count liefert 0 trotz zweier Einträge

  Alt 28. Nov 2012, 13:19
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.
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.196 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Listview.Count liefert 0 trotz zweier Einträge

  Alt 28. Nov 2012, 13:22
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.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
hyype

Registriert seit: 5. Nov 2008
97 Beiträge
 
Delphi XE2 Professional
 
#6

AW: Listview.Count liefert 0 trotz zweier Einträge

  Alt 28. Nov 2012, 14:25
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#7

AW: Listview.Count liefert 0 trotz zweier Einträge

  Alt 28. Nov 2012, 15:29
Nicht nur theoretisch ... das muß auch praktisch immer im Hauptthread laufen.
Wenn nicht, dann mußt du synchronisieren.

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:
Assert(MainThreadID = GetCurrentThreadId, 'nee, is doch''n Thread');
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:58 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