powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Пробую создать класс типа "IniFile"
15 сообщений из 15, страница 1 из 1
Пробую создать класс типа "IniFile"
    #34627490
1010100
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уфф, Всем доброго времени суток.

Вот хочу сделать класс типа IniFile, его функциональность просвечивается, это запись/чтение п а р а м е т р о в сохраняемых/считываемых с этого самого обычного текстового файла.

Класс типа Custom
Пока у него есть сырой метод Write, и свойство file_name

Проблемы с реализацией метода Write

И так...

код Write'a примерно таков (сижу не дома):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
*...
*Открытие файла, для чтения и записи ( 2 )

*Запись секции
*Запись строки в секцию

*Закрытие файла

*Пока примерно так

После этих операций получается вот такой гигант файл:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
[Section1]
Key =  0 
Key =  1 
Key =  2 
[Section2]
Key2 =  0 
Key2 =  1 
Key2 =  2 

Теперь проблема...

Вот есть у меня уже такие данные, теперь хочу добавить в [Section1] ключ Key = 3333
Должно получиться так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
[Section1]
Key =  0 
Key =  1 
Key =  2 
Key =  3333 
[Section2]
Key2 =  0 
Key2 =  1 
Key2 =  2 

При моем коде получается вот так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
[Section1]
Key =  0 
Key =  1 
Key =  2 
Key =  3333 
on2]      && бяка
Key2 =  0 
Key2 =  1 
Key2 =  2 

Я выложу в скором времени и код мой, но хотел просто узнать у Вас, как мне без всяких бяк вогнать в [Section1] ключ Key = 3333


Ну плин она просто затирает нижнюю часть, как бы Вы решили это, ну не получается, хотелось бы все это провернуть функциями Fxxxxx()
...
Рейтинг: 0 / 0
Пробую создать класс типа "IniFile"
    #34627597
crusnik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1010100

Я выложу в скором времени и код мой, но хотел просто узнать у Вас, как мне без всяких бяк вогнать в [Section1] ключ Key = 3333


Ну плин она просто затирает нижнюю часть, как бы Вы решили это, ну не получается, хотелось бы все это провернуть функциями Fxxxxx()
Читал бы в память. В ней родимой перестраивал и записывал бы обратно. И никаких проблем. Не такие уж большие ини-файлы обычно.
...
Рейтинг: 0 / 0
Пробую создать класс типа "IniFile"
    #34627701
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть готовые функции в WinAPI. Вот класс для работы со стандартными ini, а также возможностью сохранения типа данных:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
DEFINE CLASS clsini AS custom


	Height =  101 
	Width =  199 
	Name = "clsini"

	*-- Файл с параметрами
	PROTECTED cinifile


	*-- Установка имени ini-файла
	PROCEDURE setinifile
		lpara tcIniFile
		this.cIniFile = fullpath(tcIniFile)
	ENDPROC


	*-- Установка значения параметра
	PROCEDURE set
		lpara tuValue, tcKey, tcSection
		local lcS, lcCentury
		if empty(tcSection)
			tcSection = 'Common'
		endif

		if vartype(tuValue) = 'C'
			lcS = ''
		else
			lcS = '[' + vartype(tuValue) + '] '
		endif
		lcCentury = set('century')
		set century on
		do case
			case vartype(tuValue) = 'C'
				lcS = lcS + tuValue
			case vartype(tuValue) = 'D'
				lcS = lcS + dtoc(tuValue)
			case vartype(tuValue) = 'T'
				lcS = lcS + ttoc(tuValue)
			case vartype(tuValue) = 'L'
				lcS = lcS + iif(tuValue, 'TRUE', 'FALSE')
			case vartype(tuValue) = 'N'
				lcS = lcS + alltrim(str(tuValue, 20 , 9 ))
				do while .t.
					lcK = right(lcS, 1 )
					if lcK = Set('point') or lcK = '0'
						lcS = left(lcS, len(lcS) -  1 )
						if lcK = Set('point')
							exit
						endif
					else
						exit
					endif
				enddo
		endcase
		set century &lcCentury

		WritePrivateProfileString(tcSection, tcKey, lcS, this.cIniFile)
	ENDPROC


	*-- Получение значения параметра
	PROCEDURE get
		lpara tcKey, tcSection, tuDefault
		local lcVal, lnLen, lcType, luRet

		if parameters() <  3 
			tuDefault = ''
		endif
		if empty(tcSection)
			tcSection = 'Common'
		endif

		lcVal = space( 2000 )
		lnLen = GetPrivateProfileString(tcSection, tcKey, '', @lcVal,  2000 , fullpath(this.cIniFile))
		lcVal = left(lcVal, lnLen)

		if left(lcVal,  1 ) == '[' and substr(lcVal,  3 ,  2 ) == '] '
			lcType = substr(lcVal,  2 ,  1 )
			lcVal = substr(lcVal,  5 )
		else
			lcType = '*'
		endif
		do case
			case lcType == 'C'
				luRet = lcVal
			case lcType == 'D'
				luRet = ctod(lcVal)
			case lcType == 'T'
				luRet = ctot(lcVal)
			case lcType == 'N'
				luRet = ValWithPoint(lcVal)
			case lcType == 'L'
				luRet = (lcVal = 'TRUE')
			otherwise
				if empty(lcVal) and (vartype(tuDefault) != 'C' or !empty(tuDefault))
					luRet = tuDefault
					this.Set(luRet, tcKey, tcSection)
				else
					luRet = lcVal
				endif
		endcase
		return luRet
	ENDPROC


	PROCEDURE Init
		if type('glDeclareIniDll') = 'U'
			public glDeclareIniDll
			DECLARE INTEGER GetPrivateProfileString IN Win32API AS GetPrivateProfileString;
				String cSection,String cKey,String cDefault,String @cBuffer,;
				Integer nBufferSize, String cINIFile
			DECLARE INTEGER WritePrivateProfileString IN Win32API AS WritePrivateProfileString;
				String cSection,String cKey,String cValue,String cINIFile
		endif
		this.cIniFile = 'param.ini'
	ENDPROC


