![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Есть ли ошибка в моём коде? [D6, D7, Win95/98, WinXP]
^Sanya © (2002-11-24 10:41:00)Дело в том, что эта функция процентов на 99 должна давать сбой :(
Наверное здесь уместно внедрять указатели, но как???
Данная функция ищет и возвращает дочернюю форму типаTfrmMDIchildBaseNavв MDI-приложении:
function GetBaseNavForm: TfrmMDIchildBaseNav;
var
i: Integer;
begin
Result := nil;
if frmMDIparent.MDIChildCount > 0 then
for i := 0 to frmMDIparent.MDIChildCount-1 do
if (frmMDIparent.MDIChildren[i] is TfrmMDIchildBaseNav) and
(frmMDIparent.MDIChildren[i] <> nil) then
begin
Result := (frmMDIparent.MDIChildren[i] as TfrmMDIchildBaseNav);
Exit;
end;
end;
^Sanya (2002-11-25 00:38:00) [1]
> PaRL © (24.11.02 23:03)
Попробуйте догадаться, что имел ввиду
> VaS © (24.11.02 17:14)
:)))
PaRL (2002-11-24 23:03:00) [2]
> if MDIChildren[i] is TfrmMDIchildBaseNav and
> begin
???
VaS (2002-11-24 17:14:00) [3]Можно написать короче и прозрачнее:
function GetBaseNavForm: TfrmMDIchildBaseNav;
var
i: integer;
begin
Result:=nil;
if frmMDIparent <> nil then with frmMDIparent do
for i:=0 to MDIChildCount-1 do
if MDIChildren[i] is TfrmMDIchildBaseNav and
begin
Result:=TfrmMDIchildBaseNav(MDIChildren[i]);
break;
end;
end;
^Sanya (2002-11-24 15:45:00) [4]Изменил кое-какой код(который, к сожалению сюда никак не влезет)
и всё теперь без глюков.
Поясню:
MDI:
есть Проводник Таблиц(TfrmMDIchildBaseNav), есть Возможность удаления таблиц.
После удачного удаления таблицы, Проводник Таблиц нужно обновить.
Я хотел это сделать, пересоздавая окно ПТ.
Но такой вариант являлся не самым оптимальным и довольно глючным(от моих корявых рук, наверное).
Теперь ПТ я не пересоздаю, а просто его методом очищаю/читаю нужные данные...
ЗЫ: Когдавозникает ошибка "корявом",т.е. неоптимальном коде, я его не оптимизирую, пока не выявлю ошибку...
Пока я учусь, я часто специально иду на риск, чтобы лучше познать среду.
Надо ли так поступать, зная, что код с ошибкой заведомо "корявый"???
Anatoly Podgoretsky (2002-11-24 14:39:00) [5]Главная проблема в том что это глобальная переменная frmMDIparent, со всеми возможными неприятностями, надо просто это сделать методом, но и это возможно полностью не устранит проблему, но для анализа недостаточно информации.
Matolch (2002-11-24 14:38:00) [6]
> TTCustomDelphiMaster ©
> // Здесь второе условие нужно поставить вперед или выкинуть
Matolch (2002-11-24 14:28:00) [7]Ну, удачи, дружище
TTCustomDelphiMaster (2002-11-24 14:28:00) [8]begin
Result := nil;
if frmMDIparent.MDIChildCount > 0 then // Это лишнее
if frmMDIparent <> nil then // Ато может быть не лишним, а может и не быть
for i := 0 to frmMDIparent.MDIChildCount-1 do
if (frmMDIparent.MDIChildren[i] is TfrmMDIchildBaseNav) and
(frmMDIparent.MDIChildren[i] <> nil) then // Здесь второе условие нужно поставить вперед или выкинуть
begin
Result := (frmMDIparent.MDIChildren[i] as TfrmMDIchildBaseNav);
Exit;
end;
end;
^Sanya (2002-11-24 14:24:00) [9]Просто иногда я уничтожаюдочернюю форму, а MDIChildCount не изменяется...
Щас разбираюсь...
Большая (по крайней мере для меня) программа, труднова-то ошибочку отловить...
"Access Violation"...
:(
Но в любом случае отловлю, в Delphi у меня всё задуманное всегда получалось:)
Matolch (2002-11-24 14:11:00) [10]> ^Sanya © Слушай, а у тебя правда ошивка возникает*, или вообще почему она должна давать сбой, по твоему?
^Sanya (2002-11-24 13:52:00) [11]
> Anatoly Podgoretsky © (24.11.02 13:25)
Теперь спасибо, будем думать дальше..
Matolch (2002-11-24 13:32:00) [12]А мне просто интересно - forс обрывом - это нормально? Я, как правило, использую что-то типа whileили repeat, Inc(I). Цикл for, вроде попроще.
Anatoly Podgoretsky (2002-11-24 13:25:00) [13]Ну ты сам просил сделать ошибку с вероятностью 99
А так вот например глобальная переменная frmMDIparent с неизвестным состоянием, четкий источник для ошибки. Если это не учитывать то ошибки нет.
^Sanya (2002-11-24 13:16:00) [14]Неужели я что-то написал, и Anatoly Podgoretsky счёл это верным???
Кстати, ремарка насчёт Вашего Random"а....:
if Random(100) < 100 then raise.....
Почему вы не можете просто конструктивнопомочь человеку?
Я ещё многого не знаю, учусь же...
2All: значит никакой ошибки нет?
Anatoly Podgoretsky (2002-11-24 10:48:00) [15]Почему должна?
Ну если очень нужно, то делай это через
if Random(100)=99 then генерируй ошибку