Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Main form status barında mdichild isimlerini görüntüleme
#1
Herkese merhaba arkadaşilar,

Projenin main formuna alta bir statusbar veya başka bir şey koyup o alan da açılan her mdichild pencerenin ismi veya bir imajını göstermek istiyorum, Örneğin windows daki açılan her uygulamann altta başlat çubuğunda göründüğü gibi, oraya tıkladığım da ilgili pencerenin aktif edilmesini istiyorum yardımcı olabilecek var mı acaba

Saygılar.
Cevapla
#2
Üçüncü parti bileşenlere alerjim olduğu için kod yazarak sınıf oluşturmak suretiyle çözüm tercih ediyorum. Belki direkt bir yöntemi vardır ama ben bu şekilde en eski Delphi sürümlerine kadar destek verecek şekilde mütevazi halini tercih ediyorum.

Daha önce bir çalışmam olmuştu, kod parçası olarak paylaşayım. Bunu dileyen kendine göre yapılandırabilir.

Aşağıda proje olarak paylaştım ancak indirmeden göz atmak isteyenler için bir UNIT hazırladım. 
Kullanımı daha aşağıda...


unit MDI_PageControlHelperU;

interface

uses  System.SysUtils, System.Types,
      Vcl.Forms, Vcl.Controls, Vcl.ComCtrls;

Type
  tMDI_PageControl = class( TObject )
  private
    FPageControl : TPageControl;
    FImageList   : TImageList;
    procedure DoTabSelected(Sender: TObject);
    procedure SetImageList( aImageList: TImageList );
  public
    constructor Create( aPageControl: TPageControl );
    destructor  Destroy; override;
    procedure   NewChild( aChildForm: TForm );
    procedure   CloseChild( aChildForm: TObject );
    procedure   SelectChild( aChildForm: TObject );
    property    ImageList: TImageList read FImageList write SetImageList;
  end;

implementation

{ tMDI_PageControl }

constructor tMDI_PageControl.Create(aPageControl: TPageControl);
begin
  FPageControl := aPageControl;
  FPageControl.Height     := 40;
  FPageControl.TabHeight  := FPageControl.Height;
  FPageControl.TabWidth   := 80;

  // Mevcut Tab varsa varsayılan olarak silinsin..
  while FPageControl.PageCount > 0
    do
      FreeAndNil(FPageControl.Pages[FPageControl.PageCount-1]);

end;

destructor tMDI_PageControl.Destroy;
begin

  inherited;
end;

procedure tMDI_PageControl.NewChild(aChildForm: TForm);
var
  LTabSheet : TTabSheet;
begin
  LTabSheet := TTabSheet.Create(FPageControl);

  LTabSheet.Caption       := aChildForm.Caption;
  LTabSheet.PageControl   := FPageControl;
  LTabSheet.ImageIndex    := -1;
  LTabSheet.OnShow        := DoTabSelected;
  LTabSheet.VCLComObject  := aChildForm;
  if (FImageList <> nil)
    and (FImageList.Count >= 2)
      then LTabSheet.ImageIndex :=  1
      else LTabSheet.ImageIndex := -1;
  LTabSheet.Show;

end;

procedure tMDI_PageControl.DoTabSelected(Sender: TObject);
begin
  TForm(TTabSheet(sender).VCLComObject).Show;
end;

procedure tMDI_PageControl.SelectChild(aChildForm: TObject);
var
  i : Integer;
begin
  for i := FPageControl.PageCount-1 downto 0
    do if TForm(aChildForm) =  TForm(FPageControl.Pages[i].VCLComObject) then
  begin
    FPageControl.ActivePageIndex := i;
    break;
  end;
end;

procedure tMDI_PageControl.SetImageList(aImageList: TImageList);
begin
  FImageList := aImageList;
  FPageControl.Images := FImageList;

  FPageControl.TabWidth := FPageControl.TabWidth + FImageList.Width;
end;

procedure tMDI_PageControl.CloseChild(aChildForm: TObject);
var
  i : Integer;
begin
  for i := FPageControl.PageCount-1 downto 0
    do if TForm(aChildForm) =  TForm(FPageControl.Pages[i].VCLComObject) then
  begin
    FreeAndNil( FPageControl.Pages[i] );
  end;
end;


end.

Kullanımı :

