Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2004.01.13;
Скачать: [xml.tar.bz2];

Вниз

Немного о TCollection??   Найти похожие ветки 

 
Style   (2003-12-23 11:38) [0]

Как для своего класса TNMKDA_Params
зарегистрировать стандартный TCollectionPropertyEditor

или только создавать свой :( ????

TNMKDA_LowQuery = class(TComponent)
private
FParams: TNMKDA_Params;
public

published
property Params: TNMKDA_Params read FParams write FParams;
end;

TNMKDA_Param = class(TCollectionItem)
private
FParamName: string;
FParamType: TNMKDA_ParamType;
FValue: string;

procedure SetString(Value: String);
procedure SetFloat(Value: Double);
procedure SetDate(Value: TDateTime);
procedure SetTime(Value: TDateTime);
procedure SetDateTime(Value: TDateTime);
procedure SetInteger(Value: integer);
procedure SetVariant(Value: Variant);

function GetFloat: double;
function GetVariant: variant;
function GetInteger: integer;
function GetDate: TDateTime;
function GetTime: TDateTime;
function GetDateTime: TDateTime;

public

property AsString: string read FValue write SetString;
property AsVariant: Variant read GetVariant write SetVariant;
property AsFloat: double read GetFloat write SetFloat;
property AsInteger: integer read GetInteger write SetInteger;
property AsDate: TDateTime read GetDate write SetDate;
property AsTime: TDateTime read GetTime write SetTime;
property AsDateTime: TDateTime read GetDateTime write SetDateTime;

constructor Create(Collection: TCollection); override;

destructor Destroy(); override;

published

property ParamName: string read FParamName;
property ParamType: TNMKDA_ParamType read FParamType write FParamType;
property ParamValue: string read FValue write FValue;

end;

// -= TNMKDA_Params =- //

TNMKDA_Params = class(TCollection)
private
FParams: TStringList;
FOwner: TPersistent;

procedure PrepareParams;

function GetParamFrom(Pos: integer; CreateNew: boolean): TNMKDA_Param;

function GetItem(Index: Integer): TNMKDA_Param;
procedure SetItem(Index: Integer; Value: TNMKDA_Param);

public

constructor Create(AOwner: TPersistent); overload;
destructor Destroy; override;

property Items[Index: Integer]: TNMKDA_Param read GetItem write SetItem; default;

function ParamByName(ParamName: string): TNMKDA_Param;
end;

implementation

constructor TNMKDA_LowQuery.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FParams := TNMKDA_Params.Create(self);
end;

destructor TNMKDA_LowQuery.Destroy();
begin
FParams.Destroy;
inherited Destroy;
end;

// -= TNMKDA_Params =- //

constructor TNMKDA_Params.Create(AOwner: TPersistent);
begin
FParams := TStringList.Create;
FOwner := AOwner;
end;

destructor TNMKDA_Params.Destroy();
begin
NMKDA_FreeStringListObjects(FParams);
FParams.Free;
end;

function TNMKDA_Params.GetParamFrom(Pos: integer;CreateNew: boolean): TNMKDA_Param;
var
len,i: integer;
ParamName: string;
obj: TNMKDA_Param;

begin

len := Length(TNMKDA_QueryInterFace(FOwner).FSQL.Text);

if(Pos <= len) then
begin
for i := Pos to len do
begin
if(not (TNMKDA_QueryInterFace(FOwner).FSQL.Text[i] in SQL_PARAMEND)) then
ParamName := ParamName + TNMKDA_QueryInterFace(FOwner).FSQL.Text[i]
else
break;
end; //for

if(ParamName = "") then
NMKDA_ShowError(ER_SQL_PARAMNAME);

for i := 1 to Length(ParamName) do
begin
if(not (ParamName[i] in PARAMLIMIT)) then
NMKDA_ShowError(ER_SQL_PARAMNAME + ": "" + ParamName + """);
end;

end; // if len

obj := nil;

if(ParamName <> "") then
begin
if(CreateNew) then
begin
obj := TNMKDA_Param.Create(self);
obj.FParamName := ParamName;
FParams.AddObject(ParamName,obj);
end
else
begin

obj := ParamByName(ParamName);
end;
end;

result := obj;
end;

function TNMKDA_Params.ParamByName(ParamName: string): TNMKDA_Param;
var
index: integer;
begin
result := nil;
index := FParams.IndexOf(ParamName);
if(index >= 0) then
result := TNMKDA_Param(FParams.Objects[index])
else
NMKDA_ShowError(""" + ParamName + "" - " + ER_NOT_PARAM);

end;

procedure TNMKDA_Params.PrepareParams;
var
i: integer;
quot: boolean;
begin
quot := false;

nmkda_FreeStringListObjects(FParams);

for i := 1 to Length(TNMKDA_QueryInterFace(FOwner).FSQL.Text) do
begin

if( TNMKDA_QueryInterFace(FOwner).FSQL.Text[i] = SQL_QUOT ) then
if(Quot) then Quot := false else Quot := true;

if(not Quot) then
begin
if( TNMKDA_QueryInterFace(FOwner).FSQL.Text[i] = SQL_PARAM ) then
begin
GetParamFrom(i+1,true);
end;
end;

end;
end;

function TNMKDA_Params.GetItem(Index: Integer): TNMKDA_Param;
begin
result := TNMKDA_Param(FParams.Objects[Index]);
end;

procedure TNMKDA_Params.SetItem(Index: Integer; Value: TNMKDA_Param);
begin
FParams.Objects[Index] := Value;
end;


 
IDKFA17   (2003-12-23 11:50) [1]

Думаю придется писать свой, примерно так:

uses Classes, Controls, SysUtils, DesignEditors, DesignIntf, ColnEdit;

Type
TTNMKDA_LowQueryDialogEditor = class(TComponentEditor)
public
procedure ExecuteVerb(Index: Integer); override;
function GetVerbCount: Integer; override;
function GetVerb(Index: Integer): string; override;
procedure Edit; override;
end;

procedure TTNMKDA_LowQueryDialogEditor.Edit;
var
Component: TComponent;
begin
Component := TComponent(GetComponent);
if not Assigned(Component) then
Exit;
ShowCollectionEditor(Designer, Component, TNMKDA_LowQuery (Component).Params, "Params");
end;

procedure TTNMKDA_LowQueryDialogEditor.ExecuteVerb(Index: Integer);
begin
case Index of
0: Edit;
end;
end;

function TTNMKDA_LowQueryDialogEditor.GetVerb(Index: Integer): string;
begin
case Index of
0: Result := "Params Editor...";
end;
end;

function TTNMKDA_LowQueryDialogEditor.GetVerbCount: Integer;
begin
Result := 1;
end;

procedure Register;
begin
RegisterPropertyEditor(TypeInfo(TCollection), nil, "Params", TTNMKDA_LowQueryDialogEditor);
end;


 
Style   (2003-12-23 12:19) [2]

uses ColnEdit тут ошибка :(
все упрется в то что он не найдет ToolWin, ToolWnds;


 
IDKFA17   (2003-12-23 12:39) [3]

Редакторы необходимо выделить в отдельную Package для Designtime only.


 
Style   (2003-12-23 12:40) [4]

IDKFA17
Спасибо - ща спробую..


 
Style   (2003-12-23 12:46) [5]

Все равно ругаемся ToolWnds.dcu - файл не найден!


 
Юрий Зотов   (2003-12-23 13:06) [6]

> Style © (23.12.03 11:38)

В обычных случаях (которых, вероятно, 99%), если код написан правильно, то никаких редакторов не надо ни писать, ни регистрировать - автоматически подключается стандартный редактор коллекций.

Если же он не подключается, то возможен нестандартный случай, но прежде всего следует предположить ошибки в коде - в 99% это так и будет и очень похоже, что у Вас именно так и есть. Скажем, объявление свойства TNMKDA_LowQuery.Params выглядит более чем подозрительно (нет метода Set - будет утечка памяти). Еще - в элементе коллекции явно не хватает метода Assign (подозреваю, что это может быть причиной неверной работы стандартного редактора). Это только то, что бросилось в глаза, подробнее смотреть не стал - до устранения хотя бы этих серьезнейших ошибок дальнейший разбор просто не имеет смысла.

Советую посмотреть вот эту статью:
http://www.delphikingdom.ru/helloworld/tcollection.htm

И еще - возьмите любой компонент с любым свойством-коллекцией и в коде VCL посмотрите его реализацию.


 
Style   (2003-12-23 13:09) [7]

2 Ю.З.
Спасибо сейчас попробую..

>>еще - возьмите любой компонент с любым свойством-коллекцией и >>в коде VCL посмотрите его реализацию.

брал как раз из DB.pas TParams :(


 
Юрий Зотов   (2003-12-23 13:56) [8]

> Style © (23.12.03 13:09) [7]

>> возьмите любой компонент ...
> и посмотрите его реализацию.

> брал как раз из DB.pas TParams

TParams - еще НЕ компонент. Одного этого мало.


 
Style   (2003-12-23 18:57) [9]

2 Юрий Зотов ©

Вот где собака порылась!

Note: When writing a TCollection descendant that is used by another control, be sure to override the protected GetOwner method of the collection so that it can appear in the Object Inspector.

RTFM! надо было :)


 
Юрий Зотов   (2003-12-23 19:04) [10]

> Style © (23.12.03 18:57) [9]

Не только в этом. Без Set утечка памяти будет 100%-ной. А в нем потребуется Assign. А без Assign элемента он выдаст ошибку.

А GetOwner можно и не трогать - просто наследуйтесь от TOwnedCollection, там все уже сделано. И свое поле FOwner тоже не потребуется.


 
Style   (2003-12-23 19:07) [11]

Юрий Зотов © ->

Не я уже то что вы написали учел, и статейку прочитал.
Только все равно не работало - толко GetOwner у меня был private, вот я и подумал что это и есть очередная ошибка.

В общем завтра провери и попробую с наследием от TOwnedCollection..

Спасибо еще раз.



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

Форум: "Потрепаться";
Текущий архив: 2004.01.13;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.01 c
1-37753
Мыш
2003-12-29 23:33
2004.01.13
сохранить настройки


8-37800
Незнайко
2003-09-13 12:45
2004.01.13
DynamicSkinForm


1-37797
Anka12345
2003-12-27 18:05
2004.01.13
выводятся только первые 3 слова ПЕРВОГО предложени


9-37486
reticon
2003-06-22 19:25
2004.01.13
DirectX help


9-37482
15teen
2003-06-30 00:04
2004.01.13
Алгоритм для игры пятнашки





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский