Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Разница межу 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, а вообще - чей-то странная у тебя архитектура, судя по объяснению...


Наверх

Титульная страница Поиск, карта сайта Написать письмо