Form ve component leri stream kaydetme

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
mythofatih
Üye
Mesajlar: 25
Kayıt: 22 Ağu 2015 06:18

Form ve component leri stream kaydetme

Mesaj gönderen mythofatih »

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
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Form ve component leri stream kaydetme

Mesaj gönderen mrmarman »

Referans StackOverflow

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;
Kullanımı :

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;
Resim
Resim ....Resim
mythofatih
Üye
Mesajlar: 25
Kayıt: 22 Ağu 2015 06:18

Re: Form ve component leri stream kaydetme

Mesaj gönderen mythofatih »

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ı?
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Form ve component leri stream kaydetme

Mesaj gönderen mrmarman »

Değişkenleri bir componente yükleyip onun üzerinden okursan olur.
Ö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';
Değişken lazım olduğunda okumak için

Kod: Tümünü seç

  ShowMessage( ListBox1.Items.Values['strAdi'] );
Resim
Resim ....Resim
Kullanıcı avatarı
badkursat
Üye
Mesajlar: 84
Kayıt: 03 Mar 2014 08:58

Re: Form ve component leri stream kaydetme

Mesaj gönderen badkursat »

Formu xml olarak kaydedip okuma var diye biliyorum bir araştır istersen
mythofatih
Üye
Mesajlar: 25
Kayıt: 22 Ağu 2015 06:18

Re: Form ve component leri stream kaydetme

Mesaj gönderen mythofatih »

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?
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Form ve component leri stream kaydetme

Mesaj gönderen mrmarman »

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. :idea: 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.
Resim
Resim ....Resim
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Form ve component leri stream kaydetme

Mesaj gönderen thelvaci »

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 ;)
mythofatih
Üye
Mesajlar: 25
Kayıt: 22 Ağu 2015 06:18

Re: Form ve component leri stream kaydetme

Mesaj gönderen mythofatih »

Ç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.
Cevapla