ENDDEFINE
...
Рейтинг: 0 / 0
Пробую создать класс типа "IniFile"
    #34627755
Рома Б.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Потрать время, разберись в api-функциях.

DECLARE INTEGER GetPrivateProfileString IN Win32API;
STRING @lpAppName, STRING @lpKeyName, STRING @lpDefault,;
STRING @ReturnedString, INTEGER nSize, STRING @lpFileName

А также WritePrivateProfileString и др.

Вызов:

LOCAL lcValue
lcValue = REPLICATE (' ', 254)
=GetPrivateProfileString (@gс_inisec_ИменаКомпьютеров, @gc_ini_СервисЦентр, '',;
@lcValue, 1024, @gc_File_ini)
lcValue = LEFT (lcValue, AT (CHR (0), lcValue) - 1) && Обязательно! Отсечение "пустоты".
lcValue = UPPER (lcValue)
IF NOT EMPTY (lcValue) THEN
&& Удалось считать из ini-файла
gc_ИмяКомпьютера_ДиректорСервисЦентра = lcValue
ENDIF

CLEAR DLLS
...
Рейтинг: 0 / 0
Пробую создать класс типа "IniFile"
    #34628688
1010100
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемые лисы, и за это большое спасибо, но я так тоже могу, просто хочется разобраться, как сделать через Fxxxxx()
...
Рейтинг: 0 / 0
Пробую создать класс типа "IniFile"
    #34628810
1010100Уважаемые лисы, и за это большое спасибо, но я так тоже могу, просто хочется разобраться, как сделать через Fxxxxx()
Файл = тот же массив символов/байт (только большой и на диске).
Поэтому, если хотите вставить что-то в середину файла, то необходимо позаботиться о переносе "хвоста" данных.
Т.е. алгоритм вставки строки в ini-файл должен быть следующий:
- найти место для вставки фрагмента в ini-файл
- остаток ("хвост") файла скопировать в память/другой (временный) файл
- записать фрагмент
- записать "хвост" в ini-файл...
...
Рейтинг: 0 / 0
Пробую создать класс типа "IniFile"
    #34629325
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1010100Уважаемые лисы, и за это большое спасибо, но я так тоже могу, просто хочется разобраться, как сделать через Fxxxxx()А зачем делать через Ж...() если есть готовые отлаженные функции? Конкретно эти идут начиная с Win95

Если ты думаешь что фоксовые файловые функции особенные, то разочарую, вот что реально вызывается:
VFPWinAPIfcreate() fopen() CreateFile()fget() fread() ReadFile()fput() fwrite() WriteFile()fclose() CloseHandle()
...
Рейтинг: 0 / 0
Пробую создать класс типа "IniFile"
    #34629456
Cyv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Велосипед изобретаем?

F1 -> Index -> ffc -> INI Access Foundation Class

HOME(1)+ "FFC\registry.vcx" -> oldinireg
...
Рейтинг: 0 / 0
Пробую создать класс типа "IniFile"
    #34629567
1010100
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем спасибо, успокоили...
...
Рейтинг: 0 / 0
Пробую создать класс типа "IniFile"
    #34629699
1010100
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дошел до дому =), и написал как подсказал Станислав С..кий
Всем саул
...
Рейтинг: 0 / 0
Пробую создать класс типа "IniFile"
    #34630188
