Re[3]: создание собственного компонента в Delphi
От: Softwarer http://softwarer.ru
Дата: 25.08.04 07:21
Оценка: 45 (1)
Здравствуйте, 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>Мне очень интересно ознакомиться с Вашим мнением по этому поводу, ведь порой люди так погружены в работу, что перестают замечать простого решения у себя перед носом(в данном случае, это наверное я) и свежая,пускай даже простая, идея другого человека может очень сильно помочь.


Простите, в данном случае Вам нужно просто повышать знания и умения в концептуальных вопросах.
создание собственного компонента в Delphi
От: VooDoo-KB Россия  
Дата: 24.08.04 11:50
Оценка:
Доброе время суток!
У меня возникла одна проблемка, а заключается она в следующем: необходимо создать собственный компонент на основе(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
Re: создание собственного компонента в Delphi
От: Softwarer http://softwarer.ru
Дата: 24.08.04 12:04
Оценка:
Здравствуйте, 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. Датасет не даст тебе информации, которая позволит эффективно использовать твой комбобокс.
Re: создание собственного компонента в Delphi
От: Dimonka Верблюд  
Дата: 24.08.04 12:37
Оценка:
Здравствуйте, VooDoo-KB, Вы писали:

VK>Доброе время суток!

VK>У меня возникла одна проблемка, а заключается она в следующем: необходимо создать собственный компонент на основе(TComboBox). В новый компонент должны быть добавлены 2 новых свойства
VK>1 свойство — DataSet_DB — в нем должны на этапе проектирования выводиться все все наборы данных(НД) проекта.
VK>2 свойство — Field_DB — в нем, автоматически после установки значения DataSet_DB, должен выводиться список полей выбранного НД.

VK>И после установки пользователем этих 2-ух свойств в нашем ComboBox-e должен выводиться список значений полей из выбранного НД. В результате получается очень полезный компонент для работы с БД!


Дык это же LookupComboBox получается
Таких компонентов уже наделано-переделано.
Re[2]: создание собственного компонента в Delphi
От: VooDoo-KB Россия  
Дата: 25.08.04 06:46
Оценка:
Здравствуйте, 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 или как-то так)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.