Results 1 to 9 of 9

Thread: Opslaan van TEdit.Text in een Inifile

  1. #1

    Opslaan van TEdit.Text in een Inifile

    Hoi,

    Het gebeurt wel eens dat je instellingen in een applicatie wil opslaan in een inifile, ook zo voor strings in TEdits.
    Dit kan je gemakkelijk zo doen in het "OnChange" event van je editbox:
    Code:
    procedure TMainForm.Edit1Change(Sender: TObject);
    begin
      WriteStringToIniFile('Section', 'Value', Edit1.Text);
    end;:p
    Deze zeer gemakkelijke methode heeft wel als nadeel dat, iedere keer je een teken intikt, de volledige string naar de inifile geschreven wordt. Als je lokaal op je eigen PC werkt is dat normaal geen probleem, maar dat wordt het wel als je inifile op een netwerkdrive staat.

    Een betere oplossing is het te doen in het "OnExit" event van de editbox:
    Code:
    procedure TMainForm.Edit1Exit(Sender: TObject);
    begin
      WriteStringToIniFile('Sction', 'Value', Edit1.Text);
    end;
    Nu wordt er enkel geschreven als je de Editbox "verlaat" (bv als je een andere control aanklikt na de editbox aangeklikt te hebben), niet als je de tekst erin wijzigt.
    Echter, nu is het probleem dat de string niet weggeschreven wordt als je je applicatie verlaat door het aanklikken van de "x" rechtsboven.
    (Een bijverschijnsel is dat je string weggeschreven wordt bij het verlaten van je editbox, ook als je hem niet gewijzigd hebt, maar dat is een veel kleiner probleem).
    De string wordt wel weggeschreven als je je applicatie verlaat met bv een "Exit" button.

    Om het "x" probleem op te lossen doe je het volgende in het "OnCloseQuery" event van je form:
    Code:
    procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    begin
      ActiveControl := ExitButton; // een willekeurige andere control
    end;
    Door voor de activecontrol een willekeurige andere control te nemen "verlaat" je je editbox en wordt de string weggeschreven.

    Veel plezier.

  2. #2
    notice-itter SvG's Avatar
    Join Date
    Apr 2002
    Location
    's-Hertogenbosch
    Posts
    4,865
    Is het dan niet net zo makkelijk het allemaal in het OnDestroy event te doen?
    !

  3. #3

    Re: Opslaan van TEdit.Text in een Inifile

    Originally posted by Dany
    Nu wordt er enkel geschreven als je de Editbox "verlaat" (bv als je een andere control aanklikt na de editbox aangeklikt te hebben), niet als je de tekst erin wijzigt.
    Niet volledig juist, OnExit wordt enkel uitgevoerd als er een TWincontrol de focus krijgt. Zet maar eens een TEdit en een TSpeedbutton op je form. OnExit wordt nooit aangeroepen, dat komt omdat TSpeedbutton geen TWincontrol is en dus niet de focus kan krijgen --> de focus blijft op de edit staan.
    DeX 3 Delphi := The ease of VB with the power of C; Zoekt en gij zult vinden

  4. #4
    Volgens mij krijg je ook geen OnExit als je bijvoorbeeld het form sluit ookal verliest de edit dan wel degelijk focus.
    1+1=b

  5. #5

    Re: Opslaan van TEdit.Text in een Inifile

    Dat zei Dany ook
    Originally posted by Dany
    Echter, nu is het probleem dat de string niet weggeschreven wordt als je je applicatie verlaat door het aanklikken van de "x" rechtsboven.
    DeX 3 Delphi := The ease of VB with the power of C; Zoekt en gij zult vinden

  6. #6
    Hoi,

    Eigenlijk was mijn doel zo weinig mogelijk te schrijven naar de inifile zonder de code erg complex te maken.
    Het resultaat van de gepresenteerde methode is:
    1. dat er alleen iets weggeschreven wordt als je wel degelijk op een TEdit staat of stond (de kans bestaat dus dat je de tekst gewijzigd hebt),
    2. er ook iets weggeschreven wordt als je de tekst niet gewijzigd hebt (en regel 1 geldt) , maar dat neem ik erbij.

    Wegschrijven in het OnDestroy event schrijft altijd iets naar de inifile , er is dus geen regel 1. Is wel erg simpel natuurlijk.

    Voor ieder item (dat moet weggeschreven worden) een "Changed" boolean bijhouden (wat enkel zou resulteren in wegschrijven naar de inifile als de tekst werkelijk gewijzigd is) vond ik teveel overhead, vandaar de gepresenteerde methode.

  7. #7
    Voor ieder item (dat moet weggeschreven worden) een "Changed" boolean bijhouden
    Alle TCustomEdit afgeleiden hebben dit al --> Modified
    DeX 3 Delphi := The ease of VB with the power of C; Zoekt en gij zult vinden

  8. #8
    Fijn, dat wist ik niet.
    Dat zal natuurlijk al een hoop codeerwerk uitsparen. Ik kijk even of dat, in combinatie met het "OnDestroy" voorstel van SvG, een minimum aan code oplevert.
    Bedankt!

  9. #9
    Hoi,

    Ik heb uiteindelijk het volgende gemaakt dat gebruik maakt van de 'Modified' property en enkel een aanroep in "OnCreate" en "OnDestroy" vereist (zie suggestie SvG).
    De namen van de inifile section die gebruikt gaat worden geef je als parameter mee, de naam van de key is altijd de naam van het object.

    Voorbeeld van gebruik:
    Code:
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      ReadObjectFromIniFile('FileNames', DataFileEdit);
      ReadObjectFromIniFile('FileNames', DefinitionFileEdit);
      ReadObjectFromIniFile('FileNames', OutputFileEdit);
    end;
    
    procedure TForm1.FormDestroy(Sender: TObject);
    begin
      WriteObjectToIniFile('FileNames', DataFileEdit);
      WriteObjectToIniFile('FileNames', DefinitionFileEdit);
      WriteObjectToIniFile('FileNames', OutputFileEdit);
    end;
    De code zelf:
    (Voor de allerlaatste versie van de routines, zie: http://www.nldelphi.com/forum/showth...491#post120491 :unit "NLDSimpleIniFile".)
    Code:
    procedure TSimpleIniFile.WriteObject(Section: string; Obj: TObject);
    begin
      if Obj is TCheckBox then
      begin
        with Obj as TCheckBox do
        begin
          WriteBool(Section, Name, Checked);
        end;
      end;
    
      if Obj is TEdit then
      begin
        with Obj as TEdit do
        begin
          if Modified
          then WriteString(Section, Name, Text);
          Modified := false;
        end;
      end;
    
      if Obj is TLabeledEdit then
      begin
        with Obj as TLabeledEdit do
        begin
          if Modified
          then WriteString(Section, Name, Text);
          Modified := false;
        end;
      end;
    
    end;
    
    procedure TSimpleIniFile.ReadObject(Section: string; Obj: TObject);
    begin
      if Obj is TCheckBox then
      begin
        with Obj as TCheckBox do
        begin
          Checked := ReadBool(Section, Name, false);
        end;
      end;
    
      if Obj is TEdit then
      begin
        with Obj as TEdit do
        begin
          Text := ReadString(Section, Name, '');
          Modified := false;
        end;
      end;
    
      if Obj is TLabeledEdit then
      begin
        with Obj as TLabeledEdit do
        begin
          Text := ReadString(Section, Name, '');
          Modified := false;
        end;
      end;
    end;
    Momenteel zijn maar een beperkt aantal objecten ondersteund (die waar ik problemen mee had...)
    Merk op: de routines lezen en schrijven niet alle properties van het object, enkel de property die de user input of selectie bevat (bv het 'Text' veld voor TEdits).
    Last edited by Dany; 03-Jan-05 at 16:48.

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •