Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как обойти ini файл ?


Страницы:   1 2

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 копирует содержимое окна в буфер обмена в текстовом виде.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо