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

Вниз

проверка вводимого значения   Найти похожие ветки 

 
Anatoly Podgoretsky ©   (2011-02-03 15:38) [40]

> Ega23  (03.02.2011 14:51:33)  [33]

Это виртуальный метод, могбы быть даже абстрактным, его перекрытие в
наследнике обязательно.


 
Игорь Шевченко ©   (2011-02-03 15:51) [41]


> СУБД oracle10g xe, наплевать можно но не хочется :) хочется
> по уму и красиво.


а теперь задачу с начала.


 
Ega23 ©   (2011-02-03 15:53) [42]


>  его перекрытие в наследнике обязательно.


Вот тут недавно (месяца 2 назад) с Максом заспорил. По-поводу нужности абстрактных методов в Delphi.
Delphi допускает создание абстрактных классов (TStrings, например). Вот, собственно, вопрос: если допускается создание, то для чего нужна директива abstract? Почему нельзя обойтись просто виртуальным методом?
Взять тот же TDataLink c его ActiveChanged, RecordChangd, UpdateData.
Собственно, вполне возможно, что какая-то Высшая Цель преследовалась.
В самом DB.pas RecordCount только в одном месте используется.


 
Игорь Шевченко ©   (2011-02-03 15:55) [43]


>  Почему нельзя обойтись просто виртуальным методом?


чтобы получить Abstract Error при выполнении и Warning при компиляции


 
Anatoly Podgoretsky ©   (2011-02-03 16:01) [44]

> Ega23  (03.02.2011 15:53:42)  [42]

Обойтись можно, но многое теряется, кой о чем сказал ИШ, и кроме того, тогда
придется делать хотя бы пустую реализацию, кой где в коде такое есть, видимо
остатки от древних времен.


 
Ega23 ©   (2011-02-03 16:05) [45]


> чтобы получить Abstract Error при выполнении и Warning при
> компиляции


Не, это понятно.
Я может несколько сумбурно выразился.
Смысл в другом: зачем тогда вообще позволять создавать абстрактный класс?
Макс хороший пример привёл, чуть ли не от самого Борланда (источник не помню). Где как раз показано, довольно наглядно, для чего эта лазейка оставлена.

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


 
Игорь Шевченко ©   (2011-02-03 16:22) [46]


> Смысл в другом: зачем тогда вообще позволять создавать абстрактный
> класс?


для полиморфизма ?


 
Ega23 ©   (2011-02-03 16:32) [47]


> для полиморфизма ?

А какой тут полиморфизм? Ну вот я написал:
var
 strings: TStrings;
begin
 strings := TStrings.Create;


Где тут полиморфизм?
Я могу понять, когда strings := TStringList.Create;
Я могу понять, когда коллекция TMyObjectClass = class of TMyObject и явно класс задавать при создании.


 
Anatoly Podgoretsky ©   (2011-02-03 16:36) [48]

> Ega23  (03.02.2011 16:05:45)  [45]

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

Если ты против самого создания класса с абстрактными методами, ну решили не
усложнять компилятор, учивая возможно создания индирект. Да и не мешает это,
если вызовешь такой метод без реализации то получишь внятную ошибку. За это
и боролись в Турбо Паскале, но не было поддержки на уровне компилятора и
системы.


 
Ega23 ©   (2011-02-03 16:39) [49]


> Если ты против самого создания класса с абстрактными методами


Да я не то чтобы против. Просто непонятно было, зачем. Для чего идёт warning про компиляции, а не ошибка.
Вот Макс тогда хороший пример привёл, с "биологическим деревом классов". Наглядно, так сказать, демонстрировалось, в чём удобство.


 
Игорь Шевченко ©   (2011-02-03 16:51) [50]


> Где тут полиморфизм?


тут нет полиморфизма


 
Ega23 ©   (2011-02-03 17:01) [51]


> тут нет полиморфизма

Дык вот и я о том же. Либо строго ставить пустые заглушки на все абстрактные методы и жить по правилу "0 Errors, 0 Warnings, 0 Hints".
Либо на свой страх и риск создавать абстрактный класс, у которого перекыто 5 из 5000 абстрактных методов и быть твёрдо уверенным, что твой код никогда не вызовет ни одного абстрактного метода (кроме перекрытых).


 
Игорь Шевченко ©   (2011-02-03 17:14) [52]

Ega23 ©   (03.02.11 17:01) [51]


