![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как обойти ini файл ?
bogdan © (2005-08-31 00:03:00)Привет всем. У меня проблема появилась. Пишу вот простенький авторан для себя.Имена прог записываю как секции в ини файл. в каждой секции есть три ключи и значения.
Названия секций( а значит прог) считываю и записываю в ListBox.
Но, к сожалению, когда при выборе из ListBoxa имени и подстановке в функцию readstring или readSection у меня ошибка. как я понял, нельзя в эти функции подставлять не константу. Ведь в описании указано const Name : string; Тогда посоветуйте, пожалуйста, как справиться с этой задачей.
Или может можно вообще сделать как-то по-другому? Большое спасибо наперед.
bogdan (2005-09-06 10:32:00) [1]Всем спасибо проблема была решена. СПаСИБО ДЖО.
Ошибка в строкеname:=ListBox1.Items.Names[ind];
нужно писать
name:=ListBox1.Items[ind];
Удачи
Джо (2005-09-05 02:41:00) [2]
> [27] bogdan (05.09.05 02:22)
> наверное после такого кода никто не хочет отвечать, я хотел
> чтоб вы все сразу увидели и вопросов станет меньше....
Ты бы dfm запостил, а то просто лень руками все эти контролы создавать. А также примерную структуру каталогов с которыми работает программа. И пример файла. Если хочешь, вышли проект на kaminski (цуцык) ihome.net.ua. Могу сейчас посмотреть.
bogdan (2005-09-05 02:22:00) [3]наверное после такого кода никто не хочет отвечать, я хотел чтоб вы все сразу увидели и вопросов станет меньше....
bogdan (2005-09-04 13:12:00) [4]Сори за грубость.
Progname это имя выбраной строки из листбокса.
bogdan (2005-09-04 13:10:00) [5]Ладно я может быть и по вашему вааще не разбираюсь в проге ну вот уж проверте и узнаете.
unit My_autorun;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, Buttons, StdCtrls, ExtCtrls;
const IFName:string = 'FilesSetup.ini';
type
TForm1 = class(TForm)
Panel1: TPanel;
ListBox1: TListBox;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
GroupBox1: TGroupBox;
Memo1: TMemo;
BitBtn3: TBitBtn;
Label1: TLabel;
Timer1: TTimer;
MainMenu1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
Edit1: TEdit;
procedure SpeedButton1Click(Sender: TObject);
procedure Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure BitBtn1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure BitBtn2MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure BitBtn1Click(Sender: TObject);
procedure ListBox1Click(Sender: TObject);
procedure BitBtn3MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure FormShow(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure N2Click(Sender: TObject);
procedure N3Click(Sender: TObject);
procedure N4Click(Sender: TObject);
private
function CanSetupProg(iniFileName, ProgName: string): boolean;
procedure SetProgsNames(iniFileName: string; lb: TListBox);
procedure ShowInfo(const iniFileName, ProgName: string);
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
b:boolean;
implementation
uses ShellAPI,inifiles;
{$R *.dfm}
procedure TForm1.SetProgsNames(iniFileName: string;lb:TListBox);
var ini:TIniFile;
begin
ini:=TIniFile.Create('.\'+iniFileName);
ini.ReadSections(LB.Items);
LB.Items.Delete(0);
LB.Update;
ini.Free;
end;
procedure TForm1.ShowInfo(const iniFileName, ProgName: string);
var inf:string; ini:TIniFile;
begin
ini:=TIniFile.Create('.\'+iniFileName);
inf:=ini.ReadString(ProgName,'inform','no');
if inf='no' then
begin
memo1.Lines.Clear;
memo1.Lines.Add('Iaia iieno');
end
else memo1.Lines.LoadFromFile(inf);
ini.Free;
end;
function TForm1.CanSetupProg(iniFileName, ProgName: string): boolean;
var info:string; ini:TIniFile;
begin
ini:=TIniFile.Create('.\'+iniFileName);
info:=ini.ReadString(ProgName,'run','no');
if info='yes' then result:=true else result:=false;
ini.Free;
end;
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
close;
end;
procedure TForm1.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if b<>false then begin
BitBtn1.Font.Size:=8;
BitBtn1.Font.Style:=[fsBold ];
BitBtn1.Font.Color:=clred;
BitBtn2.Font.Size:=8;
BitBtn2.Font.Style:=[fsBold ];
BitBtn2.Font.Color:=clred;
BitBtn3.Font.Size:=8;
BitBtn3.Font.Style:=[fsBold ];
BitBtn3.Font.Color:=clred;
b:=false;
end;
end;
procedure TForm1.BitBtn1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
BitBtn1.Font.Size:=10;
BitBtn1.Font.Style:=[fsBold];
BitBtn1.Font.Color:=clblue;
b:=true;
end;
procedure TForm1.BitBtn2MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
BitBtn2.Font.Size:=10;
BitBtn2.Font.Style:=[fsBold];
BitBtn2.Font.Color:=clblue;
b:=true;
end;
procedure TForm1.BitBtn1Click(Sender: TObject);
var Name,path:String; ini:TiniFile;
begin
Name:=ListBox1.Items.Names[ListBox1.itemindex];
ini:=TIniFile.Create('.\'+IFName);
path:=ini.ReadString(name,'FullName','');
ini.Free;
if path<>'' then ShellExecute( Handle, 'open', PChar(path), nil, nil, SW_SHOWNORMAL)
else MessageDlg('Ia ii?eeai anoaiiaeoe i?ia?aio ',mtError,[mbOk],0);
end;
procedure TForm1.ListBox1Click(Sender: TObject);
var ind:integer;name:string;
begin
ind:=ListBox1.ItemIndex;
name:=ListBox1.Items.Names[ind];
ShowInfo(IFName,name);
if not CanSetupProg(IFName,name) then BitBtn1.Enabled:=false
else BitBtn1.Enabled:=true;
end;
procedure TForm1.BitBtn3MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
BitBtn3.Font.Size:=10;
BitBtn3.Font.Style:=[fsBold];
BitBtn3.Font.Color:=clblue;
b:=true;
end;
procedure TForm1.FormShow(Sender: TObject);
var d:string;SystemTime: TSystemTime;ini:TIniFile;
begin
ini:=TIniFile.Create('.\'+IFName);
d:=ini.ReadString('DiskInfo','name','');
ini.Free;
Form1.Caption:=Form1.Caption+d;
GetLocalTime(SystemTime);
Label1.Caption:=timetostr(time);
SetProgsNames(IFName,ListBox1);
ListBox1.ItemIndex:=0;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
label1.Caption:=TimeToStr(Time);
end;
procedure TForm1.N2Click(Sender: TObject);
begin
Close;
end;
procedure TForm1.N3Click(Sender: TObject);
begin
Application.MessageBox
('A-Autorun ? ia?oi? iio??aii? aaoi?ia? i?ia?aii?.'+#13+'Aiia iieaaoo? eiio ?iaioo ? niia?aa?nu aai.'+#13+'A yeui eiio uinu ia iiaiaa?ouny,oi aeeeiuoa eiii''?oa? '+#13+'? a?euoa ia i?in?ou o aaoi?a i??iai.'+#13+'Ayeo? ca ii?icoi?iiy i aaaeiai Aai ei?enooaaiiy',
'I?i i?ia?aio',
MB_ICONINFORMATION + MB_OK);
end;
procedure TForm1.N4Click(Sender: TObject);
begin
Application.MessageBox
('Ayeo?, ui ei?enoo?oanu aaiei aeoai?ii ienoaooaa,'+#13+'Iaia caaoe Aiaaai ?aaiiae? Aa?aciae'+#13+'Iaa?a?nu ia iaoaiaoe?iiio oaeoeuoao? O?IO,'+#13+'eaoaa?a I?eeeaaii? iaoaiaoeee. Ae caa?ae '+#13+'ii?aoa ca''ycaoenu c? iii? ii e-mail: bereznay@mail.ru',
'I?i aaoi?a',
MB_ICONINFORMATION + MB_OK);
end;
end.
Antonn (2005-09-04 12:51:00) [6]bogdan
а это вообще тот ListBox?
Плохиш (2005-09-04 11:39:00) [7]
> Плохиш © (04.09.05 11:34) [22]
> Местным телепатам осталось только догадаться, что это ещё
> за ProgName, где в неё заносится значение и почему оно не
> было занесено.
Ладно, телепаты заметили свою ошибку :-)
Но они так и не могут понять, почему нельзя поставить точку останова на строке ind:=ListBox1.ItemIndex;и с помощью встроенного отладчика посмотреть, что же там такого происходит?
Плохиш (2005-09-04 11:34:00) [8]
> bogdan (04.09.05 10:16) [20]
> Я понял в чем проблема.. действительно ошибка в строке
> inf:=ini.ReadString(ProgName,'inform','no');
> а именно из-за ProgName ,
Местным телепатам осталось только догадаться, что это ещё за ProgName, где в неё заносится значение и почему оно не было занесено.
>здесь должна идти строковая константа.
Полная чушь.
Antonn (2005-09-04 11:22:00) [9]bogdan (04.09.05 10:16) [20]
еще раз обращу внимание на
> name:=ListBox1.Items.Names[ind];
что здесь нужно получить? подставьname:=ListBox1.Items.strings[ListBox1.ItemIndex];
bogdan (2005-09-04 10:16:00) [10]Я понял в чем проблема.. действительно ошибка в строке
inf:=ini.ReadString(ProgName,'inform','no');
а именно из-за ProgName , здесь должна идти строковая константа.
Когда я поставили вместо ProgNAme например '111' то все заработало.
inf:=ini.ReadString('111'{ProgName},'inform','no');
Но теперь я уже и не представляю почему строки из листбокса не могут быть переданы в мою процедуру через progname. Уже не знаю может сделать через типизированный файл. и пусть ини идет подальше.
Antonn (2005-09-04 10:14:00) [11]bogdan (04.09.05 9:45) [17]
procedure TForm1.ListBox1Click(Sender: TObject);
var ind:integer;name:string;
begin
ind:=ListBox1.ItemIndex;
name:=ListBox1.Items.Names[ind];
ShowInfo(IFName,name);э
end;
ну что сказать...
Это к чему?name:=ListBox1.Items.Names[ind];
а может так?name:=ListBox1.Items.strings[ListBox1.ItemIndex];
bogdan (2005-09-04 09:47:00) [12]
> В приведенном коде AV может возникнуть только на строках
> с memo1, если такового мемо нет.
> Так что копай глубже.
ну как же нет мемо если оно есть?
bogdan (2005-09-04 09:45:00) [13]
>Джо © (04.09.05 01:53) [15]
> Во-первых, исключение возникает, скорее всего после выполнения
> строки inf:=ini.ReadString(ProgName,'inform','no'), а не
> той, что вы указали.
а интересно почему? ведь вроде синтаксис правильный, и компилируется. Но ошибка вознкикает когда я жму на листбоксеж Может там проблема?
Моя процедура
procedure TForm1.ListBox1Click(Sender: TObject);
var ind:integer;name:string;
begin
ind:=ListBox1.ItemIndex;
name:=ListBox1.Items.Names[ind];
ShowInfo(IFName,name);э
end;
showinfo уже описана выше. А на счет ".\" так это вместо полного пути, разве я не прав. У меня в листбоксе все то что надо считует, значит это правильно
Германн (2005-09-04 01:54:00) [14]Да. Кстати. Обрати внимание на http://delphimaster.ru/cgi-bin/forum.pl?id=1125670203&n=0
Может и у тебя что-такое?
Джо (2005-09-04 01:53:00) [15]
> [13] bogdan (04.09.05 01:32)
Во-первых, исключение возникает, скорее всего после выполнения строки inf:=ini.ReadString(ProgName,'inform','no'), а не той, что вы указали. Из этого следует самое простое объяснение - экземмпляр класса TIniFile не создан к моменту вызова ReadString. Причина, скорее всего, самая банальная - неверное указывается путь к ини-файлу. К чему вот это: '.\'?
И, второе, к проблеме отношение не имеющее, но не менее важное. Используйте try/finally:
procedure TForm1.ShowInfo(const iniFileName, ProgName: string);
var
inf: string;
ini:TIniFile;
begin
ini:=TIniFile.Create(....);
try
inf:=ini.ReadString(ProgName,'inform','no');
if inf='no' then
begin
memo1.Lines.Clear;
memo1.Lines.Add('Íåòó îïèñàíèÿ');
end
else
memo1.Lines.LoadFromFile(inf);
finally
ini.Free;
end;
end;
Германн (2005-09-04 01:50:00) [16]Уже лучше!
Теперь ты сможешь получить ответ, что данное AV ты никак не сможещь получить из-за строки if inf='no' then.
В приведенном коде AV может возникнуть только на строках с memo1, если такового мемо нет.
Так что копай глубже.
P.S. Кстати лучше глядится "Нет описания", чем "Нету описания". :)
bogdan (2005-09-04 01:32:00) [17]---------------------------
Debugger Exception Notification
---------------------------
Project BAutorun.exe raised exception class EAccessViolation with message 'Access violation at address 7C913144 in module 'ntdll.dll'. Write of address 00404311'. Process stopped. Use Step or Run to continue.
---------------------------
OK Help
---------------------------
итак : есть ини файл, каждый раздел которого - это название программы.
В каждом разделе есть три ключа: путь установки, путь к файлу описания, и логический ключ- тоесть нужно программы установить или просто скопировать с диска.
Так вот, считываю разделы с ини файла в листбокс, а потом при нажатии на листбоксе выбираю соответственно имя выделеного раздела в ини файле и хочу показать информацию о выбраной проге в мемо с помощью процедуры ShowInfo а вот и она:
procedure TForm1.ShowInfo(const iniFileName, ProgName: string);
var inf:string; ini:TIniFile;
begin
ini:=TIniFile.Create('.\'+iniFileName);
inf:=ini.ReadString(ProgName,'inform','no');
if inf='no' then
begin
memo1.Lines.Clear;
memo1.Lines.Add('Нету описания');
end
else memo1.Lines.LoadFromFile(inf);
ini.Free;
end;
но при работе этойй процедуры возникает ошибка которая указана выше. а именно в рядке
if inf='no' then....
Не могу понять почему переменная inf не может иметь значение "no".
Ведь функция ini.ReadString(ProgName,'inform','no'); возвращает "no " если не удалось найти соответствующий раздел и ключ.
Думаю теперь понятно обьяснил....
Германн (2005-09-03 02:38:00) [18]Имхо! И слава богу, что тут у нас, нельзя"прикрепить фотографию"!
Фотографии смотрю с удовольствием и неудовлетворением с ММП! Иные фотографии смотреть не желаю, если мне за это не заплатят!
Alexander Panov (2005-09-03 01:23:00) [19]Много раз уже говорил, повторю еще раз -
напиши, что ты хочешь сделать, раз уж никто не может понять.
Вот тогда уж будет конкретный разговор.
Джо (2005-09-03 00:16:00) [20]
> А как ее привести если у вас нильзя прикрепить фотографию
> того что выдает delphi ?
А можно прочитать то, "что выдает delphi" и написать тут нам. А мы, глядишь, как-нибудь прочитаем и без картинки ;)
Хинт: Нажатие Ctr-C копирует содержимое окна в буфер обмена в текстовом виде.