Çalışma zamanı PageControl, TabSheet ve Form oluşturma

Yapmak istediğiniz işle ilgili doğru bileşeni bulmak için burayı kullanabilirsiniz. Sadece bulmak için, diğer sorular Programlama forumuna lütfen.
Forum kuralları
Bu forum sadece yapacağınız işle alakalı doğru bileşeni bulmak içindir. Şöyle bir şey yapmam lazım, hangi bileşeni kullanıyım diyorsanız, doğru yerdesiniz.
Cevapla
Okann
Üye
Mesajlar: 81
Kayıt: 09 Tem 2010 02:55

Çalışma zamanı PageControl, TabSheet ve Form oluşturma

Mesaj gönderen Okann »

Merhaba Arkadaşlar,

Çalışma zamanında PageControl Tabsheet ve form oluşturuyorum.
oluşturulan sheeti kapatıp aynı formu yeniden oluşturmak istediğimde Invalid Pointer hatası alıyorum.
Sorunu aşamadım.
Aynı sayfayı oluşturuken aşağıdaki satırda hataya düşüyor.

TForm(Reference).Parent := tsMain;

Kod: Tümünü seç

  private
    procedure pcMainOnCanClose(Sender: TObject; var ACanClose: Boolean);
  public
    pcMain: TcxPageControl;
    tsMain: TcxTabSheet;
    procedure AFormCreate(AFormClass: TComponentClass; var Reference); overload;
  end;

procedure TfmMain.AFormCreate(AFormClass: TComponentClass; var Reference);
var
  I: Integer;
  Instance, pcComp, tsComp: TComponent;
begin
  pcComp := FindComponent('pc');
  tsComp := FindComponent('ts' + Copy(AFormClass.ClassName, 4, 20));
  if not Assigned(pcComp) then
  begin
    pcMain := TcxPageControl.Create(Self);
    with pcMain do
    begin
      Name := 'pc';
      Parent := pnlClientMain;
      Align := alClient;
      AlignWithMargins := True;
      Margins.Top := 2;
      Margins.Left := 2;
      Margins.Right := 2;
      Margins.Bottom := 2;
      Focusable := False;
      LookAndFeel.NativeStyle := False;
      LookAndFeel.SkinName := 'Office2013White';
      LookAndFeel.AssignedValues := [lfvNativeStyle, lfvSkinName];
      Properties.Style := 11;
      Properties.TabWidth := 150;
      Properties.TabHeight := 20;
      Properties.Images := ImgSmall;
      Properties.ShowFrame := True;
      Properties.OwnerDraw := True;
      Properties.ShowButtonHints := True;
      Properties.AllowTabDragDrop := True;
      Properties.CloseButtonMode := cbmActiveAndHoverTabs;
      Properties.Options :=
        [pcoAlwaysShowGoDialogButton,
         pcoCloseButton,
         pcoGoDialog,
         pcoGradient,
         pcoGradientClientArea,
         pcoRedrawOnResize];
      Options :=
        [pcoAlwaysShowGoDialogButton,
         pcoCloseButton,
         pcoGoDialog,
         pcoGradient,
         pcoGradientClientArea,
         pcoRedrawOnResize];
      OnCanClose := pcMainOnCanClose;
    end;
  end;
  if not Assigned(tsComp) then
  begin
    tsMain := TcxTabSheet.Create(Self);
    with tsMain do
    begin
      Name := 'ts' + Copy(AFormClass.ClassName, 4, 20);
      Caption := TForm(Reference).Caption;
      PageControl := pcMain;
      Highlighted := True;
      ImageIndex := 3;
      PageControl.ActivePageIndex := TabIndex;
    end;
    if Pointer(Reference) = nil then
    begin
      Instance := TComponent(AFormClass.NewInstance);
      TComponent(Reference) := Instance;
      try
        Instance.Create(Self);
      except
        TComponent(Reference) := nil;
        raise;
      end;
    end;
    TForm(Reference).Parent := tsMain;  // oluşturulan tabsheet kapatalıp yeniden oluşturulduğunda invalid pointer hatası alınıyor.
    TForm(Reference).BorderStyle := bsNone;
    TForm(Reference).Align := alClient;
    TForm(Reference).Show;
    TForm(Reference).SetFocus;
  end else
  begin
    for I := 0 to pcMain.PageCount - 1 do
    begin
      if pcMain.Pages[I].Name = tsComp.Name then
      begin
        pcMain.ActivePageIndex := I;
      end;
    end;
  end;
end;

procedure TfmMain.btnMaterialsClick(Sender: TObject);
begin
  AFormCreate(TfmMaterials, fmMaterials);
end;

procedure TfmMain.pcMainOnCanClose(Sender: TObject; var ACanClose: Boolean);
begin
  if pcMain.PageCount = 1 then
  begin
    ACanClose := False;
    pcMain.Free;
  end;
end;

Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2355
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Re: Çalışma zamanı PageControl, TabSheet ve Form oluşturma

Mesaj gönderen freeman35 »

- Form u runtime da create ediyorsan, bunun üzerinde zaten hiç bir şey olmaz, neden if assigned diye kotrol eidyorsun? o formun oncreate inde pagecontrol ü ve tabsheet i oluştur.
- Eğer assigned ile kotrol yapacaksanda o pointer ların nil olduklarından emin ol. xx.free; free eder ama pointer ı nil yapmaz. FreeAndNil kullan.
-gereksiz kod
pcComp := FindComponent('pc'); --> pc nin ne olduğu belli değil mi?
tsComp := FindComponent('ts' + Copy(AFormClass.ClassName, 4, 20)); -->buda gereksiz.

*Buraya göndermek istediğin formu baştan design et, IDE içerisinde. Bir form create etmek istediğinde de bu formdan inherited create et. bu kadar kod yayıntısı ve kontrole gerek kalmaz.
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 !!!
Okann
Üye
Mesajlar: 81
Kayıt: 09 Tem 2010 02:55

Re: Çalışma zamanı PageControl, TabSheet ve Form oluşturma

Mesaj gönderen Okann »

Merhaba,
Problemin doğru anlaşılmadığını düşünüyorum.
Designtime da hazırladığım 10 tane formum var.
Uygulamanın ilk açılışında bir pagecontrol yok.
Bir formu çağırdığımda Önce pagecontrol oluşacak daha sonra tab oluşacak ve ilgili form bu tabda görüntülenecek.
Diğer formu çağırdığımda bir tab daha oluşacak ve ilgili form gelecek.
ATabındayken BTabını oluşturan butona bastığımda eğer b tabı öncede oluşmuşsa BTabını yeniden oluşturmak yerine BTabına focuslanacak.
tscomp kullanma ve assigned ile sorgulama sebebim budur. Runtime da oluşmuş bir tabı başka türlü arayamam diye düşünüyorum.
Pagecontrolün tabclose eventı var. Buradan tabları kapatırken eğer 1 tab kaldıysa pagecontrolü free ediyorum.
Bu yazdığım kod işi istediğim şekilde yapıyor ama bu işlemler 2.kez tekrarlandığında yani pagecontrol ve tab yeniden oluşturulmaya başladığında hataya düşüyor.
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2355
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Re: Çalışma zamanı PageControl, TabSheet ve Form oluşturma

Mesaj gönderen freeman35 »

pagecontrol nerde? bi main formda değil mi? bunu create edip free lemeni anlamadım. o 10 tane dediğin yada x tane dediğin form ların private ksıımlarına Tabsheet tipinde değişken ekle. formları manual vreate ediyorsan, form un oncreate ve close unda bunu create ve freeandnil yap. bu sayede tab ı aramana gerek kalmaz.
"ATabındayken BTabını oluşturan butona bastığımda eğer b tabı öncede oluşmuşsa BTabını yeniden oluşturmak yerine BTabına focuslanacak." kod mantığını anlamış değilim. create edilmemiş tab a (Btabına) nasıl tıklıyabilirsin ki? neyse.
Free değil FreeAndNil kullan, yada .free; den sonra değişkene nil ata.
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 !!!
Cevapla