TForm - Aufbau und Darstellung

Rund um die LCL und andere Komponenten
Benutzeravatar
Lincoln Six Echo
Beiträge: 138
Registriert: Di 26. Aug 2014, 16:42
OS, Lazarus, FPC: Win10, Debian
CPU-Target: I7/I9/Q9650/u.a.
Wohnort: Hamburg

TForm - Aufbau und Darstellung

Beitrag von Lincoln Six Echo »

Legt man eine Anzahl visueller Components auf ein TForm und setzt die Farbe des TForm auf schwarz sieht man sobald das TForm auf dem Bildschirm dargestellt wird, das es zunächst leer und weiß ist und dann erst schwarz wird und die Components darüber gezeichnet werden.

Doublebuffered true / false ändert daran nichts. Unter Windows Thema hell der dunkel ändert nichts. Nur bei BorderStyle = bsNone des TForm tritt dieser Effekt nicht auf. Allerdings wird dann, anders als bei bsToolWindow oder bsSizeToolWindow bei DLLs (Plugins) das TForm dann neben der Anwendung als eigenes Symbol in der Taskleiste angezeigt, was nicht so sein soll.

Gerade bei Anwendungen die generell in einer dunklen Umgebung laufen ist das sehr unschön.

Hat jemand vielleicht eine Idee ?

Mathias
Beiträge: 6210
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: TForm - Aufbau und Darstellung

Beitrag von Mathias »

Hast du schon mal versucht die Farbe bei OnCreate zu setzen, und direkt schon im Objectinspector ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
Lincoln Six Echo
Beiträge: 138
Registriert: Di 26. Aug 2014, 16:42
OS, Lazarus, FPC: Win10, Debian
CPU-Target: I7/I9/Q9650/u.a.
Wohnort: Hamburg

Re: TForm - Aufbau und Darstellung

Beitrag von Lincoln Six Echo »

Ja. Es macht keinen Unterschied. Auch Brush.Color := clBlack und Canvas.Brush.Color := clBlack usw. bringt keine Änderung. Ich habe ein Bildschirmvideo gemacht und mir jedes einzelne Bild angesehen, das Fenster wird zunächst komplett weiss dargestellt, egal was immer du als Farbe einstellst. Erst dann wird alles andere darüber gezeichnet.

wp_xyz
Beiträge: 4895
Registriert: Fr 8. Apr 2011, 09:01

Re: TForm - Aufbau und Darstellung

Beitrag von wp_xyz »

Kannst du mal ein Projektchen mit so einem Formular posten? Ich kann das Problem gerade nicht reproduzieren, auch nicht mir 100 Checkboxen, die per Childsizing automatisch angeordnet werden.

Evtl. musst du das Create des Formulars überschreiben und dort die Farbe schon vor "inherited" setzen.

Benutzeravatar
Lincoln Six Echo
Beiträge: 138
Registriert: Di 26. Aug 2014, 16:42
OS, Lazarus, FPC: Win10, Debian
CPU-Target: I7/I9/Q9650/u.a.
Wohnort: Hamburg

Re: TForm - Aufbau und Darstellung

Beitrag von Lincoln Six Echo »

In meinem Projekt sind eine Vielzahl von eigenen Components und Controls enthalten. Es ist eine DAW also ein virtuelles Tonstudio. Das sind u.a. eigene Group-Boxen die wiederum Controls enthalten. Dies Groupboxes enthalten u.a. Hintergrundbilder (Textures) die z.b. eine Metalloberfläche simulieren.

Deswegen brauchen die Zeichenvorgänge ein paar msec. länger als wenn es nur ein paar Standard-Komponenten sind.

Diese Forms sind in DLLs enthalten die nur bei Bedarf angezeigt werden. Die Anwendung lädt so eine DLL und ruft dann ggf. TForm(GUI).Show oder auch TForm(GUI).Visible := true auf. Genau dann sieht man da alles erst weiß ist und dann alles andere darüber gelegt wird.

