Помогите разобраться в чем проблема!!!

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Помогите разобраться в чем проблема!!!

Сообщение net_goose » 30.03.2010 14:16:10

Подскажите, в чем ошибка и как решить...

Код прекрасно работает в Делфи7, я попытался портировать в Lazarus, и был огорчен этой ошибкой.
Подскажите может есть какой-нибудь выход, в связи с нюансами в языке Lazarus?!

Я хочу создать свой компонент на базе TEdit:
Я хочу чтобы TDbGrid выступал как выпадающий список, данные он берет из Oracle через ODAC;

type
TOraDBGrid = class(TrxDBGrid)
protected
procedure CreateParams(var Params:TCreateParams);override;
procedure KeyDown(var Key: word; Shift: TshiftState);override;
procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);override;
procedure Open;
public
constructor Create(AOwner:TComponent);override;
destructor Destroy;override;
end;

TOraEdit = class(TEdit)
private
FGrid:TOraDBGrid;
FSession:TOraSession; //TOraSession - компонент ODAC
FSql:String;
...........................


procedure TOraEdit.ShowGrid;
var col:TColumn;
pnt,pnttemp:TPoint;
FullHeigth,FullWidth,ColWidth,H:Integer;
pL,pT:integer;
i:integer;
begin
if Assigned(FGrid) then FGrid.Free;
if not ReadOnly and Enabled then begin
FGrid:=TOraDBGrid.Create(Self);
FGrid.Parent:=Self; //------------------------Здесь происходит ошибка "tedit can not have tdbgrid as child"
FGrid.Font.Assign(Self.Font);
FGrid.Height:=(FGrid.Canvas.TextHeight('*')+3)*10+2;
FGrid.Width:=Width;

with FGrid.Columns do begin
Clear;
FullWidth:=0;
for i:=0 to FShowinfield.Count-1 do begin
col:=Add;
col.FieldName:=FShowinfield[i];
col.Alignment:=taLeftJustify;
col.Width:=abs(strtoint(FColumnsizelist.Strings[i]));
ColWidth:=col.Width;
FullWidth:=FullWidth+ColWidth;
end;
end;

if FullWidth=0 then begin
FreeAndNil(fGrid); exit;
end else FGrid.Width:=FullWidth+GetSystemMetrics(SM_CXVSCROLL)+2;

pnt:=ClientToScreen(point(0,height));
pL:=pnt.X;
pT:=pnt.Y;
FullWidth:=GetSystemMetrics(SM_CXSCREEN);
FullHeigth:=GetSystemMetrics(SM_CYSCREEN);
if (pT+fgrid.Height)>fullheigth then pT:=pT-fgrid.Height-height-2;
if (pL+fgrid.Width) >fullwidth then pL:=pL-fgrid.width +width;

SetWindowPos(FGrid.Handle, HWND_TOP, pL, pT, 0, 0,SWP_NOSIZE or SWP_NOACTIVATE or SWP_SHOWWINDOW);
FGrid.Visible:=true;
AutoSelect:=false;
SetFocus;
end;
Последний раз редактировалось net_goose 01.04.2010 15:31:16, всего редактировалось 2 раз(а).
net_goose
незнакомец
 
Сообщения: 2
Зарегистрирован: 30.03.2010 14:01:34

Re: Создание нового компонента в Lazarus

Сообщение Brainenjii » 30.03.2010 15:41:12

Подобным не занимался, но предположу, что можно написать "Self.Parent" в проблемном месте
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Re: Создание нового компонента в Lazarus

Сообщение net_goose » 30.03.2010 16:04:51

Brainenjii писал(а):Подобным не занимался, но предположу, что можно написать "Self.Parent" в проблемном месте


Тогда получится что родитель - форма, а мне надо чтобы родитель был TOraEdit!
А если родитель форма, как мне обратиться (через какую конструкцию)к private свойству FSQL из процедуры TOraDBGrid.Open (к примеру) ?

procedure TOraDBGrid.Open;
...................
(DataSource.DataSet as TOraDataSet).SQL.add(TOraEdit(Parent).FSQL); --Именно так работало в делфи. Если я правильно понимаю то Parent, обозначает что Toradbgrid обращется к родителю, а это должен быть TOraEdit.
...........................

Может Lazarus не поддерживает такие конструкции?!
net_goose
незнакомец
 
Сообщения: 2
Зарегистрирован: 30.03.2010 14:01:34


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 53

Рейтинг@Mail.ru