Delphi-PRAXiS
Seite 1 von 2  1 2      

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/)
-   -   Delphi Panel-Komponente entwickelt - Offensichtliche Fehler? (https://www.delphipraxis.net/197786-panel-komponente-entwickelt-offensichtliche-fehler.html)

Hobbycoder 4. Sep 2018 15:19

Panel-Komponente entwickelt - Offensichtliche Fehler?
 
Liste der Anhänge anzeigen (Anzahl: 3)
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.

himitsu 4. Sep 2018 17:13

AW: Panel-Komponente entwickelt - Offensichtliche Fehler?
 
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.

Hobbycoder 4. Sep 2018 17:48

AW: Panel-Komponente entwickelt - Offensichtliche Fehler?
 
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.

Uwe Raabe 4. Sep 2018 18:26

AW: Panel-Komponente entwickelt - Offensichtliche Fehler?
 
Zitat:

Zitat von Hobbycoder (Beitrag 1412455)
Aber wie erfährt VST, dass der Tree neu gezeichnet werden muss.

Vermutlich wird irgendwo z.B. wie InvalidateNode aufgerufen.

Ghostwalker 5. Sep 2018 05:08

AW: Panel-Komponente entwickelt - Offensichtliche Fehler?
 
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]

TraumTaenzerDieter 5. Sep 2018 06:30

AW: Panel-Komponente entwickelt - Offensichtliche Fehler?
 
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.

hoika 5. Sep 2018 06:47

AW: Panel-Komponente entwickelt - Offensichtliche Fehler?
 
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.

KodeZwerg 5. Sep 2018 06:54

AW: Panel-Komponente entwickelt - Offensichtliche Fehler?
 
Zitat:

Zitat von Hobbycoder (Beitrag 1412436)
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.

Hobbycoder 5. Sep 2018 08:47

AW: Panel-Komponente entwickelt - Offensichtliche Fehler?
 
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.

Zitat:

Zitat von hoika (Beitrag 1412464)
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?

Blup 5. Sep 2018 10:13

AW: Panel-Komponente entwickelt - Offensichtliche Fehler?
 
Zitat:

Zitat von Hobbycoder (Beitrag 1412475)
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.


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