![]() |
Nur Stringgrid transparent ?
Hallo,
gibt es eine Möglichkeit nur ein Stringgrid transparent zu machen und nicht die ganze Form? Ich habe z.B. auf meiner Form ein TImage und darüber ein Stringgrid. Nun hätte ich es gern das die Einträge des Stringgrids sozusagen auf dem TImage zu liegen scheinen. Hat jemand eine Idee? Danke. |
AW: Nur Stringgrid transparent ?
|
AW: Nur Stringgrid transparent ?
Die TransparentColor bringt doch nur den Background des Fensters durch, aber nicht das hinterm Fenster.
Es gibt überall Erklärungen, wie man "Bereiche" eines Fenters transparent macht. * entweder 100% eine bestimmte Farbe irgendwo im Fenster (die muß man dann nur als Hintergrund im gewünschten Control verwenden) * oder mit einer Maske, welche man dann so festlegt, dass sie über dem Control liegt |
AW: Nur Stringgrid transparent ?
Anstatt die Durchsichtigkeit des Stringgrids zu "simulieren" könnte man ihn auch als "Layered Window" wirklich transparent machen:
![]() Von der Delphi VCL gibt es da aber nichts "out of the box", das muss man sich dann wohl selbst über die WinApi machen. |
AW: Nur Stringgrid transparent ?
FMX und VCL kennen WS_EX_LAYERED.
FMXForm.Transparency bzw. VCLForm.AlphaBlend oder VCLForm.TransparentColor. Es war damals in den What's New DAS supercoole Feature, weswegen man das neue Delphi kaufen sollte. :zwinker: |
AW: Nur Stringgrid transparent ?
Ja, für Formulare, aber nicht für einzelne Komponenten, in diesem Fall den Stringgrid.
Nur mal so runtergetippt, ![]()
Delphi-Quellcode:
procedure TForm1.CheckBox1Click(Sender: TObject);
var isTransparent: Boolean; begin isTransparent := (Sender as TCheckBox).Checked; setIsStringGridTransparent(isTransparent); end; procedure TForm1.setIsStringGridTransparent(const isTransparent: Boolean); var exStyle: DWORD; begin exStyle := GetWindowLongPtr(StringGrid1.Handle, GWL_EXSTYLE); Win32Check(exStyle <> 0); if(isTransparent) then begin exStyle := (exStyle or WS_EX_LAYERED); Win32Check( SetWindowLongPtr(StringGrid1.Handle, GWL_EXSTYLE, exStyle) <> 0 ); Win32Check( SetLayeredWindowAttributes( StringGrid1.Handle, 0, 127, // 50 % von 255 LWA_ALPHA ) ); end else begin exStyle := (exStyle xor WS_EX_LAYERED); SetWindowLong(StringGrid1.Handle, GWL_EXSTYLE, exStyle); end; end; |
AW: Nur Stringgrid transparent ?
Danke Euch für die rege Unterstützung. Das Beispielvideo von Der schöne Günther kommt genau an das heran was ich möchte. Also gleich mal den Code ausprobiert, aber leider bekomme ich beim ausführen die Fehlermeldung "Ein Aufruf einer Betriebssystemfunktion ist fehlgeschlagen". Beim debuggen läuft alles glatt durch.
|
AW: Nur Stringgrid transparent ?
Dann musst du ein paar mehr Informationen liefern, welche Delphi-Version?
Bei meinem Delphi 10 Seattle musste ich z.B. auch erst von Hand das ".exe-Manifest" bearbeiten denn darin muss man angeben dass man explizit Windows 8 (2012) unterstützt, und davon hatte man bei Embarcadero im Jahr 2015 wohl noch nichts gehört, neuere Delphi-Versionen habe ich nicht getestet ob die Handarbeit da noch nötig ist. |
AW: Nur Stringgrid transparent ?
Seit mindestens Delphi 10.irgendwas ist das im Standardmanifest mit drin. (man kann da sogar Admin und HighDPI aktivieren)
|
AW: Nur Stringgrid transparent ?
Ja, das gibt es in 10.0 Seattle auch, aber im Manifest war anscheinend noch nicht explizit enthalten, dass man schon mal etwas von Windows 8 gehört hat. Jedenfalls hatte ich genau diesen Fehler auch, und nachdem ich von Hand einfach mal folgendes Beispiel-Manifest in den Projektoptionen eingebunden habe ging alles.
![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:57 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