Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2012.01.15;
Скачать: [xml.tar.bz2];

Вниз

Обработка ошибок в открывающейся форме   Найти похожие ветки 

 
Laguna ©   (2011-10-05 10:28) [0]

Из главной формы открывается другая, в которой открываются таблицы. Во время открытия могут возникнуть ошибки(отсутствует файл, отсутствует индекс и т.д). Как правильно не допустить конечное открытие формы, если на этапе onCreate возникли ошибки. Из главной формы вход оформлен вот так :

 Screen.Cursor := crHourGlass;
 M_Frm := TM_Frm.Create(Application);
 M_Frm.Lab1.Caption := "Выполняется подготовка, ожидайте...";
 M_Frm.Show;
 M_Frm.Update;
 S_Frm := TS_Frm.Create(Application);
 S_Frm.ShowModal;
 M_Frm.Hide;
 M_Frm.Free;
 Screen.Cursor := crDefault;
 S_Frm.CLose;
 S_Frm.Free;



procedure TS_Frm.FormCreate(Sender: TObject);
Var
 ErrorString : String;
begin
 try
   DM1.T1Tbl.Open;
   DM1.T2Tbl.Open;
   DM1.T3Tbl.Open;
   DM1.T4Tbl.Open;
   DM1.T5Tbl.Open;
 except
   on E: EDatabaseError do
     application.messagebox( pchar(E.message), "Native Database Error", 0 );
 end;
end;


 
И. Павел ©   (2011-10-05 10:36) [1]

Можно перехватывать ошибки не в FormCreate а в вызывающей функции, т.е.:

try
M_Frm := TM_Frm.Create(Application);
except
  ...
  Exit;
end;
S_Frm.ShowModal;


 
Laguna ©   (2011-10-05 10:46) [2]

Этот вариант я просматривал. Уточнюсь дополнительно. Если произошла ошибка в момент создания формы в блоке try, то успела ли выделися для нее память и нужно ли в Except добавить S_Frm.Free ?


 
Ega23 ©   (2011-10-05 10:55) [3]

Делай это не на OnCreate, а заведи отдельный public-метод. Его и дёргай:

with TSomeForm.Create(Application) do
 try
   try
     InitSomeForm;  <-- Вот в этом методе и реализуешь всю загрузку из БД или чё там...
   except on E: Exception do
     ShowMessage("Epic Fail!" + sLineBreak + E.Message);
   end;
 finally
   Free;
 end;


 
Ega23 ©   (2011-10-05 10:55) [4]

Забыл:

with TSomeForm.Create(Application) do
try
  try
    InitSomeForm;  <-- Вот в этом методе и реализуешь всю загрузку из БД или чё там...
    ShowModal;
  except on E: Exception do
    ShowMessage("Epic Fail!" + sLineBreak + E.Message);
  end;
finally
  Free;
end;


 
И. Павел ©   (2011-10-05 10:56) [5]

> [2] Laguna ©   (05.10.11 10:46)

free делать не нужно. При возникновении исключения в конструкторе, все очистится автоматически.


 
Ega23 ©   (2011-10-05 10:59) [6]


> все очистится автоматически.


вызовется destructor


 
Laguna ©   (2011-10-05 11:05) [7]

Брр.. не совсем понял зачем дополнительный метод? Что это даст? TsomeForm в данном случае , применительно к моему вопросу какая форма выступает? Здесь главное не так ошибку описать, как не допустить загрузки формы в случае ошибки.


 
Ega23 ©   (2011-10-05 11:13) [8]


> как не допустить загрузки формы в случае ошибки.

Я уже ответил. Вынеси весь код из TSomeForm.OnCreate в TSomeForm.InitSomeForm;


 
Laguna ©   (2011-10-05 11:30) [9]

Дело в том, что из [1] видно , что из главной формы у меня так же запускается информационное окно (M_Frm := TM_Frm.Create(Application);) Для него же тоже нужно отлавливать закрытие и высвобождение памяти если произошла ошибка. А этот код я так понял выполняется во второй форме

with TSomeForm.Create(Application) do
try
  try
    InitSomeForm;  <-- Вот в этом методе и реализуешь всю загрузку из БД или чё там...
    ShowModal;
  except on E: Exception do
    ShowMessage("Epic Fail!" + sLineBreak + E.Message);
  end;
