AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Panel-Komponente entwickelt - Offensichtliche Fehler?
Thema durchsuchen
Ansicht
Themen-Optionen

Panel-Komponente entwickelt - Offensichtliche Fehler?

Ein Thema von Hobbycoder · begonnen am 4. Sep 2018 · letzter Beitrag vom 5. Sep 2018
Antwort Antwort
Seite 1 von 2  1 2      
Hobbycoder

Registriert seit: 22. Feb 2017
955 Beiträge
 
#1

Panel-Komponente entwickelt - Offensichtliche Fehler?

  Alt 4. Sep 2018, 16:19
Hi,

der Titel ist etwas unglücklich, ich werde ihn ändern, wenn mir ein Passender einfällt.

Zum Thema: Ich habe in einem Programm eine Art Anwesenheitsanzeige, die aber zur Zeit Probleme macht. Diese war auf Basis einer Statusbar. Kurzum habe ich mir eine eigenen Komponente für selbigen Zweck erstellt, und diese gleich noch ein wenig erweitert.
Ziel ist die Darstellung von Anwesenheit, Auslastung, aktuellen Tätigkeiten usw. von Mitarbeitern. Zum besseren Verständnis habe ich auch noch eine DemoApp beigelegt.

Ich wollte aber nicht in der Komponente die Daten selbst hinterlegen, sondern diese immer per Event abfragen lassen (Was soweit auch problemlos funktioniert), ähnlich dem Verhalten des OnGetText-Ereignis aus dem VirtualStringTree.

Worum es mir jetzt geht, dass sich die Experten (und auch die, die sich selbst als solche empfinden), mal drüberschauen, ob das so okay ist, oder ob ganz offensichtliche Fehler enthalten sind, die sich irgendwann man bemerkbar machen können. Ich habe beim Testen bisher keine Probleme damit.

Vor allen Dingen interessiert mich eine Sache: Wenn man in den Daten etwas ändert, dann wird im VirtualStringTree der Node direkt mit den neuen Daten dargestellt (ohne Refresh o.ä). Ich würde das gerne auch in meiner Komponente umsetzen, den da geht das natürlich nur mit Repaint oder Refresh, und ich wüsste auch nicht, wie das gehen sollte. Ich bin aber im Source vom VST nicht drauf gekommen, wie das dort gelöst ist.
In der DemoApp habe ich bewusst nur ein TListView verwendet, damit man zum Anschauen den VST nicht benötigt.
Miniaturansicht angehängter Grafiken
demoapp.png  
Angehängte Dateien
Dateityp: zip Anwesenheitspanel.zip (7,5 KB, 3x aufgerufen)
Dateityp: zip DemoApp.zip (59,1 KB, 3x aufgerufen)
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Panel-Komponente entwickelt - Offensichtliche Fehler?

  Alt 4. Sep 2018, 18:13
Die Daten sind dennoch irgendwo gespeichert.
Dort muß auf eine Änderung reagiert werden und dementsprechend ein Repaint/Refresh Invalidate der Komponente ausgelöst werden.

Beispiel:
In einem Memo, ListView oder ComboBox gibt es eine TStrings-Komponente (Lines/Items/...), welche die Daten hält.
Wenn sich in jener ertwa ändert, dann gibt sie ein Changed-Ereignis an ihre Parent-Komponente weiter, welche sich daraufhin aktualisiert.
(im TMemo ist z.B. ein TMemoStrings drin, versteckt innerhalb der Vcl.StdCtrls.pas, wo man sich sowas ansehen könnte -> TMemoStrings.SetUpdateState)





Entweder deine Komponente wird über eine Änderung informiert und holt dann die neuen Daten ab (aktualuisiert sich)
oder deine Komponente muß immer und immer und immer und immer wieder regelmäßig die Daten abfragen (pollen).

Letzteres ist wirklich blöde und verschwendet unnötig Ressourcen.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 4. Sep 2018 um 18:23 Uhr)
  Mit Zitat antworten Zitat
Hobbycoder

Registriert seit: 22. Feb 2017
955 Beiträge
 
#3

AW: Panel-Komponente entwickelt - Offensichtliche Fehler?

  Alt 4. Sep 2018, 18:48
Ja, soweit war mir das schon klar.

Aber als Beispiel mal ein VirtualStringTree. Da liegen die Daten z.B. in einer ObjectList. Wenn die Nodes erzeugt werden, wird lediglich die Adresse jedes Objekts in NodeData hinterlegt. Es gibt ansonsten keine Event-Benachrichtigung seitens der ObjectList oder den Objekten Richtung VST.
Und in der OnGetText-Methode castet man sich das Object über die Adresse aus NodeData und bekommt darüber dann den Zugriff auf selbiges.

Aber wie erfährt VST, dass der Tree neu gezeichnet werden muss. Das leuchtet mir nicht ein. Und, dass das VST die ganze Zeit pollt, nehme ich mal nicht an.

Sicherlich, ganz so trivial wie oben beschrieben wird im VST nicht ablaufen.
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#4

AW: Panel-Komponente entwickelt - Offensichtliche Fehler?

  Alt 4. Sep 2018, 19:26
Aber wie erfährt VST, dass der Tree neu gezeichnet werden muss.
Vermutlich wird irgendwo z.B. wie InvalidateNode aufgerufen.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Ghostwalker

Registriert seit: 16. Jun 2003
Ort: Schönwald
1.299 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Panel-Komponente entwickelt - Offensichtliche Fehler?

  Alt 5. Sep 2018, 06:08
Beim VST ist es so, das operationen wie z.B. AddNode, DeleteNode intern automatisch ein InvalidateNode machen und so den Updateprozess auslösen. Wenn sich die Daten selbst ändern, musst du das auch von außen entsprechend anstoßen. Das wird z.B. auch bein EndUpdate gemacht.


[OT]
VST verwendet keine Objectlist, sondern eine verkettete Liste für die Nodes. Der Userdatenbereich wird als ganz normaler Speicherbereich im Node selbst mitverwaltet. Daher muss man ja bei der Initialisierung auch die Größe der Userdaten angeben (NodeDataSize)
[/OT]
Uwe
e=mc² or energy = milk * coffee²
  Mit Zitat antworten Zitat
TraumTaenzerDieter

Registriert seit: 4. Jun 2009
Ort: 33330 Gütersloh
8 Beiträge
 
FreePascal / Lazarus
 
#6

AW: Panel-Komponente entwickelt - Offensichtliche Fehler?

  Alt 5. Sep 2018, 07:30
Zwei Infos aus der Praxis:
1: Urlaub (und noch schlimmer Krank) darf NUR
in den Personalabteilungen angezeigt werden (wg. Datenschutz),
also nur Anwesend oder Abwesend zeigen.
2: Pollen von aktuellen Daten ist okay wenn es sich NICHT
um zeitkritische Daten handelt.
Ich mache etwas ähnliches für eine Arbeitsvorbereitung
mit einem Zeitinterval von 5 Minuten.
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Panel-Komponente entwickelt - Offensichtliche Fehler?

  Alt 5. Sep 2018, 07:47
Hallo,
zu Punkt 1 wollte ich gerade schreiben, wo steht denn so was?
hier -> https://www.datenschutz.org/dienstplan/

Also erst Einverständnis der Mitarbeiter holen, dann anzeigen.

Und zur Performance, ich würde hier mit InvalidateRect arbeiten,
und im Paint nur das zeichnen, was im übergebenen Rect liegt.
Heiko

Geändert von hoika ( 5. Sep 2018 um 08:07 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Panel-Komponente entwickelt - Offensichtliche Fehler?

  Alt 5. Sep 2018, 07:54
Hi,

Worum es mir jetzt geht, dass sich die Experten (und auch die, die sich selbst als solche empfinden), mal drüberschauen, ob das so okay ist, oder ob ganz offensichtliche Fehler enthalten sind, die sich irgendwann man bemerkbar machen können. Ich habe beim Testen bisher keine Probleme damit.
Hallo, ich bin leider kein Experte deswegen habe ich mich nur auf Dein Bild konzentriert.
Da fällt mir auf das Farbe 2 nicht unbedingt zum Rest passt.
Objekt: Müller
Farbe1: clGreen
Farbe2: clRed
Darstellung: Okay, Farbe1 wird für Zeile 1+2 genommen, Farbe2 für Zeile 3

Objekt: Schulze
Farbe1: clGreen
Farbe2: clLime
Darstellung: Falsch, es wird für alles clLime angewandt, oder soll das so sein?

Bei Objekt Meier und Ludwig weiß ich nicht ob es falsch ist das dritte Zeile nicht mit Farbe2 eingefärbt ist auch ohne Text?

Das war es auch schon was mir so aufgefallen ist.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Hobbycoder

Registriert seit: 22. Feb 2017
955 Beiträge
 
#9

AW: Panel-Komponente entwickelt - Offensichtliche Fehler?

  Alt 5. Sep 2018, 09:47
Vielen Dank für die zahlreichen Hinweise bezüglich VST. Das hat mich einiges nach vorn gebracht.

In meiner Komponente mache ich das so, dass ich lediglich die Speicheradresse des Objekts hinterlege. Bei der Abfrage über Events nach Text, Farbe, etc. wird dann der Index des Eintrags übergeben, und die Methoden holen sie dann die Informationen per Cast aus den eigentlichen Objekten (Kann man im Demo sehen). Ist gegen diese Vorgehen etwas einzuwenden?

Ein Problem ist mir dabei schon selbst Aufgefallen. Wenn z.B. ein Objekt gelöscht wird, dann bleibt die Adresse im meiner Komponente unverändert stehen. Würde dann über einen Event und damit über ein Cast auf das nicht mehr existierende Objekt zugegriffen, knallt es bzw. ich erhalte Datenmüll. Ein if Assigned oder =NIL liefert hier leider kein zuverlässiges Ergebnis. Das könnte ich lösen, in dem ich beim Löschen eines Objekt meine Komponente benachrichtige, und dann die Adresse auf Nil setze. Aber möglicherweise gibt es noch eine elegantere Variante.

Auch die Hinweise zum Thema Datenschutz sind nicht unwichtig, allerdings sei hier darauf hingewiesen, dass es sich um Beispieldaten handelt, die so später nicht im Programm stehen. Trotzdem Danke.

Und zur Performance, ich würde hier mit InvalidateRect arbeiten,
und im Paint nur das zeichnen, was im übergebenen Rect liegt.
Kannst du mir das etwas erläutern? Wo wird denn im meinem Paint ein Rect übergeben?
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.464 Beiträge
 
Delphi 12 Athens
 
#10

AW: Panel-Komponente entwickelt - Offensichtliche Fehler?

  Alt 5. Sep 2018, 11:13
Ein Problem ist mir dabei schon selbst Aufgefallen. Wenn z.B. ein Objekt gelöscht wird, dann bleibt die Adresse im meiner Komponente unverändert stehen. Würde dann über einen Event und damit über ein Cast auf das nicht mehr existierende Objekt zugegriffen, knallt es bzw. ich erhalte Datenmüll. Ein if Assigned oder =NIL liefert hier leider kein zuverlässiges Ergebnis. Das könnte ich lösen, in dem ich beim Löschen eines Objekt meine Komponente benachrichtige, und dann die Adresse auf Nil setze. Aber möglicherweise gibt es noch eine elegantere Variante.
Das ist schon der richtige Weg. Deine Komponente benötigt eine Notify-Methode.
Als Parameter das betreffende Objekt und ob es geändert oder gelöscht wurde übergeben.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 08:30 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