![]() |
AW: Component.Free -> auch fremde Zeiger auflösen
@ Christian
Zitat:
Zitat:
Zitat:
Daher suche ich im DC.Destroy alle Zeiger auf diese und setze sie auf nil. Das funktioniert, sofern ich weiß, wo diese Verweise vokommen können. Zitat:
@ Uli Das habe ich mir schon angesehen, aber das schien nicht zu passen. Wenn ich das richtig verstanden habe funktioniert das Konzept nur in Zusammenhang mit Listen. (Ich habe aber dann irgendwann aufgegeben :shock:) |
AW: Component.Free -> auch fremde Zeiger auflösen
Zitat:
Zitat:
Zitat:
Zitat:
mfg Christian |
AW: Component.Free -> auch fremde Zeiger auflösen
Zitat:
Zitat:
Selektiert der Nutzer aber nun das übergeordnete Register oder blendet das übergeordnete Formular wieder ein, müssen sich die Controls ja mit den aktuellen Daten zeichnen... Daher aktualisiere ich
Delphi-Quellcode:
einfach, bevor sich die Komponente zeichnet.
Text := NeuerWertAusDatenbank
Eine wirklich bessere Lösung fällt mir nicht ein, außer alle benötigten Daten direkt bei der Änderungsnachricht abzurufen und in Variablen abzulegen. Dann kann Paint diese hinterlegten Werte beim nächsten Zeichnen benutzen. Die 3 Problem dabei sind m.E.: 1) dass alle zig000 Komponenten ständig die Daten abfragen, obwohl sie überhaupt nicht angezeigt werden 2) für alle "Felder" private Variablen zum Zwischenspeichern angelegt werden müssen (doppelte Datenhaltung) 3) Für einige Komponentendarstellungen teilw. recht komplexe Datenermittlungen (Funktionen, Suchen, Berechnungen) möglich sein können. Das wäre unnötig, wenn die Komponente ja gar nicht angezeigt wird. Deshalb kam ich auf meine Lösung... |
AW: Component.Free -> auch fremde Zeiger auflösen
Zitat:
Delphi-Quellcode:
... grob skizziert ...
// Pseudocode
TFoo = class private FMyWriter: TSomeWriter; public property MyWriter read FMyWriter write FMyWriter; procedure Save(); begin FMyWriter.Write(...); ... end; end; TSomeWriter = class procedure Write(); virtual; abstract; end; TXMLWriter = class(TSomeWrite) ... end; TDatabaseWriter = class(TSomeWrite) ... end; In TFoo steht rein gar nichts von XMl. Man kann allein durch ersetzen der MyWriter-Eingeschaft aus nem Speichern in XML eins in ne Datenbank machen. *Das* sind entkoppelte Objekte! Zitat:
Was du hier aber machst, ist, inkonsistente Zustände erlauben. Eben die unsichtbaren Komponenten, die nicht aktualisiert werden. Sowas sollte man nur tun, wenn man *ganz* genau weiß, was man tut und einen guten Grund dazu hat. Zitat:
a) das Hinzufügen und Entfernen von Elementen ==> Diese Änderungen sollten direkt über ein Event in der GUI mitgezogen werden. Sodass immer und unter jeden Umständen gilt, dass es keine überzähligen und keine Fehlenden GUI-Elemente gibt. b) das Ändern von irgendwelchen Werten. Die Werte können selbstverständlich in OnPaint gelesen werden. Das ist vollkommen unproblematisch. Nur solltest du in OnPaint niemals Konstruktoraufrufe oder ein "Free;" stehen haben. Zitat:
- Du musst selbstverständlich nicht die ganzen Wertänderungen nachziehen. Nur das Erzeugen und Freigeben von Listenelementen. Zitat:
Zitat:
[1] Weil das Objekt ja eigentlich selbst zu wissen hat, was von ihm gespeichert gehört. Man kann das auch mit Annotationen - oder wie heißen die Dinger in Delphi? Attribute glaub ich - festlegen und so generisch speichern. Dann ist gegen den externen zugriff wiederum nichts zu sagen. mfg Christian |
AW: Component.Free -> auch fremde Zeiger auflösen
Ok, wir nähern uns an :-)
Also über die reine Wertaktualisierung brauchen wir nicht mehr reden. Die Anzahl von Einträgen (Datensätzen, Items) können auch mal aus der Datenschicht heraus geändert werden, also eben nicht durch die GUI angestoßen sein. Oder ich schließe ein SubFormular mit einer Liste von 10 Items (das letzte hat den Fokus). Dann gibt es irgendwelche Änderungen und das SubForm wird wieder geöffnet - jetzt gibt es noch 5 Einträge. Bevor ich die überzähligen Items entfernen kann, zeichnet Windows (wegen dessen Focus) schon das letzte Item (ist von einen Panel abgeleitet). Ok, ich habe Dich aber verstanden und werde das mit berücksichtigen. Danke für die Hilfe! |
AW: Component.Free -> auch fremde Zeiger auflösen
Zitat:
Zitat:
Zitat:
mfg Christian |
AW: Component.Free -> auch fremde Zeiger auflösen
Ok danke, ich werde versuchen, mich zu bessern! :)
... ach so ... Der Vorteil meiner Lösung ist jedoch, dass man sich dann im Projekt um solchen Kram wie Freigabe im Formular.OnClose oder Aktualisierungen im Formular.OnShow nicht mehr kümmern muss. Die Kompos machen das halt dann alles selbständig. Solange das zuverlässig funktioniert, hat das sicher auch etwas für sich ;-) Mal sehen, ich schlafe nochmal drüber... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:36 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