DBEDIT Feld auf transparent setzen.-geht nicht

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Andy Nightingale
Beiträge: 447
Registriert: Mo 13. Jan 2025, 12:11

DBEDIT Feld auf transparent setzen.-geht nicht

Beitrag von Andy Nightingale »

Hallo Leute,
Ich wollte das bei einem DBEdit Feld der Hintergrund transparent ist...das funktioniert aber nicht. Wenn ich es bei den Eigenschaften mache geht es nicht. Wenn ich ParentColor mache dann nimmt er zwar das unterste ...das ist zwar super, aber mein DBEDIT Feld ist eins drüber auf einem Image. Dort möchte ich nur den Text lesen und ändern können, aber alles andere soll transparent sein. Im Grunde eine einfache Sache. Aber ich habe das Gefühl das ich immer über die einfachen Dinge stolpere. Ganz komisch. :D
.-auch Borderstyle bsNone funktioniert... Hat jemand eine Idee? Grüße

TFormEingabeS.FormCreate(Sender: TObject);
begin
DBEditTower.color:= clNone;
...oder mit DBEditTower.ParentColor := True; // auch nix
end;

Benutzeravatar
Zvoni
Beiträge: 777
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 11 Pro (Laz4.3/FPC3.2.3)
CPU-Target: 64Bit
Wohnort: BW

Re: DBEDIT Feld auf transparent setzen.-geht nicht

Beitrag von Zvoni »

Andy Nightingale hat geschrieben: Sa 24. Okt 2026, 17:22 Hallo Leute,
Ich wollte das bei einem DBEdit Feld der Hintergrund transparent ist...das funktioniert aber nicht. Wenn ich es bei den Eigenschaften mache geht es nicht. Wenn ich ParentColor mache dann nimmt er zwar das unterste ...das ist zwar super, aber mein DBEDIT Feld ist eins drüber auf einem Image. Dort möchte ich nur den Text lesen und ändern können, aber alles andere soll transparent sein. Im Grunde eine einfache Sache. Aber ich habe das Gefühl das ich immer über die einfachen Dinge stolpere. Ganz komisch. :D
.-auch Borderstyle bsNone funktioniert... Hat jemand eine Idee? Grüße

TFormEingabeS.FormCreate(Sender: TObject);
begin
DBEditTower.color:= clNone;
...oder mit DBEditTower.ParentColor := True; // auch nix
end;
Es wäre mir neu, dass "clNone" für Color eine Transparenz des Hintergrunds erzeugt.
Das einzige was mir einfällt, wäre, falls du auf Windows bist, ein SetWindowLong gegen das Handle abzufeuern.
Müsste WS_EX_TRANSPARENT sein

Alternative könnte "CustomDraw" sein bzw. das OnPaint respektive OnPrepareCanvas abzufangen

EDIT: Sehe gerade, dass TDBEdit gar kein OnPaint/OnPrepareCanvas hat.
Dürfte also ein ziemlich übler Hack werden.....
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

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

Re: DBEDIT Feld auf transparent setzen.-geht nicht

Beitrag von wp_xyz »

Ich finde, in diesem speziellen Fall sollte man für dieses Feld/diese Felder jeweils ein TDBEdit und ein TDBLabel zu verwenden, die so positioniert sind, dass sich sich exakt überlappen. Beide sind jeweils mit demselben Feld des TDataset verbunden, aber nur eins ist sichtbar. Normalerweise ist nur das TDBLabel sichtbar, es ist auch auf einem Image transparent (ohne eigenen Hintergrund). Wenn nun der Dataset in den Edit-Modus übergeht, wird TDBLabel auf Visible = false geschaltet und dafür TDBEdit auf Visible = true. Nun wird zwar der Hintergrund des DBEdit verwendet, aber der User soll doch erkennen, dass etwas einzugeben ist, oder? Die Umschaltung erfolgt im BeforeEdit (oder .AfterEdit?)-Event des Dataset, und im OnAfterPost/OnAfterCancel-Event wird wieder auf den Normalzustand geschaltet (DBLabel sichtbar, DBEdit unsichtbar).

Andy Nightingale
Beiträge: 447
Registriert: Mo 13. Jan 2025, 12:11

Re: DBEDIT Feld auf transparent setzen.-geht nicht

Beitrag von Andy Nightingale »

Zvoni hat geschrieben: Mo 26. Okt 2026, 08:29
Andy Nightingale hat geschrieben: Sa 24. Okt 2026, 17:22 Hallo Leute,
Ich wollte das bei einem DBEdit Feld der Hintergrund transparent ist...das funktioniert aber nicht. Wenn ich es bei den Eigenschaften mache geht es nicht. Wenn ich ParentColor mache dann nimmt er zwar das unterste ...das ist zwar super, aber mein DBEDIT Feld ist eins drüber auf einem Image. Dort möchte ich nur den Text lesen und ändern können, aber alles andere soll transparent sein. Im Grunde eine einfache Sache. Aber ich habe das Gefühl das ich immer über die einfachen Dinge stolpere. Ganz komisch. :D
.-auch Borderstyle bsNone funktioniert... Hat jemand eine Idee? Grüße

TFormEingabeS.FormCreate(Sender: TObject);
begin
DBEditTower.color:= clNone;
...oder mit DBEditTower.ParentColor := True; // auch nix
end;
Es wäre mir neu, dass "clNone" für Color eine Transparenz des Hintergrunds erzeugt.
Das einzige was mir einfällt, wäre, falls du auf Windows bist, ein SetWindowLong gegen das Handle abzufeuern.
Müsste WS_EX_TRANSPARENT sein

Alternative könnte "CustomDraw" sein bzw. das OnPaint respektive OnPrepareCanvas abzufangen

EDIT: Sehe gerade, dass TDBEdit gar kein OnPaint/OnPrepareCanvas hat.
Dürfte also ein ziemlich übler Hack werden.....
Hi Zvoni,
war ne gute Idee...aber geht leider nicht habe dies hier mit einer neuen DBEdit mit verschiedenen Einstellungen getestet um es zu erzwingen.:

Code: Alles auswählen

SetWindowLong(DBEdit1.Handle, GWL_EXSTYLE,
                GetWindowLong(DBEdit1.Handle, GWL_EXSTYLE) or WS_EX_TRANSPARENT);
   DBEdit1.Invalidate;   
Löse es nun das ich das Bild farblich so anpasse das man nicht sieht was dahinter steckt. Danke dir aber für die Idee. Grüße

Andy Nightingale
Beiträge: 447
Registriert: Mo 13. Jan 2025, 12:11

Re: DBEDIT Feld auf transparent setzen.-geht nicht

Beitrag von Andy Nightingale »

wp_xyz hat geschrieben: Mo 26. Okt 2026, 11:31 Ich finde, in diesem speziellen Fall sollte man für dieses Feld/diese Felder jeweils ein TDBEdit und ein TDBLabel zu verwenden, die so positioniert sind, dass sich sich exakt überlappen. Beide sind jeweils mit demselben Feld des TDataset verbunden, aber nur eins ist sichtbar. Normalerweise ist nur das TDBLabel sichtbar, es ist auch auf einem Image transparent (ohne eigenen Hintergrund). Wenn nun der Dataset in den Edit-Modus übergeht, wird TDBLabel auf Visible = false geschaltet und dafür TDBEdit auf Visible = true. Nun wird zwar der Hintergrund des DBEdit verwendet, aber der User soll doch erkennen, dass etwas einzugeben ist, oder? Die Umschaltung erfolgt im BeforeEdit (oder .AfterEdit?)-Event des Dataset, und im OnAfterPost/OnAfterCancel-Event wird wieder auf den Normalzustand geschaltet (DBLabel sichtbar, DBEdit unsichtbar).
Hi WP,
spannender Ansatz.-ich teste das mal.- Danke dir. :)

Benutzeravatar
Zvoni
Beiträge: 777
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 11 Pro (Laz4.3/FPC3.2.3)
CPU-Target: 64Bit
Wohnort: BW

Re: DBEDIT Feld auf transparent setzen.-geht nicht

Beitrag von Zvoni »

Andy Nightingale hat geschrieben: Mo 26. Okt 2026, 11:33 Hi Zvoni,
war ne gute Idee...aber geht leider nicht habe dies hier mit einer neuen DBEdit mit verschiedenen Einstellungen getestet um es zu erzwingen.:

Code: Alles auswählen

SetWindowLong(DBEdit1.Handle, GWL_EXSTYLE,
                GetWindowLong(DBEdit1.Handle, GWL_EXSTYLE) or WS_EX_TRANSPARENT);
   DBEdit1.Invalidate;   
Löse es nun das ich das Bild farblich so anpasse das man nicht sieht was dahinter steckt. Danke dir aber für die Idee. Grüße
https://learn.microsoft.com/de-de/windo ... attributes
WS_EX_LAYERED wäre noch ne Idee.

Heisst:
SetWindowLong mit WS_EX_LAYERED (optional mit/ohne WS_EX_TRANSPARENT)
danach SetLayeredWindowAttributes
Das interessante ist die COLORREF-Struktur
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

Antworten