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

Вниз

Немного о 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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.01 c
14-37919
SergP
2003-12-20 11:25
2004.01.13
(NMHTTP, IDHTTP) POST & PHP . Еще одна проблема...


14-37891
BKGG
2003-12-20 13:22
2004.01.13
Как привязать .exe к .doc (.xls и т.д.) файлу.


3-37527
Verba
2003-12-13 13:59
2004.01.13
Select в TAdsQuery


1-37636
~GaMeRd~
2003-12-11 20:59
2004.01.13
Создание мэмо и ричэдита во время работы проги


3-37538
Pako
2003-12-16 11:00
2004.01.13
QReport





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский