Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.036 c
2-1127251509
ArtemESC
2005-09-21 01:25
2005.10.16
Delphi|Tools|Editor Options| Source opti...|Source file type


3-1125926607
AndrewK
2005-09-05 17:23
2005.10.16
Хранение справочников в одной таблице. Предлагаю обсудить идею.


14-1127399213
ПЛОВ
2005-09-22 18:26
2005.10.16
SVGA -> S-Video или композитный выход


6-1120112485
Леха.
2005-06-30 10:21
2005.10.16
POST


1-1127486011
злобная танька
2005-09-23 18:33
2005.10.16
Локальные типизированные константы





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский