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

Вниз

Разница межу 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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.004 c
2-1409151951
kaldirishe
2014-08-27 19:05
2016.03.27
Разница межу D7 и D2010+


15-1437484469
sniknik
2015-07-21 16:14
2016.03.27
Как включить пс спикер в Win7?


15-1436563802
Юрий
2015-07-11 00:30
2016.03.27
С днем рождения ! 11 июля 2015 суббота


11-1262601093
magi6162
2010-01-04 13:31
2016.03.27
KOL-CE Form.ControlByName


15-1437140235
delphin1986
2015-07-17 16:37
2016.03.27
Функция проверки вхождения точки в многоугольник