Program Açılışında Label Değerlerim Değişmesin

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
ufb1453
Üye
Mesajlar: 52
Kayıt: 14 Oca 2014 09:41
İletişim:

Program Açılışında Label Değerlerim Değişmesin

Mesaj gönderen ufb1453 » 06 Oca 2017 12:27

Selamın Aleyküm

Aşağıda belirtilen koda göre yapmak istediğim label7 de yazan son değeri label 9 atmak programı çalıştırdığımda label 9 a bulunan değeri label 7 ye atmak, kısacası numaranın kaldığım yerden devam etmesini istiyorum, ancak programı kapattığımda yine en başa dönüp
label7 ve label9 un caption ları 0(sıfır) oluyor, bunu aşmak için nasıl bir yol izlemem gerekir

saygılarımla,

Kod: Tümünü seç

procedure TForm31.BitBtn1Click(Sender: TObject);
 var
  bas: tbitbtn;
  say: integer;
begin
  say:=StrToInt(label7.Caption);
  bas:= sender as tbitbtn    ;
   if bas.Name='BitBtn1' then
     begin
      say:=say+1;
      label7.Caption:=(IntToStr(StrToInt(Label7.Caption)+1));
     end;

 end;


procedure TForm31.Edit5Exit(Sender: TObject);
begin
edit5.Text:=label5.Caption+'-'+label6.Caption+'-'+(IntToStr(StrToInt(Label7.Caption)+1));
end;



procedure TForm31.FormClose(Sender: TObject; var Action: TCloseAction);
begin
   label9.Caption:=label7.Caption;
end;

procedure TForm31.FormCreate(Sender: TObject);
begin

 label7.Caption:=label9.Caption;
 edit5.Text:=label5.Caption+'-'+label6.Caption+'-'+(IntToStr(StrToInt(Label7.Caption)+1));

end;

Kullanıcı avatarı
hi_selamlar
Üye
Mesajlar: 523
Kayıt: 05 May 2005 02:24
Konum: DelphiTürkiye.COM

Re: Program Açılışında Label Değerlerim Değişmesin

Mesaj gönderen hi_selamlar » 06 Oca 2017 08:04

Merhaba,

Programı kapattığınız da veriyi (kaldığı numarayı) bir yere kayıt etmeniz gerekli.
Forumda *INI* işlemlerini arattırın.

Çıkışta ini dosyasına kayıt yapın veriyi.
Açılışta ini'den okutun ve devam edin işlemlerinize.
Herkes cahildir, bazi konularda.

ertank
Üye
Mesajlar: 1253
Kayıt: 11 Eyl 2015 11:45

Re: Program Açılışında Label Değerlerim Değişmesin

Mesaj gönderen ertank » 06 Oca 2017 08:36

Merhaba,

@hi_selamlar verdiği cevaba istinaden, az önce cevapladığım konuda INI dosya kullanımı örneği olan bir uygulama ekledim cevabın içine. Bu örnekten yola çıkarak sizde Label.Caption bilgilerini INI dosyası içinde saklamayı nasıl yapabileceğiniz ile ilgili fikir edinebilirsiniz.
viewtopic.php?f=2&t=36444#p196637

ufb1453
Üye
Mesajlar: 52
Kayıt: 14 Oca 2014 09:41
İletişim:

Re: Program Açılışında Label Değerlerim Değişmesin

Mesaj gönderen ufb1453 » 07 Oca 2017 12:05

Merhaba

Burada hatalı olan durum nedir acaba ini dosyasını kaydetmiyor hata da vermiyor, teşekkürler,

Kod: Tümünü seç

procedure TForm32.FormClose(Sender: TObject; var Action: TCloseAction);
var
x:integer;
begin
      x:=StrToInt(label7.Caption);
      INIDosya := TINIFile.Create( ExtractFilePath(Application.ExeName)+'SETTINGS.INI');
      INIDosya.WriteInteger('ayar','sondeger',x);
      INIDosya.Free;
end;

procedure TForm32.FormCreate(Sender: TObject);
var
x : integer;
begin
  INIDosya:= TINIFile.Create( ExtractFilePath(Application.ExeName)+'SETTINGS.INI');
  x := INIDosya.ReadInteger('ayar','sondeger',0);
  label7.Caption:=IntToStr(x);
  INIDosya.Free;
  edit5.Text:=label5.Caption+'-'+label6.Caption+'-'+(IntToStr(StrToInt(Label7.Caption)+1));

end;

3ddark
Üye
Mesajlar: 76
Kayıt: 14 Eyl 2010 09:55
Konum: İstanbul

Re: Program Açılışında Label Değerlerim Değişmesin

Mesaj gönderen 3ddark » 07 Oca 2017 09:32

Windows üzerinde bazı işlemleri yaparken dikkat etmeniz gereken bazı durumlar olabiliyor.
Windows XP den sonraki sürümlerde güvenlik mekanizması ile Windows un kurulu olduğu sürücü içine veya sistem klasörlerinin içine dosya oluşturma, silme, düzenleme sırasında yönetici izni/yetkisi ile işleme izin veriyor.

Kodda sorun olmadığını düşünüyorsanız uygulamayı birde yönetici aç diyerek deneyin veya Projenizi Windows un kurulu olduğu sürücü haricinde bir yerde çalıştırın/ Windows kullanıcısının içindeki belgeler masaüstü gibi aktif kullanıcının izni olan dizinlerde çalıştırmayı deneyin.
PostgreSQL - Delphi - Linux :!:

Kullanıcı avatarı
yhackup
Üye
Mesajlar: 114
Kayıt: 09 Ağu 2014 08:09
İletişim:

Re: Program Açılışında Label Değerlerim Değişmesin

Mesaj gönderen yhackup » 07 Oca 2017 11:49

ufb1453 yazdı:Merhaba

Burada hatalı olan durum nedir acaba ini dosyasını kaydetmiyor hata da vermiyor, teşekkürler,

Kod: Tümünü seç

procedure TForm32.FormClose(Sender: TObject; var Action: TCloseAction);
var
x:integer;
begin
      x:=StrToInt(label7.Caption);
      INIDosya := TINIFile.Create( ExtractFilePath(Application.ExeName)+'SETTINGS.INI');
      INIDosya.WriteInteger('ayar','sondeger',x);
      INIDosya.Free;
end;

procedure TForm32.FormCreate(Sender: TObject);
var
x : integer;
begin
  INIDosya:= TINIFile.Create( ExtractFilePath(Application.ExeName)+'SETTINGS.INI');
  x := INIDosya.ReadInteger('ayar','sondeger',0);
  label7.Caption:=IntToStr(x);
  INIDosya.Free;
  edit5.Text:=label5.Caption+'-'+label6.Caption+'-'+(IntToStr(StrToInt(Label7.Caption)+1));

end;



INIDosya:= TINIFile.Create( ExtractFilePath(Application.ExeName)+'SETTINGS.INI');

bu şekilde dener misiniz

INIDosya:= TINIFile.Create( ExtractFilePath(Application.ExeName)+'ini');
Çaylak Delphici :D

Yakup ULUTAŞ

ufb1453
Üye
Mesajlar: 52
Kayıt: 14 Oca 2014 09:41
İletişim:

Re: Program Açılışında Label Değerlerim Değişmesin

Mesaj gönderen ufb1453 » 07 Oca 2017 06:32

yhackup hocam dediğiniz gibi yaptım sonuç aynı, 3ddark hocam yetkilerde sorun yok ertank hocamın verdiği örnekte config dosyası oluşturuyor ancak belirttiğim kodlarda çalışmadı

Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2167
Kayıt: 12 Haz 2003 03:05
Konum: merkez camii yanı

Re: Program Açılışında Label Değerlerim Değişmesin

Mesaj gönderen freeman35 » 07 Oca 2017 07:53

var GlobalSayi: Integer;
procedure TForm31.BitBtn1Click(Sender: TObject);
var
bas: tbitbtn;
say: integer;
begin
say:=StrToInt(label7.Caption);
bas:= sender as tbitbtn; --> BitBtn1Click i başka yerden tetikletmeyeceksen bunlara ne gerek var ?
if bas.Name='BitBtn1' then
begin
say:=say+1;
label7.Caption:=(IntToStr(StrToInt(Label7.Caption)+1)); --> bukadar dolanmaya ne gerek var ?
label7.Tag:= label7.Tag +1;
label7.Caption:=(IntToStr(label7.Tag)); Tag yerine glabal değişkende aynı işi görür
GlobalSayi:= Inc(GlobalSayi, 1);
label7.Caption:=(IntToStr(GlobalSayi));

end;
end;

procedure TForm31.FormClose(Sender: TObject; var Action: TCloseAction);
begin
label9.Caption:=label7.Caption;
--> formu kapatırken label9.Caption a yazdığın bilgi nerede saklanacak?
end;

procedure TForm31.FormCreate(Sender: TObject);
begin
label7.Caption:=label9.Caption; --> label9.Caption da design time da ne varsa burda o çıkar, close eventinde yazdığın değer değil
edit5.Text:=label5.Caption+'-'+label6.Caption+'-'+(IntToStr(StrToInt(Label7.Caption)+1));
end;
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!

ufb1453
Üye
Mesajlar: 52
Kayıt: 14 Oca 2014 09:41
İletişim:

Re: Program Açılışında Label Değerlerim Değişmesin

Mesaj gönderen ufb1453 » 07 Oca 2017 08:12

freeman35 hocam vermiş olduğunuz eğitimsel bilgi için teşekkür ederim, esasında yapmak istediğim; label7 de yer alan değer örneğin 40 ta kaldı, program kapanıp açıldığında captionun 40 dan devam etmesi ertank hocamın vermiş olduğu örneğe göre denedim ancak, hata da vermedi ama kayıt da etmiyor, şimdiden ilginiz için teşekkür ederim

ertank
Üye
Mesajlar: 1253
Kayıt: 11 Eyl 2015 11:45

Re: Program Açılışında Label Değerlerim Değişmesin

Mesaj gönderen ertank » 07 Oca 2017 08:25

ufb1453 yazdı:Merhaba

Burada hatalı olan durum nedir acaba ini dosyasını kaydetmiyor hata da vermiyor, teşekkürler,

Kod: Tümünü seç

procedure TForm32.FormClose(Sender: TObject; var Action: TCloseAction);
var
x:integer;
begin
      x:=StrToInt(label7.Caption);
      INIDosya := TINIFile.Create( ExtractFilePath(Application.ExeName)+'SETTINGS.INI');
      INIDosya.WriteInteger(Section, Key, x);
      INIDosya.Free;
end;

procedure TForm32.FormCreate(Sender: TObject);
var
x : integer;
begin
  INIDosya:= TINIFile.Create( ExtractFilePath(Application.ExeName)+'SETTINGS.INI');
  x := INIDosya.ReadInteger('ayar','sondeger',0);
  label7.Caption:=IntToStr(x);
  INIDosya.Free;
  edit5.Text:=label5.Caption+'-'+label6.Caption+'-'+(IntToStr(StrToInt(Label7.Caption)+1));

end;
- Aynı prosedür/fonksiyon içinde Free() edilecek bir bileşeni prosedür/fonksiyon değişkeni olarak tanımlamakta fayda var. Örnek uygulama Form zçık olduğu sürece INI dosyası içine veri yazacağı için FormCreate() olayında oluşturulup FormDestroy() olayında Free() ediliyordu. Yazmak için her defasında tekrar tekrar dosya açma işlemini yapmamak için böyle bir kullanım var.

Sizin örnek gönderdiğiniz kod için böyle bir durum yok. Dolayısı ile prosedür/fonksiyon değişkeni tanımlayarak işlem yapmanız daha güzel olacaktır.

- Create() edilen bileşenleri aynı prosedür/fonksiyon içinde Free() edeceğimiz zaman hafıza kaçağını engellemek adına try..finally bloğu içinde kullanmalıyız. Böylece Free() edilene kadar bir hata oluşması durumunda bileşen Free() edilmiş olacak ve hafıza kaçağı olmayacaktır.

- "Form kapatıldığı zaman" bazı işlemler yapmak istiyorsanız FormDestroy() olayını kullanmak daha doğru olacaktır. FormClose() genellikle formun kapatılıp kapatılmamasına karar vermek için kullanılır. Dikkat ederseniz bu olayda sizin değiştirebileceğiniz TCloseAction tipinde bir Action değişkeni sunuluyor.

- Basit imla hatalarını engellemek adına INI dosya adı, Inı dosyası bölüm adı gibi bilgiler sabit değişkenler içinde saklanabilir.

Yukarıdaki maddelere uygun şekilde aşağıdaki gibi bir kod yazılabilir.

Form tip tanımı kısmı:

Kod: Tümünü seç

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
    const
      SECTION = 'AYAR';
      KEY = 'SonDeger';
      ININAME = 'SETTINGS.INI';

    var
      IniFileName: string;
  public
    { Public declarations }
  end;
FormCreate() olayı:

Kod: Tümünü seç

procedure TForm32.FormCreate(Sender: TObject);
var
  TempInteger: Integer;
  Ini: TIniFile;
begin
  IniFileName := ExtractFilePath(Application.ExeName) + ININAME;

  Ini := TINIFile.Create(IniFileName);
  try
    TempInteger := Ini.ReadInteger(Section, Key, 0);
  finally
    Ini.Free();
  end;

  Label7.Caption := IntToStr(TempInteger);
  Edit5.Text := Label5.Caption + '-' + Label6.Caption + '-' + (IntToStr(TempInteger + 1));
end;
FormDestroy() olayı:

Kod: Tümünü seç

procedure TForm32.FormDestroy(Sender: TObject);
var
  TempInteger: Integer;
  Ini: TIniFile;
begin
  if not TryStrToInt(Label7.Caption, TempInteger) then
  begin
    ShowMessage('Label7 bir tamsayı değil. Değeri saklanamıyor');
    Exit();
  end;

  Ini := TIniFile.Create(IniFileName);
  try
    Ini.WriteInteger(Section, Key, TempInteger);
  finally
    Ini.Free();
  end;
end;
Bu kod düzeltmeleri dışında dikkat etmeniz gereken nokta Form32'nin ne zaman Create() edilip ne zaman Free() (Destroy) edildiğidir. Zira siz formu otomatik oluşturuyor ve daha sonra Form32.Show() ve Form32.Hide() kullanarak ekranda gösteriyor iseniz bu durumda kodları OnShow() ve OnHide() olaylarına yazmanız gerekecektir.

Ancak her durumda aşağıdaki satır OnCreate() olayı içinde kalmalıdır.

Kod: Tümünü seç

  IniFileName := ExtractFilePath(Application.ExeName) + ININAME;

ufb1453
Üye
Mesajlar: 52
Kayıt: 14 Oca 2014 09:41
İletişim:

Re: Program Açılışında Label Değerlerim Değişmesin

Mesaj gönderen ufb1453 » 07 Oca 2017 10:22

hepinize verdiğiniz değerli bilgiler için teşekkür ederim sorunum giderilmiştir.

Cevapla