Form ve component leri stream kaydetme
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
-
- Üye
- Mesajlar: 25
- Kayıt: 22 Ağu 2015 06:18
Form ve component leri stream kaydetme
Herkese hayırlı akşamlar
bir projede form ve içeriğini stream e alıp tekrar form ve component leri açmam gerekiyor. Memorystream de writecomponent ve readcomponent propertyleri var. Benim formumda da iki tane veri girişi yaptığım grid , buttoneditler ve içi dolu değişkenler var. Bazen veri girişi yapılan gride yüzlerce satır kayıt giriliyor. Bu formun belirli aralıklarla stream e basıp elektrik gitmelerinde veya herhangi bir olumsuzlukla programın kapanması durumunda tekrar en az kayıpla formu açmam gerekiyor. Acaba Memorystream ile formu ve içeriğini kaydedip geriyükleme yapılabilir mi?
Şimdiden teşekkür ederim. Herkese kolay gelsin
bir projede form ve içeriğini stream e alıp tekrar form ve component leri açmam gerekiyor. Memorystream de writecomponent ve readcomponent propertyleri var. Benim formumda da iki tane veri girişi yaptığım grid , buttoneditler ve içi dolu değişkenler var. Bazen veri girişi yapılan gride yüzlerce satır kayıt giriliyor. Bu formun belirli aralıklarla stream e basıp elektrik gitmelerinde veya herhangi bir olumsuzlukla programın kapanması durumunda tekrar en az kayıpla formu açmam gerekiyor. Acaba Memorystream ile formu ve içeriğini kaydedip geriyükleme yapılabilir mi?
Şimdiden teşekkür ederim. Herkese kolay gelsin
Re: Form ve component leri stream kaydetme
Referans StackOverflow
Kullanı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;
Kod: Tümünü seç
procedure LoadComponentFromFile(Component: TComponent; const FileName: TFileName);
var
FileStream : TFileStream;
MemStream : TMemoryStream;
i: Integer;
begin
MemStream := nil;
if not Assigned(Component) then
raise Exception.Create('Component is not assigned');
if FileExists(FileName) then
begin
FileStream := TFileStream.Create(FileName,fmOpenRead);
try
for i := Component.ComponentCount - 1 downto 0 do
begin
if Component.Components[i] is TControl then
TControl(Component.Components[i]).Parent := nil;
Component.Components[i].Free;
end;
MemStream := TMemoryStream.Create;
ObjectTextToBinary(FileStream, MemStream);
MemStream.Position := 0;
MemStream.ReadComponent(Component);
Application.InsertComponent(Component);
finally
MemStream.Free;
FileStream.Free;
end;
end;
end;
Kod: Tümünü seç
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
SaveComponentToFile( Form1, 'd:\form.txt' );
end;
procedure TForm1.BitBtn2Click(Sender: TObject);
begin
LoadComponentFromFile( Form1, 'd:\form.txt' );
end;
-
- Üye
- Mesajlar: 25
- Kayıt: 22 Ağu 2015 06:18
Re: Form ve component leri stream kaydetme
Cevabınız için Teşekkür ederim
Kodlar gayet iyi çalışıyor. DAha önce de bu kodları denemiştim. Fakat benim istediğim Form,componentler, formun içindeki değişkenler ve değişkenlerin değerleri ile birlikte kaydetmek. Bu kodlar değişkenleri kaydetmiyor. Acaba başka yöntem var mı?
Kodlar gayet iyi çalışıyor. DAha önce de bu kodları denemiştim. Fakat benim istediğim Form,componentler, formun içindeki değişkenler ve değişkenlerin değerleri ile birlikte kaydetmek. Bu kodlar değişkenleri kaydetmiyor. Acaba başka yöntem var mı?
Re: Form ve component leri stream kaydetme
Değişkenleri bir componente yükleyip onun üzerinden okursan olur.
Örneğin bir ListBox'a
Değişken lazım olduğunda okumak için
Örneğin bir ListBox'a
Kod: Tümünü seç
ListBox1.Items.Values['strAdi'] := 'Muharrem';
ListBox1.Items.Values['strSoyadi'] := 'ARMAN';
ListBox1.Items.Values['strYasi'] := '42';
Kod: Tümünü seç
ShowMessage( ListBox1.Items.Values['strAdi'] );
Re: Form ve component leri stream kaydetme
Formu xml olarak kaydedip okuma var diye biliyorum bir araştır istersen
-
- Üye
- Mesajlar: 25
- Kayıt: 22 Ağu 2015 06:18
Re: Form ve component leri stream kaydetme
Teşekkür ederim.
Biz formda Record tipli değişkenler, generic classlar kullanıyoruz.Listbox a değişkenleri atayabiliriz fakat genericclasslar ve record tipli değişkenlerin durumu ile ilgili emin değilim.
Aslında Formun Kaydettiğimiz anda ramdaki değerlerinide alabileceğimiz durum olabilir mi?
Biz formda Record tipli değişkenler, generic classlar kullanıyoruz.Listbox a değişkenleri atayabiliriz fakat genericclasslar ve record tipli değişkenlerin durumu ile ilgili emin değilim.
Aslında Formun Kaydettiğimiz anda ramdaki değerlerinide alabileceğimiz durum olabilir mi?
Re: Form ve component leri stream kaydetme
Yedekleme sırasında XML ve benzeri formata dönüştürüp kayıt altına alabilecek bir formül bulabilirseniz, yeniden küllerinden üretebilirsiniz.
XML'yi de yukarıdaki örnekteki gibi bir VCL'ye bindirirsiniz kafanız rahat eder.
Sonuçta memory'de sadece değerler dizisi duruyor olacaktır. Ekranın bir ScreenShot'unun duracağı gibi değil. Bu dizinin neresinden tutacağınızın da bir listesi size zaten gerekecek. Bu listeyi tutuacak yapıyı kurmak ile XML ve benzeri ile yedeklemek aynı şeyler.
Memory'den yedekleyip geri al olayına gelince, aldığınız veriyi gerisin geriye aynı yere koyamayacaksınız. Çünkü windows sürekli çöplük boşaltıyor. Windows Hibernate olayındaki gibi bir yapı bekliyorsunuz ama hibernate olayında dahi tüm Windows donduruluyor. Sadece bir hafıza bölgesi değil bunu hatırlayınız.
Yegane önerim, her create edilen ve değerleri değişen VCL dışındaki değerleri XML ve benzeri yöntemle oluşturulacak bir yapıya atın ve kararlaştırdığınız bir VCL'ye bindirin kendisi kaydetsin. Sonra ters işlem ile geri kazanın. VCL kısmını zaten yukarıdaki fonksiyon hallediyor.

