AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte TDimPanel für BodenseeMatze
Thema durchsuchen
Ansicht
Themen-Optionen

TDimPanel für BodenseeMatze

Ein Thema von Renate Schaaf · begonnen am 28. Mai 2025 · letzter Beitrag vom 2. Jun 2025
Antwort Antwort
Renate Schaaf
Registriert seit: 25. Jun 2020
Ein Panel, welches wenn's aktiviert ist, sich über eine anwählbare TWinControl legt, die runtergedimmed und deaktiviert wird (wie eine halbdurchsichtige Glasplatte). Auf dem Panel können Controls platziert werden, die man dann benutzen kann. Ergebnis einer Zusammenarbeit im englischen Forum, Hauptautor: aehimself. Hab alles so umgeschrieben, dass es bei mir unter Delphi2006 läuft, sollte unter Delphi7 evtl. auch direkt so funktionieren.
Im Design kann man das Panel einfach irgendwo platzieren und die Eigenschaften einstellen. Bei Ausführung kann das Panel dann über beliebige TWinControls gelegt werden.

Anleitung: DimPanel.dpk installieren, mit DemoDim.dpr ausprobieren. (Ja, ich habe kein extra Design-Package gemacht .

Hoffe, es funktioniert.

Renate

Edit:
Fix für Range-Check-Error: Man könnte Range-Check in DimPanel.dpk einfach ausstellen. Besser ist es, die AlphaBlend Routine in uDimPanel.pas (implemetation) durch folgende zu ersetzen:
Delphi-Quellcode:
//Replace shr 8 by div 256, so we don't get a range check error.
//Turn optimization on, so div 256 runs as fast as shr 8
//The optimizer sees that 256 is a power of 2.
{$IFOPT O- }
{$DEFINE O_MINUS }
{$O+ }
{$ENDIF }
{$IFOPT Q+}
{$DEFINE Q_PLUS}
{$Q-}
{$ENDIF}

//AlphaBlend Source and Target using alpha/255 on Source, 1-alpha/255 on Target
//and store result in target.
procedure Alphablend(Source, Target: TBitmap; Alpha: Byte);
var stride: integer;
    ps, pt: PByte;
    i: integer;
begin
  Assert(Source.pixelformat=pf24bit);
  Assert(Target.pixelformat=pf24bit);
  Assert(Source.width=target.Width);
  Assert(Source.height=target.Height);
  stride:=((Source.Width * 24 + 31) and not 31) div 8;
  ps:=Source.ScanLine[Source.Height-1];
  pt:=Target.ScanLine[Target.Height-1];
  for I := 1 to Source.Height*stride do
  begin
    pt^:=pt^ + (Alpha*(ps^-pt^)) div 256;
    inc(pt);
    inc(ps);
  end;
end;

//Restore optimization to original
{$IFDEF O_MINUS}
{$O-}
{$UNDEF O_MINUS}
{$ENDIF}
{$IFDEF Q_PLUS}
{$Q+}
{$UNDEF Q_PLUS}
{$ENDIF}
Styles:
Das DimPanel flickert wie bekloppt, wenn man VCL-Styles verwendet.
Einfacher "Fix": seBorder aus den Style-Elements für das Form herausnehmen.
Angehängte Dateien
Dateityp: zip DimPanel.zip (6,3 KB, 33x aufgerufen)

Geändert von Renate Schaaf ( 1. Jun 2025 um 09:29 Uhr) Grund: Autor hinzugefügt
 
Renate Schaaf

 
Delphi 11 Alexandria
 
#2
  Alt 1. Jun 2025, 09:36
Hab ein paar Hinweise für Nutzer von höheren Delphi-Versionen hinzugefügt.

Renate
Renate
  Mit Zitat antworten Zitat
Bodenseematze
 
#3
  Alt 2. Jun 2025, 09:44
Vielen Dank, Renate!

Um es unter Delphi7 zum Laufen zu bringen, muss man
  • von "uDimPanel.pas" das Encoding von UTF8+BOM auf ANSI ändern;
  • alle Aufrufe _bitmap.SetSize und _scr.SetSize aufsplitten in setzen der Properties Height/Width (TBitMap hat in D7 noch keine SetSize-Methode)
Im Demo-Projekt müssen
  • einige Properties, die es unter D7 noch nicht gibt, beim Öffnen der Form in der IDE ignoriert werden und
  • die Initialisierung mit ReportMemoryLeaksOnShutdorn auskommentiert werden

Danach funktioniert es sehr gut bei mir - habe in "FormCreate" nach erzeugen der fMyWinControls noch die eigene Form zur Liste hinzugefügt:
Code:
  fMyWinControls := TList.Create;
  fMyWinControls.Add(self);
Damit lässt sich dann auch die gesamte Form "dimmen" - das ist das, was ich benötige...
(wobei hierbei leider die Titelzeile voll sichtbar und aktiv bleibt - aber das ist wg. der Lösung mit dem abhängigen DimPanel so...)
...meine eigene Lösung war bisher mit einer eigenen "DimForm", die sich über die zu dimmende Form legt.
Das hat aber ein paar Probleme, da das Handling der beiden Forms (die DimForm und die eigentliche) synchronisiert werden muß;
z.B. wird beim Doppelklick auf das Taskleistensymbol das eigentliche Fenster minimiert, die DimForm bleibt aber stehen...
(da habe ich noch keine Lösung für gefunden - finde einfach nicht die richtige Event-Methode / Windows-Message dafür)
...das Problem taucht mit der Lösung über ein Panel naturgemäß nicht auf!

Ich werde mal schauen, ob / wie ich die Panel-Lösung bei mir integrieren kann (und ggf. noch die Titelzeile der Form "abdimmen" kann).
  Mit Zitat antworten Zitat
Renate Schaaf

 
Delphi 11 Alexandria
 
#4
  Alt 2. Jun 2025, 11:35
Toll, dass es funktioniert.
Du könntest natürlich auf den Desktop malen, um die Kopfleiste abzudimmen, aber dann hast Du wieder die gleichen Synchronisierungsprobleme.
Würde mich interessieren, wenn Du dafür eine Lösung findest.
Ich dimme bei mir auch das ganze Form ab, wenn ich einen modalen Dialog anzeige. Dadurch wird der Dialog hervorgehoben und der Benutzer sieht gleich, was jetzt wichtig ist. Die Kopfleiste ist dann eh abgestellt, nur eben nicht visuell.

Renate
Renate
  Mit Zitat antworten Zitat
Antwort Antwort


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 21:06 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