AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Eigenes TPageControl - APIs zum zeichnen?
Thema durchsuchen
Ansicht
Themen-Optionen

Eigenes TPageControl - APIs zum zeichnen?

Ein Thema von wicht · begonnen am 2. Jul 2011 · letzter Beitrag vom 3. Jul 2011
 
Benutzerbild von wicht
wicht

Registriert seit: 15. Jan 2006
Ort: Das schöne Enger nahe Bielefeld
809 Beiträge
 
Delphi XE Professional
 
#4

AW: Eigenes TPageControl - APIs zum zeichnen?

  Alt 2. Jul 2011, 21:38
Hi, danke für eure Antworten.

Dass es auf "Benutz doch TTabControl oder TPageControl" hinausläuft, dachte ich mir irgendwie schon. Dann hole ich mal noch etwas mehr aus. Bis jetzt habe ich das auch ungefähr so gemacht, wie von euch vorgeschlagen (nur dass ich TPageControl genutzt habe). Auf meinen Tabs ist allerdings ein Knopf zum Schließen drauf. Und völlig egal wie ich Tabs schließe - es tritt immer das hier beschriebene Problem auf. Und mittlerweile nervt mich das so extrem, dass ich mein eigenes Tab bauen möchte (Dort funktioniert es nämlich wie gewünscht - aber eben nur mit Themes z.Z.). Die Unit, in der das genannte Problem auftritt, ist übrigens auf streamwriter.org in den Quellen mit drin, Datei common\MControls.pas.
Dort ist auf jedem Tab oben ein Knopf drauf. Wird dieser geklickt, wird das Tab per PostMessage() benachrichtigt, dass ein Tab zu schließen ist. Wenn die Message ankommt, ruft das PageControl die Methode "RemoveTab" auf, die ich hier mal poste:

Delphi-Quellcode:
procedure TMPageControl.RemoveTab(Tab: TTabSheet);
var
  Idx: Integer;
begin
  SendMessage(Handle, WM_SETREDRAW, 0, 0);
  try
    if Assigned(TMTabSheet(Tab).FOnClosed) then
      TMTabSheet(Tab).FOnClosed(Tab);

    if Tab = ActivePage then
    begin
      if PageCount - 1 > ActivePageIndex then
        Idx := ActivePageIndex
      else
        Idx := ActivePageIndex - 1;
    end else
    begin
      if Tab.PageIndex <= ActivePageIndex then
        Idx := ActivePageIndex - 1
      else
        Idx := ActivePageIndex;
    end;

    if Idx < 0 then
      Idx := 0;
    if PageCount = 0 then
      Idx := -1;

    Tab.Parent := nil;
    TabClosed(TMTabSheet(Tab));
    Tab.Free;

    ActivePageIndex := Idx;
  finally
    SendMessage(Handle, WM_SETREDRAW, 1, 0);
  end;
end;
Ja, WM_SETREDRAW ist über, bitte nicht hauen. Auch wenn die Berechnung von Idx nicht perfekt sein sollte, der Variable kann ich auch fest eine "1" zuweisen, das Problem mit dem Springen im Link von oben tritt *immer* auf. Ich habe da schon wochenlang experimentiert (auch den Vorschlag aus dem verlinkten Post von Union getestet) - nichts funktioniert. So aus Langeweile würde ich ja auch nicht versuchen, so ein Control selber zu implementieren..
http://streamwriter.org

"I make hits. Not the public. I tell the DJ’s what to play. Understand?"
  Mit Zitat antworten Zitat
 


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 05:37 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