Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.036 c
14-1082613968
Style
2004-04-22 10:06
2004.05.16
Помогите решить проблему?


4-1080046403
Nikl_MM
2004-03-23 15:53
2004.05.16
Ищу программу для создания файлов ресурсов (*.rc)


3-1082542290
stud
2004-04-21 14:11
2004.05.16
реализация запросов


14-1082787568
gn
2004-04-24 10:19
2004.05.16
Новая технология защиты кредитных карт с распознаванием голоса


1-1083415414
Jiurasdfgfr
2004-05-01 16:43
2004.05.16
Как в StringGrid вызвать OnDrawCell?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский