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

Вниз

Как обойти 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;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.026 c
4-1124011803
Denis_Ac
2005-08-14 13:30
2005.10.16
Hook Chain


14-1127555455
Goga
2005-09-24 13:50
2005.10.16
переведите на delphi Спасибо


3-1125647332
Леди
2005-09-02 11:48
2005.10.16
Программное создание DSN


14-1127133477
Антоний
2005-09-19 16:37
2005.10.16
WinXP и подключение к Win2003Server


14-1127629925
Lamer@fools.ua
2005-09-25 10:32
2005.10.16
Дожился