Avatar billede spiritusanta Nybegynder
13. januar 2004 - 00:20 Der er 28 kommentarer og
1 løsning

Brug af ini-filer

Jeg arbejder i Borland C++ Builder 5.

Da jeg nu vil til at arbejde med ini-filer, ville jeg høre om der var en, der kunne give mig et simpelt eksempel på, hvordan man skriver og henter data ud af inifiler?

Mvh Spirit
Avatar billede bertelbrander Novice
13. januar 2004 - 00:46 #1
Vil du arbejde med ini-filer eller med registrerings data-basen?

.ini-filer er man (mere eller mindre) gået bort fra.

Hvis du vil arbejde med registreringsdatabasen kan du starte med at tage et kik her:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/registry_functions.asp
Avatar billede spiritusanta Nybegynder
13. januar 2004 - 00:52 #2
Det er ini filer jeg vil arbejde med.... men ved ikke om der findes et alternativ ud over databaser, som jeg ikke vil bruge i denne sammenhæng.

Men programmet skal gøre følgende:
Brugeren går ind i indstillinger.
Indtaster stien til en mappe, hvor en række filer er gemt.
Programmet skal gemme denne oplysning.
Næste gang brugeren åbner programmet, vil han ved at klikke på en knap komme ind i den mappe, som han angav under instillinger.
Avatar billede squashguy Nybegynder
13. januar 2004 - 00:54 #3
Tag et kig på TIniFile

Den er dejlig nem
Avatar billede spiritusanta Nybegynder
13. januar 2004 - 00:57 #4
Har læst lidt på det.... men forstår ikke hvordan det fungere, nok bare mig :p

Men kunne du ikke give mig et hurtigt eksempel på hvordan programkode og inifil skal se ud?
Avatar billede bertelbrander Novice
13. januar 2004 - 01:01 #5
Et lille program der bruger "standard" Win32Api.
Første gang det kører skal det gerne skrive:

Failed to read value
Did write value

Derefter skal det skrive:

Got Value: 1
Did write value

Tallet efter Got Value skal derefter tælle en op hver gang programmet køres.

#include <windows.h>
#include <iostream.h>

int main(void)
{
  HKEY hKey;
  DWORD Value = 0;

  // Try to read
  if(RegOpenKey(HKEY_CURRENT_USER, "Software\\MyCompany\\MyApp", &hKey) == ERROR_SUCCESS)
  {
    DWORD Type = REG_DWORD, Size = sizeof(DWORD);
    RegQueryValueEx(hKey, "Value", 0, &Type, (BYTE *)&Value, &Size);
    cout << "Got Value: " << Value << endl;
  }
  else
    cout << "Failed to read value" << endl;

  // Try to save the Value
  if(RegCreateKeyEx(HKEY_CURRENT_USER, "Software\\MyCompany\\MyApp", 0, 0, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, 0, &hKey, 0) == ERROR_SUCCESS)
  {
    Value++;
    RegSetValueEx(hKey, "Value", 0, REG_DWORD, (BYTE *)&Value, sizeof(Value));
    cout << "Did write value" << endl;
  }
  else
    cout << "Failed to write value" << endl;

  return 0;
}
Avatar billede spiritusanta Nybegynder
13. januar 2004 - 01:04 #6
Ved ikke hvordan det skal indsættes, når man bruger Borland C++ Builder 5
Avatar billede spiritusanta Nybegynder
13. januar 2004 - 01:04 #7
Men bare et hurtigt eksempel til hvordan man benytter ini-filer i Borland C++ Bulder 5
Avatar billede bertelbrander Novice
13. januar 2004 - 01:06 #8
Man kan indsætte vha. Copy&Paste ;-)

Der bør iøvrigt være en RegCloseKey(hkey); når man er færdig med nøglen.
Avatar billede bertelbrander Novice
13. januar 2004 - 01:11 #9
Du bruger RegOpenKey() og RegQueryValueEx til at læse en værdi, i eksemplet en DWORD (en int/long).

Du bruger RegCreateKeyEx() og RegSetValueEx() til at gemme den.

Du retter så sti'en ("Software\\MyCompany\\MyApp") så den passer til dit formål.
Avatar billede spiritusanta Nybegynder
13. januar 2004 - 01:14 #10
Ved stadig ikke hvor jeg skal indsætte koden.... og vil nu også hellere her i begyndelsen benytte mig af simple ini-filer.
Avatar billede bertelbrander Novice
13. januar 2004 - 01:21 #11
Jeg kender ikke din applikation, men hvis den ligner andre Builder applikationer kan du indsætte læsning i din "TForm1::TForm1()" og så finde et passende sted at skrive.

Hvis du har en WinMain() kan du læse i starten og skrive i slutningen.

Jeg tror ikke ini-filer er simplere. Men du kan måske finde noget om TIniFile som squashguy skrev.
Avatar billede spiritusanta Nybegynder
13. januar 2004 - 01:24 #12
Problemet er bare, at når jeg copy paster det, opstår der en lang række fejl i rwstderr.h .... og jeg er nu ikke mester i c++ endnu
Avatar billede spiritusanta Nybegynder
13. januar 2004 - 01:25 #13
har også læst om TTniFile.... men er lidt svært at forstå lige pt. så hvis der var en der kunne komme med et meget simpelt eksempel på læsning og skrivning til en sådan fil ville det være rart :)
Avatar billede bertelbrander Novice
13. januar 2004 - 01:26 #14
Hvis du copierer det skal du ikke inkludere iostream.h (og sansynligvis heller ikke windows.h) og du skal fjerne "cout << ...."

En hurtig søgning på google fandt denne om TIniFile:

http://www.functionx.com/bcb/howto/inifile.htm
Avatar billede squashguy Nybegynder
13. januar 2004 - 01:26 #15
#include <inifiles.hpp>

TIniFile *ini;
ini = new TIniFile("test.ini");

ini->WriteInteger("sektion", "en integer", 2004);
ini->WriteString("sektion", "en string", "hello world");
ini->WriteBool("en anden sektion", "en boolean", true);

int myint = ini->ReadInteger("sektion", "en integer", 100); // 100 er standard, hvis "en integer" ikke er tilstede
AnsiString mystr = ini->ReadString("sektion", "en string", "default streng");
bool mybool = ini->ReadBool("en anden sektion", "en boolean", true);

delete ini;
Avatar billede spiritusanta Nybegynder
13. januar 2004 - 01:39 #16
Hmm det ser jo meget spændende ud bertelbrander, tror jeg vil læse på det i morgen.... er ved at være træt :) .. men det ser bestemt brugbart ud.

Et spørgsmål til dig squashguy, den kode du gav mig virker :), men ini-filen bliver gemt i windows-mappen.. er det ikke muligt at gemme den et andet sted på harddisken.
Har forsøgt at ændre
ini = new TIniFile("test.ini");
til
ini = new TIniFile("c:\test.ini");
Men bliver stadig gemt i mappen windows
Avatar billede squashguy Nybegynder
13. januar 2004 - 01:42 #17
du skal blot huske at escape din streng korrekt:

ini = new TIniFile("c:\\test.ini");
Avatar billede squashguy Nybegynder
13. januar 2004 - 01:50 #18
ini = new TIniFile(ChangeFileExt(Application->ExeName, ".ini"));

så vil den ligge i samme bibliotek som dit program, og hedde program.ini
Avatar billede spiritusanta Nybegynder
13. januar 2004 - 01:57 #19
Skulle ellers lige til at takke af for idag.... men med det nye indlæg du lige har skrevet, har jeg et spørgsmål mere.. nu når jeg gemmer filen på den måde gemmes den i samme bibliotek som programmet, men samtidig kommer filen også til at hedde project2.ini... hvis jeg nu gerne vil have filen til at hedde test.ini igen, men stadig gemmes i det samme bibliotek som programmet, hvad gør jeg så?
Avatar billede squashguy Nybegynder
13. januar 2004 - 02:00 #20
ini = new TIniFile(ExtractFilePath(Application->ExeName) + "test.ini");
Avatar billede spiritusanta Nybegynder
13. januar 2004 - 02:03 #21
Smart nok... sikke klog man er blevet i løbet af natten :D
Jeg er ved at være træt, så vil takke af for i aften... men i skal have mange tak for hjælpen begge 2... vil arbejde videre på mit lille program i morgen :)
Avatar billede spiritusanta Nybegynder
13. januar 2004 - 15:26 #22
Mange tak for hjælpen til jer begge :D
Nu mangler vi bare at i lægger et svar hver især.

Har lavet mit eget lille ini-testprogram i ini filer, som jeg skal bruge til et større program.... her er sourcen:
==============================================
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include <inifiles.hpp>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
TIniFile *ini;
ini = new TIniFile(ExtractFilePath(Application->ExeName) + "test.ini");
ini->WriteString("Tekst", "skriv", Edit1->Text);
delete ini;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
TIniFile *ini;
ini = new TIniFile(ExtractFilePath(Application->ExeName) + "test.ini");
Edit2->Text = ini->ReadString("Tekst", "skriv", "");
delete ini;
}
//---------------------------------------------------------------------------
Avatar billede bertelbrander Novice
13. januar 2004 - 21:00 #23
Jeg forsøger at undgå point.
Avatar billede spiritusanta Nybegynder
13. januar 2004 - 23:12 #24
naa du har du hjulpet lidt :)
Avatar billede squashguy Nybegynder
13. januar 2004 - 23:37 #25
kom nu bertelbrander, du ved jo du godt vil..
Avatar billede spiritusanta Nybegynder
13. januar 2004 - 23:38 #26
skal vi lige give ham til kl 18:00 i morgen ;)
Avatar billede squashguy Nybegynder
13. januar 2004 - 23:50 #27
Jeg er desværre bare bange for, at han kun samler på frimærker :)
Avatar billede spiritusanta Nybegynder
18. januar 2004 - 00:53 #28
hmm han smed ikke noget svar, så du får point'ne Squashguy :)
Tak for hjælpen til jer begge
Avatar billede spiritusanta Nybegynder
18. januar 2004 - 00:53 #29
ups sådan :p
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester