Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.12.30;
Скачать: [xml.tar.bz2];

Вниз

Работа с записями   Найти похожие ветки 

 
allucard   (2007-12-04 10:08) [0]

Доброго утра всем.

Вопрос:

Есть запись (record) у которой есть поля:

type
TMagazin = record
kassa1: integer;
kassa2: integer;
kassa3: integer;
summa: integer;
end;


Как сделать так чтобы при добавлении (или вычитании) с одной из касс автоматически перещитывалась сумма?

(чтобы не перещитывать вручную)
т.е.

например:
kassa1=3;
kassa2=1;
kassa3=2;
summa=5;

kassa1 := kassa1+2;
а сумма сама пересчиталась и была равна 7.

p.s. знаю что на c++ visual studio есть возможность переопределения, как это сделать на дельфи?

Спасибо.


 
Думкин ©   (2007-12-04 10:15) [1]

В Д7 и не в классе - никак.


 
allucard   (2007-12-04 10:31) [2]

Ну, пусть в классе, только как?

type
TMagazin = class;
 private
   kassa1: integer;
   kassa2: integer;
   kassa3: integer;
   summa: integer;
 public
   { Public declarations }
 end;


 
Dennis I. Komarov ©   (2007-12-04 10:35) [3]

> [2] allucard   (04.12.07 10:31)

И.......
Это все?

Посмотри как пишутся классы


 
{RASkov} ©   (2007-12-04 10:41) [4]

> [0] allucard   (04.12.07 10:08)

Сделать процедуры типа:

procedure AddInKassa(var m: TMagazin; const NK: Byte; const Value: Integer);
begin
 with m do begin
  case NK of
   1: kassa1:=kassa1+Value;
  ......
  end;
  summa:=summa+Value;
 end;
end;


где m - магазин, NK - номер кассы для операции, Value - значение.....
Вот в таком плане можно.... аналогично вычитание....если нужно)

Но если хочется "нормальной атоматизации", то лучше посмотреть в сторону классов и их методов...


> [2] allucard   (04.12.07 10:31)

А немного подумать)


 
Dennis I. Komarov ©   (2007-12-04 10:43) [5]

TAny=class(TComponent)
 private
   FKassa1: Integer;
   FKassa2: Integer;
   FKassa3: Integer;
   FSumma: Integer;
   procedure SetXML(const Value: TXMLDocument);
 protected

 public
   constructor Create(AOwner: TComponent); override;
   destructor Destroy; override;
 published
   property Kassa1: Integer read FKassa1 write SetKassa1;
   property Kassa2: Integer read FKassa2 write SetKassa2;
   property Kassa3: Integer read FKassa3 write SetKassa3;
   property Summa: Integer read FSumma;
 end;

....
procedure SetKassaX
begin
//Тут пересчет суммы
end;

Кажеться вот так
Писал в клиенте, если где что навалял - не бить :)


 
Думкин ©   (2007-12-04 10:43) [6]

> allucard   (04.12.07 10:31) [2]

С помощью свойств. Причем на выбор:

TMagazin = class
private
  kassa1: integer;
  kassa2: integer;
  kassa3: integer;
 public
  function summa: integer;
  ///Доступ к кассам и т.п
end;
function TMagazin.summa: integer;
begin
     Result := kassa1 + kassa2 + kassa3
end;


Или так:

TMagazin = class
private
  fkassa1: integer;
  fkassa2: integer;
  fkassa3: integer;
  fsumma : integer;
   procedure setkassa1(const Value: integer);
 public
  property kassa1 : integer read fkassa1 write setkassa1;
 ///Доступ к кассам и т.п
end;

procedure TMagazin.setkassa1(const Value: integer);
begin
 fsumma := fsumma-fkassa1+Value;
 fkassa1 := Value;
end;


 
sniknik ©   (2007-12-04 10:44) [7]

вариант
type
TMagazin = class;
private
  function GetSumma: integer;
public
  kassa1: integer;
  kassa2: integer;
  kassa3: integer;
  property summa: integer read GetSumma;
end;

function TMagazin.GetSumma: integer;
begin
 result:=  kassa1 + kassa2 + kassa3;
end;


 
Думкин ©   (2007-12-04 10:45) [8]


> function summa: integer;

property summ : integer read getsumm;


 
Dennis I. Komarov ©   (2007-12-04 10:46) [9]

> procedure SetXML(const Value: TXMLDocument);

Это убрать, случайно затесалась :)


 
Skyle ©   (2007-12-04 10:47) [10]

Есть несколько вариантов разной степени извращённости

1.
type
 TMagazin = record
   Kassa1 : Integer;
   Kassa2 : Integer;
    ...
 end;

 function MyMagazinSumma (const AMagazin : TMagazin) : Integer;
 begin
   with AMagazin do
     Result := Kassa1 + Kassa2 + ....;
 end;