Sonuçta memory'de sadece değerler dizisi duruyor olacaktır. Ekranın bir ScreenShot'unun duracağı gibi değil. Bu dizinin neresinden tutacağınızın da bir listesi size zaten gerekecek. Bu listeyi tutuacak yapıyı kurmak ile XML ve benzeri ile yedeklemek aynı şeyler.
Memory'den yedekleyip geri al olayına gelince, aldığınız veriyi gerisin geriye aynı yere koyamayacaksınız. Çünkü windows sürekli çöplük boşaltıyor. Windows Hibernate olayındaki gibi bir yapı bekliyorsunuz ama hibernate olayında dahi tüm Windows donduruluyor. Sadece bir hafıza bölgesi değil bunu hatırlayınız.
Yegane önerim, her create edilen ve değerleri değişen VCL dışındaki değerleri XML ve benzeri yöntemle oluşturulacak bir yapıya atın ve kararlaştırdığınız bir VCL'ye bindirin kendisi kaydetsin. Sonra ters işlem ile geri kazanın. VCL kısmını zaten yukarıdaki fonksiyon hallediyor.
Re: Form ve component leri stream kaydetme
Aslında olaya hatalı bir taraftan yaklaşıyorsunuz gibime geliyor. Maksat kullanıcının girdiği dataları kaybetmemek ise bu durumda dataları girdiği alanlar ya veri bilinçli denetimler değiller yada bir bir memory dataset. Eğer veri bilinçli denetimler değil ise bu tarz garip ve uzun yollara gitmeniz gerekir elbet ama bu işin doğrusu ve efektif olanı; veri bilinçli denetimler üzerinden bir memory dataset'e kayıtları girdirmeniz ve ara ara memory dataset'i kaydetmenizdir. Formunuz ilk açıldığında memory dataset ilgili dataları kaydettiğiniz bir dosya var ise yükleyecek ve veri bilinçli denetimleriniz de bu ahenge iştirak edeceklerdir. Başka bir şey yapmanıza gerek kalmaz bu durumda.
Eğer datalarınızın bir veritabanı ile ilgisi yok ise; bir record üzerinden liste sınıflarında tutuyorsanız ilgili liste sınıfları üzerinden dosyaya kaydetme işlemlerini yazmanız da pek zor olmasa gerek
Eğer datalarınızın bir veritabanı ile ilgisi yok ise; bir record üzerinden liste sınıflarında tutuyorsanız ilgili liste sınıfları üzerinden dosyaya kaydetme işlemlerini yazmanız da pek zor olmasa gerek

-
- Üye
- Mesajlar: 25
- Kayıt: 22 Ağu 2015 06:18
Re: Form ve component leri stream kaydetme
Çok teşekkür ederim değerli hocalarım.
yazdıklarınız ışığında çalışmama devam edeceğim. İnşallah bir çözüme ulaşırsam burada paylaşacağım. İyiki varsınız. Benim istediğimde hap bilgi değil ,bakış açısı kazanmak . Bu forumda da bu durumla fazlasıyla karşılaşıyorum . Tekrar teşekkür ediyorum. çalışmalarınızda başarılar diliyorum.
yazdıklarınız ışığında çalışmama devam edeceğim. İnşallah bir çözüme ulaşırsam burada paylaşacağım. İyiki varsınız. Benim istediğimde hap bilgi değil ,bakış açısı kazanmak . Bu forumda da bu durumla fazlasıyla karşılaşıyorum . Tekrar teşekkür ediyorum. çalışmalarınızda başarılar diliyorum.