Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.05.2024, 23:37   #1
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 662
По умолчанию Корректна ли функция?

Код:
Function PanelCreateVisible(Panel1:TPanel):boolean;
begin
  If Panel1<>nil then begin
    Result:=Panel1.Visible;
  end else result:=false;
end;
Во многих местах программы нужно "спросить" видимость панели, но при этом возможен случай когда она вообще не создана еще.

Для этого сделал функцию, которая сначала проверяет наличие панели вообще, а потом уже ее видимость.

Корректен ли код? Могут ли быть "подводные камни"?

Самостоятельные тесты проблем не обнаружили
Kronos913 вне форума Ответить с цитированием
Старый 18.05.2024, 01:59   #2
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,897
По умолчанию

Цитата:
Сообщение от Kronos913 Посмотреть сообщение
Корректен ли код?
Не корректен в общем случае.
northener вне форума Ответить с цитированием
Старый 18.05.2024, 10:21   #3
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,674
По умолчанию

Цитата:
Сообщение от Kronos913 Посмотреть сообщение
Могут ли быть "подводные камни"?
Panel1 не обязана быть nil, что не гарантирует наличие самого объекта.
Arigato вне форума Ответить с цитированием
Старый 18.05.2024, 11:21   #4
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 662
По умолчанию

Как тогда лучше сделать? Так лучше?
Код:
Function PanelCreateVisible(Panel1:TPanel):boolean;
begin
  try
    Result:=Panel1.Visible;
  except
    result:=false;
  end;
end;
Kronos913 вне форума Ответить с цитированием
Старый 18.05.2024, 11:58   #5
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 662
По умолчанию

Цитата:
Сообщение от Arigato Посмотреть сообщение
Panel1 не обязана быть nil, что не гарантирует наличие самого объекта.
А кроме nil, какие еще могут быть варианты у отсутствующей панели?
Kronos913 вне форума Ответить с цитированием
Старый 18.05.2024, 12:03   #6
Vapaamies
Просветитель
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,844
По умолчанию

Цитата:
Сообщение от Kronos913 Посмотреть сообщение
Корректен ли код? Могут ли быть "подводные камни"?
Корректен. Подводный камень:
Цитата:
Сообщение от Arigato Посмотреть сообщение
Panel1 не обязана быть nil, что не гарантирует наличие самого объекта.
На практике решается размещением переменных в теле класса, вызовом FreeAndNil для их очистки, а также использованием соответствующих контейнеров (TObjectList вместо массива, например), если нужно.
Vapaamies вне форума Ответить с цитированием
Старый 18.05.2024, 12:15   #7
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 662
По умолчанию

Если я в программе эту панель не удаляю, а только создаю - то могут быть случае отличающиеся от nil ?

Просто панель не создаётся сразу, чтобы не перегружать загрузку программы. Но при первом обращении к этому разделу программы, панель создаётся и больше не удаляется. Отсюда вопрос: могут ли в таком случае возникнуть проблемы с тем что значение <>nil а панели нет?
Kronos913 вне форума Ответить с цитированием
Старый 18.05.2024, 13:47   #8
Vapaamies
Просветитель
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,844
По умолчанию

Цитата:
Сообщение от Kronos913 Посмотреть сообщение
Если я в программе эту панель не удаляю, а только создаю - то могут быть случае отличающиеся от nil ?
Не должны.

Цитата:
Сообщение от Kronos913 Посмотреть сообщение
Просто панель не создаётся сразу, чтобы не перегружать загрузку программы.
А не лучше просто убрать форму из автозагрузки? Давным-давно, когда вопросов по Delphi на форумах было много, я частенько советовал убрать описание объявления переменной формы из ее модуля, чтобы компилятор заругался. Кто не поймет, что делать дальше, — не программист.

В нормальной программе создаваться автоматически должна только главная форма, а всякие вспомогательные, типа диалогов, — по мере надобности. Если нет каких-то других соображений, конечно. Они есть?
Vapaamies вне форума Ответить с цитированием
Старый 18.05.2024, 17:46   #9
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,674
По умолчанию

Цитата:
Сообщение от Kronos913 Посмотреть сообщение
могут ли в таком случае возникнуть проблемы с тем что значение <>nil а панели нет?
Запросто:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  Panel: TPanel;
begin
  if Panel = nil
    then ShowMessage('nil')
    else ShowMessage('not nil');
end;
Изображения
Тип файла: png 1.png (1.2 Кб, 28 просмотров)
Arigato вне форума Ответить с цитированием
Старый 19.05.2024, 05:55   #10
Vapaamies
Просветитель
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,844
По умолчанию

Цитата:
Сообщение от Arigato Посмотреть сообщение
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  Panel: TPanel;
begin
  if Panel = nil
    then ShowMessage('nil')
    else ShowMessage('not nil');
end;
Так это же, по сути, обращение к неинициализированному указателю. Его исправить надо, а не обходить псевдопроверками. Конкретно на этом коде сам Delphi должен выдать предупреждение при компиляции. У меня выдал:
Цитата:
[Warning] Main.pas(614): Variable 'Panel' might not have been initialized
Незачет.
Vapaamies вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Корректна ли замена BitMap Kronos913 Общие вопросы Delphi 3 12.03.2024 07:03
Напишите функцию calculateArea. -Если функция принимает одно число "a" - она возвращает площадь квадрата (a*a). -Если функция принимает два числа "a, b" - она возвращает площадь пр Skeydzh Фриланс 4 04.07.2017 22:42
Функция ICMP Microsoft Office Excel 7 05.01.2014 02:11
Функция pow |Dima| Общие вопросы C/C++ 16 19.07.2011 13:07
одна функция потока, а другая функция - член класса запускающего этот поток Дмитрий_Ч Общие вопросы C/C++ 2 27.09.2007 08:50