2009-06-26 13 views
8

Ich weiß nicht, ob diese Frage hier beantwortet werden kann, aber ich hoffe es wird. Ich schrieb einen einfachen Texteditor in Delphi 7, der als meine primäre IDE zum Schreiben von C-Code unter Windows dient. Ich betreibe Windows in einer VM und ich brauchte etwas Licht. In jedem Fall wird ein TpageControl verwendet, das beim Öffnen oder Erstellen einer neuen Datei eine neue Registerkarte erhält. Ziemlich Standard. Jetzt hat das TPageControl unter Delphi keine flache Eigenschaft.Einen TPageControl flach machen in Delphi 7

NO Ich meine nicht die Registerkarte Stil tsButtons oder tsFlatButtons Einstellung

die Grenzen nicht auf „none“ und es sieht ziemlich schlecht eingestellt werden, wenn Sie einen Texteditor in das Register-Steuerelement hinzuzufügen.

Gibt es eine Möglichkeit, ein TpageControl flach zu machen?

EDIT:

Auf einem Open-Source-Pagecontrol, die hier flach unterstützt ist, was ich gefunden:

procedure TCustomTabExtControl.WndProc(var Message: TMessage); 
begin 
    if(Message.Msg=TCM_ADJUSTRECT) and (FFlat) then 
    begin 
    Inherited WndProc(Message); 
    Case TAbPosition of 
    tpTop : begin 
    PRect(Message.LParam)^.Left:=0; 
    PRect(Message.LParam)^.Right:=ClientWidth; 
    PRect(Message.LParam)^.Top:=PRect(Message.LParam)^.Top-4; 
    PRect(Message.LParam)^.Bottom:=ClientHeight; 
    end; 
    tpLeft : begin 
    PRect(Message.LParam)^.Top:=0; 
    PRect(Message.LParam)^.Right:=ClientWidth; 
    PRect(Message.LParam)^.Left:=PRect(Message.LParam)^.Left-4; 
    PRect(Message.LParam)^.Bottom:=ClientHeight; 
    end; 
    tpBottom : begin 
    PRect(Message.LParam)^.Left:=0; 
    PRect(Message.LParam)^.Right:=ClientWidth; 
    PRect(Message.LParam)^.Bottom:=PRect(Message.LParam)^.Bottom-4; 
    PRect(Message.LParam)^.Top:=0; 
    end; 
    tpRight : begin 
    PRect(Message.LParam)^.Top:=0; 
    PRect(Message.LParam)^.Left:=0; 
    PRect(Message.LParam)^.Right:=PRect(Message.LParam)^.Right-4; 
    PRect(Message.LParam)^.Bottom:=ClientHeight; 
    end; 
    end; 
end else Inherited WndProc(Message); 

end; 

Die Sache ist, wenn ich etwas ähnliches auf der Hauptanwendung versuchte, wird es nicht funktionieren. Es wird nicht einmal kompiliert.

Antwort

11

Wenn die Registerkarten als Schaltflächen gezeichnet werden, wird kein Rahmen um den Anzeigebereich gezeichnet. Setzen Sie daher die Eigenschaft Style auf tsButtons oder tsFlatButtons. (Für Nicht-VCL-Programmierer entspricht dies dem Einschließen des Fensterstils tcs_Buttons auf dem Registerkartensteuerelement.)

Eine Alternative ist die Verwendung eines TNotebook. Es hält Seiten, aber es macht überhaupt keine Malerei. Sie müssten die Registerkarten selbst bereitstellen, z. B. indem Sie die Höhe des Registerkartensteuerelements der Höhe der Registerkarten anpassen oder TTabSet verwenden. (TTabSet ist in Delphi 7 verfügbar. Ich bin nicht sicher über Delphi 7.)

In Bezug auf den Code, den Sie gefunden haben, wäre es hilfreich, wenn Sie angegeben, warum es nicht kompiliert, oder wenn Sie einen Link zu wo Sie haben es gefunden, da der Kompilierungsfehler vermutlich darauf zurückzuführen ist, dass er sich auf Felder oder Eigenschaften der benutzerdefinierten Klasse bezieht und nicht auf die ursprüngliche. Hier können Sie versuchen, es in Ihren eigenen Code zu schreiben, ohne ein benutzerdefiniertes Steuerelement schreiben zu müssen.

