Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.16;
Скачать: CL | DM;

Вниз

Как выводить значение параметра ключа???(работа с регистром).   Найти похожие ветки 

 
^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;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.086 c
3-1082345098
Orange
2004-04-19 07:24
2004.05.16
Сохранение базы данных


1-1083133018
Stas
2004-04-28 10:16
2004.05.16
тип PCHAR и ACCESS


1-1083163718
Svetka*
2004-04-28 18:48
2004.05.16
Лабораторная.... помогите девушке!


4-1079983789
Ангел.
2004-03-22 22:29
2004.05.16
LoadAccelerators


3-1082614692
jenya_d
2004-04-22 10:18
2004.05.16
Средства разработчика БД MS SQL 2000