Konuyu Oyla:
  • Derecelendirme: 5/5 - 1 oy
  • 1
  • 2
  • 3
  • 4
  • 5
delphi içinden şablon çağırma
#1
delphi içinden panel ve panel içindeki tüm controlleri(componentleri) kaydedip başka bir formda çağırma hatta pagecontrolde açtığımız her sayfaya çağıracamız şablonu aktarma işini yapabiliceğim bir kodlama lazım 
write componentle read componentle bu işi yapabiliyoruz ama çağırdığımız dosya sadece o forma açıyor ben aynı formdaki diğer sayfalarada aynı işilemi yapmak istiyorum 
yazacağım program  photo collage sistemi 10 sayfalı bir albüm düşünün her sayfanın şablonu farklı bu şablonları her sayfaya nasıl çağıracağım ... şablonları çalışma anında nasıl değiştireceğim(önceden tanımlı kayıtla)  şablon olacak şekil sadece tpanellerden ve her tpanelin içindeki timage dan oluşuyor bu konuda fikri olan paylaşabilirmi
Cevapla
#2
Test edip size yazamıyorum bilgisayar başında değilim. Şöyle bir şey deneseniz.  Buna benzer daha önce ben de yapmıştım ama sizin kadar çok içerikli değil di ama.
Aşağıdaki ni kendime uyarlamıştım. Kusura bakmayın mobilden araçta yazıyorum Smile
Site: Stack Amca

İçerideki aldigim kod:

Procedure CopyLabels(ParentControl,DestControl:TWinControl);
var
i      : integer;
ALabel : TLabel;
begin
 for i := 0 to ParentControl.ControlCount - 1 do
  if ParentControl.Controls[i] is TLabel then
   begin
      ALabel:=TLabel.Create(DestControl);
      ALabel.Parent :=DestControl;
      ALabel.Left   :=ParentControl.Controls[i].Left;
      ALabel.Top    :=ParentControl.Controls[i].Top;
      ALabel.Width  :=ParentControl.Controls[i].Width;
      ALabel.Height :=ParentControl.Controls[i].Height;
ALabel.Caption:=TLabel(ParentControl.Controls[i]).Caption;
   end;
end;

Panelin içerisinde gezinirken. Diyelim bir panel daha buldun bunun da içinde gezinip. Parent lari düzgün ayarlayacagin kopyalarsın. En azından belki fikir olur bu. Koaky gelsin
Cevapla
#3
(27-06-2018, Saat: 18:39)death_claws Adlı Kullanıcıdan Alıntı: Test edip size yazamıyorum bilgisayar başında değilim. Şöyle bir şey deneseniz.  Buna benzer daha önce ben de yapmıştım ama sizin kadar çok içerikli değil di ama.
Aşağıdaki ni kendime uyarlamıştım. Kusura bakmayın mobilden araçta yazıyorum Smile
Site: Stack Amca

İçerideki aldigim kod:

Procedure CopyLabels(ParentControl,DestControl:TWinControl);
var
i      : integer;
ALabel : TLabel;
begin
 for i := 0 to ParentControl.ControlCount - 1 do
  if ParentControl.Controls[i] is TLabel then
   begin
      ALabel:=TLabel.Create(DestControl);
      ALabel.Parent :=DestControl;
      ALabel.Left   :=ParentControl.Controls[i].Left;
      ALabel.Top    :=ParentControl.Controls[i].Top;
      ALabel.Width  :=ParentControl.Controls[i].Width;
      ALabel.Height :=ParentControl.Controls[i].Height;
ALabel.Caption:=TLabel(ParentControl.Controls[i]).Caption;
   end;
end;

Panelin içerisinde gezinirken. Diyelim bir panel daha buldun bunun da içinde gezinip. Parent lari düzgün ayarlayacagin kopyalarsın. En azından belki fikir olur bu. Koaky gelsin
benim söylediğim bu değil sizinki kontrol kopyalama ... bir dosyaya kaydedip tekrar tekrar çağırma
Cevapla
#4
Merhaba.

Özel mesaja gerek yok, başlıkları görüyorum.
Çözümüm aşağıdaki gibi olacak... Smile

Peşinen ekleyeyim :  STREAM aşamasında SAVETOFILE yaparsınız artık diyorum...  Rolleyes
uses
 TypInfo;