Benutzeravatar
Lincoln Six Echo
Beiträge: 138
Registriert: Di 26. Aug 2014, 16:42
OS, Lazarus, FPC: Win10, Debian
CPU-Target: I7/I9/Q9650/u.a.
Wohnort: Hamburg

Re: TForm - Aufbau und Darstellung

Beitrag von Lincoln Six Echo »

Compressor.jpg
Compressor.jpg (49.17 KiB) 1133 mal betrachtet
So sieht das z.B. aus.

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: TForm - Aufbau und Darstellung

Beitrag von Michl »

Hilft es, wenn du das Formular außerhalb vom sichtbaren Screen erstellst und wenn alles fertig ist, in den sichtbaren Bereich setzt?

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6217
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: TForm - Aufbau und Darstellung

Beitrag von af0815 »

Nur zum Auseinanderhalten - tritt der Effekt NUR bei 'nativen' Forms auf oder nur bei 'DLL' Forms auf oder bei beiden ?
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
Lincoln Six Echo
Beiträge: 138
Registriert: Di 26. Aug 2014, 16:42
OS, Lazarus, FPC: Win10, Debian
CPU-Target: I7/I9/Q9650/u.a.
Wohnort: Hamburg

Re: TForm - Aufbau und Darstellung

Beitrag von Lincoln Six Echo »

Die Form an einer nicht sichtbaren Position zu erzeugen und dann in den sichtbaren Bereich zu schieben ist eine ziemlich gute Idee.

Danke dafür.

Funktioniert leider auch nicht. Der Effekt erst alles weiß und dann alles andere darüber ist auch dann sichtbar.

Benutzeravatar
Lincoln Six Echo
Beiträge: 138
Registriert: Di 26. Aug 2014, 16:42
OS, Lazarus, FPC: Win10, Debian
CPU-Target: I7/I9/Q9650/u.a.
Wohnort: Hamburg

Re: TForm - Aufbau und Darstellung

Beitrag von Lincoln Six Echo »

Der Effekt ist bis jetzt nur zu sehen wenn ein TForm zur Laufzeit des Programms erstellt und angezeigt wird.

Ich habe nun schon mit der WndProc herumprobiert, man kann z.B. WM_PAINT ausfiltern, dann wird kein Rahmen usw. gezeichnet aber auch alles erstmal mit weiß gefüllt.

Auch wenn es nicht aus einer DLL kommt, also einfach im Hauptprogramm aus einer Unit dann sieht man das auch.

wenn es nur ein paar Standardkomponenten sind geht das so schnell das man es nicht sieht, wenn aber Controls dabei sind die etwas aufwendiger gezeichnet werden müssen, wie z.B. meine Drehregler und dann noch Hintergrundgrafiken dazu kommen wird dieser Effekt immer unschöner.

Du hast halt immer erst eine große weiße Fläche auf dem Bildschirm bevor das eigentliche "Face" zu sehen ist.

Was mich nun echt ärgert ist das es in einer C++ gebauten Anwendung mit den gleichen Controls nicht auftritt.

"Dann nimm doch C++". Nein. Ich bin echter Pascal-Freak ;-) Und Lazarus mit dem FPC ist eine absolut hervorragende IDE.

Vor einigen Tagen habe ich gelesen das Anwendungen die mit C++ gebaut wurden im Audio und Videobereich schneller laufen als wenn die mit Lazarus und dem FPC erstellt wurden. Das ist definitiv nicht so. Ich habe das lange ausprobiert. Es kommt auf den Algo an, nicht die Programmiersprache. Ich habe einige Plugins programmiert (mit Lazarus) die laufen tatsächlich einen Tick schneller als exakt das gleich mit C++ gemachte. Getestet auch in Cubase, Reaper, Studio One und FL Studio. Klar da geht es um Millisekunden aber Objectpascal geht da genauso wie C++.

Mathias
Beiträge: 6210
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: TForm - Aufbau und Darstellung

Beitrag von Mathias »

