![]() |
Formular neu zeichnen erzwingen
Hallo,
ich bräuchte eine Möglichkeit von jeder Stelle im Programm, auch von meinen Units aus, das Hauptformular zum Neuzeichnen zu zwingen. Ich dachte mir, dass das über eine Message gehen sollte. Weis hier jemand wie man dies am besten umsetzt. Danke und Gruß Dieter |
Re: Formular neu zeichnen erzwingen
Du könntest Invalidate des Formulars aufrufen, das sorgt für ein komplettes Neuzeichnen.
|
Re: Formular neu zeichnen erzwingen
Hallo,
das Hauptform hat ja eine globale Form-Variable.
Delphi-Quellcode:
Ich würde aber im Main-Form eine Methode definieren (RefreshForm),
unit X
implementation uses Form1; // Hauptform begin Form1.Invalidate die nur Invalidate aufruft. Das lässt sich besser Debuggen, wenn du mal einen "Refresh"-Fehler suchst. Heiko |
Re: Formular neu zeichnen erzwingen
Hallo zusammen und Danke für die Antworten.
An euren Antworten kann ich erkennen, dass ich mich nicht richtig ausgedrückt habe. Ich versuche es am besten noch mal. Also was ich möchte ist eine grundsätzliche Lösung, ich suche eine z.B. Procedure FormRefresh die ich in meine, z.B. Komponenten; Klassenobjekten, einbaue welche mir die Form auf der sie sich befinden zum Neuzeichnen zwingt. Das ganze muss sehr flexibel sein, da ich den Namen der Form nicht kenne. Ich hoffe es ist nun ein bisschen klarer geworden was ich erreichen möchte. Gruß Dieter |
Re: Formular neu zeichnen erzwingen
Versuch doch, mit GetParentForm das Formular zu ermitteln, welches Du dann mit Invalidate/Refresh/Repaint neu zeichnen kannst.
|
Re: Formular neu zeichnen erzwingen
Falsche Frage bzw. falsch aufgebauter Code, das ist dein Problem.
Eine Komponente belegt nur einen kleinen Teil eines Formulars oder sogar nur eines Containers. Warum sollte die Komponente also das Neuzeichnen auslösen? Es gibt keinen Grund, da die Komponente auf dem Bereich nicht zugreifen kann. Da liegt eindeutig ein Designfehler vor. Wenn du nun behauptest du änderst z.B. die Systemfarben und willst erreichen das das Fenster nun grün gezeichnet wird, dann ist dein angefragter Weg auch falsch, da du dann das Ändern der Systemfarben falsch umgesetzt hast. Es gibt bei allen Dingen entsprechende Möglichkeiten und um bei dem Beispiel zu bleiben hättest du nach Änderung der Systempalette ein Broadcast rausschicken müssen der über diese Änderung informiert und alle Programme mit Nutzung der Systemfarben sind verpflichtet auf diese Botschaft zu reagieren und ihre Farben neu zu ermitteln und die Paletten neu anzumischen. Also nochmals: Dein Ansatz ist falsch bzw. der Aufbau. Stell lieber eine detaillierte Beschreibung ein, dann kann man eher aufzeigen wo das Problem liegt. |
Re: Formular neu zeichnen erzwingen
Zitat:
Delphi-Quellcode:
wm_RefreshForm definierst Du als
SendMessage({MainForm.Handle}, wm_RefreshForm, 0, 0);
Delphi-Quellcode:
und in der MainForm muss Du nur noch die Message abfangen mit
wm_RefreshForm = wm_User + 42;
Delphi-Quellcode:
Sowohl der MainForm.Handle als auch wm_RefreshForm muss in all Deinen Units bekannt sein.
TMainForm = class(TForm)
private procedure wmRefreshForm(var Msg: TMessage); message wm_RefreshForm; end; procedure TMainForm.wmRefreshForm(var Msg: Tmessage); begin Self.Invalidate; end; War es das, was Du suchst? Gruß, Carsten |
Re: Formular neu zeichnen erzwingen
Hallo zusammen,
@ Muetze1 ich habe hinter den Komponenten Objekte (jede Komponente ist eine Instanz von einem Objekt). Durch die Eingaben eines Users wird nun das Objekt hinter der Komponente geändert. Diese Änderung wirkt sich nun auch auf andere Objekte aus. Um nun den Komponneteninhalt der geänderten Objekte zu aktuallisieren soll das ganze Formular neu gezeichnet werden. Dann ist mann nämlich frei von der Bildschirmaktuallisierung der einzelnen Komponenten und kann sich ausschließlich um das Verhalten seiner Objekte kümmern. Was ist bitte daran falsch, ich glaube das ist das Grundprinzip der OOP. Denn hier wird der eigentliche Programmablauf und Datenfluß in den Objekten abgearbeitet und die Visuelle Seite wird in den Komponenten geregelt. @ DeddyH Zitat:
Wenn ich dann auf die Form zugreifen kann, sollte es zumindest in den Komponenten gehen. @ Carsten1234 Ich glaube nicht, dass ich damit ans Ziel komme, trotzdem Danke Gruß Dieter |
Re: Formular neu zeichnen erzwingen
Zitat:
Du solltest ein ![]() Ein Beispiel hierfür sind die datensensitiven Steuerelemente von Delphi (TDBEdit, TDBGrid etc.) Sie reagieren auf Änderungen am Dataset und stellen sich dann ggf. selbstständig neu dar. Dabei weiss ein Dataset gar nicht, ob und welche visuellen Controls vorhanden sind, es soll es auch gar nicht wissen. Zitat:
![]() |
Re: Formular neu zeichnen erzwingen
Hallo alzaimar
Zitat:
Ich wollte eigentlich nur erreichen, dass die Komponenten (die ja die richtigen Daten beinhalten) neu gezeichnet werden, wenn ich nämlich das Formular in der Taskleiste ablege und wieder öffne werden meine Komponenten korrekt dargestellt. Seit gestern Abend weis ich allerdings, dass ich durch ein Form.Repaint dies nicht erreichen kann, da die Form scheinbar nicht komplett neu gezeichnet wird. :oops: Nun mal Butter bei den Fischen. Leider war kein Beispiel für Delphi bei dem Link für Observerpattern dabei und die Umsetzung nach Delphi bekomme ich nicht hin, zu wenige Kenntnisse. Wie erstelle ich ein Überwachungsmuster in Delphi und wie melde ich meine Komponenten dort an und ab und wie werden diese Komponenten zum Neuzeichnen veranlasst? Hast du mal ein Beispiel in Delphi für mich oder waren das nur Schlagworte die du drauf hast? :zwinker: Gruß Dieter |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:52 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