Форум: "Начинающим";
Текущий архив: 2005.10.16;
Скачать: [xml.tar.bz2];
ВнизКак обойти ini файл ? Найти похожие ветки
← →
bogdan (2005-08-31 00:03) [0]Привет всем. У меня проблема появилась. Пишу вот простенький авторан для себя.Имена прог записываю как секции в ини файл. в каждой секции есть три ключи и значения.
Названия секций( а значит прог) считываю и записываю в ListBox.
Но, к сожалению, когда при выборе из ListBoxa имени и подстановке в функцию readstring или readSection у меня ошибка. как я понял, нельзя в эти функции подставлять не константу. Ведь в описании указано const Name : string; Тогда посоветуйте, пожалуйста, как справиться с этой задачей.
Или может можно вообще сделать как-то по-другому? Большое спасибо наперед.
← →
Джо © (2005-08-31 00:17) [1]Опиши, пожалуйста, четко, что ты хочешь сделать. Ничего не понятно.
← →
Джо © (2005-08-31 00:18) [2]
> Ведь в описании указано const Name : string;
Это не значит, что передавать нужно "константу". Это значит, что параметр внутри метода не изменяется.
← →
Германн © (2005-08-31 02:45) [3]Но, к сожалению, когда при выборе из ListBoxa имени и подстановке в функцию readstring или readSection у меня ошибка.
Следовало бы привести сообщение об этой ошибке!
← →
Плохиш © (2005-08-31 11:12) [4]Да ладно вам всем :-) У человека ошибка в 17й строке, а вы телепатируете ;-)
← →
Antonn © (2005-08-31 11:19) [5]работает - ini.ReadString(ListBox1.Items.Strings[ListBox1.itemindex],ListBox1.Items.Strings[ListBox1.itemindex],"fuflo");
← →
bogdan (2005-09-02 11:18) [6]1. Не пойму что за 17 строка?:-)
2.а вот и ошибка в процедуре
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;
← →
Плохиш © (2005-09-02 11:27) [7]
> // ОШИБКу выдает здесь
> --->>>if inf="no" then
И что это за супер секретная ошибка, партизан фигов.
← →
_RusLAN © (2005-09-02 14:56) [8]> // ОШИБКу выдает здесь
> --->>>if inf="no" then
Оно выдает не ошибку - ошибка у тебя в программе
А оно выдает ПОДСКАЗКУ о той ошибке, которая у тебя в программе.
Если она(подсказка) тебе ничего не говорит, это не значит что там нет ничего полезного.
Приведи ее здесь. Кому-то это может и подсказать как решить твою проблему.
← →
bogdan (2005-09-03 00:07) [9]
>
> Плохиш © (02.09.05 11:27) [7]
>
>
> И что это за супер секретная ошибка, партизан фигов
Ну спасибо конечно за помощь...
> _RusLAN © (02.09.05 14:56) [8]
> > // ОШИБКу выдает здесь
> > --->>>if inf="no" then
>
> Оно выдает не ошибку - ошибка у тебя в программе
> А оно выдает ПОДСКАЗКУ о той ошибке, которая у тебя в программе.
> Если она(подсказка) тебе ничего не говорит, это не значит
> что там нет ничего полезного.
> Приведи ее здесь. Кому-то это может и подсказать как решить
> твою проблему.
А как ее привести если у вас нильзя прикрепить фотографию того что выдает delphi ?
← →
Джо © (2005-09-03 00:16) [10]
> А как ее привести если у вас нильзя прикрепить фотографию
> того что выдает delphi ?
А можно прочитать то, "что выдает delphi" и написать тут нам. А мы, глядишь, как-нибудь прочитаем и без картинки ;)
Хинт: Нажатие Ctr-C копирует содержимое окна в буфер обмена в текстовом виде.
← →
Alexander Panov © (2005-09-03 01:23) [11]Много раз уже говорил, повторю еще раз -
напиши, что ты хочешь сделать, раз уж никто не может понять.
Вот тогда уж будет конкретный разговор.
← →
Германн © (2005-09-03 02:38) [12]Имхо! И слава богу, что тут у нас, нельзя "прикрепить фотографию"!
Фотографии смотрю с удовольствием и неудовлетворением с ММП! Иные фотографии смотреть не желаю, если мне за это не заплатят!
← →
bogdan (2005-09-04 01:32) [13]---------------------------
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-04 01:50) [14]Уже лучше!
Теперь ты сможешь получить ответ, что данное AV ты никак не сможещь получить из-за строки if inf="no" then.
В приведенном коде AV может возникнуть только на строках с memo1, если такового мемо нет.
Так что копай глубже.
P.S. Кстати лучше глядится "Нет описания", чем "Нету описания". :)
← →
Джо © (2005-09-04 01:53) [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:54) [16]Да. Кстати. Обрати внимание на http://delphimaster.net/view/1-1125670203/
Может и у тебя что-такое?
← →
bogdan (2005-09-04 09:45) [17]
>Джо © (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 уже описана выше. А на счет ".\" так это вместо полного пути, разве я не прав. У меня в листбоксе все то что надо считует, значит это правильно
← →
bogdan (2005-09-04 09:47) [18]
> В приведенном коде AV может возникнуть только на строках
> с memo1, если такового мемо нет.
> Так что копай глубже.
ну как же нет мемо если оно есть?
← →
Antonn © (2005-09-04 10:14) [19]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 10:16) [20]Я понял в чем проблема.. действительно ошибка в строке
inf:=ini.ReadString(ProgName,"inform","no");
а именно из-за ProgName , здесь должна идти строковая константа.
Когда я поставили вместо ProgNAme например "111" то все заработало.inf:=ini.ReadString("111"{ProgName},"inform","no");
Но теперь я уже и не представляю почему строки из листбокса не могут быть переданы в мою процедуру через progname. Уже не знаю может сделать через типизированный файл. и пусть ини идет подальше.
← →
Antonn © (2005-09-04 11:22) [21]bogdan (04.09.05 10:16) [20]
еще раз обращу внимание на
> name:=ListBox1.Items.Names[ind];
что здесь нужно получить? подставьname:=ListBox1.Items.strings[ListBox1.ItemIndex];
← →
Плохиш © (2005-09-04 11:34) [22]
> bogdan (04.09.05 10:16) [20]
> Я понял в чем проблема.. действительно ошибка в строке
> inf:=ini.ReadString(ProgName,"inform","no");
> а именно из-за ProgName ,
Местным телепатам осталось только догадаться, что это ещё за ProgName, где в неё заносится значение и почему оно не было занесено.
>здесь должна идти строковая константа.
Полная чушь.
← →
Плохиш © (2005-09-04 11:39) [23]
> Плохиш © (04.09.05 11:34) [22]
> Местным телепатам осталось только догадаться, что это ещё
> за ProgName, где в неё заносится значение и почему оно не
> было занесено.
Ладно, телепаты заметили свою ошибку :-)
Но они так и не могут понять, почему нельзя поставить точку останова на строке ind:=ListBox1.ItemIndex; и с помощью встроенного отладчика посмотреть, что же там такого происходит?
← →
Antonn © (2005-09-04 12:51) [24]bogdan
а это вообще тот ListBox?
← →
bogdan (2005-09-04 13:10) [25]Ладно я может быть и по вашему вааще не разбираюсь в проге ну вот уж проверте и узнаете.
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.
← →
bogdan (2005-09-04 13:12) [26]Сори за грубость.
Progname это имя выбраной строки из листбокса.
← →
bogdan (2005-09-05 02:22) [27]наверное после такого кода никто не хочет отвечать, я хотел чтоб вы все сразу увидели и вопросов станет меньше....
← →
Джо © (2005-09-05 02:41) [28]
> [27] bogdan (05.09.05 02:22)
> наверное после такого кода никто не хочет отвечать, я хотел
> чтоб вы все сразу увидели и вопросов станет меньше....
Ты бы dfm запостил, а то просто лень руками все эти контролы создавать. А также примерную структуру каталогов с которыми работает программа. И пример файла. Если хочешь, вышли проект на kaminski (цуцык) ihome.net.ua. Могу сейчас посмотреть.
← →
bogdan (2005-09-06 10:32) [29]Всем спасибо проблема была решена. СПаСИБО ДЖО.
Ошибка в строкеname:=ListBox1.Items.Names[ind];
нужно писатьname:=ListBox1.Items[ind];
Удачи
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2005.10.16;
Скачать: [xml.tar.bz2];
Память: 0.56 MB
Время: 0.045 c