Machen Sie zwei neue Erklärungen in Ihrer Form wie folgt aus:

FOldTabProc: TWndMethod; 
procedure TabWndProc(var Msg: TMessage); 

Im OnCreate Ereignishandler des Formulars zuweisen diese Methode auf die WindowProc Eigenschaft des Seitensteuerung:

FOldTabProc := PageControl1.WindowProc; 
PageControl1.WindowProc := TabWndProc; 

Jetzt implementieren, dass Methode und behandeln die tcm_AdjustRect messagesage:

procedure TForm1.TabWndProc(var Msg: TMessage); 
begin 
    FOldTabProc(Msg); 
    if Msg.Msg = tcm_AdjustRect then begin 
    case PageControl1.TabPosition of 
     tpTop: begin 
     PRect(Msg.LParam)^.Left := 0; 
     PRect(Msg.LParam)^.Right := PageControl1.ClientWidth; 
     Dec(PRect(Msg.LParam)^.Top, 4); 
     PRect(Msg.LParam)^.Bottom := PageControl1.ClientHeight; 
     end; 
    end; 
    end; 
end; 

Sie können die anderen drei Fälle ausfüllen, wenn Sie sie benötigen. Tcm_AdjustRect ist eine Nachrichten-ID, die in der Einheit CommCtrl deklariert ist. Wenn Sie diese Nachricht nicht in dieser Einheit haben, deklarieren Sie sie selbst; Sein Wert ist 4904.

Ich vermute, dass dies die Kontrolle nicht daran hindert, seine Grenzen zu zeichnen.Es bewirkt vielmehr, dass die enthaltenen TTabSheet ein wenig größer werden und die Grenzen verdecken.

+1

flache Tasten sollte es tun. Ich benutze es oft. – Hemant

+0

Danke, aber wie ich auf meiner Frage erwähnt habe ich nicht tsFlatButtons. – wonderer

+0

Verwenden Sie dann nicht flache Tasten. Der Punkt ist, dass die Seitensteuerung flach wird, wenn die Registerkarten Schaltflächen sind, egal welche Schaltflächen sie sind. –

2

Sie könnten immer eine kommerzielle Lösung verwenden. Ich würde dringend empfehlen Raize components, die flache TPageControls mit Tabs unterstützen. Das Komponentenset ist sehr einfach zu bedienen und unterstützt zahlreiche visuelle Verbesserungen, die meiner Meinung nach für jede Anwendung ein besseres Gefühl geben.

screen shot of tTPageControl with flat borders

+0

Danke. Aber 1) Ich habe bereits eine Lösung gefunden und 2) da dies ein persönliches Programm ist, sehe ich nicht die Notwendigkeit, für einen Compoment zu bezahlen. – wonderer

1

Tropfen zwei TPageControl s, ein mit Tabs als Tab s, mit einer globalen Höhe gleich die Vorsprünge, und ein mit flatbuttons und Tabvisible Eigenschaften auf falsch gesetzt, die unter dem ersten ausgerichtet werden würden. Dann stellen Sie sicher, dass die Registerkarte wechseln auf der ersten TPagecontrol lässt die Registerkarten auch in der zweiten ändern.

0

Ich verwende Delphi XE8 und das scheint nach dem Trick zu tun:

ATabControl.Tabs.Clear; 
ATabControl.Style := TTabStyle.tsFlatButtons; 
ATabControl.Brush.Color := clWhite; 
+0

Wäre nett, wenn Leute ihre Downvotes erklären würden. – uberlaufer

+1

Ich habe während der Überprüfung auf den unteren Rand geklickt, weil die Frage "Delphi 7" und nicht "Delphi XE8" ist. Ich wusste nicht, dass während der Überprüfung hinzugefügte Stimmen nicht nach Abschluss der Überprüfung (Antwort veröffentlicht oder entfernt) entfernt werden. Leider kann ich jetzt nicht widersprechen. – agabrys

+2

Kein Problem. Ich war nur neugierig, und ich würde sagen, wenn es jemandem hilft, der darüber stolpert, da es klar ist, um welche Version es sich handelt, würde ich persönlich solche ähnlichen Antworten bevorzugen. Aber ich bin neu hier und bin noch nicht ganz mit der ganzen Struktur der Seite und den Konventionen vertraut, wie man damit umgeht. Danke für die Rückmeldung! – uberlaufer