MdiForma bir tane PageControl ekleyin ve Align özelliğini alBottom yapın ki sayfalama en aşağıda kalsın.

Unit2'de sizin MdiChild formunuz var olsun. Türetilecek child formlar buradan klonlama yapılacak.

bir butona veya menüye de miYeniPencere isimli menü elemenanındaki şekilde atama yapılıyor olacak.





uses Unit2, MDI_PageControlHelperU;

var
  FPage : tMDI_PageControl;

procedure TForm1.FormCreate(Sender: TObject);
var
  LMenuItem: TMenuItem;
begin

  ReportMemoryLeaksOnShutdown := true;

  FPage := tMDI_PageControl.Create(PageControl1);
  Fpage.ImageList := ImageList1;

  if miPencereler.Count = 0 then
  begin
    LMenuItem := TMenuItem.Create(miPencereler);
    LMenuItem.Caption := '-';
    miPencereler.Add(LMenuItem);
  end;

  self.WindowMenu := miPencereler;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin

  if Assigned(FPage)
    then
      FreeAndNil(FPage);

end;

procedure TForm1.miYeniPencereClick(Sender: TObject);
{$j+}
const
  LPencere : Integer = 0;
{$j-}
var
  LFormChild : TForm;
begin
  LFormChild := TFormChild.Create(self);
  With LFormChild do
  begin
    inc(LPencere);
    Name      := Format('Child_%.2d', [LPencere] );
    Caption   := Name;
    FormStyle := fsMDIChild;
    OnDestroy   := FPage.CloseChild;
    OnActivate  := FPage.SelectChild;
  end;

  FPage.NewChild( LFormChild );
end;

procedure TForm1.miCikisClick(Sender: TObject);
begin
  Close;
end;





isrii5sqzpiu5f4vhwc3.gif


Ek Dosyalar
.zip   VCL_MDIForm_WindowMenu.zip (Dosya Boyutu: 31,33 KB / İndirme Sayısı: 15)
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla
#3
(15-12-2024, Saat: 14:50)mrmarman Adlı Kullanıcıdan Alıntı: Üçüncü parti bileşenlere alerjim olduğu için kod yazarak sınıf oluşturmak suretiyle çözüm tercih ediyorum. Belki direkt bir yöntemi vardır ama ben bu şekilde en eski Delphi sürümlerine kadar destek verecek şekilde mütevazi halini tercih ediyorum.

Daha önce bir çalışmam olmuştu, kod parçası olarak paylaşayım. Bunu dileyen kendine göre yapılandırabilir.

Aşağıda proje olarak paylaştım ancak indirmeden göz atmak isteyenler için bir UNIT hazırladım. 
Kullanımı daha aşağıda...


unit MDI_PageControlHelperU;

interface

uses  System.SysUtils, System.Types,
      Vcl.Forms, Vcl.Controls, Vcl.ComCtrls;

Type
  tMDI_PageControl = class( TObject )
  private
    FPageControl : TPageControl;
    FImageList   : TImageList;
    procedure DoTabSelected(Sender: TObject);
    procedure SetImageList( aImageList: TImageList );
  public
    constructor Create( aPageControl: TPageControl );
    destructor  Destroy; override;
    procedure   NewChild( aChildForm: TForm );
    procedure   CloseChild( aChildForm: TObject );
    procedure   SelectChild( aChildForm: TObject );
    property    ImageList: TImageList read FImageList write SetImageList;
  end;

implementation

{ tMDI_PageControl }

constructor tMDI_PageControl.Create(aPageControl: TPageControl);
begin
  FPageControl := aPageControl;
  FPageControl.Height     := 40;
  FPageControl.TabHeight  := FPageControl.Height;
  FPageControl.TabWidth   := 80;

  // Mevcut Tab varsa varsayılan olarak silinsin..
  while FPageControl.PageCount > 0
    do
      FreeAndNil(FPageControl.Pages[FPageControl.PageCount-1]);

end;

destructor tMDI_PageControl.Destroy;
begin

  inherited;
end;

procedure tMDI_PageControl.NewChild(aChildForm: TForm);
var
  LTabSheet : TTabSheet;
begin
  LTabSheet := TTabSheet.Create(FPageControl);

  LTabSheet.Caption       := aChildForm.Caption;
  LTabSheet.PageControl   := FPageControl;
  LTabSheet.ImageIndex    := -1;
  LTabSheet.OnShow        := DoTabSelected;
  LTabSheet.VCLComObject  := aChildForm;
  if (FImageList <> nil)
    and (FImageList.Count >= 2)
      then LTabSheet.ImageIndex :=  1
      else LTabSheet.ImageIndex := -1;
  LTabSheet.Show;

end;

procedure tMDI_PageControl.DoTabSelected(Sender: TObject);
begin
  TForm(TTabSheet(sender).VCLComObject).Show;
end;

procedure tMDI_PageControl.SelectChild(aChildForm: TObject);
var
  i : Integer;
begin
  for i := FPageControl.PageCount-1 downto 0
    do if TForm(aChildForm) =  TForm(FPageControl.Pages[i].VCLComObject) then
  begin
    FPageControl.ActivePageIndex := i;
    break;
  end;
end;

procedure tMDI_PageControl.SetImageList(aImageList: TImageList);
begin
  FImageList := aImageList;
  FPageControl.Images := FImageList;

  FPageControl.TabWidth := FPageControl.TabWidth + FImageList.Width;
end;

procedure tMDI_PageControl.CloseChild(aChildForm: TObject);
var
  i : Integer;
begin
  for i := FPageControl.PageCount-1 downto 0
    do if TForm(aChildForm) =  TForm(FPageControl.Pages[i].VCLComObject) then
  begin
    FreeAndNil( FPageControl.Pages[i] );
  end;
end;


end.

Kullanımı :

MdiForma bir tane PageControl ekleyin ve Align özelliğini alBottom yapın ki sayfalama en aşağıda kalsın.

Unit2'de sizin MdiChild formunuz var olsun. Türetilecek child formlar buradan klonlama yapılacak.

bir butona veya menüye de miYeniPencere isimli menü elemenanındaki şekilde atama yapılıyor olacak.





uses Unit2, MDI_PageControlHelperU;

var
  FPage : tMDI_PageControl;

procedure TForm1.FormCreate(Sender: TObject);
var
  LMenuItem: TMenuItem;
begin

  ReportMemoryLeaksOnShutdown := true;

  FPage := tMDI_PageControl.Create(PageControl1);
  Fpage.ImageList := ImageList1;

  if miPencereler.Count = 0 then
  begin
    LMenuItem := TMenuItem.Create(miPencereler);
    LMenuItem.Caption := '-';
    miPencereler.Add(LMenuItem);
  end;

  self.WindowMenu := miPencereler;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin

  if Assigned(FPage)
    then
      FreeAndNil(FPage);

end;

procedure TForm1.miYeniPencereClick(Sender: TObject);
{$j+}
const
  LPencere : Integer = 0;
{$j-}
var
  LFormChild : TForm;
begin
  LFormChild := TFormChild.Create(self);
  With LFormChild do
  begin
    inc(LPencere);
    Name      := Format('Child_%.2d', [LPencere] );
    Caption   := Name;
    FormStyle := fsMDIChild;
    OnDestroy   := FPage.CloseChild;
    OnActivate  := FPage.SelectChild;
  end;

  FPage.NewChild( LFormChild );
end;

procedure TForm1.miCikisClick(Sender: TObject);
begin
  Close;
end;





isrii5sqzpiu5f4vhwc3.gif

Elinize emeğinize sağlık Üstadım, tam aradığım şey üstelik bileşensiz olması ayrı bir güzellik, müteşekkirim.
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  form close de form bosalmiyor sadikacar60 11 1.632 24-01-2025, Saat: 19:25
Son Yorum: sadikacar60
  Delphi ile Web Form Alanlarını Doldurma bünyamin68 13 2.578 30-09-2024, Saat: 14:14
Son Yorum: yhackup
  lazarusda form create sorunu sadikacar60 1 607 28-06-2024, Saat: 18:22
Son Yorum: Tuğrul HELVACI
  Optik form kodlama baloglurecep 8 3.843 16-11-2023, Saat: 16:23
Son Yorum: COMMANDX
Sad Tabsheet içinde Form Create, Close olayları YILDIRIMBEY 0 787 24-08-2023, Saat: 17:26
Son Yorum: YILDIRIMBEY



Konuyu Okuyanlar: 1 Ziyaretçi