Memo içeriğini Kontrollü Kaydetme Yardım

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
dkadir
Üye
Mesajlar: 40
Kayıt: 04 Oca 2014 06:44

Memo içeriğini Kontrollü Kaydetme Yardım

Mesaj gönderen dkadir »

Selamun Aleyküm
Memo1 içindeki yazıyı txt dosyasına SaveToFile ile kaydederken bu işi timer kullanarak yapıyorum.Kaydettiğim Sürücünün boyutu labelin captionunda anlık olarak yazıyor.Timer aktif olduğunda azalmaya başlıyor.Ancak hafıza tamamen dolduğunda hata veriyor. Benim yapmam gereken hafıza tamamen dolduğunda durdurmak bunu bir türlü yapamadım.Acaba nasıl yaparım ?
yardımlarınız için şimdiden teşekkürler..
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: Memo içeriğini Kontrollü Kaydetme Yardım

Mesaj gönderen Lord_Ares »

Sürücünün boyutu labelin captionına anlık olarak aldığınıza bakılırsa elinizde sürücü boyotunu alan bir kodunuz var. O zaman tek yapmanız gereken
"İf surucuboyutu=0 then kaydetme " veya "while surucuboyu>dosyaboyutu "gibi basit bir sorgu içine kodlarınızı yazarsanız işinizi görecektir.
ertank
Kıdemli Üye
Mesajlar: 1711
Kayıt: 12 Eyl 2015 12:45

Re: Memo içeriğini Kontrollü Kaydetme Yardım

Mesaj gönderen ertank »

dkadir yazdı:Selamun Aleyküm
Memo1 içindeki yazıyı txt dosyasına SaveToFile ile kaydederken bu işi timer kullanarak yapıyorum.Kaydettiğim Sürücünün boyutu labelin captionunda anlık olarak yazıyor.Timer aktif olduğunda azalmaya başlıyor.Ancak hafıza tamamen dolduğunda hata veriyor. Benim yapmam gereken hafıza tamamen dolduğunda durdurmak bunu bir türlü yapamadım.Acaba nasıl yaparım ?
yardımlarınız için şimdiden teşekkürler..
Mevcut kodu paylaşabilir misiniz?
dkadir
Üye
Mesajlar: 40
Kayıt: 04 Oca 2014 06:44

Re: Memo içeriğini Kontrollü Kaydetme Yardım

Mesaj gönderen dkadir »

Kod: Tümünü seç

procedure SaveMemo(Memo: TMemo; FileName: string; Apnd: boolean= true);
var f: textfile;
i: integer;
begin
AssignFile(f, FileName);
{$I-}
if apnd then
append(f) else
rewrite(f);
{$I+}
if IOResult= 0 then
for i:= 0 to Memo.Lines.Count- 1 do
WriteLn(f, Memo.Lines[i]);
CloseFile(f);
end;

// Kaydetme Bölümü
procedure TForm1.kaydetTimer(Sender: TObject);
begin
SaveMemo(Memo1,'C:\makale.txt' )
end;

//Disk kapasitesini anlık labelde yazma bölümü
procedure TForm1.KapasiteTimer(Sender: TObject);
var
Bos_Alan : Integer;
begin
Bos_Alan := DiskFree(8); // H Sürücüsünde ne kadar boş yer var
Label2.Caption := IntToStr(Bos_Alan);
end;
üstlerinde ne yaptığını yazdım
Kullanıcı avatarı
brs
Üye
Mesajlar: 626
Kayıt: 04 Eki 2012 03:52

Re: Memo içeriğini Kontrollü Kaydetme Yardım

Mesaj gönderen brs »

Kod: Tümünü seç

var
  Form1: TForm1;

var
Bos_Alan:: Integer;

implementation

{$R *.dfm}


// Kaydetme Bölümü örnek:

Kod: Tümünü seç

procedure TForm1.kaydetTimer(Sender: TObject);
begin
if Bos_Alan < 10 then 
begin
SaveMemo(Memo1,'C:\makale.txt' )
end;
gibi yapabilirsiniz.
İşi bilen yardım eder, az bilen akıl verir, bilmeyen eleştirir, yapamayan ise çamur atar...
ertank
Kıdemli Üye
Mesajlar: 1711
Kayıt: 12 Eyl 2015 12:45

Re: Memo içeriğini Kontrollü Kaydetme Yardım

Mesaj gönderen ertank »

Merhaba,

Her ne kadar değişken isimleri kullanıcının kendi zevkine göre verilebilse de genel kabul görmüş olan değişken ismi büyük harf ile başlar ve birden fazla kelimeden oluşan değişkenlerde kelimelerin ilk harfleri büyük şekilde yazılır şeklindedir. Buna yurtdışında "camel case" veya "Pascal notation" diyorlar. Örneğin aşağıdaki ifade