function KopyaOlustur( aKaynak:TControl; aParent:TWinControl ):TControl;
var
 i        : Integer;
 PropList : TypInfo.TPropList;
begin
 With TMemoryStream.Create do
 try
   WriteComponent( aKaynak );
   Position := 0;
   Result := TControlClass(aKaynak.ClassType).Create(aParent);
   Result.Parent := aParent;
   ReadComponent(Result);
   // Şimdi de EVENT'leri kopyalayalım...
   for i := 0 to GetPropList(aKaynak.ClassInfo, [tkMethod], @PropList) - 1
     do SetMethodProp(Result, PropList[i], GetMethodProp(aKaynak, PropList[i]));
 finally
   Free;
 end;
end;

procedure PanelKopyala( aPanel:TPanel; aTabSheet:TTabSheet );
var
 i : Integer;
begin
 KopyaOlustur( aPanel, aTabSheet );

 for i := 0 to aPanel.ControlCount-1
  do KopyaOlustur( aPanel.Controls[i], aTabSheet );
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  With TTabSheet.Create( PageControl1 ) do
  begin
    Name        := Format('Sayfa_%.2d', [ PageControl1.PageCount ]);
    Caption     := Name;
    PageControl := PageControl1;
  end;
  PanelKopyala( Panel1, PageControl1.Pages[PageControl1.PageCount-1] );
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 ShowMessage('Merhaba');
end;

djimnjzcbrycqp1wznmh.gif
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla
#5
Kaydet ve Yükle kısmını da vereyim tam olsun. Boş vaktim vardır çayımı kahvemi aldım biraz çalıştım.
Kendi arşivim için de faydalı bir çalışma oldu.

( Bu arada mesaj ekinde kaynak kodlarıyla projenin kendisi de yer alıyor )

Dikkat edilecek unsur; YUKLE procedure içerisindeki
  RegisterClasses([TPanel, TLabel, TComboBox, TEdit, TButton, TRadioGroup]);
satırına panelinizde yer alan nesneleri girmeyi unutmayın.

Başarılar.

Procedure PanelKaydet( aPanel: TPanel; aHedef: String );
 Procedure Kaydet( aKaynak:TControl; aHedef:String );
 begin
   With TMemoryStream.Create do
   try
     WriteComponent( aKaynak );
     Position := 0;
     SaveToFile( aHedef );
   finally
     Free;
   end;
 end;
Var
 aDosya : String;
 i      : Integer;
begin
 aDosya := ChangeFileExt( aHedef,  '_a_' + aPanel.ClassType.ClassName + '_' + aPanel.Name +  '.DAT' );
 Kaydet( aPanel, aDosya );

 for i := 0 to aPanel.ControlCount-1
  do begin
    aDosya := ChangeFileExt( aHedef,  '_b_' + aPanel.Controls[i].ClassType.ClassName + '_' + aPanel.Controls[i].Name + '.DAT' );
    Kaydet( aPanel.Controls[i], aDosya );
  end;
end;

Procedure PanelCagir( aPanelDosya:String; aParent:TWinControl );
 function Yukle( aKaynak:String; aClass:String; aParent:TWinControl ):TControl;
 begin
   RegisterClasses([TPanel, TLabel, TComboBox, TEdit, TButton, TRadioGroup]);
   With TMemoryStream.Create do
   try
     LoadFromFile( aKaynak );
     Position := 0;
     Result := TControlClass( FindClass(aClass) ).Create(aParent);
     Result.Parent := aParent;
     ReadComponent(Result);
   finally
     Free;
   end;
 end;
Var
 aDosya, bDosya, bClass : String;
 AraBul : tSearchRec;
begin
 aDosya := aPanelDosya;
 Yukle(  aDosya
       , 'TPanel'
       , aParent  );

 aDosya := Copy( aDosya, 1, Pos('_a_', aDosya)-1 ) + '_b_';
 if FindFirst( aDosya + '*', faAnyFile, AraBul) = 0 then
 begin
   repeat
     if AraBul.Size > 0 then begin
       bDosya := AraBul.Name;
       bClass := bDosya;
       System.Delete( bClass, 1, Pos('_b_', bClass) + 2 );
       bClass := Copy(bClass, 1, Pos('_', bClass)-1);
       Yukle(  bDosya
             , bClass
             , aParent  );
     end;
   until FindNext(AraBul) <> 0;
   FindClose(AraBul);
 end;

end;

procedure TForm1.BitBtn2Click(Sender: TObject);
begin
 With TSaveDialog.Create(nil)
 do  if Execute
     then PanelKaydet( Panel1, FileName );
end;

procedure TForm1.BitBtn3Click(Sender: TObject);
begin
 With TOpenDialog.Create(nil) do begin
   try
     Filter := 'PanelData *_a_*.DAT|*_a_*.DAT';
     FilterIndex := 1;
     if Execute then begin

       With TTabSheet.Create( PageControl1 ) do
       begin
         Name        := Format('Sayfa_%.2d', [ PageControl1.PageCount ]);
         Caption     := Name;
         PageControl := PageControl1;
       end;
       PanelCagir( FileName
                  , PageControl1.Pages[PageControl1.PageCount-1]  );
     end;
   finally
     free;
   end;
 end;
end;


Ek Dosyalar
.zip   PanelCopy_PageCont.zip (Dosya Boyutu: 55,96 KB / İndirme Sayısı: 17)
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla
#6
(27-06-2018, Saat: 23:31)mrmarman Adlı Kullanıcıdan Alıntı: Kaydet ve Yükle kısmını da vereyim tam olsun. Boş vaktim vardır çayımı kahvemi aldım biraz çalıştım.
Kendi arşivim için de faydalı bir çalışma oldu.

( Bu arada mesaj ekinde kaynak kodlarıyla projenin kendisi de yer alıyor )

Dikkat edilecek unsur; YUKLE procedure içerisindeki
  RegisterClasses([TPanel, TLabel, TComboBox, TEdit, TButton, TRadioGroup]);
satırına panelinizde yer alan nesneleri girmeyi unutmayın.

Başarılar.

Procedure PanelKaydet( aPanel: TPanel; aHedef: String );
 Procedure Kaydet( aKaynak:TControl; aHedef:String );
 begin
   With TMemoryStream.Create do
   try
     WriteComponent( aKaynak );
     Position := 0;
     SaveToFile( aHedef );
   finally
     Free;
   end;
 end;
Var
 aDosya : String;
 i      : Integer;
begin
 aDosya := ChangeFileExt( aHedef,  '_a_' + aPanel.ClassType.ClassName + '_' + aPanel.Name +  '.DAT' );
 Kaydet( aPanel, aDosya );

 for i := 0 to aPanel.ControlCount-1
  do begin
    aDosya := ChangeFileExt( aHedef,  '_b_' + aPanel.Controls[i].ClassType.ClassName + '_' + aPanel.Controls[i].Name + '.DAT' );
    Kaydet( aPanel.Controls[i], aDosya );
  end;
end;

Procedure PanelCagir( aPanelDosya:String; aParent:TWinControl );
 function Yukle( aKaynak:String; aClass:String; aParent:TWinControl ):TControl;
 begin
   RegisterClasses([TPanel, TLabel, TComboBox, TEdit, TButton, TRadioGroup]);
   With TMemoryStream.Create do
   try
     LoadFromFile( aKaynak );
     Position := 0;
     Result := TControlClass( FindClass(aClass) ).Create(aParent);
     Result.Parent := aParent;
     ReadComponent(Result);
   finally
     Free;
   end;
 end;
Var
 aDosya, bDosya, bClass : String;
 AraBul : tSearchRec;
begin
 aDosya := aPanelDosya;
 Yukle(  aDosya
       , 'TPanel'
       , aParent  );

 aDosya := Copy( aDosya, 1, Pos('_a_', aDosya)-1 ) + '_b_';
 if FindFirst( aDosya + '*', faAnyFile, AraBul) = 0 then
 begin
   repeat
     if AraBul.Size > 0 then begin
       bDosya := AraBul.Name;
       bClass := bDosya;
       System.Delete( bClass, 1, Pos('_b_', bClass) + 2 );
       bClass := Copy(bClass, 1, Pos('_', bClass)-1);
       Yukle(  bDosya
             , bClass
             , aParent  );
     end;
   until FindNext(AraBul) <> 0;
   FindClose(AraBul);
 end;

