Форум: "Начинающим";
Текущий архив: 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