1010100
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дорогие форумчане, а можно обсудить мой кривой код? может как нибудь по другому сделать?

переменная:
xxx - "адрес" секции от текущей позиции, т.е есть вернуться на xxx байт назад (-xxx) то вернемся к секции
ExistSector - секция существует в файле
ExistVariable - переменная (переменная = ключ) существует в секции
poz_vari - тоже что и xxx, но для переменной
stroka, stroka2 - временные переменные, считывание строк...
mas_x - "хвостовая" переменная
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
PARAMETERS sSection, sVariable, sKey as String

*SET STEP ON
=FSEEK(fff, 0 )
* Проверка существования секции и переменной
sSection = '['+sSection+']'
ExistSector   = .f.
ExistVariable = .f.
xxx= 0 
DO WHILE !FEOF(fff)
   stroka = ALLTRIM(FGETS(fff))
   xxx    = xxx+LEN(stroka)+ 2 
   IF stroka = sSection
      ExistSector = .t.
      EXIT
   ENDIF
ENDDO
IF ExistSector
   DO WHILE !FEOF(fff)
      stroka2 = ALLTRIM(FGETS(fff))
      poz_vari= LEN(stroka2)+ 2 
      
      vari = ALLTRIM(SUBSTR(stroka2, 1 , AT('=',stroka2)- 1 )) && с начала строки и до знака "="
      IF ALLTRIM(sVariable) == vari
         ExistVariable = .t.
         EXIT 
      ENDIF
      IF LEFT(stroka2, 1 ) = '[' AND RIGHT(stroka2, 1 ) = ']'
         =FSEEK( fff,-poz_vari, 1 )
         EXIT
      ENDIF
   ENDDO
ENDIF


* если есть секция но нет переменной
IF ExistSector AND NOT ExistVariable
   DO WHILE !FEOF(fff)
      stroka = ALLTRIM(FGETS(fff))
      xxx    = LEN(stroka)+ 2 
      IF LEFT(stroka, 1 ) = '[' AND RIGHT(stroka, 1 ) = ']'
         mas_x=stroka+CHR( 13 )+CHR( 10 )
         DO WHILE !FEOF(fff)
            stroka = ALLTRIM(FGETS(fff))
            xxx    = xxx + LEN(stroka)+ 2 
            mas_x=mas_x+stroka+CHR( 13 )+CHR( 10 )
         ENDDO
         =FSEEK(fff,-xxx, 1 ) 
         =FPUTS( fff, sVariable+' = '+sKey)
         =FWRITE(fff, mas_x)
         
         RETURN
      ENDIF
   ENDDO
   =FPUTS( fff, sVariable+' = '+sKey)
ENDIF

* если нет секции и нет переменной
IF NOT ExistSector AND NOT ExistVariable
   =FPUTS( fff, sSection)
   =FPUTS( fff, sVariable+' = '+sKey)
ENDIF

* если есть секция и есть переменная
IF ExistSector AND ExistVariable
mas_x=''
DO WHILE !FEOF(fff)
   stroka = ALLTRIM(FGETS(fff))
   poz_vari = poz_vari + LEN(stroka)+ 2 
   mas_x=mas_x+stroka+CHR( 13 )+CHR( 10 )
ENDDO
   poz_vari=poz_vari
   =FSEEK( fff,-poz_vari, 1 ) 
   =FPUTS( fff, sVariable+' = '+sKey)
   =FWRITE(fff, mas_x)
ENDIF
...
Рейтинг: 0 / 0
Пробую создать класс типа "IniFile"
    #34630898
1010100
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Неужели код такой мощный, что придраться не к чему? =)
наверное желания нет...
...
Рейтинг: 0 / 0
Пробую создать класс типа "IniFile"
    #34631204
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1010100Неужели код такой мощный, что придраться не к чему? =)
наверное желания нет...Наверно нет... Перевелись изобретатели велосипедов ...
Тебе же сказали как делать, а если ты решил сам себе создавать проблемы, то будь добр - преодолевай их самостоятельно.
...
Рейтинг: 0 / 0
Пробую создать класс типа "IniFile"
    #34631276
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1010100Неужели код такой мощный, что придраться не к чему? =)
наверное желания нет...
Если уж совсем хочется написать именно СВОЙ код, то придумай красивую, оболочку над WinAPI, которые привел тебе Рома Б и Dima T .
Поверь, там есть над чем поработать, а вот саму разборку INI-файл оставь операционной системе.
Это, разумеется, IMHO.
С уважением, Алексей.
...
Рейтинг: 0 / 0
Пробую создать класс типа "IniFile"
    #34633639
1010100
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот теперь все идеально, и запись и чтение и удаление и тд...и нету л а ж которые в коде наверху.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Пробую создать класс типа "IniFile"
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]