Kod: Tümünü seç

var f: textfile;
şu şekilde yazıldığı zaman Pascal geleneklerine daha uygun olacaktır:

Kod: Tümünü seç

var 
  F: TextFile;
Bunun dışında fonksiyon/prosedür içinde kod yazar iken de özen gönsterilmesi gereken konular var. Blok nerede başlıyor, nerede bitiyor kısmı en güzel bloklar içi kod birkaç karakter içeriden yazıldığı zaman anlaşılıyor. Örnek olarak gönderilen, disk boş alanını gösteren kodun aşağıdaki şekilde yazılması daha kolay okunmasına yardımcı olacaktır.

Kod: Tümünü seç

procedure TForm1.KapasiteTimer(Sender: TObject);
var
  Bos_Alan: Integer;
begin
  Bos_Alan := DiskFree(8); // H Sürücüsünde ne kadar boş yer var
  Label2.Caption := IntToStr(Bos_Alan);
end;
Son olarak, soru ile bilrlikte kullanılan Delphi sürümünü bildirmekte fayda var. Ben son sürümlerden bir tanesi (XE serisi veya 10, 10.1) olduğunu düşünerek muhtemel çözüm kodunu öneriyorum. Delphi7 olması durumunda kodda değişiklikler yapılması gerekecektir.

Bu genel konuları anlattıktan sonra esas soruyu aşağıdaki şekilde çözmek mümkün olabilir.

Kod: Tümünü seç

uses
  System.IOUtils;  // TFile tanımı bunun içinde
  
function SaveMemo(Memo: TMemo; FileName: string; AppendTo: Boolean = True): Boolean;
var
  F: TextFile;
  i: Integer;
begin
  Result := False;

  AssignFile(F, FileName);
  // Eğer dosya yok ise Append modunda kayıt mümkün olmayacaktır
  if not TFile.Exists(FileName) then AppendTo := False;

  {$I-}
  if AppendTo then
    Append(F)
  else
    ReWrite(F);
  {$I+}
  if IOResult = 0 then
  begin
    try
      for i := 0 to Memo.Lines.Count - 1 do
      begin
        {$I-}
        WriteLn(f, Memo.Lines[i]);
        {$I+}
        // Muhtemelen disk dolu veya başka bir hata oluştu
        if IOResult <> 0 then Exit();
      end;
    finally
      // try..finally bloğu içinde olduğu için
      // dosya mutlaka kapatılarak fonksiyondan çıkılır
      CloseFile(F);
    end;
  end
  else
    // Dosya ReWrite veya Append modunda açılamadı.
    Exit();

  // Buraya kadar sorun yok ise kaydetme işlemi başarılı olduğunu bildir
  Result := True;
end;
Yukarıdaki fonksiyon bir iki konuya dikkat ediyor.
- Öncelikle kayıt işleminin başarılı olup olmadığını geriye bilgi olarak çeviriyor.
- Eğer belirtilen dosya yok ise Append() fonksiyonu başarısız olur. Dolayısı ile dosya olmadığı zaman ReWrite modunu zorunlu yapıyor.
- WriteLn() fonksiyonu kontrollü olarak kullanılıyor. Hata alındığı zaman yüksek ihtimalle disk dolmuş oluyor.

IOResult ile detaylı kontrol yapılması da mümkün. WriteLn() satırının altındaki "if IOResult <> 0 then" ifadesi "case IOResult of" şeklide değiştirilebilir. Ancak orjinal kod hata detayları ile ilgilenmediği için detaylı kontrole gerek görmedim. IOResult ile daha detaylı bilgiyi aşağıdaki linkte bulabilirsiniz.
http://docs.embarcadero.com/products/ra ... esult.html

Yukarıdaki değiştirilmiş SaveMemo fonksiyonu esas sorunu çözüyor. Ancak ekranda disk alanını göstermeye devam etmek isterseniz ilgili prosedürde "DiskFree(8)" ifadesine dikkat etmek gerekli. Birçok bilgisayarda H sürücüsü olmayacaktır. H sürücüsü olmayan bilgisayarlarda disk kapasitesi -1 olarak gösterilecektir.

Ayrıca, orjinal kod örneğinde parametre olarak gönderilen dosya C sürücüsünde, disk boş alanı H sürücüsünde gösteriliyor.

Son olarak, C sürücüsü genel olarak Windows kurulumu yapılan sürücüdür. Son sürümlere yakın Windows işletim sistemleri artık C:\ alanına yazmaya izin vermiyor. Bunun için Administrator yetkisi arıyor. Bu konuya da dikkat edilmesi gerekecektir.

