Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Theming / CommonControls - Geht es auch teilweise? (https://www.delphipraxis.net/188377-theming-commoncontrols-geht-es-auch-teilweise.html)

Der schöne Günther 25. Feb 2016 19:00

Theming / CommonControls - Geht es auch teilweise?
 
Es ist etwas verrückt, ich gebe es zu.

Ich habe eine VCL-Anwendung die sehr mutig ist. Sie verschiebt beispielsweise Komponenten (wie Labels und Buttons) im
Delphi-Quellcode:
OnPaint
-Handler des Formulars. Das ist nicht richtig so, ich weiß. Damit das alles funktioniert, muss man in den Delphi-Projektoptionen unter "Laufzeit-Themes" "Keine" anwählen. Damit hat man diese Windows 2000-Optik, aber das ist ok.

Schaltet man die Themes ein, funktioniert gar nichts mehr: Das Verschieben von Komponenten löst den OnPaint-Handler wieder aus und die gesamte Anwendung hängt oder zeichnet sich sehr komisch.

Soweit, so gut.


Ich möchte nun allerdings ein neues Formular hinzufügen. Eins mit Themes, wo alles toll aussehen soll. Geht das, ohne generell Themes einzuschalten? Ich finde nur, wie man Themes für einzelne Controls wieder deaktivieren kann. Aber das hilft mir nicht, da stapeln sich die OnPaint-Handler weiterhin. Die Anwendung läuft nurwenn kein Common Controls 6-Eintrag im Manifest ist. Also man in den Projektoptionen "Keine Themes" angewählt hat.

Was kann ich jetzt noch tun?

Uwe Raabe 25. Feb 2016 19:05

AW: Theming / CommonControls - Geht es auch teilweise?
 
Du kannst im Programm nur eine COMCTL32.DLL verwenden. Durch das Manifest bestimmst du, welche es sein soll. Meines Wissens kann man das nicht mischen.

stahli 25. Feb 2016 19:36

AW: Theming / CommonControls - Geht es auch teilweise?
 
Warum machst Du so was komisches?
Willst Du Labels anhand eines Bitmaps positionieren oder so?
Vielleicht finden wir ja einen besseren Ansatz?

Ein Problem, das ich früher hatte: Panel.Left := Panel.Left; hat eine Neuzeichnung ausgelöst.
Also habe ich vorher auf Gleichheit geprüft und nur bei Ungleichheit neu zugewiesen.
Vielleicht bringt Dich das ja irgendwie weiter.

Der schöne Günther 25. Feb 2016 19:39

AW: Theming / CommonControls - Geht es auch teilweise?
 
Ich mache das nicht- Als der Code geschrieben wurde bin ich (ernsthaft) noch in die Grundschule gegangen.

Ich suche nur verzweifelt nach einer Möglichkeit noch etwas billig dranzustricken ohne die OnPaint-Handler von Dutzenden Formularen entwirren zu müssen. Denn sonst wird das schon wieder nichts mit Urlaub nehmen :pale:

Noch bin ich nicht verzweifelt genug die neuen Formulare in eine gesonderte DLL auszulagern. Das geht bestimmt...

Namenloser 25. Feb 2016 20:14

AW: Theming / CommonControls - Geht es auch teilweise?
 
Kannst du nicht sowas machen?

Delphi-Quellcode:
TBaseForm = class(TForm)
protected
  FRepaintDisabled: Boolean;
  procedure DoPaint; override;
public
  procedure DisableRepaints;
  procedure EnableRepaints;
end;

procedure TBaseForm.DisableRepaints;
begin
  FRepaintDisabled := True;
end;

procedure TBaseForm.EnableRepaints;
begin
  FRepaintDisabled := True;
end;

procedure TBaseForm.DoPaint;
begin
  if not FRepaintDisabled then
    inherited DoPaint;
end;

---------------------------------------------

procedure TMyForm.FormPaint(Sender: TObject);
begin
  // bla bla bla ...

  DisableRepaints;
  Button1.Left := Button1.Left + 1;
  EnableRepaints;

  // bla bla bla ...
end;
Soll jetzt eher Pseudocode sein, habe lange nichts mit Delphi gemacht. Wenn es sehr viele Stellen sind und man nicht alle einzeln ändern will, könnte man auch
Delphi-Quellcode:
procedure TBaseForm.DoPaint;
begin
  if not FRepaintDisabled then
  begin
    DisableRepaints;
    inherited DoPaint;
    EnableRepaints;
  end;
end;
versuchen. Könnte natürlich ungewollte Seiteneffekt haben.

himitsu 26. Feb 2016 01:43

AW: Theming / CommonControls - Geht es auch teilweise?
 
Man kann die neuen CC verwenden, aber das Theming für alle/einzelne Controls deaktivieren.


Grundantwort: Im OnPaint darf niemals die "Anzeige", bzw. Komponenteneigenschaften verändert werden, vorallem nichts permanent immer wieder.
Außer indem man selber das Zeichnen übernimmt und nur im Gezeichneten variiert.

Bernhard Geyer 26. Feb 2016 06:07

AW: Theming / CommonControls - Geht es auch teilweise?
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1331393)
Ich mache das nicht- Als der Code geschrieben wurde bin ich (ernsthaft) noch in die Grundschule gegangen.

Und? Jeder hat mal angefangen und weiß es nach Jahren besser.
Wem das nicht so geht hat vermutlich in den Jahren nix gelernt.

Zitat:

Zitat von Der schöne Günther (Beitrag 1331393)
Ich suche nur verzweifelt nach einer Möglichkeit noch etwas billig dranzustricken ohne die OnPaint-Handler von Dutzenden Formularen entwirren zu müssen. Denn sonst wird das schon wieder nichts mit Urlaub nehmen :pale:

Vieleicht wurde es die letzten Male nix mit Urlaub nehmen weil du versuchst immer was billig dranzustricken statt es mal richtig umzuschreiben.[/QUOTE]

Zitat:

Zitat von Der schöne Günther (Beitrag 1331393)
Noch bin ich nicht verzweifelt genug die neuen Formulare in eine gesonderte DLL auszulagern. Das geht bestimmt...

Wieso sollte es das sein?

uligerhardt 26. Feb 2016 07:05

AW: Theming / CommonControls - Geht es auch teilweise?
 
Vielleicht mit MSDN-Library durchsuchenSetWindowTheme?
http://www.delphipraxis.net/287158-post8.html

Der schöne Günther 26. Feb 2016 09:20

AW: Theming / CommonControls - Geht es auch teilweise?
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1331410)
[...]

Danke, sehr hilfreich. :thumb:

Zitat:

Zitat von uligerhardt (Beitrag 1331413)
Vielleicht mit MSDN-Library durchsuchenSetWindowTheme?

Damit sieht zwar alles wieder "alt" aus, aber aufhängen tut es sich leider immer noch :-(


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:57 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