Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.08.17;
Скачать: CL | DM;

Вниз

AddFieldDef - бага в DB.pas   Найти похожие ветки 

 
TFieldDefs   (2008-02-22 16:01) [0]

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

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;

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


 
sniknik ©   (2008-02-22 16:36) [1]

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

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


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


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

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


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

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


 
Palladin ©   (2008-02-22 20:57) [3]


> 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;

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


 
sniknik ©   (2008-02-22 21:09) [4]

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

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

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


 
sniknik ©   (2008-02-22 21:18) [5]

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


 
Johnmen ©   (2008-02-22 21:22) [6]


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

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


 
Palladin ©   (2008-02-22 21:22) [7]


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

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


 
Loginov Dmitry ©   (2008-02-22 23:44) [8]

> Dataset := TDataset.Create(nil);


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


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


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

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

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

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


 
имя   (2008-02-25 08:56) [10]

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


 
sniknik ©   (2008-02-25 12:17) [11]

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

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

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


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


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

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


 
Amoeba ©   (2008-02-26 22:54) [13]


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


LMD!!!


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


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

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


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


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

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

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

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


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


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

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


 
sniknik ©   (2008-02-27 18:12) [17]

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

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


 
Amoeba ©   (2008-02-27 20:09) [18]


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

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



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

Текущий архив: 2008.08.17;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.021 c
2-1216099771
Пробежал
2008-07-15 09:29
2008.08.17
StringGrid


2-1215954643
maxNmin
2008-07-13 17:10
2008.08.17
удаление в корзину


2-1215890925
Mixail2
2008-07-12 23:28
2008.08.17
TTreeNode


15-1214563536
oldman
2008-06-27 14:45
2008.08.17
Архиватор PAR


2-1215767508
ekto
2008-07-11 13:11
2008.08.17
Как разбить текст на строки?