p := 0; k := 0; ini.ReadInteger('mon', '10', p); // возвращает p = 1000 k := strtoint(edit11.Text); // edit11.Text = 12 p := p + k; ini.WriteString('mon', '10', inttostr(p)); //по идее записаться должно 1012 

The problem is that writing to the ini-file is done without adding variables, that is, 1000.

Help to understand, please.

Added.

 procedure tform1.FormCreate(Sender: TObject); begin ini := TIniFile.Create('./set.ini') // ini.WriteString('mon', '10', '7531'); работает отлично, но после //этого значение не изменяется при новом вводе end; procedure tform1.Button1Click(Sender: TObject); var p,k:i integer; begin p := 0; k := 0; ini.ReadInteger('mon', '10', p); k := strtoint(edit11.Text); p:= p + k; ini.WriteString('mon', '10', inttostr(p)); end; procedure tform1.FormClose(Sender: TObject); begin ini.Free; end. 

In general, such a code.

Added.

I tried your way, that's what happened:

 procedure TForm2.Button7Click(Sender: TObject); var po, ki, toc: integer; begin if edit6.Text <> '' then begin po := 0; ki := 0; ini := TIniFile.Create('./settings.ini'); ini.ReadInteger('Купюры', '5000', po); ini.Free; ki := strtoint(edit6.Text); toc := po + ki; ini := TIniFile.Create('./settings.ini'); ini.WriteString('Купюры', '5000', inttostr(toc)); ini.Free end else begin MessageDlg('Сначала введите количество купюр.', mtError, [mbOk], 0); edit6.Clear; edit6.SetFocus; end; if edit7.Text <> '' then begin po := 0; ki := 0; ini := TIniFile.Create('./settings.ini'); ini.ReadInteger('Купюры', '1000', po); ini.Free; ki := strtoint(edit7.Text); toc := po + ki; ini := TIniFile.Create('./settings.ini'); ini.WriteString('Купюры', '1000', inttostr(toc)); ini.Free end else begin MessageDlg('Сначала введите количество купюр.', mtError, [mbOk], 0); edit7.Clear; edit7.SetFocus; end; if edit8.Text <> '' then begin po := 0; ki := 0; ini := TIniFile.Create('./settings.ini'); ini.ReadInteger('Купюры', '500', po); ini.Free; ki := strtoint(edit8.Text); toc := p + k;//разобрался, надо было изменить переменные на po и ki ini := TIniFile.Create('./settings.ini'); ini.WriteString('Купюры', '500', inttostr(toc)); ini.Free end else begin MessageDlg('Сначала введите количество купюр.', mtError, [mbOk], 0); edit8.Clear; edit8.SetFocus; end; if edit9.Text <> '' then begin po := 0; ki := 0; ini := TIniFile.Create('./settings.ini'); ini.ReadInteger('Купюры', '100', po); ini.Free; ki := strtoint(edit9.Text); toc := po + ki; ini := TIniFile.Create('./settings.ini'); ini.WriteString('Купюры', '100', inttostr(toc)); ini.Free end else begin MessageDlg('Сначала введите количество купюр.', mtError, [mbOk], 0); edit9.Clear; edit9.SetFocus; end; if edit10.Text <> '' then begin po := 0; ki := 0; ini := TIniFile.Create('./settings.ini'); ini.ReadInteger('Купюры', '50', po); ini.Free; ki := strtoint(edit10.Text); toc := po + ki; ini := TIniFile.Create('./settings.ini'); ini.WriteString('Купюры', '50', inttostr(toc)); ini.Free end else begin MessageDlg('Сначала введите количество купюр.', mtError, [mbOk], 0); edit10.Clear; edit10.SetFocus; end; if edit11.Text <> '' then begin po := 0; ki := 0; ini := TIniFile.Create('./settings.ini'); ini.ReadInteger('Купюры', '10', po); ini.Free; ki := strtoint(edit11.Text); toc := po + ki; ini := TIniFile.Create('./settings.ini'); ini.WriteString('Купюры', '10', inttostr(toc)); ini.Free end else begin MessageDlg('Сначала введите количество купюр.', mtError, [mbOk], 0); edit11.Clear; edit11.SetFocus; end; ini := TIniFile.Create('./settings.ini'); label18.Caption := '5000 = ' + ini.ReadString('Купюры', '5000', '') + ' шт.'; label19.Caption := '1000 = ' + ini.ReadString('Купюры', '1000', '') + ' шт.'; label20.Caption := '500 = ' + ini.ReadString('Купюры', '500', '') + ' шт.'; label21.Caption := '100 = ' + ini.ReadString('Купюры', '100', '') + ' шт.'; label22.Caption := '50 = ' + ini.ReadString('Купюры', '50', '') + ' шт.'; label23.Caption := '10 = ' + ini.ReadString('Купюры', '10', '') + ' шт.'; ini.Free; end; 

actually nothing happened. moreover, the problem remains (it does not add the amount, but only the value entered into the edit), so one was added - no matter how many entered into edit8, the file 500 = 0 is still

I am learning, so do not judge strictly my code.

waiting for help! :)

  • And why do you think that the new value is recorded in general, and does not remain the same as it was first? You show the whole code, please, where is your ini.Free going on or something else? Does the same work if, after ini.Create you do not do ReadInteger , and immediately WriteString with some special number, such as 7531 ? - RodionGork
  • Added to the question. - Vladimir Archi
  • @ Vladimir Archi Use the correct code formatting: four spaces (tab) before each line. - Nicolas Chabanovsky

3 answers 3

Replace

 ini.ReadInteger('mon', '10', p); 

on

 p:= ini.ReadInteger('mon', '10', p); 

you have the same value is read, but not assigned to p , despite the comment //возвращает p = 1000 .

    You have Create, WriteString and Free all in different methods. I hope you call them correctly ... But in general, I suspect that it is worth trying to do everything at once when you click, re-initializing the file before recording:

     ... ini.Create ini.ReadInteger ini.Free ... ini.Create ini.WriteString ini.Free ... 

    If it fails here, try writing to another line (say, mooon) and also checking that k is not zero after the conversion ... Although I think you have already checked.

    • Creating, reading and releasing an object is not required to be in the same method. And it is wasteful to create / release it every time you access an ini-file. - Nofate

    Your code will result in an exception if you try to close the program without pressing the button. So how do you create by pressing the button and clear on exit.

    here two decisions or free to do in onClick or create to do in OnCreate

    Another note is that the parameter of the type Integer is stored as a String. You read the parameter as an Integer and write as a String

    you either read it as a String and write it WriteString or read it as an Integer and write it WriteInteger

    • Well, they are stored there in any case as strings. But the one who will read this will certainly not please ) - Nofate
    • I have not used INI for a long time, but in my opinion when creating a type there it is assigned, and written after fries. So if you already suffer with such a perversion, then you create it, read how the number was closed. - SoftR