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
Hobbycoder

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

AW: Panel-Komponente entwickelt - Offensichtliche Fehler?

  Alt 4. Sep 2018, 17: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.757 Beiträge
 
Delphi 12 Athens
 
#2

AW: Panel-Komponente entwickelt - Offensichtliche Fehler?

  Alt 4. Sep 2018, 18: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
 
#3

AW: Panel-Komponente entwickelt - Offensichtliche Fehler?

  Alt 5. Sep 2018, 05: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
 
#4

AW: Panel-Komponente entwickelt - Offensichtliche Fehler?

  Alt 5. Sep 2018, 06: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.277 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Panel-Komponente entwickelt - Offensichtliche Fehler?

  Alt 5. Sep 2018, 06: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 07:07 Uhr)
  Mit Zitat antworten Zitat
Hobbycoder

Registriert seit: 22. Feb 2017
1.017 Beiträge
 
#6

AW: Panel-Komponente entwickelt - Offensichtliche Fehler?

  Alt 5. Sep 2018, 08: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.493 Beiträge
 
Delphi 12 Athens
 
#7

AW: Panel-Komponente entwickelt - Offensichtliche Fehler?

  Alt 5. Sep 2018, 10: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
Blup

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

AW: Panel-Komponente entwickelt - Offensichtliche Fehler?

  Alt 5. Sep 2018, 10:31
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?
Vor dem Aufruf von Paint wird für den Canvas automatisch eine Clipping-Region gesetzt, in der neu zu zeichen ist.
Die Region kann eine beliebige Form haben. Es können weiterhin auch Zeichenbefehle an den Canvas gesendet werden, die darüber hinaus gehen.
Die Zeichenoperationen werden aber nur in diesem Bereich ausgeführt. Das sorgt schon mal für eine Beschleunigung.
Wenn man weiter optimieren muss, im Paint Canvas.ClipRect abfragen und nur die Daten ermitteln und zeichnen, die tatsächlich gebraucht werden.
  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 23:51 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz