Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 16.07.2008, 22:44
Аватар для ZIP
ZIP ZIP вне форума
Прохожий
 
Регистрация: 15.06.2008
Адрес: Россия, под Казанью
Сообщения: 39
Репутация: 10
Восклицание Помогите отловить баг...

Помогите отловить баг... Вот программа, считает дни, месяцы и.т.д. до какого либо числа. Записывает это число в ini фаил, что бы потом при старте и нажатии кнопки Button1 число грузилось и начинался отсчет.
Дык вот, проблема в том, что в RAD 2007 у меня все нормально запускается, но после компиляции и запуска как самостоятельного приложения возникает Баг.

1. Запускаю прожку
2. Нажимаю Button2. (и попадаю в меню настроек)
3. Устнавливаю дату DateTimePicker1
4. Нажимаю "Сохранить" (Bitbtn1)
5. Закрываю настройки, нажимаю на главной форме Button1 и...
Access violation at adress 0047AAA3 in module 'Project1.exe'. Read of adress 0000028C.
Пытаюсь войти в настройки и...
Access violation at adress 00000000. Read of adress 00000000.
В дельфи все путем а вот в висте... В чем ошибка?
Закрываю прожку, открываю снова... старт... все работает, дата сохранена... (на висте, а D2007 работает все и сразу)


Unit1 - главная форма
Unit2 - настройки

Ах, да проверьте пожалуйста, у меня в Unit2.procedure TForm2.BitBtn1Click правильно прописано создание ini, если его еще нет?


А сейчас я запостю такое, что вы меня всей толпой повестите.
Вот код Unit1

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, Menus, jpeg, DateUtils, Unit2, IniFiles;

type
  TForm1 = class(TForm)
    Image1: TImage;
    Image2: TImage;
    Label8: TLabel;
    Image3: TImage;
    Panel1: TPanel;
    GroupBox2: TGroupBox;
    Label1: TLabel;
    GroupBox3: TGroupBox;
    Label2: TLabel;
    GroupBox4: TGroupBox;
    Label3: TLabel;
    GroupBox5: TGroupBox;
    Label4: TLabel;
    GroupBox6: TGroupBox;
    Label5: TLabel;
    GroupBox7: TGroupBox;
    Label6: TLabel;
    GroupBox8: TGroupBox;
    Label7: TLabel;
    PopupMenu1: TPopupMenu;
    Timer1: TTimer;
    Button1: TButton;
    Button2: TButton;
    Label9: TLabel;
    Label10: TLabel;
    procedure Timer1Timer(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  WaitMonth: word;
  WaitWeek: word;
  WaitDay: word;
  Mill: integer;
  Data: TIniFile;

implementation


{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
Form2.Show;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
FName: string;
begin
Fname := ExtractFilePath(Application.ExeName) + 'data.ini';
Data := TIniFile.Create(FName);
if FileExists(FName) then
     with TIniFile.Create(FName) do
         begin
           Form2.DateTimePicker1.DateTime := StrToDate(Data.ReadString('TmeSet', '1', ''));
   Free;
 end;
 Timer1.Enabled := true;
 Button2.Visible := false;
 Panel1.Visible := true;
 Button1.Visible := false;
 Label10.Caption := DateToStr(Form2.DateTimePicker1.DateTime)
end;




procedure TForm1.Timer1Timer(Sender: TObject);
begin
  label1.Caption := intToStr(MonthsBetween(Now, Form2.DateTimePicker1.DateTime));
  Label2.Caption := IntToStr(WeeksBetween(Now, Form2.DateTimePicker1.DateTime));
  Label3.Caption := IntToStr(DaysBetween(Now, Form2.DateTimePicker1.DateTime));
  Label4.Caption := IntToStr(HoursBetween(Now, Form2.DateTimePicker1.DateTime));
  Label5.Caption := IntToStr(MinutesBetween(Now,Form2.DateTimePicker1.DateTime));
  Label6.Caption := IntToStr(SecondsBetween(Now, Form2.DateTimePicker1.DateTime));
  Label7.Caption := IntTostr(YearsBetween(now, Form2.DateTimePicker1.DateTime));


end;




end.

И второго...

Код:
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IniFiles, StdCtrls, Buttons, ComCtrls, ExtCtrls;

type
  TForm2 = class(TForm)
    GroupBox1: TGroupBox;
    BitBtn1: TBitBtn;
    DateTimePicker1: TDateTimePicker;
    RadioGroup1: TRadioGroup;
    GroupBox2: TGroupBox;
    CheckBox1: TCheckBox;
    Edit1: TEdit;
    procedure BitBtn1Click(Sender: TObject);
    procedure CheckBox1Click(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;
  Data: TIniFile;

implementation

{$R *.dfm}

procedure TForm2.BitBtn1Click(Sender: TObject);
var
FName: string;
begin

Fname := ExtractFilePath(Application.ExeName) + 'data.ini';
Data := TIniFile.Create(FName);
if FileExists(FName) then
 with TIniFile.Create(FName) do
 begin
   Data.WriteString('TmeSet', '1', DateToStr(DateTimePicker1.DateTime));
   Free;
 end
else
Data.WriteString('TmeSet', '1', DateToStr(DateTimePicker1.DateTime));


end;



procedure TForm2.CheckBox1Click(Sender: TObject);
begin
if CheckBox1.Checked then
begin
Edit1.Enabled := true;
end
else
Edit1.Enabled := false;
end;

end.

И если не сложно, помогите вывести процедуру Timer1.Timer, ну отсчет, во внешнюю dll и вызвать ее из проги... а то сам я чуть с ума не сошел... Просто я хочу еще по другому время выводить, с перспективой обновления модулей...

Заранее большое спасибо.
__________________
Сжатый

Последний раз редактировалось ZIP, 16.07.2008 в 22:48.
Ответить с цитированием
  #2  
Старый 17.07.2008, 00:54
san-46 san-46 вне форума
Активный
 
Регистрация: 25.04.2008
Сообщения: 383
Репутация: 33
По умолчанию

Про первую проблему не могу ничего сказать.
Про создание ini файла могу.
Код:
procedure TForm1.Button2Click(Sender: TObject);
var
  FName: string;
begin
  Fname := ExtractFilePath(Application.ExeName) + 'data.ini';
  with TIniFile.Create(FName) do begin
    Form2.DateTimePicker1.DateTime := 
      StrToDate(ReadString('TmeSet', '1', '01.01.2008'));
    Free;
  end; //третьим параметром в ReadString можно указать значение по умолчанию,
       //которое и будет передано в DateTime, если файла нет

  Timer1.Enabled := true;
  .....
end;

// и не надо создавать два экземпляра класса TIniFile - это абсолютно ни к чему, 
// к тому же происходит утечка памяти - не уничтожается лишний экземпляр

procedure TForm2.BitBtn1Click(Sender: TObject);
var
  FName: string;
begin
  Fname := ExtractFilePath(Application.ExeName) + 'data.ini';
  with TIniFile.Create(FName) do begin
    WriteString('TmeSet', '1', DateToStr(DateTimePicker1.DateTime));
    Free;
  end //если ini файл не создан, то система его создает автоматом
end;

procedure TForm2.CheckBox1Click(Sender: TObject);
begin
  Edit1.Enabled := CheckBox1.Checked; //так проще
end;
Зачем таймер в DLL? Вот морока будет. Уверен. что можно проще решить задачу с таймером.
__________________
Не забывайте делать резервные копии

Последний раз редактировалось san-46, 17.07.2008 в 01:09.
Ответить с цитированием
  #3  
Старый 17.07.2008, 08:54
dmdx dmdx вне форума
Начинающий
 
Регистрация: 24.05.2008
Адрес: Москва
Сообщения: 133
Репутация: 15
По умолчанию

RAD2007 ещё к сожлению сыроват. Сам столкнулся с аналогичной ошибкой. Попробуй тоже самое проделать в D7 или BSD2006
Ответить с цитированием
  #4  
Старый 17.07.2008, 10:14
Аватар для Thrasher
Thrasher Thrasher вне форума
Illuminati
 
Регистрация: 06.03.2008
Адрес: Крым, г. Симферополь
Сообщения: 348
Репутация: 8808
По умолчанию

Во-первых надо правильно использовать конструкцию with Somthing do:
Так не надо!

Код:
Data := TIniFile.Create(FName);
if FileExists(FName) then
     with Data do
         begin
           Form2.DateTimePicker1.DateTime := StrToDate(Data.ReadString('TmeSet', '1', ''));
   Free;
 end;

Надо так:

Код:
Data := TIniFile.Create(FName);
with Data do
         begin
           Form2.DateTimePicker1.DateTime := StrToDate(Data.ReadString('TmeSet', '1', ''));
         end;

Data.Free;

Если просто объявить Free, то компилятор может отнести этот метод не к Data, а к Form1.

Во-вторых, надо научиться пользоваться отладчиком. Если дан адрес по которому возникла ошибка, то можно посмотреть в какой строке кода это возникает. Также для этого можно использовать детальные map-файлы. В моей статье описано как это сделать. А сообщение
Access violation at adress 00000000. Read of adress 00000000.
Возникает при попытке обращения к несуществующему или неинициализированному объекту/переменной.
__________________
Хорошо написанная программа не требует документации
ICQ 9-184-668.
Ответить с цитированием
  #5  
Старый 17.07.2008, 14:03
Аватар для notricky
notricky notricky вне форума
Прохожий
 
Регистрация: 09.07.2008
Сообщения: 13
Репутация: 10
По умолчанию

Цитата:
Сообщение от Thrasher
Если просто объявить Free, то компилятор может отнести этот метод не к Data, а к Form1.
Как это может отнести? А может и не отнести?
Нет, так не пойдет. Во вложенности (между бегин..енд) процедуры, если встречаются одинаковые процедуры - от компонента и от компонент более высокого уровня - используется первая.

Во-первых не очень понял, как ты закрываешь настройки нажимая на form1.Button1 - у тебя там Form2.show.
Не понял так же, где у тебя открытие настроек по нажатию на Form1.Button2 - там нет показывания формы или у тебя настройки на панели?
Настроены ли у тебя кнопки, BitBtn1 как модальные?

Касательно настроек и Ацессов виолатионов.
АцессВиолатион у тебя возникает (как мне видится), изза того, что когда ты запускаешь в Button1Click таймер, в нем лейблы ссылаются на Form2.DateTimePicker1.DateTime. Как я понимаю, форма у тебя тоже не показывается. И при закрытии такая байда возникает, потому что Таймер продолжает работать, когда объект формы уже уничтожен.
Если чтото не так, тогда сорри

Посмотри в коде самой программы (в юните, где он начинается с зарезервированного слова program <имя проги>). Имя проги - это имя проекта. Тоесть в файле проекта посмотри как у тебя создаются формы. Я так понимаю что создаются последовательно:

Application.CreateForm(Form1,TForm1);
Application.CreateForm(Form2,TForm2);

Если так, то в Дельфи: Project->Options->Закладка Forms. В Auto-Create секции оставляешь только главную форму, все остальное переносишь вправо.

Чтобы отобразить форму, по нажатию на кнопку делаешь так:
var
F2: TForm2; // глобальная переменная в рамках "этого" юнита

Код:
procedure TForm1.OpenFormButtonClick(Sender:TObject)
begin
  if not Assigned(F2) then
    F2 := TForm2.Create(nil); // или Application вместо nil.
  F2.SomeThing.enabled := true; // настраиваешь то что надо настроить
  F2.SomethingElse.AnyData := 'AnyTime';
  F2.ShowModal;  // или F2.Show;
end;

Procedure TForm1.ButtonSaveSettingsClick(Sender: TObject);
begin
  if assigned(F2) then
  begin
    F2.SaveSett;
    F2.Close;
  end;
end;

-------------------------------------------------------------------
// во второй форме
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
end;

procedure TForm2.SaveSett; // пихаешь в описании класса в секцию public
begin
  // тут операции с ини файлом
end;
Ответить с цитированием
  #6  
Старый 17.07.2008, 18:40
Аватар для ZIP
ZIP ZIP вне форума
Прохожий
 
Регистрация: 15.06.2008
Адрес: Россия, под Казанью
Сообщения: 39
Репутация: 10
По умолчанию

Цитата:
В моей статье описано как это сделать.
А можно ссылку на статью?
__________________
Сжатый
Ответить с цитированием
  #7  
Старый 17.07.2008, 19:30
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

По поводу вывода таймера в ДЛЛ.
Выводить надо не таймер, а вывод информации. Т.е. должно быть что-то типа:

Код:
TForm1.Timer1Timer(...);
var
  FNow : TDateTime;
  S1,...,Sn : String; // Переменные для "принятия" форматированных данных.
begin
  FNow := Now;
  // Здесь загрузка ДЛЛ, инициализация поинтера на процку и т.д.
  FormatData(FNow,FToDate,S1,...,Sn); // собственно вызов процки из длл. FToDate - твоя контрольная дата.
  // А здесь выгрузка ДЛЛ.
end;
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 11:28.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025