Memo içeriğini Kontrollü Kaydetme Yardım
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
Memo içeriğini Kontrollü Kaydetme Yardım
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..
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..
Re: Memo içeriğini Kontrollü Kaydetme Yardım
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.
"İf surucuboyutu=0 then kaydetme " veya "while surucuboyu>dosyaboyutu "gibi basit bir sorgu içine kodlarınızı yazarsanız işinizi görecektir.
Re: Memo içeriğini Kontrollü Kaydetme Yardım
Mevcut kodu paylaşabilir misiniz?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..
Re: Memo içeriğini Kontrollü Kaydetme Yardım
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;
Re: Memo içeriğini Kontrollü Kaydetme Yardım
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;
İşi bilen yardım eder, az bilen akıl verir, bilmeyen eleştirir, yapamayan ise çamur atar...
Re: Memo içeriğini Kontrollü Kaydetme Yardım
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
şu şekilde yazıldığı zaman Pascal geleneklerine daha uygun olacaktır:
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.
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.
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.
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;
Kod: Tümünü seç
var
F: TextFile;
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;
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;
- Ö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;
Re: Memo içeriğini Kontrollü Kaydetme Yardım
Yukarıdaki örnek çok doğru olmuyor. Şöyle ki;brs yazdı: // Kaydetme Bölümü örnek:gibi yapabilirsiniz.Kod: Tümünü seç
procedure TForm1.kaydetTimer(Sender: TObject); begin if Bos_Alan < 10 then begin SaveMemo(Memo1,'C:\makale.txt' ) end;
- 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.
Re: Memo içeriğini Kontrollü Kaydetme Yardım
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...
Her söylenileni bir bir yapıp dönüş yapacağım
Saygılarımla...
Re: Memo içeriğini Kontrollü Kaydetme Yardım
ertank yazdı:Yukarıdaki örnek çok doğru olmuyor. Şöyle ki;brs yazdı: // Kaydetme Bölümü örnek:gibi yapabilirsiniz.Kod: Tümünü seç
procedure TForm1.kaydetTimer(Sender: TObject); begin if Bos_Alan < 10 then begin SaveMemo(Memo1,'C:\makale.txt' ) end;
- 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...
Re: Memo içeriğini Kontrollü Kaydetme Yardım
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 

Re: Memo içeriğini Kontrollü Kaydetme Yardım
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
benim yapmak istediğim Timer2 Seçilen sürücüyü kontrol edip hafıza dolmaya yakın Timer1 i durduracak
Re: Memo içeriğini Kontrollü Kaydetme Yardım
Siz bir şeyleri yanlış ifade ediyor olabilir misiniz acaba?
Re: Memo içeriğini Kontrollü Kaydetme Yardım
ne gibi hocam anlamadım