Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

AddFieldDef - бага в DB.pas [D7, MSSQL]


TFieldDefs ©   (2008-02-22 16:01:00) 

Всем, привет. На днях парился с багой:

procedure TForm1.Button1Click(Sender: TObject);
var
 Dataset: TDataset;
 FieldDefs: TFieldDefs;
 FieldDef1: TFieldDef;
 FieldDef2: TFieldDef;
begin
 Dataset := TDataset.Create(nil);
 FieldDefs := Dataset.FieldDefs;
 FieldDef1 := FieldDefs.AddFieldDef();
 FieldDef1.Name := 'Field2';
 FieldDef2 := FieldDefs.AddFieldDef(); //бага
 FieldDef2.Name := 'Field1';
end;

После долгих мучений дошло, что ошибка в исходниках DB.pas Они генерят имя для элемента коллекции не проверяя что такой элемент существует, а потом сами же и ругаются...
В общем напмсал простенькую функцию:

function AddFieldDef(const AFieldDefs: TFieldDefs;
 const AName: WideString): TFieldDef;
begin
 Result := TFieldDef.Create(nil);
 Result.Name := AName;
 Result.Collection := AFieldDefs;
end;

Может кому поможет...


Amoeba   (2008-02-27 20:09:00) [1]


> TFieldDefs   (27.02.08 13:29) [15]
>
>
> > Имя нужно только в design-time! В run-time оно (имя) идёт
> > лесом. Оно абсолютно не нужно.
>
> Да что Вы говорите? Как Вы думаете с каким именем будет
> создан Field после:
>
> ...
> FieldDef1.CreateField(Dataset);
> ...
>
> Отвечу за Вас. Оно будет создано с именем которое было в
> FieldDef1.Name
> И если после создания филда не заменить ему FieldName на
> то что будет в запросе, то получим еще багу - о том что
> поля такого-то не существует. Зачем мне еще раз ходить по
> коллекции филдов и подменять то что нагенерил Борланд?
> Почему я не могу сразу это сделать?
>

Нечего нга зеркало пенять, коли рожа крива. (c) Народная мудрость.


sniknik   (2008-02-27 18:12:00) [2]

> И если после создания филда не заменить ему FieldName
?
а нам голову морочишь Name-ом... (болит голова, а уколы знаете куда назначили... вот и подумайте какая связь?)

> Почему я не могу сразу это сделать?
потому что ты делаешь не то, что нужно (/в хелпе прописано), а то что тебе хочется (а хочется тебе показать какой борланд "глюкавый" а ты умный... только оно все наоборот)


TFieldDefs   (2008-02-27 13:32:00) [3]


> Почему я не могу сразу это сделать?

откат. Можно. В метод CreateField можно передать это имя.


TFieldDefs   (2008-02-27 13:29:00) [4]


> Имя нужно только в design-time! В run-time оно (имя) идёт
> лесом. Оно абсолютно не нужно.

Да что Вы говорите? Как Вы думаете с каким именем будет создан Field после:

...
FieldDef1.CreateField(Dataset);
...

Отвечу за Вас. Оно будет создано с именем которое было в FieldDef1.Name
И если после создания филда не заменить ему FieldName на то что будет в запросе, то получим еще багу - о том что поля такого-то не существует. Зачем мне еще раз ходить по коллекции филдов и подменять то что нагенерил Борланд?
Почему я не могу сразу это сделать?


Германн   (2008-02-27 01:26:00) [5]


> TFieldDefs   (25.02.08 12:54) [12]
>
>

Имя нужно только в design-time! В run-time оно (имя) идёт лесом. Оно абсолютноне нужно. А тот, кто что-то ставит в Name при создании компонента в run-time должен последовать совету Amoeba ©   (26.02.08 22:54) [13].


Amoeba   (2008-02-26 22:54:00) [6]


> TFieldDefs   (25.02.08 12:54) [12]
>
>
> > да. также как ты не можеш создать в рантайм Button14 если
> > у тебя в десигне уже положено 14 батонов на форму и имена
> > ты им с автоматических не менял.
>
> Немного не то... У формы нет метода - создать кнопку где
> сам создает сам же и имя генерит, а у TFildDefs есть, причем
> передать параметром нельзя имя, которое я хочу присвоить
> новому элементу. Вместо этого получаю багу...


LMD!!!


TFieldDefs   (2008-02-25 12:54:00) [7]


> да. также как ты не можеш создать в рантайм Button14 если
> у тебя в десигне уже положено 14 батонов на форму и имена
> ты им с автоматических не менял.

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


sniknik   (2008-02-25 12:17:00) [8]

> A compomponent Field14 already exists. И типа это нормально?
да. также как ты не можеш создать в рантайм Button14 если у тебя в десигне уже положено 14 батонов на форму и имена ты им с автоматических не менял.

