AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

TabControl und Events

Ein Thema von EWeiss · begonnen am 9. Jul 2018 · letzter Beitrag vom 10. Jul 2018
Antwort Antwort
Benutzerbild von EWeiss
EWeiss

Registriert seit: 16. Okt 2010
5.744 Beiträge
 
Delphi 2010 Architect
 
#1

TabControl und Events

  Alt 9. Jul 2018, 07:11
Ich habe ein Transparentes TabControl erstellt.
Meine Probleme die ich habe sind 2 an der Zahl.

1. Welches Event wird ausgelöst beim klick auf einem Item.
2. Wie bekomme ich das updown control weg? Will da lieber was eigenes machen gibt es da einen Schalter?

Mein Versuch mit WM_NOTIFY bringt leider nichts.
Delphi-Quellcode:
    WM_NOTIFY:
      begin
        begin
          nmptr := PNMHdr(lp);
          if (nmptr.code = TCN_SELCHANGE) then
          begin
            GetClientRect(WinHandle, rc);
          end;
        end;
      end;
Komme da nicht rein wenn ich auf einen Button klicke.

EDIT:
OK punkt 1 ist erledigt normaler WM_LBUTTONUP

gruss
Miniaturansicht angehängter Grafiken
1.png   2.png   3.png   blur.png   crystal.jpg  


Geändert von EWeiss ( 9. Jul 2018 um 10:34 Uhr)
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
1.808 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#2

AW: TabControl und Events

  Alt 9. Jul 2018, 08:46
Zu 1. aus der Unit ComCtrls:

Delphi-Quellcode:
...
procedure CNNotify(var Message: TWMNotify); message CN_NOTIFY; // <--- CN_ anstatt WM_
...
Delphi-Quellcode:
procedure TCustomTabControl.CNNotify(var Message: TWMNotify);
begin
  with Message do
    case NMHdr.code of
      TCN_SELCHANGE:
        Change;
      TCN_SELCHANGING:
        begin
          Result := 1;
          if CanChange then Result := 0;
        end;
    end;
end;
Change wird in der abgeleiteten Klasse TPageControl aufgerufen:

Delphi-Quellcode:
procedure TPageControl.Change;
var
  Form: TCustomForm;
begin
  if TabIndex >= 0 then
    UpdateActivePage;
  if csDesigning in ComponentState then
  begin
    Form := GetParentForm(Self);
    if (Form <> nil) and (Form.Designer <> nil) then
      Form.Designer.Modified;
  end;
  inherited Change;
end;
  Mit Zitat antworten Zitat
Benutzerbild von EWeiss
EWeiss

Registriert seit: 16. Okt 2010
5.744 Beiträge
 
Delphi 2010 Architect
 
#3

AW: TabControl und Events

  Alt 9. Jul 2018, 08:56
Danke!
Werde mal schaun ob ich davon etwas für NonVCL umsetzen kann.
TCustomTabControl kenne ich nicht SysTabControl32

Zitat:
// <--- CN_ anstatt WM_
Auch bei NonVCL ?
Glaube nicht.

gruss

Geändert von EWeiss ( 9. Jul 2018 um 08:58 Uhr)
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
1.808 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#4

AW: TabControl und Events

  Alt 9. Jul 2018, 10:04
Danke!
Werde mal schaun ob ich davon etwas für NonVCL umsetzen kann.
TCustomTabControl kenne ich nicht SysTabControl32

Zitat:
// <--- CN_ anstatt WM_
Auch bei NonVCL ?
Glaube nicht.
TCustomTabControl ist die VCL-Kapselung für SysTabControl32.
Deine Kapselung heißt natürlich anders, weil du ja alles selber machst.

Außerdem hast du Recht mit WM_NOTIFY.
In der VCL-Variante wird explizit in Controls.DoControlMsg der Offset mit CN_BASE hinzugefügt.
Man könnte sagen, die Message wird neu gemappt.
Jetzt müsste man nur noch rausfinden, warum das so gelöst wurde.
Das hatte gewiss einen spezifischen Hintergrund.
  Mit Zitat antworten Zitat
Benutzerbild von EWeiss
EWeiss

Registriert seit: 16. Okt 2010
5.744 Beiträge
 
Delphi 2010 Architect
 
#5

AW: TabControl und Events

  Alt 9. Jul 2018, 10:31
Danke..

