[Çözüldü] Runtime da create edilen bileşenleri

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

[Çözüldü] Runtime da create edilen bileşenleri

Mesaj gönderen Lord_Ares »

Merhaba , runtime da create edip oluşturduğum 135 bileşen var. Bu Formu DFM dosyası olarak kaydederek bu dfm dosyasını tasarım anında kullanılabilir mi ? Nasıl yaparım. Aşağıdaki kod ile txt olarak kaydedebildim. Fakat kullanmak istediğimde bazı sınıfların eksik olduğu hatalarını aldım. İlgili pas ve dfm uzantılı dosyaları açarak pas ve dfm de geçen isimleri kontrol edip düzeltmeme rağmen çalıştırmaya kalktığımda aynı hataları aldım.

Kod: Tümünü seç

procedure SaveComponentToFile(Component: TComponent; const FileName: TFileName);
var
  FileStream : TFileStream;
  MemStream : TMemoryStream;
begin
  MemStream := nil;

  if not Assigned(Component) then
    raise Exception.Create('Component is not assigned');

  FileStream := TFileStream.Create(FileName,fmCreate);
  try
    MemStream := TMemoryStream.Create;
    MemStream.WriteComponent(Component);
    MemStream.Position := 0;
    ObjectBinaryToText(MemStream, FileStream);
  finally
    MemStream.Free;
    FileStream.Free;
  end;
end;
SaveComponentToFile(Form1,ExtractFilePath(Application.ExeName)+ 'formdata.txt');
En son Lord_Ares tarafından 28 Eyl 2017 10:52 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: Runtime da create edilen bileşenleri

Mesaj gönderen ertank »

Bu şekilde yapmak yerine bir database içine 135 adet kayıt girmek (bileşenler ile ilgili gerekli bilgileri içerecek bir tablo yapısı içine) daha sonra gerekli olduğunda database içindeki bilgileri baz alarak 135 tane bileşeni çalışma zamanında oluşturmak daha doğru olacaktır diye düşünüyorum.
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: Runtime da create edilen bileşenleri

Mesaj gönderen Lord_Ares »

Dikkatimi çeken birşey oldu üstadım , bu konuda fikrinizi öğrenmek isterim.
1) Tasarım aşamasında formuma 50 panel ekleyip projeyi kaydettim ve compaile edip exe dosyasını oluşturdum. Exenin boyutu 11 mb
2) Bu sefer boş forma Runtime da 50 paneli oluşturacak kodları ekleyerek kaydettim ve exe dosyasını oluşturdum. Exenin boyu 4 mb

Merak ettiğim şu oldu, Runtimde kod ile 50 panel oluşturunca, exe boyutunda tasarruf ettim mi . Yoksa Diskten yer kazanmış gibi dururken Ram den mi kaybediyorum. Hangisi daha avantajlı anlamış değilim :)
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: Runtime da create edilen bileşenleri

Mesaj gönderen ertank »

Uses kısmını kontrol etmenizi tavsiye ederim. Kullanılmayan birçok ünite exe içine dahil edilmiş olabilir tüm o denemeleriniz sırasında.
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: Runtime da create edilen bileşenleri

Mesaj gönderen Lord_Ares »

ertank yazdı: 26 Eyl 2017 11:41 Bu şekilde yapmak yerine bir database içine 135 adet kayıt girmek (bileşenler ile ilgili gerekli bilgileri içerecek bir tablo yapısı içine) daha sonra gerekli olduğunda database içindeki bilgileri baz alarak 135 tane bileşeni çalışma zamanında oluşturmak daha doğru olacaktır diye düşünüyorum.
Çalışma zamanında oluşturduğumuz bileşenlerin yordamlarını kullanabilecekmiyim. Örneğin onclick yordamına tasarım halindeyken kod yazabiliyoruz. Runtime de nasıl olacak bilmiyorum.
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: Runtime da create edilen bileşenleri

Mesaj gönderen ertank »

Aşağıdaki örnek kod nasıl yapılacağı ile ilgili fikir verecektir. Form tamamen boş olduğu halde bu kodu çalıştırır iseniz çalıştığı zaman form üzerinde butonu görüp tıkladığınızda ise ekranda mesajı görürsünüz.

Kod: Tümünü seç

unit Unit1;

interface

uses
  Winapi.Windows,
  Winapi.Messages,
  System.SysUtils,
  System.Variants,
  System.Classes,
  Vcl.Graphics,
  Vcl.Controls,
  Vcl.Forms,
  Vcl.Dialogs,
  Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    AButton: TButton;

    procedure MyBtnClick(Sender: TObject);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  AButton := TButton.Create(Self);
  AButton.Parent := Self;
  AButton.Caption := '&Deneme';
  AButton.Left := 50;
  AButton.Top  := 50;
  AButton.OnClick := MyBtnClick;
end;

procedure TForm1.MyBtnClick(Sender: TObject);
begin
  ShowMessage('Buton tıklandı');
end;

end.
Özetle, buton tıklama prosedürünü manuel olarak elle yazmanız gerekli. Ardından oluşturduğunuz nesnenin OnClick olayına manuel prosedürü eşleştirmeniz gerekir. Bu yöntem tüm bileşenler için uygulanabilir.

Dikkat edilmesi gereken konu bileşenin eşleştirilen olayının dizayn aşamasında Delphi tarafından açılan olay ile aynı parametreleri içermesi. Bir başka deyiş ile eğer bir OnMouseDown() olayı için manuel prosedür oluşturacak iseniz aşağıdaki gibi tanımlanmalı

Kod: Tümünü seç

procedure MyMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: Runtime da create edilen bileşenleri

Mesaj gönderen Lord_Ares »

Teşekkürler yeni birşey daha öğrenmiş oldum.
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3077
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Re: Runtime da create edilen bileşenleri

Mesaj gönderen sabanakman »

Lord_Ares yazdı: 26 Eyl 2017 10:33..Fakat kullanmak istediğimde bazı sınıfların eksik olduğu hatalarını aldım...
RegisterClass metodu ile kullanılacak sınıfları kayıt ettikten sonra tekrar deneyin.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: Runtime da create edilen bileşenleri

Mesaj gönderen Lord_Ares »

sabanakman yazdı: 27 Eyl 2017 03:28 RegisterClass metodu ile kullanılacak sınıfları kayıt ettikten sonra tekrar deneyin.
Dediğiniz gibi yapınca sorun kalmadı. Teşekkürler
Kullanıcı avatarı
cengaver
Üye
Mesajlar: 111
Kayıt: 01 Nis 2014 05:02
Konum: İstanbul

Re: [Çözüldü] Runtime da create edilen bileşenleri

Mesaj gönderen cengaver »

Merhaba,

Size ufak bir tüyo vermiş olayım,

Mesela "herhangi bir" bileşeni runtime'de oluşturmak istiyorsanız ilk önce tasarım anında o bileşeni veya bileşen topluluğunu oluşturun. "Tamam, oldu bu" dediğiniz anda o bileşen topluluğunu tasarım ekranında seçip CTRL+C tuşuna basın. Sonra NOTEPAD'i açıp CTRL+V ile yapıştırın. Göreceksiniz ki notepad ekranına o bileşen ve özellikleri ile ilgili ( ve hatta eventler de dahil) herşeyi görmüş olacaksınız.
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2356
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Re: [Çözüldü] Runtime da create edilen bileşenleri

Mesaj gönderen freeman35 »

dfm in amacı, IDE ile görsel çalışırken, property lere hızlı erişebilmek, mesela left, heigh, top vs gibi. Bu bilgiler dfm değilde pas içinde olsaydı, IDE bunları parse edebilmek ve tekrar yazabilmek için cebelleşir sonunda kitlenirdi :) 1-2mb lık bir pas olduğunu düşünün, bunun içinde onlarca bileşen vs.
Bunu runtime da yapmak isterseniz, o dfm içinde yazan değerleri, hiyararşiyi, yani parent/owner sıralamalarını pas içerisinde kodla yapmanız gerek. EXE boyutuna her halukârda etkileyecek.Ya dfm e yazılmış yada pas içine kod eklenmiş. Burada bu öenmli değil, önemli olan tasarım, yani neyi neden yaratacaksın? eğer bu 135 tane bileşen visual sa, ve bir formda olacaksa, bunu form yapmak daha mantıklı. runtime da form u create etmek yetecektir, ama 135 component şart a bağlı oluşturulacaksa mecburen runtime da create edilecekler. Ama bu gene kısalaştırılabilinir design time da yapılabilinir.
Programcılık budur işte, yoksa visual icon ları sürükle bırak event lerine çift tıkla, 2 satır kod yaz yada bir yerlerden bulup yapıştırmak değil.

DFM de bir treeview varsa, ve buna designtime da node lar eklendiyse, yablış hatırlamıyorsam bu nodelar dfm de binary olarak saklıanır. Yani her tpersistant class özellikleri dfm de olmaya bilir. Runtime da Treeview ı ceate ettikten sonra, itemları eklemeden, herhangi bir node a erişmeye kalkarsan hata alırsın.

"RegisterClass" Bunu "hatayı gidermek için" kullanırsan, yaptım oldu diyorsan sözüm yok ama bu zihniyet külliyen hatalı kod yazıyorsun demek.
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 !!!
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: [Çözüldü] Runtime da create edilen bileşenleri

Mesaj gönderen Lord_Ares »

Runtime da 135 panel oluşturdum. Bu panellerin içindeki 1215 adet captionların değerlerinin girilmesi gerekiyordu. Runtime oluşturduğum için yapacağım bu değişiklikler kalıcı olmayacaktı. Bende runtimede değerleri atayıp dfm olarak çıktı alırsam tasarım anında kullanabileceğim forma sahip olurum düşüncesi ile böyle birşey denedim baktım olmadı elle oluşturdum.
Cevapla