2017-12-01 22 views
1

질문이 있습니다.Firemonkey TTabControl

이 간단한 코드로 버튼을 추가했지만 모든 솔루션을 컴파일하지 못합니까?

unit Unit1; 

interface 

uses 
    System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, 
    FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, 
    FMX.Controls.Presentation, FMX.StdCtrls, FMX.TabControl; 

type 
    TTabItem = class(FMX.TabControl.TTabItem) 
    procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Single); override; 
    end; 

    TTabControl = class(FMX.TabControl.TTabControl) 
    function GetTabIndex : integer; 
    public 
    procedure SetTabIndexv2(const Value: Integer); 
    property TabIndex: Integer read GetTabIndex write SetTabIndexv2 default -1; 
    end; 

type 
    TForm1 = class(TForm) 
    tbc1: TTabControl; 
    TabItem1: TTabItem; 
    TabItem2: TTabItem; 
    Button1: TButton; 
    Button2: TButton; 
    procedure Button1Click(Sender: TObject); 
    procedure Button2Click(Sender: TObject); 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.fmx} 

{ TTabItem } 

procedure TTabItem.MouseDown(Button: TMouseButton; Shift: TShiftState; X, 
    Y: Single); 
begin 
    if (self.TabControl.ActiveTab <> self) and 
    ((Button = TMouseButton.mbLeft) or (ssDouble in Shift)) then begin 
    MessageDlg('[Tab Item] do you want to do this?', System.UITypes.TMsgDlgType.mtInformation, 
     [System.UITypes.TMsgDlgBtn.mbYes, System.UITypes.TMsgDlgBtn.mbNo], 0, procedure (const AResult: TModalResult) 
    begin 
     begin 
     case AResult of 
      mrYes: self.TabControl.ActiveTab := self; 
      mrNo:; 
     end; 
     end; 
    end); 
    end else begin 
    inherited; 
    end; 
end; 

{ TTabControl } 

function TTabControl.GetTabIndex: integer; 
begin 
result := FMX.TabControl.TTabControl(Self).TabIndex; 
end; 

procedure TTabControl.SetTabIndexv2(const Value: Integer); 
begin 
    if self.TabIndex <> value then begin 
    MessageDlg('[tabcontrol] do you want to do this?', System.UITypes.TMsgDlgType.mtInformation, 
     [System.UITypes.TMsgDlgBtn.mbYes, System.UITypes.TMsgDlgBtn.mbNo], 0, procedure (const AResult: TModalResult) 
    begin 
     begin 
     case AResult of 
     mrYes: begin 
       FMX.TabControl.TTabControl(Self).TabIndex := value; 
       end; 
     mrNo : ; 
     end; 
     end; 
    end); 
    end; 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    if tbc1.TabIndex = 0 then 
    tbc1.TabIndex := 1 
    else 
    tbc1.TabIndex := 0; 
end; 

procedure TForm1.Button2Click(Sender: TObject); 
var 
    tbitem: TTabItem; 
begin 
    tbitem := tbc1.Add(); //Here Error !!! 
end; 

end. 

[DCC32 오류]로, Unit1.pas (106) : E2010 호환되지 않는 유형 : 'Unit1.TTabItem'와 'FMX.TabControl.TTabItem'코드이 수정으로

Delphi can Fire monkey TTabControl replicate VCL TPageControl.OnChanging event

+0

아마도 Unit1에 TTabItem 클래스 선언이 중복되어있을 수 있습니다 ... – dustypup

+0

답변 해 주셔서 감사합니다. 어떤 부분이 잘못되었는지 이해할 수 없습니다. 감사합니다. –

+0

'Unit1.TTabItem'선언이 어떻게 생겼습니까? 일반적으로 문제에 대한 충분한 맥락을 보여 주어야합니다. 문맥이없는 4 줄은 대개 시간 낭비입니다. –

답변

2

거의 다 왔어.

procedure TForm15.ButtonRandomSeedClick(Sender: TObject); 
var 
    tbitem: TTabItem; 
begin 
    tbitem := TabControl1.Add(TTabItem) as TTabItem; //<<<<< Change 1 
    tbItem.Text := 'Tab ' + IntToStr(TabControl1.TabCount); 
end; 

procedure TForm15.TabItem1MouseDown(Sender: TObject; Button: TMouseButton; 
    Shift: TShiftState; X, Y: Single); 
var 
    tbitem: TTabItem; 
begin 
    tbitem := (Sender as TTabItem); // <<<<<<this change for testing only 
    if (tbItem <> TabControl1.ActiveTab) and 
    ((Button = TMouseButton.mbLeft) or (ssDouble in Shift)) then begin 
    MessageDlg('[Tab Item] do you want to do this?', System.UITypes.TMsgDlgType.mtInformation, 
     [System.UITypes.TMsgDlgBtn.mbYes, System.UITypes.TMsgDlgBtn.mbNo], 0, procedure (const AResult: TModalResult) 
    begin 
     begin 
     case AResult of 
      mrYes: TabControl1.ActiveTab := (Sender as TTabItem); 
      mrNo:; 
     end; 
     end; 
    end); 
    end else begin 
    inherited; 
    end; 

end; 

은 원하는대로 작동합니다. (내 이름은 당신과 다릅니다)

1

가 팝업 물어 탭을 선택하려고 할 때마다 '이 작업을 수행 하시겠습니까?'라는 메시지가 표시됩니다.

procedure TForm22.Button2Click(Sender: TObject); 
var 
    tbitem: TTabItem; 
begin 
// tbitem := tbc1.Add(); //Here Error !!! 
    tbItem := TTabItem(tbc1.Add(TTabItem)); 
    tbitem.Text := 'Item '+tbitem.Index.ToString(); 
end; 

두 번째 줄은 탭의 일부 텍스트를보기 위해 추가 한 것입니다.

+0

완벽하게 작동했습니다. 다시 한번 감사드립니다. 신께 축복해 주셔서 감사합니다. –