Ich habe das erste jetzt mit WM_LBUTTONUP gelöst.
Delphi-Quellcode:
    WM_LBUTTONUP:
      begin
        Item := GetCurSel(WinHandle);
        FSelectedItem := Item;

        ItemCount := GetItemCount(WinHandle);
        for IntI := 0 to ItemCount - 1 do
        begin
          if IntI <> FSelectedItem then
          begin
            HItem := GetDlgItem(FParentHandle, ID_PANEL_FIRST + IntI);
            if HItem <> 0 then
              ShowWindow(HItem, SW_HIDE)
          end;
        end;
        HItem := GetDlgItem(FParentHandle, ID_PANEL_FIRST + FSelectedItem);
        if HItem <> 0 then
          ShowWindow(HItem, SW_SHOW);

        SkinEngine.FInvalidateRect(WinHandle, false);
      end;
Muss jetzt nur noch rausfinden wie ich das mit updown32 gelöst bekomme das es nicht angezeigt wird.
Notfalls muss ich halt dieses Control auch noch pimpen.

Habe mal einen Test angehängt.
Mich würde interessieren ob das TabControl bei euch auch transparent ist. (Win7 sollte gehen).

gruss
Angehängte Dateien
Dateityp: zip bin.zip (3,22 MB, 1x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
34.931 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

AW: TabControl und Events

  Alt 9. Jul 2018, 10:39
Zitat:
Wie bekomme ich das updown control weg? Will da lieber was eigenes machen gibt es da einen Schalter?
Billige Lösung: Nur die Tabs anzeigen, welche sichtbar sind / sein sollen und die Anderen auf Invisible.
Und beim Scrollen die Sichbarkeiten halt entsprechend anpassen.

Also von vorne x Tabs ausgeblendet, entsprechend Scrollposition und danach x Tabs sichtbar, wie angezeigt werden können.



Alternativ als MultilineTabcontrol und alle Tabs mehrzeilig anzeigen ... da gibt es diese Buttons auch nicht.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu ( 9. Jul 2018 um 10:41 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von EWeiss
EWeiss

Registriert seit: 16. Okt 2010
5.744 Beiträge
 
Delphi 2010 Architect
 
#7

AW: TabControl und Events

  Alt 9. Jul 2018, 10:45
Zitat:
Billige Lösung: Nur die Tabs anzeigen, welche sichtbar sind / sein sollen und die Anderen auf Invisible.
Das scrollen sollte schon verfügbar sein denn man hat nicht immer genug platz um das Tab entsprechend zu vergrößern.
Das hinzufügen dynamischer Tabs ist nur ein Test denn das muss ja auch funktionieren.

Hmmm... mal schaun.

So wird das Tab und der Button darauf erstellt.
Das aussehen der Button vom TabSheet ist dann abhängig davon wie das BTN_Push.png aussieht das kann alle erdenkliche formen haben.
Delphi-Quellcode:
  TabInfo := CTRL_TabCreate;
  TabInfo.ImagePath := SKAERO_FOLDER + 'BTN_Push.png';
  TabInfo.Left := 230;
  TabInfo.Top := 268;
  TabInfo.Width := 300;
  TabInfo.Height := 250;
  TabInfo.DlgItemID := ID_TAB;
  TabInfo.ImageStateMax := 0;
  TabInfo.TabImagePath := SKAERO_FOLDER + 'TabFrame.png';
  TabInfo.CreateWindow(hMain);
  SKAERO_SetAnchorMode(TabInfo.Handle, ANCHOR_HEIGHT_WIDTH);
  SKAERO_SetZorder(TabInfo.Handle, HWND_TOP);

  TabInfo.InsertItem(TabInfo.Handle, 0, 'Hello World');
  TabInfo.SetCurSel(TabInfo.Handle, 0);
  TabHandle := TabInfo.AddTab(TabInfo.Handle, 0);

  btnTab0 := CTRL_PushButtonCreate;
  btnTab0.ImagePath := SKAERO_FOLDER + 'BTN_Push.png';
  btnTab0.Text := 'Button on Tab Hello World';
  btnTab0.Left := 20;
  btnTab0.Top := 20;
  btnTab0.Width := 180;
  btnTab0.Height := 75;
  btnTab0.DlgItemID := ID_BTN_TAB0;
  btnTab0.TextCol := SKAERO_BTNTEXTCOLOR;
  btnTab0.Label3D := 1;
  btnTab0.TextAlligment := Center;
  btnTab0.ImageStateMax := 0;
  btnTab0.CreateWindow(TabHandle);
  SKAERO_SetAnchorMode(btnTab0.Handle, ANCHOR_BOTTOM_RIGHT);
  SKAERO_SetZorder(btnTab0.Handle, HWND_TOP);
und so dynamisch erstellt.
Delphi-Quellcode:
ID_BTN_ADDTAB:
  begin
    ItemCount := TabInfo.GetItemCount(TabInfo.Handle);
    TabInfo.InsertItem(TabInfo.Handle, ItemCount + 1,
      PWideChar('Tab ' + IntToStr(ItemCount)));

    TabHandle := TabInfo.AddTab(TabInfo.Handle, ItemCount);
    AddCtrlToTab(TabHandle, ItemCount);

    SKAERO_UpdateWindow(WinHandle, False);
  end;
So kann man jetzt xbeliebige Controls im Tab erstellen.
Hier nur die ersten 2 die anderen bleiben leer.
Einmal einen Button und einmal eine Tackbar
Delphi-Quellcode:
procedure AddCtrlToTab(TabHandle: Integer; Item: Integer);
var
  myTip: PWideChar;
begin

  case Item of
    1:
      begin
        btnTab1 := CTRL_PushButtonCreate;
        btnTab1.ImagePath := SKAERO_FOLDER + 'BTN_Push.png';
        btnTab1.Text := 'Button on Tab 1';
        btnTab1.Left := 20;
        btnTab1.Top := 40;
        btnTab1.Width := 120;
        btnTab1.Height := 75;
        btnTab1.DlgItemID := ID_BTN_TAB1;
        btnTab1.TextCol := SKAERO_BTNTEXTCOLOR;
        btnTab1.Label3D := 1;
        btnTab1.ImageStateMax := 0;
        btnTab1.CreateWindow(TabHandle);
        SKAERO_SetAnchorMode(btnTab1.Handle, ANCHOR_BOTTOM_RIGHT);
        SKAERO_SetZorder(btnTab1.Handle, HWND_TOP);
      end;
    2:
      begin
        SKAERO_SplitColorARGB(SKAERO_AEROCOLOR, Alpha, Red, Green, Blue);
        trbTab := CTRL_TrackBarCreate;
        trbTab.ImageThumbPath := SKAERO_FOLDER + 'BTN_Track_H.png';
        trbTab.Left := 38;
        trbTab.Top := 40;
        trbTab.Width := 142;
        trbTab.Height := 14;
        trbTab.DlgItemID := ID_TRACK_TAB;
        trbTab.MinVal := 0;
        trbTab.MaxVal := 255;
        trbTab.Val := Alpha;
        trbTab.LineVisible := true;
        trbTab.TrackColor := SKAERO_TRACKHICOLOR;
        trbTab.ProgressColor := SKAERO_TRACKPROGRESSCOLOR;
        trbTab.ParentWindow := MainHandle;
        trbTab.CreateWindow(TabHandle);
        SKAERO_SetAnchorMode(trbTab.Handle, ANCHOR_BOTTOM);
        SKAERO_SetZorder(trbTab.Handle, HWND_TOP);
        myTip := 'Only Test';
        CTRL_ToolTipCreate(trbTab.Handle, myTip);
      end;
  end;
end;
gruss

Geändert von EWeiss ( 9. Jul 2018 um 11:37 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
34.931 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#8

AW: TabControl und Events

  Alt 9. Jul 2018, 11:27
Zitat:
Das scrollen sollte schon verfügbar sein denn man hat nicht immer genug platz um das Tab entsprechend zu vergrößern.
Du willst das Scrollen ja selber machen ... so wäre es eine Möglichkeit die Scrollknöpfe wegzubekommen und zu steuern welche Tabs "in diesem Moment" sichtbar sind.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
Benutzerbild von EWeiss
EWeiss

Registriert seit: 16. Okt 2010
5.744 Beiträge
 
Delphi 2010 Architect
 
#9

AW: TabControl und Events

  Alt 9. Jul 2018, 11:34
Zitat:
Das scrollen sollte schon verfügbar sein denn man hat nicht immer genug platz um das Tab entsprechend zu vergrößern.
Du willst das Scrollen ja selber machen ... so wäre es eine Möglichkeit die Scrollknöpfe wegzubekommen und zu steuern welche Tabs "in diesem Moment" sichtbar sind.
Jo Danke werde es mal testen..

gruss
  Mit Zitat antworten Zitat
Benutzerbild von EWeiss
EWeiss

Registriert seit: 16. Okt 2010
5.744 Beiträge
 
Delphi 2010 Architect
 
#10

AW: TabControl und Events

  Alt 10. Jul 2018, 22:21
Ich subclasse das UpDown32 control nun da ich denke das es der sauberste weg ist.
Das was man ganz rechts sieht das Rechteck über dem letzten Tab ist das Control mit draufgerenderten Hintergrund.
Muss jetzt nur noch die Button erstellen und das Handling des Paint Event verbessern danach melde ich mich nochmal.

Funktioniert jetzt so wie es soll.

gruss
Miniaturansicht angehängter Grafiken
erledigt.png  

Geändert von EWeiss (11. Jul 2018 um 19:33 Uhr)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 00:30 Uhr.
Powered by vBulletin® Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2018 by Daniel R. Wolf