2.
type
 TMagazin = class
 private
   FKassa1 : Integer;
   FKassa2 : Integer;
   function GetSumma : Integer;
 public
   property Kassa1 : Integer read FKassa1 write FKassa1;
   property Kassa1 : Integer read FKassa1 write FKassa1;
   property Summa : Integer read GetSumma;
 end;

function TMagazin.GetSumma : Integer;
begin
 Result := FKassa1 + FKassa2 + ....;
end;


Можно и ещё придумать. Зависит от особенностей использования.


 
allucard   (2007-12-04 10:54) [11]

Спасибо.

Сейчас попробую.


 
allucard   (2007-12-04 11:03) [12]


> Dennis I. Komarov ©   (04.12.07 10:43) [5]
>
> TAny=class(TComponent)

а что существенного мне даст сделать свой компонент наследником TComponent, для моих примитивных целей?)


 
Anatoly Podgoretsky ©   (2007-12-04 11:05) [13]

summa поле расчетное, поэтому оно физически не нужно и не нужно делать перерасчеты соответственно.

Сделать только три приватных поля и четыре контролируемых свойства. Обязательно запрети прямую запись в kassaX


 
Skyle ©   (2007-12-04 11:05) [14]


> allucard   (04.12.07 11:03) [12]

Судя по наличию SetXML это была какая-то домашняя заготовка. Можно не обращать внимания.


 
sniknik ©   (2007-12-04 11:07) [15]

> Можно и ещё придумать. Зависит от особенностей использования.
лучше не придумывать... т.к. конкретно вот эта особенность состоит, имхо, в написании замены базе/таблице.
товарищ не разобрался с готовым и решил что написать свое проще. еще раз ИМХО.


 
Dennis I. Komarov ©   (2007-12-04 11:12) [16]

> [14] Skyle ©   (04.12.07 11:05)

Совершенно правильно, выдрал из первого попавшегося, не все исправил :)

> [12] allucard   (04.12.07 11:03)

Забей. Я просто показал, что [2] этого мало :)


 
allucard   (2007-12-04 12:47) [17]

Решил всё таки по своему.

Через процедурные типы в записи:

type
TFuncInt = function: integer;

TMagazin = record
kassa1: integer;
kassa2: integer;
kassa3: integer;
summa: TFuncInt;
end;

var Magazin: TMagazin;

function summa: integer;
begin
result := kassa1+kassa2+kassa3;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Magazin.Summa := Summa;
end;

Всем спасибо.


 
Dennis I. Komarov ©   (2007-12-04 12:53) [18]

А ведь этот софт будет в каком-то магазине :(


 
allucard   (2007-12-04 12:54) [19]

:)


 
allucard   (2007-12-04 12:56) [20]

главное работает ;)


 
Anatoly Podgoretsky ©   (2007-12-04 12:58) [21]

> allucard  (04.12.2007 12:56:20)  [20]

Неправда - это не главное.
Главное, что бы правильно работало, а этот вариант не гарантирует.
Смело можно поменять любую кассу в обход.
Магазин не должен допускать таких вольностей.


 
sniknik ©   (2007-12-04 13:00) [22]

> Решил всё таки по своему.
пусть через задницу, но свое родное... молодца!

хотя, приведенный код вобще то не рабочий (область видимости не та)... что оставляет надежду на то, что ты воспользовался всетаки какимнибудь из приведенных выше вариантов но постеснялся в этом признаться.


 
Dennis I. Komarov ©   (2007-12-04 13:01) [23]

> [21] Anatoly Podgoretsky ©   (04.12.07 12:58)

Магазин не должен допускать таких программистов, т.к. ИМХО - это уже коммерческий софт. И потери могут быть гораздо больше, чем такая экономия.


 
allucard   (2007-12-04 13:49) [24]


> Anatoly Podgoretsky ©   (04.12.07 12:58) [21]

Я до такого уровня ещё не дошёл.
И понимаю необходимо использовать классы и данные по кассам держать в секции private.

Вы это имели ввмду?


 
Ega23 ©   (2007-12-04 13:51) [25]


> Вы это имели ввмду?


Данные по кассам надо держать в сейфе.


 
Anatoly Podgoretsky ©   (2007-12-04 14:03) [26]

> allucard  (04.12.2007 13:49:24)  [24]

Тебе достаточно привели примеров, осталось только реализовать.



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2007.12.30;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.008 c
2-1197037557
Nikfel
2007-12-07 17:25
2007.12.30
Как получить список процессов с путем.


2-1196851391
Максим
2007-12-05 13:43
2007.12.30
DLL


15-1196155673
Cyrax
2007-11-27 12:27
2007.12.30
Дилерский договор, платёжные реквизиты: чей ИНН/КПП указывать ?


2-1196686616
Alexandr Malygin
2007-12-03 15:56
2007.12.30
Арифметика


3-1187943795
DmitriyG.
2007-08-24 12:23
2007.12.30
Передача и восстановление данных для mysql





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский