2012-08-22 6 views
10

In einer Delphi 2010-Anwendung mit Themen erlaubt ich zwei TPageControls haben (eine in der anderen) in einem Formular mit einem clMoneyGreen Hintergrund:Wie repariert man TPageControl Hintergrundfarbe ohne das Systemthema zu verlieren?

enter image description here

Die äußere Seite Steuerung korrekt sein Hintergrund mit der Farbe der zeichnen Übergeordnete Komponente, das Steuerelement für die innere Seite zeichnet jedoch seinen Hintergrund mit clBtnFace (rote Ellipse im Bild) anstelle des weißen Elements der übergeordneten Kontrolle (TTabSheet). Gibt es eine Möglichkeit, das zu beheben, ohne das Seitensteuerelement zu seinem klassischen Windows-Aussehen zurückzubringen (Windows-Thema verlieren)?

Alle Korrekturen, die ich in Google und hier auf Stack Overflow gefunden habe, beinhaltet OwnerDraw, die die Seitensteuerung ihre Theming verlieren lassen.

Ich habe versucht, neue Seite Steuerungskomponente von TPageControl mit einer Methode geerbt Erstellung der WM_ERASEBKGND Fenster Nachricht zu handhaben:

procedure TMyPageControl.WMEraseBkGnd(var Msg: TWMEraseBkGnd); 
begin 
    if Parent is TCustomPageControl then 
    begin 
    Brush.Color := clWhite; 
    Windows.FillRect(Msg.dc, ClientRect, Brush.Handle); 
    Msg.Result := 1; 
    end 
    else 
    inherited; 
end; 

Es zeichnet den Hintergrund weiß aber einige andere nach WM_ERASEBKGND genannt Methode (ich vermute Twincontrol ist WM_PAINT-Methode) wird grau über den weißen Hintergrund neu gezeichnet.

Hinweis: Ich untersuche dies, weil ich Theming auf einer großen Anwendung portiert von Delphi 7, deshalb versuche ich, dieses Problem durch eine abgeleitete Komponente zu lösen: Ich kann alle 207 leicht suchen und ersetzen TPageControl-Vorkommen mit meiner neuen Klasse, aber die Platzierung von Panels hinter einigen von ihnen würde viel mehr Zeit erfordern.

Antwort

11

Das ist ein bekannter Fehler in Delphi 2010. Sie können umgehen, indem Sie ein Feld hinzufügen, das ein Kind der äußersten Registerkarte ist und das übergeordnete Steuerelement der inneren Seite ist.

Ich habe keine Ahnung, warum dies das Problem behebt. Ich habe die Problemumgehung nur selbst entdeckt, weil mir aufgefallen ist, dass in meiner App nur die richtig ineinander gerenderten verschachtelten Register/Seiten-Steuerelemente mit einem geeigneten dazwischen liegenden Feld angezeigt wurden.

Wenn ich mich richtig erinnere, ist der Defekt nicht in den neuesten Delphi-Versionen vorhanden.

+2

Diese [embarcadero Seite] (http://qc.embarcadero.com/wc/qcain.aspx?d=80381) meldet immer noch den Fehler als geöffnet –

+2

Übrigens, bitte lesen Sie diese Seite, um mehr zu erfahren Antworten akzeptieren: http://meta.stackexchange.com/questions/5234/ Danke –

+0

Dank eines Freundes habe ich es geschafft, eine Delphi XE2-Installation in die Hände zu bekommen und die Seitenkontrolle funktioniert wie erwartet. Ich werde noch ein bisschen warten, wenn niemand anderes die Frage beantwortet, werde ich Ihre Antwort wählen. –

Verwandte Themen