Форум: "Начинающим";
Текущий архив: 2016.03.27;
Скачать: [xml.tar.bz2];
ВнизРазница межу D7 и D2010+ Найти похожие ветки
← →
kaldirishe (2014-08-27 19:05) [0]Здравствуйте!
Столкнулся со следующей проблемой: компилирую библиотеку, написанную в D7, под D2010 и далее, все Ок, но есть проблема, с ходу, которую, я разрешить не могу:
У меня компонент, выводится из TForm, в процедуре Create, создает несколько объектов, участвующих в процедуре Loaded...
В D6 и D7 последовательность конструктора:
inherited;
создание;
и по дебагеру Loaded;
работает,
а в D2010 по чему-то:
inherited;
по дебагеру Loaded;
создание;
Я как то не могу сообразить когда создавать объекты, объявленные в секции published
Я вот в полном... посоветуйте плиз, как переписать, спасибо
← →
Rouse_ © (2014-08-27 19:16) [1]Создавай перед вызовом inherited, а вообще - чей-то странная у тебя архитектура, судя по объяснению...
← →
kaldirishe (2014-08-27 19:56) [2]>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;
← →
kaldirishe (2014-08-27 19:59) [3]Вышибает на FBitmapObject.SetSize(Width, Height); потому что nil(
← →
Rouse_ © (2014-08-27 20:01) [4]А зачем ты так все разнес-то? :)
← →
kaldirishe (2014-08-27 20:11) [5]Разнес, наблюдая исходники, и реакцию) Вот повезло на гуру попасть, я на твоем примере сделал прогу на основе "обратных интерфейсов". Мы кустари, я писал, что "перекрашу" кнопку как хочу, я сделал это, но столкнулся с непонятками, поэтому прошу ...___...
← →
kaldirishe (2014-08-27 20:21) [6]То есть создавать до вызова конструктора?
← →
Rouse_ © (2014-08-27 21:20) [7]
> Вот повезло на гуру попасть
Зотыча тут еще небыло - ты меня перепутал с кем-то.
> То есть создавать до вызова конструктора?
Все это разнесенное безобразие засунь в одну процедуру и назови ее к примеру MainInit и будет достаточно.
А ее в конструкторе и дергай.
Loaded тут избыточно.
← →
kaldirishe (2014-08-27 23:18) [8]А с чем связано такое изменение в этих версиях (я к тому, что может быть релиз какой -нить с объяснениями), может если есть объяснение - есть и метод?
← →
junglecat (2014-08-28 08:51) [9]фишка в том, чтобы твой код не зависел (или как можно меньше) от изменения в версиях.
Инициализацию надо проводить 1 раз в 1 месте, так же как и финализацию.
← →
kaldirishe (2014-08-31 14:42) [10]>Rouse_ © & junglecat
Разнести нельзя, сначала надо создать объект, потом дождаться inherited Loaded и только после объект инициализировать (в моем случаи использовать размеры формы)
Ндя... Чтобы разобраться пришлось ставить XE с исходниками...
Действительно последовательность вызовов поменялась и появилась новая процедурка InitializeNewForm, которая, как я понял и призвана решить проблемы моего типа). Собственно перекрывается и туда запихивается все необходимое при создании как для версии 7.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2016.03.27;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.002 c