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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 07.04.2010, 18:07
Аватар для T-dayne
T-dayne T-dayne вне форума
Начинающий
 
Регистрация: 26.01.2010
Сообщения: 180
Репутация: 31
Восклицание В чем может быть ошибка?

Здравствуйте. Написал код, который скачивает с сервера файл, проверяет этот файл и если условие верно, то показывает одно окно, если не верно, происходит выход из формы.
Это я образно описал, вот сам код, с комментариями:
PHP код:
procedure TForm9.FormShow(SenderTObject);
var 
FileOnNetLocalFileNamestring;
initinifile;
begin
   gif
.Visible:=true;
   
label1.Visible:=true;
   
form9.Height:=80;
   
memo1.Visible:=false;
   
button1.Visible:=false;
   
button2.Visible:=false//возвращаем исходные данные окна

   
FileOnNet:='http://127.0.0.1/mysite/finalv.ini';
   
LocalFileName:='finalv.ini';
   
label1.Caption:='Подключаемся...';
   if 
GetInetFile(FileOnNet,LocalFileNamethen //Если файл скачан успешно 
    
begin
    label1
.Caption:='Проверка наличия версии...';
    
ini:=tinifile.Create(extractfiledir(application.ExeName)+'\finalv.ini');
     if 
ini.ReadInteger('main''finalv'1)>1331033 then //сравниваем версию на сайте и версию программы
      
begin
      gif
.Visible:=false//если есть новая версия активируем текст и кнопки обновления
      
label1.Visible:=false;
      
form9.Height:=134;
      
memo1.Visible:=true;
      
button1.Visible:=true;
      
button2.Visible:=true;
      
end
     
else
      
begin //если при сравнении версии одинаковы то
       
showmessage('У вас самая последняя версия'); 
       
form9.Close;
      
end;
    
end
     
else //если файл скачать не удалось то выводим:
      
showmessage('Не удалось подключиться к серверу обновления!');

end
Так вот, все работает прекрасно, но если вдруг получается так, что версии одинаковы, и обновление не требуется, то на месте кода:
Код:
showmessage('У вас самая последняя версия'); 
       form9.Close;
Выползает ошибка
Цитата:
Cannot change visible in OnShow or OnHide
и окно не закрывается!
В чем может быть проблема?
Ответить с цитированием
  #2  
Старый 07.04.2010, 18:42
roamer roamer вне форума
Активный
 
Регистрация: 15.04.2009
Сообщения: 369
Репутация: 93
По умолчанию

Если (в данном случае) в переменной form9 хранится ссылка на объект класса TForm9, то корректность вызова метода Close внутри метода FormShow - сомнительна ...
Ответить с цитированием
  #3  
Старый 07.04.2010, 18:45
Аватар для T-dayne
T-dayne T-dayne вне форума
Начинающий
 
Регистрация: 26.01.2010
Сообщения: 180
Репутация: 31
По умолчанию

Цитата:
Сообщение от roamer
Если (в данном случае) в переменной form9 хранится ссылка на объект класса TForm9, то корректность вызова метода Close внутри метода FormShow - сомнительна ...
А как возможно тогда реализовать закрытие формы сразу поле showmessage?

Последний раз редактировалось T-dayne, 07.04.2010 в 18:48.
Ответить с цитированием
  #4  
Старый 07.04.2010, 18:59
roamer roamer вне форума
Активный
 
Регистрация: 15.04.2009
Сообщения: 369
Репутация: 93
По умолчанию

А нужно ли размещать всю логику в методе FormShow ?

Может быть лучше что-то вроде этого :
Код:
type
  TForm9 = class(TForm)
    ...
    ...            
  private
    { Private declarations }
  public
    { Public declarations }
    function Execute(нужные параметры) : boolean;

  end;

var
  form9: TForm9;

function TForm9.Execute(нужные параметры) : boolean;
begin
  Result:=false;

  ...инициализация того, что надо
  
  if ShowModal = mrOk then begin
    Result:=true;
     ... Действия, если все OK
  end
  else begin
     ... иначе ...
  end;

end;

Ответить с цитированием
  #5  
Старый 07.04.2010, 19:17
Аватар для T-dayne
T-dayne T-dayne вне форума
Начинающий
 
Регистрация: 26.01.2010
Сообщения: 180
Репутация: 31
По умолчанию

Цитата:
Сообщение от roamer
А нужно ли размещать всю логику в методе FormShow ?

Может быть лучше что-то вроде этого :
Код:
type
  TForm9 = class(TForm)
    ...
    ...            
  private
    { Private declarations }
  public
    { Public declarations }
    function Execute(нужные параметры) : boolean;

  end;

var
  form9: TForm9;

function TForm9.Execute(нужные параметры) : boolean;
begin
  Result:=false;

  ...инициализация того, что надо
  
  if ShowModal = mrOk then begin
    Result:=true;
     ... Действия, если все OK
  end
  else begin
     ... иначе ...
  end;

end;

совсем ничего не понятно...
Код:
if ShowModal = mrOk
это вообще не имеет место быть в моем коде вроде... там нет кнопок "ок" "нет", нужно просто закрыть форму после выполения showmessage() остальное работает нормально
Ответить с цитированием
  #6  
Старый 07.04.2010, 19:37
roamer roamer вне форума
Активный
 
Регистрация: 15.04.2009
Сообщения: 369
Репутация: 93
По умолчанию

Цитата:
Сообщение от T-dayne
совсем ничего не понятно...
Код:
if ShowModal = mrOk
это вообще не имеет место быть в моем коде вроде... там нет кнопок "ок" "нет", нужно просто закрыть форму после выполения showmessage() остальное работает нормально
Да, но именно это Вам система и разрешает ...
Ответить с цитированием
  #7  
Старый 07.04.2010, 19:39
roamer roamer вне форума
Активный
 
Регистрация: 15.04.2009
Сообщения: 369
Репутация: 93
По умолчанию

Размещение специального функционала в методе FormShow - не самый лучший метод реализации.
Разве что Вы планируете наследовать этот функционал в наследниках (от этой формы) ...
Ответить с цитированием
  #8  
Старый 08.04.2010, 15:50
Аватар для T-dayne
T-dayne T-dayne вне форума
Начинающий
 
Регистрация: 26.01.2010
Сообщения: 180
Репутация: 31
По умолчанию

Попробовал запихнуть close в отдельную процедуру и запустить ее из под OnShow , ошибки нет, но программа виснет наглухо в этот момент.
Вопрсо все еще актуален!
Ответить с цитированием
  #9  
Старый 09.04.2010, 16:30
roamer roamer вне форума
Активный
 
Регистрация: 15.04.2009
Сообщения: 369
Репутация: 93
По умолчанию

Цитата:
Сообщение от T-dayne
Попробовал запихнуть close в отдельную процедуру и запустить ее из под OnShow , ошибки нет, но программа виснет наглухо в этот момент.
Вопрсо все еще актуален!

А что-то вроде этого :
Код:
program Project1;

uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1},
  Unit2 in 'Unit2.pas' {Form9};

