Форум: "Основная";
Текущий архив: 2004.05.16;
Скачать: [xml.tar.bz2];
ВнизКак выводить значение параметра ключа???(работа с регистром). Найти похожие ветки
← →
^G^ (2004-04-24 16:45) [0]Подскажите пожалуйста , как определять значение параметра ключа??
Я знаю что нужно как-то чтоб определялся тип, а затем выводился опред.ф-ей.
if regini.GetDataType(ListBox2.Items[index]) = rdString then ListBox3.Items[index] := regini.ReadString(ListBox1.Items[index],ListBox2.Items[index],"Default value");
+ для integer, uknow,ExpandString,rdBinary.Для каких типов и какие ф-и еще надо??
Если так правильно в чем может быть ошибка, если выводит постоянно неизвестное значение или 0 хотя должно быть число.
← →
Cobalt © (2004-04-24 20:22) [1]Попробуй ещё раз объяснить - телипаты ещё не вернулись из отпуска...
← →
Anatoly Podgoretsky © (2004-04-24 22:12) [2]У ключей нет значений!
← →
^G^ (2004-04-24 22:31) [3]Мне нужно написать программу в которой будет выводится список программ на компьютере с параметрами и значениями, как в egedit.
Работа с TRegIniFile.
Я знаю как выводить список ключей и параметры, а значения параметров как выводить я не знаю. Как выводить значение параметров ключей???
У значения разного типа значит нужно чтоб распознавало тип.
Я предполагаю что должно быть примерно так.Но почему-то не смотря на другие значения параметров выводит почти всегда unknow value либо 0. В чем же ошибка???
if regini.GetDataType(ListBox2.Items[index]) = rdString then ListBox3.Items[index] := regini.ReadString(ListBox2.Items[index],ListBox2.Items[index],"Default value");
if regini.GetDataType(ListBox2.Items[index]) = rdInteger then ListBox3.Items[index] := inttostr(regini.ReadInteger(ListBox2.Items[index],ListBox2.Items[index],0));
if regini.GetDataType(ListBox2.Items[index]) = rdUnknown then ListBox3.Items[index] := "Unknown value";
if regini.GetDataType(ListBox2.Items[index]) = rdExpandString then ListBox3.Items[index] := regini.ReadString(ListBox2.Items[index],ListBox2.Items[index],"Default exp value");
Если написанное правильно надо ли для каких-то еще типов предусмотреть, и какими ф-и оно будет выводится(у int например read string, а если еще какой-то тип надо , то какая ф-я для него)???
← →
^G^ (2004-04-24 22:33) [4]не ключа значение , а параметра как в регистре идет параметр тип и значение
← →
Cobalt © (2004-04-25 00:46) [5]Хм, может тогдп лучше использовать не TRegIni, а TRegistry, раз уж TRegIni не распознаёт тип параметра?
Кстати, а ты уверен, что параметр имеет именно тот тип, что тебе нужен? Приведи значение (из експортированного *.reg)
← →
Anatoly Podgoretsky © (2004-04-25 10:15) [6]Cobalt © (25.04.04 00:46) [5]
Расспознает, это всегда строка
← →
^G^ (2004-04-25 13:03) [7]всмысле параметр имеет именно тот тип что нужен.??
Если параметр имеет integer всеравно почемуто выводит unknow value или 0.
Неужели никто не сможет мне помоч?
← →
Digitman © (2004-04-25 14:55) [8]
> ^G^
> почемуто выводит unknow value или 0
потому что RegIniFile всегда пытается считывать значение параметра как параметра строкового типа, ВНЕ зависимости от реального типа
либо храни в ключе реестра только строковые значения параметров либо пользуй TRegistry
← →
^G^ (2004-04-25 17:23) [9]Что значит пытается?ЕСли бы строковое пытался, то для него условие где параметр по умолчанию default value.Кроме того почему он выводит по умолчанию а не имеющееся тогда?
А для остальных типов есть условия тоже.
А какие ф-и для TRegistry тогда???
← →
Cobalt © (2004-04-25 22:27) [10]>^G^
>почему он выводит по умолчанию а не имеющееся тогда?
Посмотри в справку или в исходники?
>А какие ф-и для TRegistry тогда???
А вот это однозначно в справку. Тем более, он довольно-таки похож на RegIniFile
← →
^G^ (2004-04-25 23:03) [11]Cobalt , наверно я смотрела в код.и в справку.
ЛАдно про Registry разберемся.
НУ что не так в коде ???, почему так выводит??Я что-то не так поняла??Какое третье значение тогда должно быть??
← →
Digitman © (2004-04-26 09:38) [12]
> ^G^
> наверно я смотрела в код
плохо смотрела
еще раз смотри :
function TRegIniFile.ReadInteger(const Section, Ident: string; Default: LongInt): LongInt;
var
Key, OldKey: HKEY;
S: string;
begin
Key := GetKey(Section);
if Key <> 0 then
try
OldKey := CurrentKey;
SetCurrentKey(Key);
try
if ValueExists(Ident) then
begin
S := inherited ReadString(Ident); // !!! читаем строковый параметр !!! если параметр на самом деле не строковый, то будет возбуждено исключение
Result := StrToIntDef(S, Default); // пытаемся преобразовать строку в число !!
end else
Result := Default;
finally
SetCurrentKey(OldKey);
end;
finally
RegCloseKey(Key);
end
else Result := Default;
end;
← →
^G^ (2004-04-26 18:26) [13]НУ то что у меня listbox одинаковые в первом и втором параметре ,это опечатка.
Ладно то что вы написали будет работать, но тчо не верно в моем примере??
Я докапалась, стало выводить значения, но иногда выскакивает ошибка::
prpject p.exe raised exeption class EstringListError with message "List index out of bounds (6)"......
Наверное это что-то с № строки , но что именно не пойму вроде все парвильно.???
← →
Anatoly Podgoretsky © (2004-04-26 19:25) [14]Недостаточно кода, но это означает, что значение index в
ListBox2.Items[index] и/или в ListBox3.Items[index]
выходит за пределы
← →
^G^ (2004-04-26 21:07) [15]Дело в том что я изменила переменные № строк.Как я поняла у меня до этого были не правильно заданы переменные. У ListB1 ListB2 секция и параметр не всегда строки с одним индексом -№ строк , поэтому я задала разные переменные:
indexlb1 := ListBox1.ItemIndex ;
Index := ListBox2.ItemIndex;
Это поидее исключает выход за пределы, т.е. если секция нажата в 5 строке, а парметр из 3 занчит индекс у них разный и переменные тоже.
Простите , если я как-то нелепо изъясняюсь,это всилу маленького объема знаний в этой области, но я стараюсь.
Может быть мне весь исходник сюда вставить, чтоб избежать лишних предположений.???
← →
^G^ (2004-04-27 12:49) [16]А на это сообщение будут обращать внимание если оно будет на другой странице далекой?
← →
Digitman © (2004-04-27 13:00) [17]
> ^G^
про встроенный в Делфи отладчик и про пошаговую трассировку программы что-нибудь слышала ?
← →
^G^ (2004-04-27 13:12) [18]ДА.Я трассировала ошибку выводит как раз на условиях либо unknow либо int вообщем на этих устовиях.
Я кстати изменила почему стало хоть как-то работать теперь я сделала не
then ListBox3.Items[index] := regini.ReadString(
,а
then ListBox3.Itemsadd(regini.ReadString(ListBox1....
← →
^G^ (2004-04-27 21:23) [19]help
← →
Игорь Шевченко © (2004-04-27 21:56) [20]Кода бы. И побольше
← →
^G^ (2004-04-27 22:05) [21]Вот код проги:
var
RegIni:{TRegistry;}TRegIniFile;
index,Sir: Integer;
Form1: TForm1;
indexLB1 : Integer;
implementation
{$R *.dfm}
procedure TForm1.ComboBox1Change(Sender: TObject);
var
i : integer;
begin
i := ComboBox1.ItemIndex;
case i of
0: begin RegIni.RootKey := HKEY_CLASSES_ROOT; Caption := "HKEY_CLASSES_ROOT" end;
1: begin RegIni.RootKey := HKEY_CURRENT_USER; Caption := "HKEY_CURRENT_USER"end;
2: begin RegIni.RootKey := HKEY_LOCAL_MACHINE; Caption := "HKEY_LOCAL_MACHINE" end;
3: begin RegIni.RootKey := HKEY_USERS; Caption := "HKEY_USERS" end;
4: begin RegIni.RootKey := HKEY_CURRENT_CONFIG; Caption := "HKEY_CURRENT_CONFIG" end;
end;
RegIni.OpenKey("",false);
RegIni.ReadSections(ListBox1.Items);
ListBox3.clear;
ListBox2.clear;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
RegIni:=TRegIniFile.Create;
RegIni.OpenKey("",false);
RegIni.ReadSections(ListBox1.Items);
end;
procedure TForm1.ListBox1DblClick(Sender: TObject);
begin
try
indexlb1 := ListBox1.ItemIndex ;
RegIni.OpenKey(ListBox1.Items[indexlb1],false);
regini.ReadSections(ListBox1.Items);
ComboBox1.Text := RegIni.CurrentPath;
ListBox3.clear;
Except
ShowMessage("Error");
end;
end;
procedure TForm1.ListBox1Click(Sender: TObject);
begin
try
Indexlb1 := ListBox1.ItemIndex;
RegIni.ReadSection(ListBox1.Items[ListBox1.ItemIndex],ListBox2.Items);
ListBox3.clear;
Caption := IntToStr(indexlb1);
Except
ShowMessage("Error");
end;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
RegIni.Free;
end;
procedure TForm1.ListBox2Click(Sender: TObject);
begin
try
ListBox3.Clear ;
Index := ListBox2.ItemIndex;
if regini.GetDataType(ListBox2.Items[index]) = rdString then
ListBox3.Items.Add(regini.ReadString(ListBox1.Items[indexlb1],ListBox2.Items[index],"Default value"));
if regini.GetDataType(ListBox2.Items[index]) = rdInteger then
ListBox3.Items.Add(inttostr(regini.ReadInteger(ListBox1.Items[indexlb1],ListBox2.Items[index],0)));
if regini.GetDataType(ListBox2.Items[index]) = rdUnknown then
ListBox3.Items.Add("Unknown value");
if regini.GetDataType(ListBox2.Items[index]) = rdExpandString then
ListBox3.Items.Add(regini.ReadString(ListBox1.Items[indexlb1],ListBox2.Items[index],"Default exp value"));
if regini.GetDataType(ListBox2.Items[index]) = rdBinary then
ListBox3.Items.Add("Binary");
//RegIni.GetValueNames(ListBox2.Items);
Index := 0;
except
ShowMessage("Error GetDataType");
end;
end;
procedure TForm1.ListBox1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if key = 13 then ListBox1DblClick(listbox1);
//ShowMessage(inttostr(key));
end;
procedure TForm1.Button1Click(Sender: TObject);
var
i,r: integer;
S,P,S2 : string;
begin
if combobox1.Text <> "" then begin
R := 0; P := "";
S := combobox1.Text;
for i:= length(S) downto 1 do
if (S[i] = "\") and (i <> length(S)) then begin
R := i-1;
break;
end;
for i := 1 to R do
S2 := S2 + S[i];
RegIni.CloseKey;
S2 := S2 + "\" ;
combobox1.Text := S2;
if S2 = "\" then combobox1.Text := "";
For i := 1 to length(S2) do
begin
if S2[i] <> "\" then P := P + S2[i] else
begin
RegIni.OpenKey(Trim(P),false);
P := "";
end;
end;
regini.ReadSections(ListBox1.Items);
end;
end;
end.
← →
Игорь Шевченко © (2004-04-27 22:10) [22]Это все хорошо, а надо чего получить ? (желательно внятно объяснить)
← →
^G^ (2004-04-27 22:27) [23]А ну я уже говорила.
Выводит значения только те что стоят по умолчанию ито не всегда, настоящие значения параметров не выводит.Почему?
Иногда почему-то появляется ошибка:prpject p.exe raised exeption class EstringListError with message "List index out of bounds (6)"......Хотя вроде со строками все впорядке.Почему?
← →
Игорь Шевченко © (2004-04-27 22:41) [24]
> А ну я уже говорила.
Мне пожалуйста два раза и помедленнее. Чего от программы надо получить ?
← →
^G^ (2004-04-28 00:05) [25]Дак вы в начале темы посмотрели бы подробней.
Мне надо написать прогу в которой будет выводится список прокрамм параметров и значений параметров как rehedit.
Работа должнга быть с reginifile.
У меня написана прога должно быть частично правильно, но возникают ошибки о которых я написала в предыдущем сообщении.
На процедуру procedure TForm1.ListBox1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState) можете не обращать внимания т.к. она к теме не относится.
Мне надо найти ошибку симптомы такие : Выводит значения только те что стоят по умолчанию ито не всегда, настоящие значения параметров не выводит.Почему?
Иногда почему-то появляется ошибка:prоject p.exe raised exeption class EstringListError with message "List index out of bounds (6)"......Хотя вроде со строками все впорядке или нет?.Почему?
← →
Игорь Шевченко © (2004-04-28 00:24) [26]
> prоject p.exe raised exeption class EstringListError with
> message "List index out of bounds (6)"......Хотя вроде со
> строками все впорядке или нет?.
В какое место показывает отладчик в момент этой ошибки ?
← →
^G^ (2004-04-28 00:46) [27]Там в коде условия есть как-раз где тип определяется и ф-я для него так вот на какую-либо из этих условий с функциями.
Там выше сказали что : Недостаточно кода, но это означает, что значение index в
ListBox2.Items[index] и/или в ListBox3.Items[index]
выходит за пределы. Я немогу понять почему.И так ли это.Может что-то с ListBox3.Items[index] с индексом с переменной.Хотя вроде все в порядке.
← →
Игорь Шевченко © (2004-04-28 10:41) [28]
> Там выше сказали что : Недостаточно кода, но это означает,
> что значение index в
> ListBox2.Items[index] и/или в ListBox3.Items[index]
> выходит за пределы. Я немогу понять почему.И так ли это.Может
> что-то с ListBox3.Items[index] с индексом с переменной.Хотя
> вроде все в порядке.
Запусти программу. Дождись ошибки. Посмотри отладчиком, в каком месте возникает ошибка. Посмотри, почему значение индекса выходит за границы.
← →
^G^ (2004-04-28 18:51) [29]Все все я поняла в чем ошибка.Спасибо большое без вас я бы нарно не дошла до этого.
Но я узнала вот еще что.Говорят с ini файлом значения параметра выводить полюбому не будет, только по умолчанию.Это правда??И что этого добится можно только с Regictry.
← →
Anatoly Podgoretsky © (2004-04-28 19:00) [30]^G^ (28.04.04 18:51) [29]
Правда в том, что в ини файле нет типа, там только строки и дело твое как их интерпритировать, а вот в реестре уже есть информация о типе
← →
^G^ (2004-04-28 19:25) [31]Дак вот я думала что ф-ей getDataType я определяю тип и в соответствии с типом вывожу значение ф-ми readstring readinteger и т.п. Я думала эти функции как раз считываю значения, а если его нет то выводят то что по умолчанию стоит 3 параметром.Неужели я ошибаюсь.?
← →
Игорь Шевченко © (2004-04-28 20:39) [32]
> Я думала эти функции как раз считываю значения, а если его
> нет то выводят то что по умолчанию стоит 3 параметром
Правильно. В Help так и написано.
Ты можешь попробовать вызвать метод самого TRegistry:
(regini as TRegistry).ReadInteger(ListBox1.Items[indexlb1],ListBox2.Items[index],0)
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.05.16;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.029 c