Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   tabsheet deaktivieren (https://www.delphipraxis.net/150581-tabsheet-deaktivieren.html)

khh 21. Apr 2010 09:09


tabsheet deaktivieren
 
hallo zusammen,
ich such mir grad wieder nen Wolf :-(

wie kann ich die Beschriftung eines tabsheet auf einem pagecontrol deaktiviert darstellen und damit einen Wechsel dahin verhindern, ohne das tab auszublenden.

Danke Gruss KH

Sherlock 21. Apr 2010 09:17

Re: tabsheet deaktivieren
 
Enabled := false schon probiert?

Sherlock

khh 21. Apr 2010 10:14

Re: tabsheet deaktivieren
 
Zitat:

Zitat von Sherlock
Enabled := false schon probiert?

Sherlock

ja, damit deaktiviert er mir zwar alle Eingabemöglichkeiten auf dem Tabsheet, der Wechsel dahin ist aber dennoch möglich, auch die Beschriftung ist nicht deaktiviert.

Sherlock 21. Apr 2010 10:26

Re: tabsheet deaktivieren
 
Ach, jetzt verstehe ich. Na, vielleicht machst Du das dann am besten von Hand.
Wechsel unterbinden im OnChanging.
Schrift ausgrauen...hmmmm, gibt bestimmt auch ne Möglichkeit.

Sherlock

Björn Ole 21. Apr 2010 10:41

Re: tabsheet deaktivieren
 
So in etwa?

Delphi-Quellcode:
procedure TForm1.PageControl1Change(Sender: TObject);
begin
  if PageControl1.ActivePageIndex = 1 then
    PageControl1.SelectNextPage(true);
end;

khh 21. Apr 2010 10:44

Re: tabsheet deaktivieren
 
Zitat:

Zitat von Sherlock
Ach, jetzt verstehe ich. Na, vielleicht machst Du das dann am besten von Hand.
Wechsel unterbinden im OnChanging.
Schrift ausgrauen...hmmmm, gibt bestimmt auch ne Möglichkeit.

Sherlock

mhh und welche?
gibts nicht einfach ne eigenschaft die ich true oder false setzen kann?

uligerhardt 21. Apr 2010 10:53

Re: tabsheet deaktivieren
 
Kuckst du, was der Meister spricht:
https://forums.embarcadero.com/threa...28690&tstart=0
http://groups.google.de/group/borlan...fd728d9920a342

khh 21. Apr 2010 11:05

Re: tabsheet deaktivieren
 
mh, werd ich mich "drüber her machen"

danke euch

khh 22. Apr 2010 13:43

Re: tabsheet deaktivieren
 
sorry für den 2ten Tread :-(

ich hatte das Pagecontrol per drag and drop zur Entwicklungszeit auf dem Form plaziert.
hatte das so verstanden, dass es reicht die Eigenschaft des tabsheet enabled:= false zusetzen.

jetzt hab ich das Ganze nach deinem Beispiel zur Laufzeit erzeugt.
ich sehe drei Tabs in gleicher Schrift, alle sind anwählbar :-(
auch das welches enabled:= false ist.

Liegts am Lazarus?

uligerhardt 22. Apr 2010 13:51

Re: tabsheet deaktivieren
 
Zitat:

Zitat von khh
sorry für den 2ten Tread :-(

KH meint diesen Thread.

Zitat:

Zitat von khh
ich hatte das Pagecontrol per drag and drop zur Entwicklungszeit auf dem Form plaziert.

Ich wollte mir das Ding nicht erst installieren, drum muss ich es per Pascal-Code erzeugen.

Zitat:

Zitat von khh
hatte das so verstanden, dass es reicht die Eigenschaft des tabsheet enabled:= false zusetzen.

Sollte es, ja. Und tut es zumindest unter D2007/Windows XP, wenn man es zur Laufzeit setzt. Ob es zur Designzeit funktioniert, kann ich nicht sagen - s.o.

Zitat:

Zitat von khh
jetzt hab ich das Ganze nach deinem Beispiel zur Laufzeit erzeugt.
ich sehe drei Tabs in gleicher Schrift, alle sind anwählbar :-(
auch das welches enabled:= false ist.

Liegts am Lazarus?

Das steht zu befürchten. :mrgreen:

uligerhardt 22. Apr 2010 13:54

Re: tabsheet deaktivieren
 
Schau doch mal, ob das Programm bei dir in TPBPageControl.DrawTab ankommt. Vielleicht ist TCustomTabControl.DrawTab in Lazarus nicht als virtuell deklariert?

khh 22. Apr 2010 14:10

Re: tabsheet deaktivieren
 
Zitat:

Zitat von uligerhardt
Schau doch mal, ob das Programm bei dir in TPBPageControl.DrawTab ankommt. Vielleicht ist TCustomTabControl.DrawTab in Lazarus nicht als virtuell deklariert?

mh wenn ich ins

TPBPageControl.Create reinsteppe komme ich in die Tpagecontrol :-(

die PBPagecontrol sieht nach dem Einbinden in die IDE so aus:



Delphi-Quellcode:
unit PBPageControl;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, ComCtrls;

type
  TPBPageControl = class(TPageControl)
  private
    { Private declarations }
  protected
    { Protected declarations }
  public
    { Public declarations }
  published
    { Published declarations }
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Common Controls',[TPBPageControl]);
end;

end.
was macht Lazarus da?

uligerhardt 22. Apr 2010 14:16

Re: tabsheet deaktivieren
 
Zitat:

Zitat von khh
Zitat:

Zitat von uligerhardt
Schau doch mal, ob das Programm bei dir in TPBPageControl.DrawTab ankommt. Vielleicht ist TCustomTabControl.DrawTab in Lazarus nicht als virtuell deklariert?

mh wenn ich ins

TPBPageControl.Create reinsteppe komme ich in die Tpagecontrol :-(

die PBPagecontrol sieht nach dem Einbinden in die IDE so aus:



Delphi-Quellcode:
unit PBPageControl;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, ComCtrls;

type
  TPBPageControl = class(TPageControl)
  private
    { Private declarations }
  protected
    { Protected declarations }
  public
    { Public declarations }
  published
    { Published declarations }
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Common Controls',[TPBPageControl]);
end;

end.
was macht Lazarus da?

Na du bist ein Scherzkeks. :P
Du nimmst den ganzen Quellcode aus der Unit raus und wunderst dich, wenn Funktionalität verloren geht? :wall:
Probier mal, den Originalcode aus dem Posting, das du eingangs verlinkt hast, zu nehmen, zu speichern und zu compilieren. Geht das mit Lazarus? (Den hier:
Delphi-Quellcode:
{$mode objfpc}{$H+}
darfst du von mir aus noch einfügen.)

khh 22. Apr 2010 14:20

Re: tabsheet deaktivieren
 
eben nicht :-(

ich hab den Code nicht rausgenommen,
das hat Lazarus fabriziert.

weiss der Teufel warum.

ich habs sogar schon 2mal installiert und jedesmal ist danach der Code raus

uligerhardt 22. Apr 2010 14:30

Re: tabsheet deaktivieren
 
Zitat:

Zitat von khh
eben nicht :-(

ich hab den Code nicht rausgenommen,
das hat Lazarus fabriziert.

weiss der Teufel warum.

ich habs sogar schon 2mal installiert und jedesmal ist danach der Code raus

Probier mal, Schritt für Schritt nachzuvollziehen, was ich hier gemacht habe. Achte darauf, eine lokale Kopie von PCPageControl.pas im Projektverzeichnis zu erstellen und zu verwenden. Funzt das?

khh 22. Apr 2010 14:43

Re: tabsheet deaktivieren
 
alsooo
ich hab die Installation in der IDE rückgängig gemacht und nur die lokale Kopie im Projektverzeichnis gespeichert und verwendet.

Beim Kompilieren bekomme ich schon bei der Deklaration der Procedure :
Delphi-Quellcode:
   Procedure CMDialogKey( Var msg: TWMKey ); message CM_DIALOGKEY;
den Fehler:
PBPageControl.pas(69,66) Error: Identifier not found "CM_DIALOGKEY"



in der messages.inc gibts den auch nicht :-(

EDIT:
ersetze ich die message Constante mit igrendwas anderem ( nur um weiter zu kommen) kommt die nächste Fehlermeldung bei:

procedure DrawTab(TabIndex: Integer; const Rect: TRect; Active: Boolean); override;

PBPageControl.pas(75,22) Error: Duplicate identifier "TabIndex"

:-(

DeddyH 22. Apr 2010 14:46

Re: tabsheet deaktivieren
 
Unter Delphi steht der in der Controls.pas. Versuch es einfach mal damit.

khh 22. Apr 2010 14:51

Re: tabsheet deaktivieren
 
Zitat:

Zitat von DeddyH
Unter Delphi steht der in der Controls.pas. Versuch es einfach mal damit.

leider nicht, die ist auch standardmässig schon eingebunden gewesen.

uligerhardt 22. Apr 2010 16:00

Re: tabsheet deaktivieren
 
Zitat:

Zitat von khh
procedure DrawTab(TabIndex: Integer; const Rect: TRect; Active: Boolean); override;

PBPageControl.pas(75,22) Error: Duplicate identifier "TabIndex"
:-(

Benenn die Parameter mal um: ATabIndex, ARect, AActive. Dann kommst du bestimmt zum nächsten Fehler. :P

taaktaak 22. Apr 2010 19:37

Re: tabsheet deaktivieren
 
Moin, Moin.
Habe mit den Code des Grossmeisters mal angesehen - offenbar wird auch im Coder-Himmel nur mit Wasser gekocht: Die vorgestellte Loesung ist grundsaetzlich natuerlich viel eleganter als im OnChanging() den Wechsel zu verhindern, aber so ganz ueberzeugen kann sie denn doch nicht. Ein wenig Feinarbeit sollte man noch hineinstecken:
  • Die Darstellung der aktiven Seite in bsBold ist nicht wirklich praktikabel. Je mehr Buchstaben die Caption hat, desto deutlicher ist zu erkennen, dass die Tab-Breite fuer die Fett-Schrift vergroessert werden muesste. Also vielleicht doch lieber eine andere Schriftfarbe verwenden?
  • Die deaktivierte Page mit grauer Schrift darstellen? Na, eigentlich bietet sich hier die Ausgabe mit DrawState() unter Verwendung von DSS_DISABLED an!
  • Der Sinn oder die Aufgabe von CMDialogKey() erschliesst sich mir ueberhaupt nicht :-( Wozu ist die Methode gut?
  • Dafuer kann ueber die "normalen" Tasten CursorLeft, CursorRight, Pos1 etc. leider doch eine deaktivierte Seite aktiviert werden. Derzeit wird nur die Auswahl mittels Maus abgefangen - die Tastensteuerung muss aber ebenfalls kontrolliert und ggf. korrigiert werden.

uligerhardt 23. Apr 2010 12:33

Re: tabsheet deaktivieren
 
Zitat:

Zitat von taaktaak
Moin, Moin.
Habe mit den Code des Grossmeisters mal angesehen - offenbar wird auch im Coder-Himmel nur mit Wasser gekocht: Die vorgestellte Loesung ist grundsaetzlich natuerlich viel eleganter als im OnChanging() den Wechsel zu verhindern, aber so ganz ueberzeugen kann sie denn doch nicht. Ein wenig Feinarbeit sollte man noch hineinstecken:

ACK, verbessern kann man alles.

Zitat:

Zitat von taaktaak
  • Die Darstellung der aktiven Seite in bsBold ist nicht wirklich praktikabel. Je mehr Buchstaben die Caption hat, desto deutlicher ist zu erkennen, dass die Tab-Breite fuer die Fett-Schrift vergroessert werden muesste. Also vielleicht doch lieber eine andere Schriftfarbe verwenden?

Oder (soweit möglich) die Tabbreite beeinflussen.

Zitat:

Zitat von taaktaak
  • Die deaktivierte Page mit grauer Schrift darstellen? Na, eigentlich bietet sich hier die Ausgabe mit DrawState() unter Verwendung von DSS_DISABLED an!

Stimmt - schaut besser aus.

Zitat:

Zitat von taaktaak
  • Der Sinn oder die Aufgabe von CMDialogKey() erschliesst sich mir ueberhaupt nicht :-( Wozu ist die Methode gut?

Um das Strg-Tab-Verhalten azupassen.

Zitat:

Zitat von taaktaak
  • Dafuer kann ueber die "normalen" Tasten CursorLeft, CursorRight, Pos1 etc. leider doch eine deaktivierte Seite aktiviert werden. Derzeit wird nur die Auswahl mittels Maus abgefangen - die Tastensteuerung muss aber ebenfalls kontrolliert und ggf. korrigiert werden.

Das wird sie schon, aber halt nur zum Teil - s.o.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:59 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