![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Разница межу D7 и D2010+ [D6, D7, WinXP]
kaldirishe © (2014-08-27 19:05:00)Здравствуйте!
Столкнулся со следующей проблемой: компилирую библиотеку, написанную в D7, под D2010 и далее, все Ок, но есть проблема, с ходу, которую, я разрешить не могу:
У меня компонент, выводится из TForm, в процедуре Create, создает несколько объектов, участвующих в процедуре Loaded...
В D6 и D7 последовательность конструктора:
inherited;
создание;
и по дебагеру Loaded;
работает,
а в D2010 по чему-то:
inherited;
по дебагеру Loaded;
создание;
Я как то не могу сообразить когда создавать объекты, объявленные в секции published
Я вот в полном... посоветуйте плиз, как переписать, спасибо
kaldirishe (2014-08-31 14:42:00) [1]>Rouse_ © & junglecat
Разнести нельзя, сначала надо создать объект, потом дождаться inherited Loaded и только после объект инициализировать (в моем случаи использовать размеры формы)
Ндя... Чтобы разобраться пришлось ставить XE с исходниками...
Действительно последовательность вызовов поменялась и появилась новая процедурка InitializeNewForm, которая, как я понял и призвана решить проблемы моего типа). Собственно перекрывается и туда запихивается все необходимое при создании как для версии 7.
junglecat (2014-08-28 08:51:00) [2]фишка в том, чтобы твой код не зависел (или как можно меньше) от изменения в версиях.
Инициализацию надо проводить 1 раз в 1 месте, так же как и финализацию.
kaldirishe (2014-08-27 23:18:00) [3]А с чем связано такое изменение в этих версиях (я к тому, что может быть релиз какой -нить с объяснениями), может если есть объяснение - есть и метод?
Rouse_ (2014-08-27 21:20:00) [4]
> Вот повезло на гуру попасть
Зотыча тут еще небыло - ты меня перепутал с кем-то.
> То есть создавать до вызова конструктора?
Все это разнесенное безобразие засунь в одну процедуру и назови ее к примеру MainInit и будет достаточно.
А ее в конструкторе и дергай.
Loaded тут избыточно.
kaldirishe (2014-08-27 20:21:00) [5]То есть создавать до вызова конструктора?
kaldirishe (2014-08-27 20:11:00) [6]Разнес, наблюдая исходники, и реакцию) Вот повезло на гуру попасть, я на твоем примере сделал прогу на основе "обратных интерфейсов". Мы кустари, я писал, что "перекрашу" кнопку как хочу, я сделал это, но столкнулся с непонятками, поэтому прошу ...___...
Rouse_ (2014-08-27 20:01:00) [7]А зачем ты так все разнес-то? :)
kaldirishe (2014-08-27 19:59:00) [8]Вышибает на FBitmapObject.SetSize(Width, Height); потому что nil(
kaldirishe (2014-08-27 19:56:00) [9]>Rouse_ Спасиб)
Стандартная, я вставлю конструкоты () и Loaded:
так вот, loaded работает ренее CreateNew, да и в вариациях тоже(
constructor TlfCustomLayerForm.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
if not (csDesigning in ComponentState) then
begin
SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle,
GWL_EXSTYLE) or WS_EX_LAYERED);
end;
end;
constructor TlfCustomLayerForm.CreateNew(AOwner: TComponent; Dummy: Integer =
0);
begin
inherited;
if not IsWin2K then
raise Exception.Create('Only for Win2k');
with FBlend do
begin
BlendOp := AC_SRC_OVER;
BlendFlags := 0;
SourceConstantAlpha := 255;
AlphaFormat := AC_SRC_ALPHA;
end;
FBmpTopLeft := Point(0, 0);
FAlphaBlend := True;
FAlphaBlendValue := 255;
FAutoScroll := False;
FBitmapObject := TlfBitmapObject.Create;
FBitmaps := nil;
FBitmapsLink := TlfBitmapsLink.Create;
FBitmapsLink.OnChange := BitmapsChange;
FBorderStyle := bsNone;
FCountInvalidate := 0;
FCountPaint := 0;
FCountPosition := 0;
FDraggAble := True;
FFormMinimizedState := fsDefault;
FFormNormalState := fsDefault;
FillChar(FFormSize, SizeOf(FFormSize), 0);
FImage := -1;
FImageMinimize := -1;
FLoaded := False;
FMagnetic := False;
FMagneticSize := 10;
FMinimizeWidth := 100;
FMinimizeHeight := 25;
FMenu := nil;
FWnd := Classes.AllocateHWnd(HandleIconMessage);
FTrayHint := '';
FTrayIcon := TIcon.Create;
with FTrayIconData do
begin
cbSize := SizeOf(TNotifyIconDataEx);
wnd := FWnd;
uId := IconID;
uFlags := NIF_ICON + NIF_MESSAGE + NIF_TIP;
uCallbackMessage := WM_TRAYNOTIFY;
end;
FControls := TlfControlCollection.Create(Self,
TlfControlItem);
FControls.OnChanged := Changed;
FTrayPopupMenu := nil;
FWindowState := lsNormal;
FWndLayerForm := TlfWndLayerForm.Create(nil);
FWndLayerForm.Control := Self;
FWndLayerForm.OnInvalidate := NeedCountInvalidate;
FWndLayerForm.OnUpdate := NeedCountPaint;
if not (csDesigning in ComponentState) then
SetBorderStyle(bsNone);
end;
........................
procedure TlfCustomLayerForm.Loaded;
begin
inherited;
if not (csDesigning in ComponentState) then
begin
with FFormSize do
begin
MinimizeLeft := Left;
MinimizeTop := Top;
NormalLeft := Left;
NormalTop := Top;
NormalClientWidth := Width;
NormalClientHeight := Height;
end;
FBitmapObject.SetSize(Width, Height);
DoLayerImageUpdate;
SetCountInvalidate(FCountInvalidate + 1);
SetCountPaint(FCountPaint + 1);
FLoaded := True;
end
else
SetAutoScroll(False);
end;
Rouse_ (2014-08-27 19:16:00) [10]Создавай перед вызовом inherited, а вообще - чей-то странная у тебя архитектура, судя по объяснению...