Kayıt ile ilgili kısmı yeni SaveMemo fonksiyonu ile aşağıdaki şekilde de kullanabilirsiniz.

Kod: Tümünü seç

procedure TForm15.KaydetTimerTimer(Sender: TObject);
begin
  // Her ne kadar Timer ile kaydediliyor olsa da 
  // kayıt işleminin başarılı olduğunu bildirmekte fayda var
  if not SaveMemo(Memo1, 'H:\makale.txt') then
    Label1.Caption := 'Kayıt başarısız';
end;
ertank
Kıdemli Üye
Mesajlar: 1711
Kayıt: 12 Eyl 2015 12:45

Re: Memo içeriğini Kontrollü Kaydetme Yardım

Mesaj gönderen ertank »

brs yazdı: // Kaydetme Bölümü örnek:

Kod: Tümünü seç

procedure TForm1.kaydetTimer(Sender: TObject);
begin
if Bos_Alan < 10 then 
begin
SaveMemo(Memo1,'C:\makale.txt' )
end;
gibi yapabilirsiniz.
Yukarıdaki örnek çok doğru olmuyor. Şöyle ki;
- Sadece boş alan 10 byte'tan küçük olduğu zaman kayıt etme işlemini gerçekleştiriyor.
- Memo içinde kaydedilecek ifadenin boyutu kontrol edilmiyor. 10 byte'tan fazla olması durumunda kayıt işlemi yine başarısız olacaktır.
dkadir
Üye
Mesajlar: 40
Kayıt: 04 Oca 2014 06:44

Re: Memo içeriğini Kontrollü Kaydetme Yardım

Mesaj gönderen dkadir »

Sayın Hocalarım Değerli Yorumlarınız İçin Çok teşekkür ederim..
Her söylenileni bir bir yapıp dönüş yapacağım
Saygılarımla...
Kullanıcı avatarı
brs
Üye
Mesajlar: 626
Kayıt: 04 Eki 2012 03:52

Re: Memo içeriğini Kontrollü Kaydetme Yardım

Mesaj gönderen brs »

ertank yazdı:
brs yazdı: // Kaydetme Bölümü örnek:

Kod: Tümünü seç

procedure TForm1.kaydetTimer(Sender: TObject);
begin
if Bos_Alan < 10 then 
begin
SaveMemo(Memo1,'C:\makale.txt' )
end;
gibi yapabilirsiniz.
Yukarıdaki örnek çok doğru olmuyor. Şöyle ki;
- Sadece boş alan 10 byte'tan küçük olduğu zaman kayıt etme işlemini gerçekleştiriyor.
- Memo içinde kaydedilecek ifadenin boyutu kontrol edilmiyor. 10 byte'tan fazla olması durumunda kayıt işlemi yine başarısız olacaktır.

Selam, durumun farkındayım sadece arkadaşın sormuş olduğu soruyu cevapladım...
İşi bilen yardım eder, az bilen akıl verir, bilmeyen eleştirir, yapamayan ise çamur atar...
edo
Üye
Mesajlar: 40
Kayıt: 05 Haz 2005 11:12

Re: Memo içeriğini Kontrollü Kaydetme Yardım

Mesaj gönderen edo »

Biraz garip olacak ama yıl olmuş 2016, çoğu bilgisayarın kapasitesi 1 TeraByte'dan başlarken 10 bit ya da byte'ın hesabını yapmak biraz garip geldi bana. Bence bu kısım da ayrıca irdelenmeli :D
dkadir
Üye
Mesajlar: 40
Kayıt: 04 Oca 2014 06:44

Re: Memo içeriğini Kontrollü Kaydetme Yardım

Mesaj gönderen dkadir »

sorunu yanlış anladınız Timer1 var seçilen sürüye habre kayıt yapıyor ama sürücünün hafızası dolduğunda hatalarla kilitleniyor.
benim yapmak istediğim Timer2 Seçilen sürücüyü kontrol edip hafıza dolmaya yakın Timer1 i durduracak
edo
Üye
Mesajlar: 40
Kayıt: 05 Haz 2005 11:12

Re: Memo içeriğini Kontrollü Kaydetme Yardım

Mesaj gönderen edo »

Siz bir şeyleri yanlış ifade ediyor olabilir misiniz acaba?
dkadir
Üye
Mesajlar: 40
Kayıt: 04 Oca 2014 06:44

Re: Memo içeriğini Kontrollü Kaydetme Yardım

Mesaj gönderen dkadir »

ne gibi hocam anlamadım
Cevapla