Форум: "Начинающим";
Текущий архив: 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, которое вызывается не из тела конструктора,
> а из AfterConstructionconstructor 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