Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Есть ли ошибка в моём коде? [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 генерируй ошибку


Наверх

Титульная страница Поиск, карта сайта Написать письмо