> Либо строго ставить пустые заглушки на все абстрактные методы
> и жить по правилу "0 Errors, 0 Warnings, 0 Hints".


Уволят и будут правы


 
kxft78 ©   (2011-02-03 17:26) [53]


> Игорь Шевченко ©   (03.02.11 15:51) [41]
> > СУБД oracle10g xe, наплевать можно но не хочется :) хочется
> > по уму и красиво.а теперь задачу с начала.

Задача:
Есть 2 таблицы ТаблицаА(рабочая таблицы) и ТаблицаБ(некая справочная таблица).
Есть форма с едитом, edit.text котрого инсертится в ТаблицаА.
перед инсертом в  ТаблицаА, необходимо проверить наличие содержимого edit.text в ТаблицаБ, если его там нету обругать юзера и не дать сделать инсерт.


 
Ega23 ©   (2011-02-03 17:27) [54]


> перед инсертом в  ТаблицаА, необходимо проверить наличие
> содержимого edit.text в ТаблицаБ, если его там нету обругать
> юзера и не дать сделать инсерт.


Есть подозрение, что спроектировано в корне неверно.


 
kxft78 ©   (2011-02-03 17:37) [55]


> Есть подозрение, что спроектировано в корне неверно.

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


 
DiamondShark ©   (2011-02-03 17:38) [56]

type

TBase = class
constructor Create; virtual;
procedure Kuku; virtual; abstract;
end;

TBaseClass = class of TBase;

var

 koo: TBase;
 tkoo: TBaseClass;

begin

tkoo := GetClassRefFromFarFarAwaySource();
koo := tkoo.Create;
koo.Kuku;

Если нельзя конструировать абстрактные классы вообще, такая конструкция была бы невозможной.
Если запретить только явное конструирование абстрактных классов, такая конструкция всё равно позволит создать экземпляр абстрактного класса.

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


 
Игорь Шевченко ©   (2011-02-03 18:13) [57]


> перед инсертом в  ТаблицаА, необходимо проверить наличие
> содержимого edit.text в ТаблицаБ, если его там нету обругать
> юзера и не дать сделать инсерт.


Use MERGE, Luke


 
Ega23 ©   (2011-02-03 19:36) [58]


> Если нельзя конструировать абстрактные классы вообще, такая
> конструкция была бы невозможной.


А это не коструирование абстрактного класса, это конструирование вполне конкретного TBaseClass.

type
 TMyStringList = class (TStringList)
 ....
 end;

var
 list: TstringList;
begin
 list := TMyStringList.Create;

Никаких абстрактных классов. Однако ничего сверхъестественного тоже не случилось.


 
kxft78 ©   (2011-02-04 05:10) [59]


> Игорь Шевченко ©   (03.02.11 18:13) [57]
>
>
> > перед инсертом в  ТаблицаА, необходимо проверить наличие
> > содержимого edit.text в ТаблицаБ, если его там нету обругать
> > юзера и не дать сделать инсерт.
>
>
> Use MERGE, Luke


Если вам несложно покажите пожалуйста на конкретном примере как это будет выглядеть (сам триггер который бы проверял наличие значения в ТаблицеБ, и в случае его отсутствия генерировал исключение ).


 
Игорь Шевченко ©   (2011-02-04 11:43) [60]


> Если вам несложно


RTFM:
http://download.oracle.com/docs/cd/B28359_01/server.111/b28286/statements_9016.htm


 
Jeer ©   (2011-02-04 15:23) [61]


> Ega23 ©   (03.02.11 14:22) [26]
>
>
> > Т.е. этими репликами вы отрицаете, что -1 >= -1 = true?
>
>
>
> Давай так сделаем. Приведи пример, когда я могу к TDataSet
> обратиться через FieldByName и получить вразумительное значение,
>  но при этом TDataSet.IsEmpty = True.
> Приведёшь пример - я извинюсь, публично.


Не пробовал ? Попробуй и начни извиняться :)

Date дает 30.12.1899
Int дает 0
и т.д.

Если что - под рукой оказались D7, MSSQL-2000, dbExpress.


 
Ega23 ©   (2011-02-04 15:41) [62]


> Не пробовал ? Попробуй и начни извиняться :)


Код в студию.


 
Ega23 ©   (2011-02-04 15:42) [63]

Я ща даже специально 2000 MSSQL поставлю.


 
Jeer ©   (2011-02-04 16:41) [64]


> Ega23 ©   (04.02.11 15:41) [62]
> Код в студию.


Ну какой код-то ? :)

По дате:

OnScroll
 selPlan.RunDate := sdsPLANS.FieldByName("PLANS_RUNDATE").AsDateTime;

OnShow
datetimePiker.Date := selPlan.Date;

Вот в пикере и вижу 1899, if sdsPLANS.IsEmpty

selPlan - объект, имеющий свойство RunDate: TDateTime
sdsPLANS: TSimpleDataset ( dbExpress )


 
Anatoly Podgoretsky ©   (2011-02-04 17:00) [65]

> Jeer  (04.02.2011 16:41:04)  [64]

Правильно, для AsDateTime не существует нулов, он их нулем заменяет, что и
даст 30.12.1899
Никаких ошибок не будет.


 
Ega23 ©   (2011-02-04 18:40) [66]


> Jeer ©   (04.02.11 16:41) [64]


selPlan.RunDate := sdsPLANS.FieldByName("PLANS_RUNDATE").AsDateTime;

А ты напиши:

 if sdsPLANS.IsEmpty then
   selPlan.RunDate := -1000
 else
   selPlan.RunDate := sdsPLANS.FieldByName("PLANS_RUNDATE").AsDateTime;


 
Игорь Шевченко ©   (2011-02-04 19:04) [67]


>  Приведи пример, когда я могу к TDataSet
> > обратиться через FieldByName и получить вразумительное
> значение,
> >  но при этом TDataSet.IsEmpty = True.


Тебе привели ? Привели. Нехрен увиливать


 
Ega23 ©   (2011-02-04 19:08) [68]


> Тебе привели ? Привели. Нехрен увиливать


Да не вопрос.
И. Павел, я приношу Вам свои извинения. Я был неправ. IsEmpty - хуже, чем Eof and Bof


 
Игорь Шевченко ©   (2011-02-04 19:16) [69]

Ega23 ©   (04.02.11 19:08) [68]

IsEmpty лучше :)

Не в этом дело, дело в том, что при Eof and Bof получится точно такое же значение.


 
И. Павел ©   (2011-02-04 22:00) [70]

Ну мы же уже закрыли этот вопрос. Суть была не в том, что FieldByName что-то может вернуть.
Я думал, что IsEmpty подвержен той же ошибке, что и RecordCount, но он, оказывается, ей не подвержен - и я это уже проверил: даже если RecordCount = -1 но записи есть, IsEmpty все равно дает false, т.е. работает правильно (т.к. он ничего не знает о способе определения RecordCount потомком).
Т.е. все таки изначально я был не прав. А придраться к словам можно всегда.


> IsEmpty лучше :)


Только с точки зрения простоты синтаксиса? Т.е. потому, что запись IsEmpty короче? Или есть другие причины? Если есть - тогда на IsEmpty перейду, раз он все равно безопасен.


 
Игорь Шевченко ©   (2011-02-04 22:33) [71]

И. Павел ©   (04.02.11 22:00) [70]

TDataSet.IsEmpty Method
Indicates whether the dataset contains no records.

Class
TDataSet

Syntax

[Delphi] function IsEmpty(): Boolean;

Description
Call IsEmpty to determine if a dataset has records. IsEmpty returns true if the dataset does not contain any records. Otherwise it returns false

TDataSet.Bof Property

Indicates whether the first record in the dataset is active.

TDataSet.Eof Property

Indicates whether a dataset is positioned at the last record.
Eof is true when an application:

Opens an empty dataset.

Calls a dataset"s Last method. (Unless it is a unidirectional dataset)

Call a dataset"s Next method, and the method fails because the current record is already the last row in the dataset.

Calls SetRange on an empty range or dataset.

Eof is false in all other cases.
Tip:
If both Eof and Bof are true, the dataset or range is empty.


Тебе нужен переводчик ?



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

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

Наверх





Память: 0.6 MB
Время: 0.008 c
1-1253856818
sdsk
2009-09-25 09:33
2011.05.15
Форма с фиксированной частью экрана


15-1296309321
DelphistBD
2011-01-29 16:55
2011.05.15
Чем в PHP обработать датасет, который вернулся через SOAP


2-1296568705
Rembo
2011-02-01 16:58
2011.05.15
Обмен пакетами между сервером и клиентом


15-1296458678
12
2011-01-31 10:24
2011.05.15
зачем дублируют секцию при описании?


3-1258535984
Бульбаш
2009-11-18 12:19
2011.05.15
Выбор значения поля из списка





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский