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
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
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
(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
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
Özel mesaja gerek yok, başlıkları görüyorum.
Çözümüm aşağıdaki gibi olacak...
Peşinen ekleyeyim : STREAM aşamasında SAVETOFILE yaparsınız artık diyorum...
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;
(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
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..
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...
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.