раз такой умный предложи другой способ именования компонент в VCL, только не говори что [0] твой способ... мало приятного будет при "ложении" любого компонента на форму каждый раз вводить его имя...
имя должно быть автоматическим(для десигна) и понятным(их люди используют).

> Возможно ламеризм, только у Борланда.
ню ню.
напиши свой VCL который естественно будет супер профессиональным, без багов... только работать с ним будут нельзя (гарантировано, если по всему остальному такие же "претензии").


  (2008-02-25 08:56:00) [9]

Удалено модератором
Примечание: имя в ветке не менять! см. правила.


TFieldDefs   (2008-02-25 08:56:00) [10]


> зачем давать имена из тех что и так поставяться только намерено
> путая порядок? если бы они хотябы были осмысленные... но
> тогда бы "глюка" не было бы.

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

Представте что у Вас строятся полей 20, где-то 5-ым создался филд с названием Field14, а потом когда я 14-ым хочу создать скажем ContactName, я этого уже не могу - A compomponent Field14 already exists. И типа это нормально?

Возможно ламеризм, только у Борланда.


Loginov Dmitry   (2008-02-22 23:44:00) [11]

> Dataset := TDataset.Create(nil);


А разве это не абстрактный класс? Пользуйся TTable, TQuery, а TDataset зачем мучаешь?


Palladin   (2008-02-22 21:22:00) [12]


> sniknik ©   (22.02.08 21:18) [5]

как ты жестоко пессиместичен и в то же время прав :)))


Johnmen   (2008-02-22 21:22:00) [13]


> такой вот круговорот ламеризма в интернете.

Неплохо...:)


sniknik   (2008-02-22 21:18:00) [14]

>> вряд ли. тебе же не помогло... пример есть в хелпе. рабочий.
> В смысле?
ты посмотрел в хелп на рабочий и правильный пример прежде чем осчастливить мир своим творением? а с чего ты взял, что комуто, оно поможет? его же не просто получить ткнув в F1, его еще пор инету разыскать надо! т.что толпа рационализаторов не смотря ни на хелт ни проводя поиски твоего творения накатает кучу своего бессмысленного кода... и ринется в инет осчастливливать остальных со словами "Может кому поможет...". ... такой вот круговорот ламеризма в интернете.


sniknik   (2008-02-22 21:09:00) [15]

> Где бага с именованием?
 FieldDef 1.Name := ' Field2';
 FieldDef 2.Name := ' Field1';
зачем давать имена из тех что и так поставяться только намерено путая порядок? если бы они хотябы были осмысленные... но тогда бы "глюка" не было бы.
или давал бы по порядку
 FieldDef1.Name := 'Field1';
 FieldDef2.Name := 'Field2';
тоже не было бы. хотя так, оно уже есть, "автоматом" без присваиваний.

> потом при инсерте итема в коллекцию ругнулся - это типа нормально? :)
абсолютно. это же ошибка этапа разработки, а проверки = тормоза на исполнении...

хотя ладно, объяснять не буду, имхо, бесполезно. вместо этого можно устроить голосование, пока голосов 1 vs 1.


Palladin   (2008-02-22 20:57:00) [16]


> TFieldDefs   (22.02.08 16:01)  

да да да... ты просто не в курсе великой вещи :)

создай новое приложение Poroject1
кинь две кнопки на пустую форму, ширину выставь примерно в 100, чтобы надписи видно было...
назначь обработчик  button1.onclick
и пропиши в обработчике

procedure TForm1.Button1Click(Sender: TObject);
begin
Button1.Caption:='Я буттон 1';
Button1.Name:='';
Button2.Name:='Button1';
Button1.Caption:='нет это я буттон 1 !!!';
end;

наслаждайся...


TFieldDefs   (2008-02-22 20:24:00) [17]


> вряд ли. тебе же не помогло... пример есть в хелпе. рабочий.
> ..

В смысле? Я юзаю свою функцию и она работает.


> крута! вместо исправления собственное бага с наименованиями
> полей.

Где бага с именованием? Т.е. То что Борланд сам сгенерил имя, не проверил что такое уже есть, потом при инсерте итема в коллекцию ругнулся - это типа нормально? :)


sniknik   (2008-02-22 16:36:00) [18]

> Может кому поможет...
вряд ли. тебе же не помогло... пример есть в хелпе. рабочий...

> В общем напмсал простенькую функцию:
крута! вместо исправления собственное бага с наименованиями полей. (лучше бы вообще не присваивал имена, полагаясь на автоматические, нет же, присвоить надо специально именно то что следующее "в списке на авто присвоение", а после "бороться". малацца.)


Наверх

Титульная страница Поиск, карта сайта Написать письмо