{$R *.res}

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.CreateForm(TForm9, Form9);
  Application.Run;
end.

=======================

unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
  public
  end;

var
  Form1: TForm1;

implementation
uses Unit2;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  Form9.MyShowForm;
end;

end.

=======================

unit Unit2;
interface
uses
  IniFiles,
  Dialogs,
  Windows, SysUtils, Classes, Graphics, Forms, Controls, StdCtrls,
  Buttons, ExtCtrls, jpeg;

type
  TForm9 = class(TForm)
    Panel1: TPanel;
    OKBtn: TButton;
    CancelBtn: TButton;
    Panel2: TPanel;
    Label1: TLabel;
    gif: TImage;
    Memo1: TMemo;
    Button1: TButton;
    Button2: TButton;
    Timer1: TTimer;
    procedure Timer1Timer(Sender: TObject);
  private
    FileOnNet, LocalFileName: string;
    ini: tinifile;
  public
    procedure MyShowForm;
    function GetInetFile(FileOnNet,LocalFileName : string) : boolean;
  end;

var
  Form9: TForm9;

implementation

{$R *.dfm}

procedure TForm9.MyShowForm;
begin
  gif.Visible:=true;
  label1.Visible:=true;
  //Height:=80;
  memo1.Visible:=false;
  button1.Visible:=false;
  button2.Visible:=false; //возвращаем исходные данные окна

  Show;

  Timer1.Enabled:=true;
end;

function TForm9.GetInetFile(FileOnNet,LocalFileName : string) : boolean;
begin
  Result:=true;
  //...
end;

procedure TForm9.Timer1Timer(Sender: TObject);
Var
  fnSize : integer;
begin
  Timer1.Enabled:=false;

  FileOnNet:='http://127.0.0.1/mysite/finalv.ini';
  LocalFileName:='finalv.ini';
  label1.Caption:='Подключаемся...';
  if GetInetFile(FileOnNet,LocalFileName) then //Если файл скачан успешно
   begin
     label1.Caption:='Проверка наличия версии...';

     ini:=tinifile.Create(extractfiledir(application.ExeName)+'\finalv.ini');
     TRY
       fnSize:=ini.ReadInteger('main', 'finalv', 1);
     FINALLY
       ini.Free;
     END;

     if fnSize>1331033 then //сравниваем версию на сайте и версию программы
      begin
         gif.Visible:=false; //если есть новая версия активируем текст и кнопки обновления
         label1.Visible:=false;
         //Height:=134;
         memo1.Visible:=true;
         button1.Visible:=true;
         button2.Visible:=true;
      end
     else
      begin //если при сравнении версии одинаковы то
         showmessage('У вас самая последняя версия');
         Close;
      end;
  end
  else //если файл скачать не удалось то выводим:
      showmessage('Не удалось подключиться к серверу обновления!');
end;

end.




Ответить с цитированием
  #10  
Старый 10.04.2010, 08:21
Аватар для T-dayne
T-dayne T-dayne вне форума
Начинающий
 
Регистрация: 26.01.2010
Сообщения: 180
Репутация: 31
По умолчанию

roamer
Огромное вам спасибо, все более менее работает.

Последний раз редактировалось T-dayne, 10.04.2010 в 08:25.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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