AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Formular neu zeichnen erzwingen

Ein Thema von Optiplex · begonnen am 10. Aug 2009 · letzter Beitrag vom 18. Aug 2009
Antwort Antwort
Seite 1 von 3  1 23      
Optiplex

Registriert seit: 5. Mär 2008
131 Beiträge
 
Delphi 2005 Personal
 
#1

Formular neu zeichnen erzwingen

  Alt 10. Aug 2009, 12:41
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
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Formular neu zeichnen erzwingen

  Alt 10. Aug 2009, 12:44
Du könntest Invalidate des Formulars aufrufen, das sorgt für ein komplettes Neuzeichnen.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: Formular neu zeichnen erzwingen

  Alt 10. Aug 2009, 13:26
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
Heiko
  Mit Zitat antworten Zitat
Optiplex

Registriert seit: 5. Mär 2008
131 Beiträge
 
Delphi 2005 Personal
 
#4

Re: Formular neu zeichnen erzwingen

  Alt 11. Aug 2009, 09:08
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
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#5

Re: Formular neu zeichnen erzwingen

  Alt 11. Aug 2009, 09:23
Versuch doch, mit GetParentForm das Formular zu ermitteln, welches Du dann mit Invalidate/Refresh/Repaint neu zeichnen kannst.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#6

Re: Formular neu zeichnen erzwingen

  Alt 11. Aug 2009, 09:25
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.
  Mit Zitat antworten Zitat
Carsten1234

Registriert seit: 9. Apr 2008
Ort: Vechelde
178 Beiträge
 
Delphi 8 Professional
 
#7

Re: Formular neu zeichnen erzwingen

  Alt 11. Aug 2009, 09:35
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.
SendMessage({MainForm.Handle}, wm_RefreshForm, 0, 0); wm_RefreshForm definierst Du als
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
  Mit Zitat antworten Zitat
Optiplex

Registriert seit: 5. Mär 2008
131 Beiträge
 
Delphi 2005 Personal
 
#8

Re: Formular neu zeichnen erzwingen

  Alt 11. Aug 2009, 12:40
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 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.
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
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#9

Re: Formular neu zeichnen erzwingen

  Alt 11. Aug 2009, 13:41
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 . 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 von Optiplex:
...jede Komponente ist eine Instanz von einem Objekt
Es schadet nicht, die Grundbegriffe der OOP noch einmal nachschlagen.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Optiplex

Registriert seit: 5. Mär 2008
131 Beiträge
 
Delphi 2005 Personal
 
#10

Re: Formular neu zeichnen erzwingen

  Alt 12. Aug 2009, 09:18
Hallo alzaimar

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.

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?

Gruß Dieter
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 16:30 Uhr.
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