Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Formular neu zeichnen erzwingen (https://www.delphipraxis.net/138435-formular-neu-zeichnen-erzwingen.html)

Optiplex 10. Aug 2009 11:41


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

jaenicke 10. Aug 2009 11:44

Re: Formular neu zeichnen erzwingen
 
Du könntest Invalidate des Formulars aufrufen, das sorgt für ein komplettes Neuzeichnen.

hoika 10. Aug 2009 12:26

Re: Formular neu zeichnen erzwingen
 
Hallo,

das Hauptform hat ja eine globale Form-Variable.
Delphi-Quellcode:
unit X

implementation

uses
  Form1; // Hauptform

begin
  Form1.Invalidate
Ich würde aber im Main-Form eine Methode definieren (RefreshForm),
die nur Invalidate aufruft.

Das lässt sich besser Debuggen,
wenn du mal einen "Refresh"-Fehler suchst.


Heiko

Optiplex 11. Aug 2009 08:08

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

DeddyH 11. Aug 2009 08:23

Re: Formular neu zeichnen erzwingen
 
Versuch doch, mit GetParentForm das Formular zu ermitteln, welches Du dann mit Invalidate/Refresh/Repaint neu zeichnen kannst.

Muetze1 11. Aug 2009 08:25

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.

Carsten1234 11. Aug 2009 08:35

Re: Formular neu zeichnen erzwingen
 
Zitat:

Zitat von Optiplex
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.

Delphi-Quellcode:
SendMessage({MainForm.Handle}, wm_RefreshForm, 0, 0);
wm_RefreshForm definierst Du als
Delphi-Quellcode:
wm_RefreshForm = wm_User + 42;
und in der MainForm muss Du nur noch die Message abfangen mit
Delphi-Quellcode:
TMainForm = class(TForm)
  private
    procedure wmRefreshForm(var Msg: TMessage); message wm_RefreshForm;
end;

procedure TMainForm.wmRefreshForm(var Msg: Tmessage);
begin
  Self.Invalidate;
end;
Sowohl der MainForm.Handle als auch wm_RefreshForm muss in all Deinen Units bekannt sein.

War es das, was Du suchst?

Gruß, Carsten

Optiplex 11. Aug 2009 11:40

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:

Zitat von DeddyH
Versuch doch, mit GetParentForm das Formular zu ermitteln, welches Du dann mit Invalidate/Refresh/Repaint neu zeichnen kannst.

Dies könnte ein Lösungsansatz sein, GetParentForm kannte ich noch nicht. :oops:
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

alzaimar 11. Aug 2009 12:41

Re: Formular neu zeichnen erzwingen
 
Zitat:

Zitat von Optiplex
Was ist bitte daran falsch, ich glaube das ist das Grundprinzip der OOP...

Bloß weil Du Objekte verwendest, heißt das ja noch nicht, das Du gleich das OOP Paradigma korrekt umsetzt :stupid: . Dein Design-Fehler besteht in der starren Verbindung der (Daten-)Objekte mit den Visualisierungsobjekten. Du verletzt damit zwei Grundprinzipien der OOP: Unabhängigkeit und Wiederverwendbarkeit von Klassen.

Du solltest ein Observerpattern implementieren. Dabei melden sich die für die Visualisierung zuständigen Objekte beim Observer an. Wenn nun ein Datenobjekt verändert wurde, meldet es dies dem zuständigen Observer, der seinerseits alle angemeldeten Objekte über eine definierte Schnittstelle benachrichtigt, sodaß diese sich neuzeichnen können. Auf diese Weise sind die Klassen unabhängig und wiederverwendbar.

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:

Zitat von Optiplex
...jede Komponente ist eine Instanz von einem Objekt

Es schadet nicht, die Grundbegriffe der OOP noch einmal nachschlagen. :zwinker:

Optiplex 12. Aug 2009 08:18

Re: Formular neu zeichnen erzwingen
 
Hallo alzaimar

Zitat:

Zitat von alzaimar
Dein Design-Fehler besteht in der starren Verbindung der (Daten-)Objekte mit den
Visualisierungsobjekten. Du verletzt damit zwei Grundprinzipien der OOP: Unabhängigkeit und Wiederverwendbarkeit von Klassen.:


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 14:30 Uhr.
Seite 1 von 3  1 23      

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