Was mich nun echt ärgert ist das es in einer C++ gebauten Anwendung mit den gleichen Controls nicht auftritt.
Was für ein C++, den C++ Builder ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
kralle
Lazarusforum e. V.
Beiträge: 994
Registriert: Mi 17. Mär 2010, 14:50
OS, Lazarus, FPC: Linux Mint 20 , FPC 3.3.1 , Lazarus 2.1.0 -Win10 & XE7Pro
CPU-Target: 64Bit
Wohnort: Bremerhaven
Kontaktdaten:

Re: TForm - Aufbau und Darstellung

Beitrag von kralle »

Moin,

Nur mal so eine Idee:
"Hast Du den aktuellen Treiber für Deine Grafikkarte installiert?"

Hatte mal das Problem, das unter Firefox der Seitenaufbau ewig dauerte.
Erst der aktuelle Grafiktreiber, löste das Problem.

Gruß Heiko
OS: Manjaro Linux, Debian und Windows 10
FPC-Version: 3.2.2 , Lazarus 3.0
+ Delphi XE7SP1

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6217
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: TForm - Aufbau und Darstellung

Beitrag von af0815 »

An und für sich ist die LCL ja vorhanden, also kann man dort auch nachsehen. Die LCL kocht ja auch nur mit Wasser und reicht die Zeichenenbotschaften ja je nach Widgetset weiter.

Es tritt bei dir aber sowohl bei einem dunklen als auch bei einem hellen System auf. Ich hätte erwartet, das die default Farben des Systems genommen werden. Hmm, schon komisch.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
Lincoln Six Echo
Beiträge: 138
Registriert: Di 26. Aug 2014, 16:42
OS, Lazarus, FPC: Win10, Debian
CPU-Target: I7/I9/Q9650/u.a.
Wohnort: Hamburg

Re: TForm - Aufbau und Darstellung

Beitrag von Lincoln Six Echo »

Grafiktreiber ist aktuell.

Ein Kollege hat das in Visual C nachgebaut. Das Plugin sieht genauso aus, macht auch genau das gleiche, aber bei der Bildschirmdarstellung tritt der "Weiß-Effekt" NICHT auf.

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: TForm - Aufbau und Darstellung

Beitrag von Michl »

Soll es plattformübergreifend funktionieren oder nur für ein spezielles OS? Wahrscheinlich liegt es an den Parametern, wie ein Formular erstellt wird.

Unter Windows zum Beispiel wird das Ganze letztlich in der Unit Win32WSControls (siehe https://learn.microsoft.com/en-us/windo ... ewindowexw) erstellt. Dabei könntest du etwas mit dem Parameter FlagsEx experimentieren. Mir würde z.B. sowas wie WS_EX_TRANSPARENT (siehe https://learn.microsoft.com/en-us/windo ... dow-styles in den Sinn kommen. Vielleicht kannst du deinen Kollegen fragen, welche Parameter er zum Erzeugen verwendet hat. Wenn du etwas experimentieren willst, kannst du selbst in Win32WSControls in der Prozedur FinishCreateWindow vor Window := CreateWindowExW FlagsEx zum testen verändern. z.B. (ungetestet):

Code: Alles auswählen

procedure FinishCreateWindow(const AWinControl: TWinControl; var Params: TCreateWindowExParams;
  const AlternateCreateWindow: boolean; SubClass: Boolean = False);
...
      FlagsEx := FlagsEx or WS_EX_TRANSPARENT;
      Window := CreateWindowExW(FlagsEx, PWideChar(WideString(pClassName)),
        PWideChar(UTF8ToUTF16(WindowTitle)), Flags,
        Left, Top, Width, Height, Parent, 0, HInstance, @NCCreateParams);  
Ansonsten, kannst du das Projekt soweit minimieren, dass eine einfache Anwendung übrigbleibt, die du hier posten kannst? Evtl. findest du auf diesem Weg schon eine Lösung oder man kann dann damit testen.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Antworten