finally
  Free;
end;


 
Ega23 ©   (2011-10-05 11:36) [10]


> Дело в том, что из [1] видно , что из главной формы у меня
> так же запускается информационное окно (M_Frm := TM_Frm.
> Create(Application);)


Если честно, то:
1. Код вообще непонятен. Что такое TM_Frm и TS_Frm - тебе может быть и понятно, но другим нет.
2. Непонятна вообще вся архитектура приложения.
3. Непонятна суть вопроса.

Я вопрос понял так: есть некая модальная форма. При её создании делается много вещей, где может возникнуть исключение, как это лучше обработать?


 
Anatoly Podgoretsky ©   (2011-10-05 11:50) [11]


>  M_Frm := TM_Frm.Create(Application);

на вопрос отвечает этот код, как уже указали некоторые

M_Frm := TM_Frm.Create(Application);
try


 
_Юрий   (2011-10-05 11:51) [12]

Проще поступить не так.
Если выполнить потенциально опасный код не в OnCreate, а непосредственно в переопределенном конструкторе, желаемое поведение получится автоматически


 
Ega23 ©   (2011-10-05 11:56) [13]


> Если выполнить потенциально опасный код не в OnCreate, а
> непосредственно в переопределенном конструкторе


Что-то я не понял. Приведи пример.


 
Laguna ©   (2011-10-05 12:06) [14]


> Если честно, то:1. Код вообще непонятен. Что такое TM_Frm
> и TS_Frm - тебе может быть и понятно, но другим нет.2. Непонятна
> вообще вся архитектура приложения.3. Непонятна суть вопроса.

S_Frm и M_Frm названия двух форм. В [1] разве не видно как они создаются?

M_Frm := TM_Frm.Create(Application);
S_Frm := TS_Frm.Create(Application);


> Я вопрос понял так: есть некая модальная форма. При её создании
> делается много вещей, где может возникнуть исключение, как
> это лучше обработать?


В принципе так. Есть главная форма. В ней создается модальная форма S_Frm , в которой в свою очередь открываются таблицы.... Ну опять [1] переписывать?


 
Ega23 ©   (2011-10-05 12:09) [15]


>  Есть главная форма. В ней создается модальная форма S_Frm
> , в которой в свою очередь открываются таблицы.... Ну опять
> [1] переписывать?


Тогда ответ уже дан.


 
_Юрий   (2011-10-05 12:31) [16]


> Что-то я не понял. Приведи пример.


type
 TS_Frm = class(TForm)
 public
   constructor Create(AOwner: TComponent); override;
 end;

constructor TS_Frm.Create(AOwner: TComponent);
begin
 inherited;
 А тут код открытия таблиц и прочее
end;

При возникновении исключения форма автоматически разрушится, и на экране ничего  показано не будет.
В отличие от OnCreate, которое вызывается не из тела конструктора, а из AfterConstruction


 
Ega23 ©   (2011-10-05 12:47) [17]


> В отличие от OnCreate, которое вызывается не из тела конструктора,
>  а из AfterConstruction


constructor TCustomForm.Create(AOwner: TComponent);
begin
 inherited Create(AOwner);
{$IF DEFINED(CLR)}
 GlobalNameSpace.AcquireWriterLock(MaxInt);
{$ELSE}
 GlobalNameSpace.BeginWrite;
{$IFEND}
 try
   FCreatingMainForm := Application.FCreatingMainForm;
   if FCreatingMainForm then
     Application.FCreatingMainForm := False;

   InitializeNewForm;
   if (ClassType <> TForm) and not (csDesigning in ComponentState) then
   begin
     Include(FFormState, fsCreating);
     try
       if not InitInheritedComponent(Self, TForm) then
         raise EResNotFound.CreateFmt(SResNotFound, [ClassName]);
     finally
       Exclude(FFormState, fsCreating);
     end;
{$IF NOT DEFINED(CLR)}
     if OldCreateOrder then
{$IFEND}
       DoCreate;
   end;
 finally
{$IF DEFINED(CLR)}
   GlobalNameSpace.ReleaseWriterLock;
{$ELSE}
   GlobalNameSpace.EndWrite;
{$IFEND}
 end;
end;


 
_Юрий   (2011-10-05 14:04) [18]


> Ega23 ©   (05.10.11 12:47) [17]


В зависимости от значения OldCreateOrder - или в конструкторе, или в AfterConstruction, по умолчанию - второе.
Можно конечно выставить это свойство в true. Но на мой взгляд, ни к чему завязываться на состояние без необходимости.


 
Ega23 ©   (2011-10-05 14:14) [19]


> или в AfterConstruction, по умолчанию - второе.


Зависит от того, до inherited или после.
Только мне всё равно непонятно преимущество вызова исключения в конструкторе. Не, я в принципе понимаю, что можно, TFileStream и всё такое. Но преимуществ не вижу.

З.Ы. Что-то я туплю уже...


 
Игорь Шевченко ©   (2011-10-05 15:30) [20]


> При возникновении исключения форма автоматически разрушится,
>  и на экране ничего  показано не будет.


будет


 
OW ©   (2011-10-05 15:36) [21]

S_Frm := CreateForm_TSFrm;
if S_Frm =|<> nil then

function CreateForm_TSFrm: TS_Frm;
result := nil;
try
  DM1.T1Tbl.Open;
  DM1.T2Tbl.Open;
  DM1.T3Tbl.Open;
  DM1.T4Tbl.Open;
  DM1.T5Tbl.Open;
  result := TS_Frm.Create(Application);
except
  on E: EDatabaseError do
    application.messagebox( pchar(E.message), "Native Database Error", 0 );
end;


 
_Юрий   (2011-10-05 15:43) [22]


> Ega23 ©   (05.10.11 14:14) [19]



procedure TCustomForm.AfterConstruction;
begin
 if not OldCreateOrder then DoCreate;



> Игорь Шевченко ©   (05.10.11 15:30) [20]


И что же будет показано?


 
_Юрий   (2011-10-05 15:46) [23]


> Ega23 ©   (05.10.11 14:14) [19]


> Только мне всё равно непонятно преимущество вызова исключения
> в конструкторе.


Оно в том, что не нужно совершать дополнительных плясок с try-except или с введением дополнительных методов инициализации


 
Игорь Шевченко ©   (2011-10-05 17:10) [24]


> И что же будет показано?


форма


 
Ega23 ©   (2011-10-05 17:16) [25]


> Игорь Шевченко ©   (05.10.11 17:10) [24]
>
> > И что же будет показано?
> форма


Если в AfterConstruction исключение поднять, то не будет.
Пруф:

unit Unit23;

interface

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

type
 TForm23 = class(TForm)
   Memo1: TMemo;
   procedure FormCreate(Sender: TObject);
 private
   { Private declarations }
 public
   procedure AfterConstruction; override;

 end;

var
 Form23: TForm23;

implementation

{$R *.dfm}

procedure TForm23.AfterConstruction;
begin
 Memo1.Lines.Add("TForm23.AfterConstruction; before inherited");
 inherited;
 raise Exception.Create("Error Message");
 Memo1.Lines.Add("TForm23.AfterConstruction; after inherited");
end;

procedure TForm23.FormCreate(Sender: TObject);
begin
 Memo1.Lines.Add("TForm23.FormCreate(Sender: TObject);");
//  raise Exception.Create("Error Message");
end;

end.


Опробовано с обоими вариантами OldCreateOrder


 
Ega23 ©   (2011-10-05 17:18) [26]

Если поднять в OnCreate - таки будет, также с обоими вариантами


 
MsGuns ©   (2011-10-05 17:26) [27]

А если попробовать выкопать морковку без трактора, комбайна, эскаватора, звена колхозниц и роты пулеметчиков - просто голыми руками:

procedure TForm1.OnActivate(Sender: TObject);
begin
 if (Tag>0) then exit;
 try
    ... // Открытие всех нужных таблиц
    Tag := 1;
 except
    ShowMessage("Ошибка открытия") ;
 end;
end;


 
Ega23 ©   (2011-10-05 17:33) [28]


> .OnActivate


Вот это как раз не следует. Нафига показывать то, что уже не прошло валидацию?


 
MsGuns ©   (2011-10-05 17:36) [29]

Тогда формочку-сплитер.


 
OW ©   (2011-10-05 17:39) [30]

ну а чем плохо

все открыть, если все нормально, то и создать форму
если нет - все закрыть "взад" и поругаться


 
MsGuns ©   (2011-10-05 17:46) [31]

Вообще-то положено какбы предварительно логиниться к базе, а без формы это сделать затруднительно. И если возникает ошибка, то сообщать о ее характере, предлагая пользователю попробовать еще раз (например после выяснения у админа новых парметров соединения). Как собсна сделаны все субэдэшные сервисы.
Однако тут как всегда дружно и вдохновенно изобретают велосипед


 
Ega23 ©   (2011-10-05 17:54) [32]


>  а без формы это сделать затруднительно


Для таких целей существует DataModule


 
MsGuns ©   (2011-10-05 18:03) [33]

Датамодуль нужен совсем для других целей


 
_Юрий   (2011-10-05 18:37) [34]


> Игорь Шевченко ©   (05.10.11 17:10) [24]


> форма


Не сразу заметил, что автор ловит исключение. Речь идет разумеется о случае, когда исключение не отлавливается.

Автор - не лови исключение! И никакой формы тогда показано не будет.


> Ega23 ©   (05.10.11 17:16) [25]



> Если в AfterConstruction исключение поднять, то не будет.

Если исключение поднялось  где угодно перед вызовом Show(Modal), то разумеется не будет, просто потому что мы не попадаем на Show(Modal)


 
Игорь Шевченко ©   (2011-10-05 19:57) [35]

_Юрий   (05.10.11 18:37) [34]

автор спрашивает:


> Как правильно не допустить конечное открытие формы, если
> на этапе onCreate возникли ошибки


Между прочим, это один из моих вопросов кандидатам на собеседовании :)


 
Ega23 ©   (2011-10-05 20:08) [36]


> Между прочим, это один из моих вопросов кандидатам на собеседовании
> :)


PostMessage WM_CLOSE


 
Ega23 ©   (2011-10-05 20:09) [37]


> MsGuns ©   (05.10.11 18:03) [33]
>
> Датамодуль нужен совсем для других целей


Ну давай уже тогда, описывай, для чего он нужен.


 
DiamondShark ©   (2011-10-05 20:12) [38]


> Между прочим, это один из моих вопросов кандидатам на собеседовании :)

Если задумался, и собрался отвечать -- гнать поганой метлой.
Ответивший на этот вопрос будет хранить данные в TreeView и всю бизнес-логику писать внутри Button1Click. Нафиг никому не нужен такой кандидат.


 
DiamondShark ©   (2011-10-05 20:15) [39]


> OW ©   (05.10.11 17:39) [30]
> ну а чем плоховсе открыть, если все нормально, то и создать
> формуесли нет - все закрыть "взад" и поругаться

Это не по дельфийски.


 
Игорь Шевченко ©   (2011-10-05 20:16) [40]


> Ответивший на этот вопрос будет хранить данные в TreeView
> и всю бизнес-логику писать внутри Button1Click


До сих пор указанного соответствия не наблюдалось


 
DiamondShark ©   (2011-10-05 20:19) [41]


> До сих пор указанного соответствия не наблюдалось

А формы, отменяющие показ в OnCreate, стало быть, наблюдались?


 
Игорь Шевченко ©   (2011-10-05 20:20) [42]


> А формы, отменяющие показ в OnCreate, стало быть, наблюдались?


формы, выдающие исключение в OnCreate и не появляющиеся после этого на экране наблюдались. Заметьте разницу - не отменяющие показ, а выдающие исключение


 
_Юрий   (2011-10-05 20:21) [43]


> Игорь Шевченко ©   (05.10.11 19:57) [35]


> Между прочим, это один из моих вопросов кандидатам на собеседовании
> :)


Ну дык как по твоему правильно не допустить этого самого открытия?


 
Германн ©   (2011-10-06 01:08) [44]

Удалено модератором


 
MsGuns ©   (2011-10-06 12:36) [45]

>Игорь Шевченко ©   (05.10.11 20:20) [42]
>формы, выдающие исключение в OnCreate и не появляющиеся после этого >на экране наблюдались. Заметьте разницу - не отменяющие показ, а >выдающие исключение

А теперь пожалуйста в деталях чем отличается первое от второго с т.зр. пользователя ?
Или маэстро пишут ПО исключительно для маэстро ?


 
MsGuns ©   (2011-10-06 12:43) [46]

Я не знаю почему топикстартер озадачился испечь блины в атомном реакторе, но чисто на практике знаю какую реакцию вызывает у простого юзверя программа, которая после запуска молча (или с белым прямоугольником, иногда с вкраплениями текста и цвета) зависает на несколько минут, а бывает и часов если говнокодер выставил пузатый таймаут. Ответ простой - резкое желание переместить ярлычок в отхожее место.
Не знаю что там спрашивается на собеседованиях по поводу открытия форм стартующих приложений и честно говоря не интересно. Ибо это в конце концов стандарт софт-конторы, который приходящий усваивает в секунду и в дальнейшем тупо кописпастит (ибо стандарт).


 
MsGuns ©   (2011-10-06 12:47) [47]

Представил что бы было если бы PL/SQL Developer или Toad работал бы по принципу ИШ-ТС с учетом того, что у нас периодицки перебои с Киевом по сетке (базы там). Бррррр....


 
Ega23 ©   (2011-10-06 12:55) [48]


> MsGuns ©   (06.10.11 12:47) [47]
>
> Представил что бы было если бы PL/SQL Developer или Toad
> работал бы по принципу ИШ-ТС с учетом того


А что тут такого?
Не, если в твоём понимании все программы, которые перед показом главной формы подключаются к БД и выкачивают оттуда некую служебную информацию, необходимую для начала работы, относятся к поделкам говнокодеров, то мне тогда искренне жаль твоих клиентов.


 
Игорь Шевченко ©   (2011-10-06 13:14) [49]


> А теперь пожалуйста в деталях чем отличается первое от второго
> с т.зр. пользователя ?


прошу озвучить точку зрения пользователя


> Представил что бы было если бы PL/SQL Developer или Toad
> работал бы по принципу ИШ-ТС


Не представляй, у тебя плохо получается, не твое это


 
MsGuns ©   (2011-10-06 14:37) [50]

>Ega23 ©   (06.10.11 12:55) [48]
>Не, если в твоём понимании все программы, которые перед показом главной формы подключаются к БД и выкачивают оттуда некую служебную информацию, необходимую для начала работы, относятся к поделкам говнокодеров, то мне тогда искренне жаль твоих клиентов.

В моем понимании программа предварительно предлагает залогиниться, а потом уже "подключается", "выкачивает" и т.д. Под "говнокодерами" я подразумевал тех, кто выставляет часовые таймауты без веских на то оснований.

>Игорь Шевченко ©   (06.10.11 13:14) [49]
>прошу озвучить точку зрения пользователя

Отсутствие тормозов (в т.ч. и особенно при запуске приложения),
Удобный интерфейс (без излишеств, но со всем необходимым)
Отсутстствие непредвиденных (не описанных в руководстве) глюков и граблей
Понятное интуитивно поведение программы, включая сообщения об ошибках.

Достаточно ?

>Не представляй, у тебя плохо получается, не твое это

Ну куда уж нам уж выйти замуж :)


 
Ega23 ©   (2011-10-06 14:45) [51]


> В моем понимании программа предварительно предлагает залогиниться


И чем это противоречит созданию компонента TLoginDialog, размещению его в DataModule и вызов перед созданием главной формы?


 
Ega23 ©   (2011-10-06 14:45) [52]

И, кстати, я так и не услышал лекции, для чего предназначены ДатаМодули. Очень интересно послушать.


 
И. Павел ©   (2011-10-06 14:49) [53]

> Под "говнокодерами" я подразумевал тех, кто выставляет часовые
> таймауты без веских на то оснований.

Чувствую, не доводилось вам сталкиваться с истинным говнокодом :)


 
Юрий Зотов ©   (2011-10-06 15:19) [54]

Вместо OnCreate  - перекрыть конструктор. И все дела.

>Ega23 ©   (05.10.11 14:14) [19]
> преимущество вызова исключения в конструкторе...

...в том, что форма будет уничтожена автоматически.


 
Игорь Шевченко ©   (2011-10-06 15:20) [55]

MsGuns ©   (06.10.11 14:37) [50]


> Достаточно ?


не вижу противоречий с описанными мной деталями реализации.


> Ну куда уж нам уж выйти замуж :)


Вот и не выходи


 
Ega23 ©   (2011-10-06 15:22) [56]


> ...в том, что форма будет уничтожена автоматически.


Это философский спор.


 
Юрий Зотов ©   (2011-10-06 15:24) [57]


> Ega23 ©   (06.10.11 15:22) [56]

Тогда без меня...


 
Ega23 ©   (2011-10-06 15:36) [58]


> Тогда без меня...


Не, то что она будет автоматически уничтожена, спору нет. Вопрос в преимуществе. :)


 
MsGuns ©   (2011-10-06 15:46) [59]

>Ega23 ©   (06.10.11 14:45) [52]
>И, кстати, я так и не услышал лекции, для чего предназначены >ДатаМодули. Очень интересно послушать.

Если действительно интересно (в чем очень сомневаюсь), то поищи на этом же форуме - валом, в т.ч. и с моими скромными репликами
Если просто пофлудить для удовлетворения своего эго, то без меня.

>Игорь Шевченко ©   (06.10.11 15:20) [55]
>Вот и не выходи

Да уж, не часто в последнее время высовываюсь в Мастаках, - просто не интересно. А тут решил "выйти" :)
Ну извини уж, что заставил тебя трудится да тратить твой сарказм


 
Ega23 ©   (2011-10-06 16:14) [60]


> Если действительно интересно (в чем очень сомневаюсь), то
> поищи на этом же форуме - валом, в т.ч. и с моими скромными
> репликами


Судя по твоей ремарке у меня складывается впечатление, что у тебя действительно отсутствует понимание в предназначении DataModule. Это не шутка и не ёрничание.


 
Юрий Зотов ©   (2011-10-06 16:31) [61]

> Ega23 ©   (06.10.11 15:36) [58]
> Вопрос в преимуществе

Оно заключается в слове "автоматически". Нам ничего не надо делать.


 
Ega23 ©   (2011-10-06 16:41) [62]


> Нам ничего не надо делать.


в одном случае нам надо перекрыть AfterContruction и производить инициализацию там, в другом - добавить метод InitSomething и производить инициализацию в нём.
Разница в последующей эксплуатации - в одной строке.
Спор ниочём.


 
MsGuns ©   (2011-10-06 16:41) [63]

>Ega23 ©   (06.10.11 16:14) [60]
>Судя по твоей ремарке у меня складывается впечатление

Извини, но мне как то все равно что у тебя и где складывается.
Но загромождать датамодули созданием формочек и вообще чего-то визуального принципиально не желаю ибо для этого имеются вполне удобные компоненты, в т.ч. и формы. Либо библиотеки.
Хотя это дело вкуса, конечно.


 
Ega23 ©   (2011-10-06 17:09) [64]


> Но загромождать датамодули созданием формочек


Знаешь, TOpenDialog тоже в каком-то смысле "формочка". Против него у тебя ничего нет?


 
Игорь Шевченко ©   (2011-10-06 17:09) [65]


> Да уж, не часто в последнее время высовываюсь в Мастаках


Мудро, Штирлиц. Руководствуйтесь этим и впредь.


 
Jeer ©   (2011-10-06 17:43) [66]


> Ega23 ©   (06.10.11 17:09) [64]
> > Но загромождать датамодули созданием формочек
> Знаешь, TOpenDialog тоже в каком-то смысле "формочка". Против
> него у тебя ничего нет?


Так и обходись одним датамодулем, зачем тебе все остальное ?


 
Jeer ©   (2011-10-06 17:47) [67]


> MsGuns ©   (06.10.11 16:41) [63]
> Хотя это дело вкуса, конечно.


Для такого варианта - вкуса нет, в моем понимании.


 
Ega23 ©   (2011-10-06 19:28) [68]


> Так и обходись одним датамодулем, зачем тебе все остальное?


Есть датамодуль. В нём всякие ImageList-ы, глобальный коннект к БД, несколько датасорс-датасет-ов и TDBConnectDialog. Отдельный компонент, невизуальный (в дизайн-тайм). Который, собственно, отрабатывает при старте либо при реконнекте.
Датамодуль создаётся первым. Если коннект не прошёл, то убивается и выход, до создания главной формы дело даже не дошло.
Вот, собственно, и всё.


 
_Юрий   (2011-10-06 20:13) [69]


> И. Павел ©   (06.10.11 14:49) [53]
>



> Чувствую, не доводилось вам сталкиваться с истинным говнокодом
> :)


Ему доводилось, я гарантирую это. Не верите - смотрите [27], это ни что иное, как он самый  и есть.


 
Cobalt ©   (2011-10-07 10:49) [70]

Ega23 ©   (06.10.11 19:28) [68]
> Если коннект не прошёл, то убивается и выход, до создания
> главной формы дело даже не дошло.
> Вот, собственно, и всё.


А как же уведомление пользователя о том, что "Необходимо обратиться к администратору с целью проверки связи с сервером приложения"?


 
Ega23 ©   (2011-10-07 10:54) [71]


> А как же уведомление пользователя о том, что "Необходимо
> обратиться к администратору с целью проверки связи с сервером
> приложения"?


В рамках компонента.


 
Jeer ©   (2011-10-07 11:14) [72]


> В рамках компонента.
>

Даже как очень частный случай, рассматривают такой метод для себя нежелательным.
В моих случаях, пользователи всегда получают главную форму с возможностью подключения к тому или иному северу, той или иной БД.
Разумеется, физические детали скрыты от юзера, но он понимает, к чему хочет подключиться. Ну и получает мессаги и статус контролов на форме по результатам подключения.


 
Ega23 ©   (2011-10-09 22:03) [73]


> всегда получают главную форму с возможностью подключения


Какая разница?


 
Laguna ©   (2011-10-09 22:43) [74]


> Есть датамодуль. В нём всякие ImageList-ы, глобальный коннект
> к БД, несколько датасорс-датасет-ов и TDBConnectDialog.
> Отдельный компонент, невизуальный (в дизайн-тайм). Который,
>  собственно, отрабатывает при старте либо при реконнекте.
> Датамодуль создаётся первым. Если коннект не прошёл, то
> убивается и выход, до создания главной формы дело даже не
> дошло.Вот, собственно, и всё.


А чего вы все зациклились на показе главной формы? Вопрос был не в этом. В DM у меня лежат все компоненты, связанные с таблицами, имагесы  и т.д. Изначально все таблицы не открываю. Разные формы связаны с открытием разных таблиц по необходимости. Поэтому и проверяю перед открытием формы валидность доступа к данным. Смысл открывать форму с пустым гридом, если данные не открылись?


 
Laguna ©   (2011-10-09 22:45) [75]

Т.е. все дополнительные формы открываются из главной после того, как главная уже открыта.


 
Юрий Зотов ©   (2011-10-09 23:47) [76]

> Laguna
> Как правильно не допустить конечное открытие формы, если на этапе
> onCreate возникли ошибки.

1. Замещаете конструктор формы и в нем сначала пишете inherited, а потом - код инициализации формы (тот, что раньше был в OnCreate).

2. В этом коде при невозможности инициализации формы (нет доступа к БД, еще что угодно) возбуждаете исключение.

3. Теперь, когда Ваш код будет создавать эту форму, то она либо нормально создастся, либо возникнет исключение. В первом случае все ОК, показываем форму и работаем. Во втором же случае форма создана не будет (точнее, она будет создана, но тут же будет автоматически уничтожена кодом VCL, без всяких наших усилий) - а Вам остается только поймать это исключение и вывести юзеру внятное сообщение. Для этого достаточно вызов конструктора формы поместить в блок try-except:

procedure TAppMainForm.SomeButtonClick(Sender: TObject);
var
 MyForm: TMyForm;
begin
 try
   MyForm := TMyForm.Create(Application)
 except
   on e: Exception do
   begin
     MessageBox(...); // Здесь используем e.Message.
     Exit
   end
 end;
 // Здесь показываем форму и работаем с ней, а в конце, если она
 // уже не нужна, то убиваем ее (используя для этого try-finally).
end;



Страницы: 1 2 вся ветка

Форум: "Начинающим";
Текущий архив: 2012.01.15;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.67 MB
Время: 0.005 c
15-1317069002
Юрий
2011-09-27 00:30
2012.01.15
С днем рождения ! 27 сентября 2011 вторник


4-1253534102
__Алексей__
2009-09-21 15:55
2012.01.15
Доступ из службы к сетевому компбютеру


15-1317426033
Кто б сомневался
2011-10-01 03:40
2012.01.15
Замедленный скролл при включенном видео в Win 7


15-1317198478
boriskb
2011-09-28 12:27
2012.01.15
Прототип «русской Windows» разработают за 5 млн рублей


15-1317056504
Dennis I. Komarov
2011-09-26 21:01
2012.01.15
Бегство с тонущего корабля





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