end;

procedure TForm1.BitBtn2Click(Sender: TObject);
begin
 With TSaveDialog.Create(nil)
 do  if Execute
     then PanelKaydet( Panel1, FileName );
end;

procedure TForm1.BitBtn3Click(Sender: TObject);
begin
 With TOpenDialog.Create(nil) do begin
   try
     Filter := 'PanelData *_a_*.DAT|*_a_*.DAT';
     FilterIndex := 1;
     if Execute then begin

       With TTabSheet.Create( PageControl1 ) do
       begin
         Name        := Format('Sayfa_%.2d', [ PageControl1.PageCount ]);
         Caption     := Name;
         PageControl := PageControl1;
       end;
       PanelCagir( FileName
                  , PageControl1.Pages[PageControl1.PageCount-1]  );
     end;
   finally
     free;
   end;
 end;
end;

hocam yükle derken ilk panel.dat çağrdığımızda diğer controller için release klasörünü arıyor.. bu arada çok teşekkür ederim.. yine size ait olan sürükle bırak ile ilgili bir çalışmanı vardı onuda kullanacağım projemde..
Cevapla
#7
Merhaba

Denizleri geçip derede takılmayınız, SaveDialog ve OpenDialog için DefaultFolder / InitialDir vermek kafi. Üzmeyin bizi bunlar için.  Undecided Wink

bkz. bu link
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla
#8
(28-06-2018, Saat: 07:05)mrmarman Adlı Kullanıcıdan Alıntı: Merhaba

Denizleri geçip derede takılmayınız, SaveDialog ve OpenDialog için DefaultFolder / InitialDir vermek kafi. Üzmeyin bizi bunlar için.  Undecided Wink

bkz. bu link

evt haklısınız kendimi beceriksiz olarak ilan ediyorum... delphiye bir başından bir ortasından girdiim içinböyle oluyor.... ama geliştireceğim...  hocam istediğim şey open ve save diologlar değil kendi belirleyeceğim filename ile kaydedip çağırmak istiyorum... dosya isimlerini ve yollarını veritabanından çağıracağım... filename denedim ama ilk paneli alıyor sonra döngüde yine program dizinine gidiyor...

  PanelCagir('template1.dat'

                   , PageControl1.Pages[PageControl1.PageCount-1]  );
 birde bunları hocam aşağıdaki düzende tek dosya halinde kaydetmemiz mümkünmü...

object pnlSource: TPanel
Left = 8
Top = 8
Width = 201
Height = 265
Caption = 'pnlSource'
TabOrder = 0
object Label1: TLabel
  Left = 48
  Top = 208
  Width = 31
  Height = 13
  Caption = 'Label1'
end
object Label2: TLabel
   ...

eventler tüm panellerdeki aynı olacağından sonradan döngü ile atayabiliriz..
Cevapla
#9
Mümkündür. 

Her bir bileşeni Text formata dönüştürüp bir dosya altında birleştirdikten sonra;
Bir de bütünü parse ederek bileşenlere ayırma ve sonra işleme almak göreviniz olacağını belirtelim. 

ObjectBinaryToText()  ile ObjectTextToBinary() procedure özelliklerini inceleyiniz.  Idea
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla
#10
döngüde program klasörüne geri dönmesi problemi çözdüm...

        bDosya := ExtractFilePath(adosya)+AraBul.Name;


tek sorun binarytotext olarak kaydedip okutmak kaldı
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  delphi 10.4 deutsch1988 0 71 18-04-2024, Saat: 11:46
Son Yorum: deutsch1988
  Delphi virus gibi deutsch1988 11 493 12-04-2024, Saat: 17:36
Son Yorum: deutsch1988
  Delphi 7 Unrar mcuyan 12 674 19-03-2024, Saat: 10:30
Son Yorum: frmman
Lightbulb Delphi 7zip Password lü Dosya Sıkıştırma ve Açma + Bonus RAR5 Desteği frmman 6 322 16-03-2024, Saat: 17:55
Son Yorum: delphi.developer
  delphi 12 ile TFileStream çalışmıyor aegean 5 527 05-03-2024, Saat: 22:23
Son Yorum: aegean



Konuyu Okuyanlar: 1 Ziyaretçi