Здравствуйте, VooDoo-KB, Вы писали:
VK> возникающая ошибка впринципе ничего ценного в себе не несет...в ней указываются какие-то 0000ххх адреса непонятно чего...
В этих словах Вы сделали две ошибки.
Во-первых, "непонятно чего" как раз обычно и несет ценную информацию. Отбрасывать можно только то, в чем Вы детально разобрались и знаете, что ничего интересного там нет. Методом посмотрел — не понял — неинтересно высот не достичь.
Во-вторых, это непонятно что утверждает, что у Вас проблема при работе с динамической памятью. То есть ошибка вряд ли имеет отношение к сути того, что Вы делаете — скорее, к технике Ваших действий.
Что касается динамической памяти — объяснять на пальцах тут вряд ли стоит; это лучше смотреть в литературе.
S>>1) Полезно иногда смотреть места, где аналогичная задача уже решена. Например, в TDBEdit делается именно что выбор поля из датасета, да и в других db-компонентах — тоже. Исходники VCL доступны.
VK>Смотрел. Но ничего ценного для себя не нашел.
Рискну предположить, что это скорее из серии "плохо смотрел". Либо я не понимаю, чего Вы хотите достичь в этом месте.
VK>Нет ничего проще активировать(и пусть он всегда открыт) датасет и брать из него поля.Я так и действовал.
Это действительно просто. Вот только работать так зверски неудобно. Причин три. Во-первых, даже в самом лучшем случае открытие датасета занимает время и память. И когда таким образом откроешь три-четыре десятка датасетов, тривиальная операция — типа "открыть data module" — начинает выполняться несколько медленно. Во-вторых, далеко не все датасеты могут быть тупо открыты в дизайн-тайме — начинаются ошибки. В-третьих, при работе программы датасет обычно требует той или иной инициализации перед открытием — в результате чего при загрузке программы сначала откроется датасет (хорошо если без ошибки), потом программа его закроет, инициализирует как надо и снова откроет.
S>>3) Есть такая штука — property editors & component editors. Желающему писать компоненты нужно про них знать.
VK>Вы не подскажете где с этой "штукой" можно ознакомиться?
Хм. Исходники дельфы и чужих компонент. Каталог \Source\ToolsAPI в дельфе. Литература и статьи. Гугль.
VK>Этот компонент планируется НЕ для создания "справочников", а как вспомогательный, частоиспользуемый элемент при работе с БД.
Это компонент выбора значения из справочника. На самом деле Вы идете путем, который уже многократно пройдет самыми разными людьми самыми разными способами. И хорошие способы, которые я видел — утверждают, что комбобокса для этого не хватит.
VK> А до запросов мне еще нужно дойти(если они вообще будут применяться).
Дойдете. Может, и не до запросов — но до необходимости получить данные для выборки.
Поэтапное решение — это хорошо. Но сначала должен быть общий проект. А Вы пытаетесь проектировать "снизу вверх" — вряд ли понимая риски такого подхода.
VK>На данном этапе для меня стоит задача заполнения свойства Field_DB. Мне совершенно непонятно почему предложенные мной варианты не могут быть осуществимы, ведь с синтаксической точки зрения они выполнены правельно.???
Ошибка в семантике.
VK>Мне очень интересно ознакомиться с Вашим мнением по этому поводу, ведь порой люди так погружены в работу, что перестают замечать простого решения у себя перед носом(в данном случае, это наверное я) и свежая,пускай даже простая, идея другого человека может очень сильно помочь.
Простите, в данном случае Вам нужно просто повышать знания и умения в концептуальных вопросах.
Доброе время суток!
У меня возникла одна проблемка, а заключается она в следующем: необходимо создать собственный компонент на основе(TComboBox). В новый компонент должны быть добавлены 2 новых свойства
1 свойство — DataSet_DB — в нем должны на этапе проектирования выводиться все все наборы данных(НД) проекта.
2 свойство — Field_DB — в нем, автоматически после установки значения DataSet_DB, должен выводиться список полей выбранного НД.
И после установки пользователем этих 2-ух свойств в нашем ComboBox-e должен выводиться список значений полей из выбранного НД. В результате получается очень полезный компонент для работы с БД!
Все бы хорошо, но вот в одном месте кода возникает непонятная ошибка!
листинг:
unit comboBox_class;
interface
uses
SysUtils, Classes, QControls, QStdCtrls, Messages,
Windows, Graphics, Forms, Controls, StdCtrls, Dialogs, db;
type
tcomboBox_class = class(TComboBox)
private{ Private declarations }
FDataEntText: TDataSet;
FFieldEntText: TCOmboBox;
protected{ Protected declarations }procedure SetDataEntText(value: TDataSet);
procedure SetFieldEntText(value: TCOmboBox);
public{ Public declarations }constructor create(AOwner: TComponent);override;
published
property FIELDS_DB:TCOmboBox read FFieldEntText
write SetFieldEntText;
property DATASET_DB:TDataSet read FDataEntText
write SetDataEntText;
end;
procedure Register;
implementation
Procedure TCombobox_class.SetDataEntText(value: TDataSet);
begin{------------------------------------------------------}
FDataEntText:=value;
//а дальше 3 варианта и ни один не работает ???
{1 вариант для случая FIELDS_DB:TCOmboBox ???}
{ FDataEntText.GetFieldNames(self.FFieldEntText.Items);}
{2 вариант тоже для случая FIELDS_DB:TCOmboBox ???}
{
while not FDataEntText.Eof;
do
begin
FFieldEntText.Items.Add
( FDataEntText.Fields[0].AsString);
FDataEntText.Next;
end;
end;
}
{3 вариант для случая FIELDS_DB:TStrings (вверху заменить на TStrings ) ???}
//self - по усмотрению
{FDataEntText.GetFieldNames(self.FIELDS_DB);}
//или
{FDataEntText.GetFieldNames(self.FFieldEntText);}Procedure TCombobox_class.SetFieldEntText(value: TCOmboBox);
begin
FFieldEntText:=value;
FFieldEntText.Clear;
constructor TComboBox_class.create(AOwner: TComponent);
begin
inherited create(AOwner);
// if FDataEntText<>nil then FDataEntText.GetFieldNames(self.items);end;
procedure Register;
begin
RegisterComponents('Standard', [tcomboBox_class]);
end;
end.
24.08.04 16:12: Перенесено модератором из 'Базы данных' — Merle
Здравствуйте, VooDoo-KB, Вы писали:
VK>Все бы хорошо, но вот в одном месте кода возникает непонятная ошибка!
На будущее — хорошо бы все-таки объяснять, в чем именно ошибка.
VK>//а дальше 3 варианта и ни один не работает ??? VK>{1 вариант для случая FIELDS_DB:TCOmboBox ???}
Если ты хочешь, чтобы в Fields_DB было поле — оно должно быть типа TField. Имя поля — string.
Начал ты неплохо, но несколько ошибок все же сделал.
1) Полезно иногда смотреть места, где аналогичная задача уже решена. Например, в TDBEdit делается именно что выбор поля из датасета, да и в других db-компонентах — тоже. Исходники VCL доступны.
2) Брать список полей из датасета — плохое решение, поскольку в дизайн-тайме датасет обычно закрыт, и полей у него нет. Дельфа, кстати, тут тоже не очень хорошо работает. Можно — очень аккуратно попытаться открыть датасет, взять имена полей, потом закрыть — но при этом никакой ругани, если открыть не удалось, и должна быть возможность набрать имя поля руками.
3) Есть такая штука — property editors & component editors. Желающему писать компоненты нужно про них знать.
4) Таким образом вряд ли удастся хорошо реализовать идею, лежащую в основе твоего компонента. На самом деле хороший справочник делается не на основе комбобокса и намного сложнее, но по минимуму — нужно делать запрос наподобие select distinct record_id, record_name from records. Датасет не даст тебе информации, которая позволит эффективно использовать твой комбобокс.
Здравствуйте, VooDoo-KB, Вы писали:
VK>Доброе время суток! VK>У меня возникла одна проблемка, а заключается она в следующем: необходимо создать собственный компонент на основе(TComboBox). В новый компонент должны быть добавлены 2 новых свойства VK>1 свойство — DataSet_DB — в нем должны на этапе проектирования выводиться все все наборы данных(НД) проекта. VK>2 свойство — Field_DB — в нем, автоматически после установки значения DataSet_DB, должен выводиться список полей выбранного НД.
VK>И после установки пользователем этих 2-ух свойств в нашем ComboBox-e должен выводиться список значений полей из выбранного НД. В результате получается очень полезный компонент для работы с БД!
Дык это же LookupComboBox получается
Таких компонентов уже наделано-переделано.
Здравствуйте, Softwarer, Вы писали:
S>На будущее — хорошо бы все-таки объяснять, в чем именно ошибка.
В этом Вы абсолютно правы правы. Дело в том, что свойство DataSet_DB в моем случае работает и в режиме проектирования пользователь может из списка выбрать нужный НД. Проблема заключается именно в свойстве Field_DB.Все 3 моих примера, иллюстрирующих разные способы заполнения свойства Field_DB, не могут быть выполнены. возникающая ошибка впринципе ничего ценного в себе не несет...в ней указываются какие-то 0000ххх адреса непонятно чего...
S>Если ты хочешь, чтобы в Fields_DB было поле — оно должно быть типа TField. Имя поля — string.
А вот над этим мне стоит задуматься и попробывать использовать предложенный Вами тип.
S>1) Полезно иногда смотреть места, где аналогичная задача уже решена. Например, в TDBEdit делается именно что выбор поля из датасета, да и в других db-компонентах — тоже. Исходники VCL доступны.
Смотрел. Но ничего ценного для себя не нашел.
S>2) Брать список полей из датасета — плохое решение, поскольку в дизайн-тайме датасет обычно закрыт, и полей у него нет. Дельфа, кстати, тут тоже не очень хорошо работает. Можно — очень аккуратно попытаться открыть датасет, взять имена полей, потом закрыть — но при этом никакой ругани, если открыть не удалось, и должна быть возможность набрать имя поля руками.
Нет ничего проще активировать(и пусть он всегда открыт) датасет и брать из него поля.Я так и действовал.
S>3) Есть такая штука — property editors & component editors. Желающему писать компоненты нужно про них знать.
Вы не подскажете где с этой "штукой" можно ознакомиться?
S>4) Таким образом вряд ли удастся хорошо реализовать идею, лежащую в основе твоего компонента. На самом деле хороший справочник делается не на основе комбобокса и намного сложнее, но по минимуму — нужно делать запрос наподобие select distinct record_id, record_name from records. Датасет не даст тебе информации, которая позволит эффективно использовать твой комбобокс.
Этот компонент планируется НЕ для создания "справочников", а как вспомогательный, частоиспользуемый элемент при работе с БД. А до запросов мне еще нужно дойти(если они вообще будут применяться).
На данном этапе для меня стоит задача заполнения свойства Field_DB. Мне совершенно непонятно почему предложенные мной варианты не могут быть осуществимы, ведь с синтаксической точки зрения они выполнены правельно.??? Мне очень интересно ознакомиться с Вашим мнением по этому поводу, ведь порой люди так погружены в работу, что перестают замечать простого решения у себя перед носом(в данном случае, это наверное я) и свежая,пускай даже простая, идея другого человека может очень сильно помочь.
Спасибо за внимание.
Re[2]: создание собственного компонента в Delphi
От:
Аноним
Дата:
25.05.06 09:47
Оценка:
Здравствуйте, Dimonka, Вы писали:
D>Здравствуйте, VooDoo-KB, Вы писали:
VK>>Доброе время суток! VK>>У меня возникла одна проблемка, а заключается она в следующем: необходимо создать собственный компонент на основе(TComboBox). В новый компонент должны быть добавлены 2 новых свойства VK>>1 свойство — DataSet_DB — в нем должны на этапе проектирования выводиться все все наборы данных(НД) проекта. VK>>2 свойство — Field_DB — в нем, автоматически после установки значения DataSet_DB, должен выводиться список полей выбранного НД.
VK>>И после установки пользователем этих 2-ух свойств в нашем ComboBox-e должен выводиться список значений полей из выбранного НД. В результате получается очень полезный компонент для работы с БД!
D>Дык это же LookupComboBox получается D>Таких компонентов уже наделано-переделано.
Полный перевод оригинальной справки Дельфи по созданию собственных компонентов на сайте
dcomponents.narod.ru
Re[3]: создание собственного компонента в Delphi
От:
Аноним
Дата:
26.05.06 15:43
Оценка:
VK> возникающая ошибка впринципе ничего ценного в себе не несет...\
Не правда. В принципе она несёт всё, потомч что ничего другого у вас пока нет.
VK> в ней указываются какие-то 0000ххх адреса непонятно чего...
Вполне понятно чего — зайдите в Delphi в меню Search.
И зайдите на www.rsdn.ru — Cтатьи про Delphi
S>>1) Полезно иногда смотреть места, где аналогичная задача уже решена. Например, в TDBEdit делается именно что выбор поля из датасета, да и в других db-компонентах — тоже. Исходники VCL доступны.
VK>Смотрел. Но ничего ценного для себя не нашел.
Как минимум посмотрите, что во всех библиотеках работа DB-aware компонент идет не с TDataSet напрямую, а через прокси — TDataSource
Посмотрите исходники rxLib, Polaris DB Lib, vgLib, Borland VCL, JediVCL, любой другой db-aware на www.torry.ru — хотя бы с целью понять зачем это так.
S>>3) Есть такая штука — property editors & component editors. Желающему писать компоненты нужно про них знать.
VK>Вы не подскажете где с этой "штукой" можно ознакомиться?
В справке Delphi.
Вы с ней прекрасно знакомы. Вы наверняка щелкали на свойствах типа TColor в Object Inspectоr и наверняка щедкали на компонентах типа TTable.
Вот окошки, которые при этом появляются — они и есть родные.
Посмотрите как они сделаны в других библиотеках (список, например, выше), например в rxLib — устаревшей, зато маленькой, это свойства типа TCaption (Caption, Hint, etc) и компоненты с фотоаппаратом на иконке (TFormPlacement или как-то так)