MDI Form

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
mavsar

MDI Form

Mesaj gönderen mavsar »

Selam arkadaşlar MDI formlara ilişkin bir problemim var. Mevcut uygulamamı MDI tarzı bir yapıya dönüştürmek istiyorum. Fakat bunu yaparken de create ettiğim her bir child için pagecontrol üzerinde bir sekme oluşturuyorum. Farklı Child lar (inherit edilen bir child form yok sadece mevcut formun property si MDIChild oluyor) olduğundan aynı anda birden fazla child form açık olduğunda programdan çıkmak istediğimde exepciton'a düşüyorum.
  • MDI formlarda farklı clientlar için ne yapmalıyım. Nasıl bir mantık önerirsiniz
  • Standart bazı propertyler içeren(Oluşan her MDIChield ta Pagecontrole tab sekmesi oluşturmak gibi) formumdan yeni formlar inherit etmek istiyorum. Bunun için nasıl bir yöntem izlememi tavsiye edersiniz
İyi çalışmalar.

Mehmet


Not: Meraklısı için MDIChild oluşurken nasıl TPageControl üzerinde tab oluşturulduğuna dair kod aşağıdadır.

Kod: Tümünü seç

// Project1.dpr olarak kaydedin

program Project1;

uses
  Forms,
  Unit1 in 'Unit1.pas' {FormInduk},
  Unit2 in 'Unit2.pas' {FormAnak};

{$R *.RES}

begin
  Application.Initialize;
  Application.CreateForm(TFormInduk, FormInduk);
  Application.CreateForm(TFormAnak, FormAnak);
  Application.Run;
end.


// Unit1.pas olarak kaydedin

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ComCtrls, Menus;

type
  TFormInduk = class(TForm)
    PageControl1: TPageControl;
    MainMenu1: TMainMenu;
    AddAnak1: TMenuItem;
    procedure AddAnak1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  FormInduk: TFormInduk;
  AnakCount: Integer;

implementation

uses Unit2;

{$R *.DFM}

procedure TFormInduk.FormCreate(Sender: TObject);
begin
  AnakCount := 2;
end;

procedure TFormInduk.AddAnak1Click(Sender: TObject);
begin
  FormAnak := TFormAnak.Create(Application);
  FormAnak.Caption := 'Bilinmeyen ' + IntToStr(AnakCount);
  FormAnak.MDITab.Caption := FormAnak.Caption;
  Inc(AnakCount);
end;

end.

// Unit1.dfm olarak kaydedin

object FormInduk: TFormInduk
  Left = 192
  Top = 110
  Width = 435
  Height = 300
  Caption = 'Test Uygulaması'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  FormStyle = fsMDIForm
  Menu = MainMenu1
  OldCreateOrder = False
  OnCreate = FormCreate
  PixelsPerInch = 96
  TextHeight = 13
  object PageControl1: TPageControl
    Left = 0
    Top = 0
    Width = 427
    Height = 25
    Align = alTop
    TabOrder = 0
  end
  object MainMenu1: TMainMenu
    Left = 200
    Top = 120
    object AddAnak1: TMenuItem
      Caption = 'Childekle'
      OnClick = AddAnak1Click
    end
  end
end

// Unit2.pas olarak kaydedin

unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ComCtrls;

type
  TFormAnak = class(TForm)
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormCreate(Sender: TObject);
    procedure FormActivate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    MDITab: TTabSheet;
    procedure MDITabShow(Sender: TObject);
  end;

var
  FormAnak: TFormAnak;

implementation

uses Unit1;

{$R *.DFM}

procedure TFormAnak.MDITabShow(Sender: TObject);
begin
  BringToFront;
end;

procedure TFormAnak.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree; // FormAnak kapatılıyor
  MDITab.Free;
end;

procedure TFormAnak.FormCreate(Sender: TObject);
begin
  MDITab := TTabSheet.Create(Application);
  MDITab.PageControl := FormInduk.PageControl1;
  MDITab.Caption := 'Bilinmeyen 1';
  MDITab.OnShow := MDITabShow;
end;

procedure TFormAnak.FormActivate(Sender: TObject);
begin
  MDITab.Show;
end;

end.

// Unit2.dfm olarak kaydedin

object FormAnak: TFormAnak
  Left = 192
  Top = 110
  Width = 435
  Height = 300
  Caption = 'Bilinmeyen 1'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  FormStyle = fsMDIChild
  OldCreateOrder = False
  Position = poDefault
  Visible = True
  OnActivate = FormActivate
  OnClose = FormClose
  OnCreate = FormCreate
  PixelsPerInch = 96
  TextHeight = 13
end
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2356
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Mesaj gönderen freeman35 »

Eğer Yanlış anlamadıysam gönderdiğin kodda bir formun aynısını Child olarak çoğaltıyorsun, yani kullanıcı her yeni dediğinde aynı formu birdaha create ediyorsun. eğer buysa aldığın hatanın sebebi

FormInduk: TFormInduk; sen formu buna yada benzeri bir Variable a atıyorsun, buraya kadar normal sorun şurda, aynı formu 2. kez create ettiğinde sen gene aynı variable ı kullanıyorsun. aslında burdaki variable(FormInduk) bir pointer dır. sadece bir adres gösterir. sen ana formu kapattığında sen manual close edip free liyorsun ilkinde hata vermez ama 2.de verir. çünki free lediğin bir adresi free lemeye çalışıyorsun.
Yapman gereken, variable kullanma direk sil onu unitten.
ben Tlist kullanmıştım mesala. Helpde detay var bunun için. TList tepointer saklıyorsun. bir diğer yöntemde yanılmıyorsam Pagecontrol ün herbir page inde tag vardı. sen bu tag lara ilgili formun pointer ını atarsın. hatta page index ide formun tag ına atarsan 2 yönlü bir iletişim bile sağlarsın yani form varsa elinde pageindex e pageindex ten forma ulaşabilirsin

Kolay gele...
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
mavsar

Mesaj gönderen mavsar »

Abi maalesef problemim o değildi. Mesajın başında da belirttiğim gibi :

"inherit edilen bir child form yok sadece mevcut formun property si MDIChild oluyor"

Evet gönderdiğim programda dediğin gibi bir child var ve her seferinde ondan bir kopya üretiliyor. Ama bende her bir child normal birer form yalnız MDIChild özelliğindeler.
Cevapla