Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 29.01.2014, 19:20
Аватар для Mrak
Mrak Mrak вне форума
Местный
 
Регистрация: 26.01.2013
Адрес: МО
Сообщения: 438
Версия Delphi: XE2
Репутация: 17
По умолчанию Избавиться от глобальных переменных

Приветствую

В проге есть 2 кнопки: Рассчитать и Сохранить, это некий калькулятор затрат для заявки на услуги
При нажатии "Рассчитать" берутся данные из БД для текущей выбранной заявки (назову их константами в данном контексте). Констант 10 штук, с помощью них осуществляется пересчет по формулам (константы для удобства пихаю в глобальные переменные), выводится сумма.
Если пользователя все устраивает, он жмет сохранить - константы (т.е. глобальные переменные) сохраняются в БД.

Как мне уйти от использования глобальных переменных?

Есть мысль создать класс (в первый раз, не судите строго), например такой:
Код:
...
TMyConst = Class
  private
    FDlina: double;
    FShirina: double;
    // и т.д.
  public
    function SetDlina(Value: string): double;
    function SetShirina(Value: string): double;
    property Dlina: double
      read FDlina write SetDlina;
    property Shirina: double
      read FShirina write SetShirina;
    //....
end;       
...
implementation

function SetDlina(Value: string): double;
begin
  ADOQuery.SQL.Text:='SELECT BDlina FROM const WHERE nomer = "' + value + '"';
  ADOQuery.Open;
  Result:=ADOQuery.FieldByName('BDlina').asfloat;
end;

// Аналогично с остальными константами

НО! Получается, что для каждой переменной-поля будет отдельный запрос! Как то неправильно выходит - 10 запросов вместо одного

Нельзя ли как-то сделать так, чтобы установить все константы одним запросом ('SELECT BDlina, BShirina, ...... FROM const WHERE nomer = "' + value + '"'
__________________
Я за здоровый экстрим!
Спасибо за "спасибо")
Ответить с цитированием
  #2  
Старый 29.01.2014, 20:08
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Приведенная функция SetDlina не подходит. Если она должна менять конфигурацию - нужно что-то в этом роде:
Код:
procedure GetSettings(Value: string);
begin
  ADOQuery.SQL.Text:='<запрос на все параметры>';
  ADOQuery.Open;
  FDlina := ADOQuery.FieldByName('BDlina').asfloat;
  FShirina := ADOQuery.FieldByName('BShirina').asfloat;
  ...
end;
Проперти же сделать Read-Only. Тогда мы гарантируем, что загружены они будут только из базы, а не с потолка, и при этом их можно читать.

З.Ы. с пропертями почти не работал, не люблю их. Но насколько помню, для установки значения функция должна не возвращать double, а явно записывать в поле.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 29.01.2014 в 20:12.
Ответить с цитированием
Этот пользователь сказал Спасибо Bargest за это полезное сообщение:
Mrak (29.01.2014)
  #3  
Старый 29.01.2014, 23:41
Аватар для Mrak
Mrak Mrak вне форума
Местный
 
Регистрация: 26.01.2013
Адрес: МО
Сообщения: 438
Версия Delphi: XE2
Репутация: 17
По умолчанию

а еще есть способы избавления от глобальных переменных?
__________________
Я за здоровый экстрим!
Спасибо за "спасибо")
Ответить с цитированием
  #4  
Старый 30.01.2014, 00:59
Аватар для Freeman
Freeman Freeman вне форума
Местный
 
Регистрация: 05.10.2012
Адрес: Санкт-Петербург
Сообщения: 577
Версия Delphi: 6
Репутация: выкл
По умолчанию

Цитата:
Сообщение от Mrak
Констант 10 штук, с помощью них осуществляется пересчет по формулам (константы для удобства пихаю в глобальные переменные), выводится сумма.
Если калькулятор работает как диалог, для реализация "редактирования диалогом" у него должна быть функция Execute, принимающая на вход запись с нужными параметрами.

Запись (record) -- самый простой способ передачи окружения. Если окружение разрастается во что-то сложное и становится конфигурацией со своей собственной моделью, его реализуют в виде класса или набора классов. Пока рано, как мне кажется.
__________________
Не стоит путать форумы с богадельнями. © Bargest
Ответить с цитированием
Этот пользователь сказал Спасибо Freeman за это полезное сообщение:
Mrak (30.01.2014)
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 12:21.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025