Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по Delphi (до версии 2009) - часть 6

Автор: smirnvlad
Дата сообщения: 24.08.2011 22:00
Maks150988
под WideString надо в SizeOf(WChar) раз больше места
плюс ещё под завершающий двойной null
IsBadWritePtr(plbi.pszText, (plbi.cchTextMax+1)*SizeOf(WChar));
LPWSTR(GlobalAlloc(GPTR, (plbi.cchTextMax+1)*SizeOf(WChar));

после SetLength(pszText, MAX_PATH); надо бы ещё и обнулить

тут +1 не нужен
info.cchTextMax := lstrlenW(info.pszText) + 1;

msdn гласит что IsBadWritePtr, lstrlenW и lstrcpynW небезопасные и предлагает новые
Автор: Maks150988
Дата сообщения: 25.08.2011 11:41
smirnvlad

Выставление информации:


Код: ZeroMemory(@lbi, SizeOf(TListBoxExItemW));
lbi.mask := LBIF_TEXT;
lbi.pszText := LPWSTR(pszText);
lbi.cchTextMax := (lstrlenW(LPWSTR(pszText)) + 1) * SizeOf(WideChar);
SendMessageW(GetDlgItem(hWnd, IDC_LISTBOX), LB_EX_SETITEMINFO,
iItem, Integer(@lbi));
Автор: smirnvlad
Дата сообщения: 25.08.2011 13:35
Maks150988
Выставление информации:
lbi.cchTextMax := (lstrlenW(LPWSTR(pszText)) + 1) * SizeOf(WideChar); указали в байтах размер текста + null

Получение текста:
bRet := IsBadWritePtr(plbi.pszText, plbi.cchTextMax); проверили plbi.cchTextMax байт
bRet := IsBadWritePtr(pcp.ItemData[wParam].pszText, pcp.ItemData[wParam].cchTextMax); тут видимо имелся ввиду IsBadReadPtr
lstrcpynW(plbi.pszText, pcp.ItemData[wParam].pszText, plbi.cchTextMax); скопировали plbi.cchTextMax*2 байт, можно также заменить на CopyMemory

IsBadWritePtr проверяет указатель на nil и доступна ли память на запись, а не то что эта память уже не занята другими данными
так же и IsBadReadPtr проверяет на nil и доступна ли память на чтение, но не то что эта память занята переданным указателем

Выставление текста: (раньше)
GlobalAlloc(... plbi.cchTextMax) выделяет plbi.cchTextMax байт
а
lstrcpynW(... plbi.cchTextMax); копирует plbi.cchTextMax*2 байт

Выставление текста: (сейчас)
GetMem( ... .cchTextMax ) выделяет .cchTextMax байт
CopyMemory(... plbi.cchTextMax); копирует plbi.cchTextMax байт
Автор: R3Pa4eK
Дата сообщения: 04.09.2011 18:08
Как уменьшить размер .dll при использовании ImageEn? А то библиотека весит 2 Мб. И еще, почему version info в delphi неактивное? То есть нельзя ввести названия компании и т.д.
Автор: marser
Дата сообщения: 05.09.2011 06:40
R3Pa4eK

Цитата:
почему version info в delphi неактивное? То есть нельзя ввести названия компании и т.д.

Нет файла ресурсов <Имя проекта>.res или не стоит галочка в <Include version information in project>
Автор: wasilissk
Дата сообщения: 05.09.2011 07:00
R3Pa4eK
>Как уменьшить размер .dll при использовании ImageEn?
http://en.wikipedia.org/wiki/UPX
Автор: druff
Дата сообщения: 06.09.2011 10:59
А в D2006 есть какая-нибудь функция, которая любую строку может преобразовать к виду, пригодному для использования в качестве имени файла? (т.е. спец символы убирает, или заменяет на разрешённые символы)
Автор: wasilissk
Дата сообщения: 06.09.2011 12:23
druff
StringReplace
Автор: Graach
Дата сообщения: 06.09.2011 12:53
Доброго времени суток,

Долго думала где задать этот вопрос...
Есть самописный пакет компонент MyClientDataSet, в котором есть компонента Zclientdataset, которая использует отдельную библиотеку CommunicationLayer.dll и вот пришлось перенести эту библиотеку в другое место и после этого начались проблемы. При открытии формы, на которой находится компонент Zclientdataset, выпадает ошибка, которая поднимается при создании экземпляра класса в библиотеке CommunicationLayer. После этого все вроде нормально работает. Когда закрываю форму, снова поднимается та же ошибка. А когда полностью выхожу из Delphi поднимается исключение: [more=Access violation at address 00000000. Read of address 00000000]
---------------------------
Error
---------------------------
Access violation at address 00000000. Read of address 00000000.
---------------------------
OK Details <<
---------------------------
[171277B4]{MyClientDataSet.bpl} Tusingcommunicationlayerun.TUsingCommunicationLayer.RemoveQuery + $18
[17143AF5]{MyClientDataSet.bpl} Zclientdataset.TZClientDataSet.RemoveFromPool + $35
[171436D4]{MyClientDataSet.bpl} Zclientdataset.TZClientDataSet + $1C
[2000679C]{rtl100.bpl } System.TObject.Free (Line 8832, "sys\system.pas" + 1) + $4
[23483B75]{ZdxBarDBNavigatorPack.bpl} ZdxBarDBNavigator.TZdxBarDBNavButton.Destroy (Line 258, "ZdxBarDBNavigator.pas" + 3) + $6

[2000679C]{rtl100.bpl } System.TObject.Free (Line 8832, "sys\system.pas" + 1) + $4
[2348496F]{ZdxBarDBNavigatorPack.bpl} ZdxBarDBNavigator.TZdxBarDBNavigator.SetVisibleButtons (Line 595, "ZdxBarDBNavigator.pas" + 11) + $0
[2348444E]{ZdxBarDBNavigatorPack.bpl} ZdxBarDBNavigator.TZdxBarDBNavigator.Destroy (Line 451, "ZdxBarDBNavigator.pas" + 1) + $8
[2003F6E3]{rtl100.bpl } Classes.TComponent.DestroyComponents (Line 10464, "common\Classes.pas" + 9) + $6
[2003F4D7]{rtl100.bpl } Classes.TComponent.Destroy (Line 10366, "common\Classes.pas" + 8) + $2
[20139CB0]{vcl100.bpl } Controls.TControl.Destroy (Line 3624, "Controls.pas" + 17) + $7
[20006754]{rtl100.bpl } System.TObject.FreeInstance (Line 8813, "sys\system.pas" + 2) + $2
[20006B86]{rtl100.bpl } System.@ClassDestroy (Line 9513, "sys\system.pas" + 0) + $2
[200328F0]{rtl100.bpl } Classes.TPersistent.Destroy (Line 3715, "common\Classes.pas" + 3) + $6
[2013E09D]{vcl100.bpl } Controls.TWinControl.Destroy (Line 6060, "Controls.pas" + 27) + $7
[201578FC]{vcl100.bpl } Forms.TScrollingWinControl.Destroy (Line 2362, "Forms.pas" + 3) + $7
[20158A5D]{vcl100.bpl } Forms.TCustomForm.Destroy (Line 2937, "Forms.pas" + 14) + $A
[20158A78]{vcl100.bpl } Forms.TCustomForm.Destroy (Line 2939, "Forms.pas" + 16) + $9
[20D27404]{designide100.bpl} Proxies.DestroyHook (Line 283, "Proxies.pas" + 2) + $6
[2000679C]{rtl100.bpl } System.TObject.Free (Line 8832, "sys\system.pas" + 1) + $4
[21D99B0A]{delphivclide100.bpl} VCLFormDesigner.TVCLRootDesigner.FreeRoot (Line 508, "VCLFormDesigner.pas" + 0) + $2
[20D4B5BE]{designide100.bpl} ComponentDesigner.TComponentRoot.InternalDeinitializeDesigner (Line 4433, "ComponentDesigner.pas" + 26) + $B
[20D4B61A]{designide100.bpl} ComponentDesigner.TComponentRoot.InternalDeinitializeDesigner (Line 4440, "ComponentDesigner.pas" + 33) + $B
[20D4D955]{designide100.bpl} ComponentDesigner.TComponentRoot.Close (Line 5241, "ComponentDesigner.pas" + 4) + $5
[216AF060]{delphicoreide100.bpl} DelphiModule.TPascalCodeMgrModHandler.Destroyed (Line 635, "DelphiModule.pas" + 9) + $5
[20A60F45]{coreide100.bpl} DocModul.TCodeIDocModule.NotifyDestroyed (Line 2342, "DocModul.pas" + 2) + $5
[20D243CD]{designide100.bpl} ToolUtils.ForEach (Line 90, "ToolUtils.pas" + 5) + $F
[20A60EB6]{coreide100.bpl} DocModul.TCodeIDocModule.NotifyDestruction (Line 2326, "DocModul.pas" + 2) + $B
[20A5DFEE]{coreide100.bpl} DocModul.TDocModule.BeforeDestruction (Line 956, "DocModul.pas" + 15) + $0
[20006BE5]{rtl100.bpl } System.@BeforeDestruction (Line 9548, "sys\system.pas" + 7) + $0
[2097C98A]{coreide100.bpl} SourceModule.TSourceModule.Destroy (Line 414, "SourceModule.pas" + 0) + $2
[2000679C]{rtl100.bpl } System.TObject.Free (Line 8832, "sys\system.pas" + 1) + $4
[20A5F088]{coreide100.bpl} DocModul.WalkDependencies (Line 1549, "DocModul.pas" + 9) + $2
[20A5F0D1]{coreide100.bpl} DocModul.TDocModule.WalkDependencies (Line 1558, "DocModul.pas" + 1) + $1
[20A5E250]{coreide100.bpl} DocModul.TDocModule.Close (Line 1050, "DocModul.pas" + 12) + $F
[209E3B8B]{coreide100.bpl} ProjectModule.TBaseProject.BeforeDestruction (Line 912, "ProjectModule.pas" + 30) + $4
[2168470D]{delphicoreide100.bpl} BaseDelphiProject.TBaseDelphiProject.BeforeDestruction (Line 1232, "BaseDelphiProject.pas" + 4) + $2
[20006BE5]{rtl100.bpl } System.@BeforeDestruction (Line 9548, "sys\system.pas" + 7) + $0
[21682BCE]{delphicoreide100.bpl} BaseDelphiProject.TBaseDelphiProject.Destroy (Line 719, "BaseDelphiProject.pas" + 0) + $A
[2000679C]{rtl100.bpl } System.TObject.Free (Line 8832, "sys\system.pas" + 1) + $4
[209CD8E2]{coreide100.bpl} ProjectGroup.TProjectGroup.BeforeDestruction (Line 923, "ProjectGroup.pas" + 41) + $2
[20006BE5]{rtl100.bpl } System.@BeforeDestruction (Line 9548, "sys\system.pas" + 7) + $0
[209CD6A2]{coreide100.bpl} ProjectGroup.TProjectGroup.Destroy (Line 869, "ProjectGroup.pas" + 0) + $2
[2000679C]{rtl100.bpl } System.TObject.Free (Line 8832, "sys\system.pas" + 1) + $4
[209D3721]{coreide100.bpl} ProjectGroup.TProjectGroupWrapper.Close (Line 2516, "ProjectGroup.pas" + 0) + $5
[004147AC]{bds.exe } AppMain.TAppBuilder.DestroyProjectGroup (Line 2157, "ui\AppMain.pas" + 16) + $9
[004170CD]{bds.exe } AppMain.TAppBuilder.WindowCloseQuery (Line 3126, "ui\AppMain.pas" + 40) + $3
[2015E025]{vcl100.bpl } Forms.TCustomForm.CloseQuery (Line 5624, "Forms.pas" + 8) + $14
[2015DF4D]{vcl100.bpl } Forms.TCustomForm.Close (Line 5596, "Forms.pas" + 4) + $4
[2015CF72]{vcl100.bpl } Forms.TCustomForm.Resizing (Line 5078, "Forms.pas" + 5) + $11
[2015CF78]{vcl100.bpl } Forms.TCustomForm.WMClose (Line 5083, "Forms.pas" + 0) + $0
[2013C527]{vcl100.bpl } Controls.TControl.WndProc (Line 5146, "Controls.pas" + 83) + $6
[0B0CDA31]{dxSkinsCoreD11.bpl} Dxskinsform.dxSkinGetControllerClassForWindow + $155
[201406A7]{vcl100.bpl } Controls.TWinControl.WndProc (Line 7304, "Controls.pas" + 111) + $6
[20159E7F]{vcl100.bpl } Forms.TCustomForm.WndProc (Line 3512, "Forms.pas" + 136) + $5
[2013FDD0]{vcl100.bpl } Controls.TWinControl.MainWndProc (Line 7073, "Controls.pas" + 3) + $6
[20040E4C]{rtl100.bpl } Classes.StdWndProc (Line 11583, "common\Classes.pas" + 8) + $0
[201407A3]{vcl100.bpl } Controls.TWinControl.DefaultHandler (Line 7334, "Controls.pas" + 23) + $17
[2015BFB6]{vcl100.bpl } Forms.TCustomForm.DefaultHandler (Line 4576, "Forms.pas" + 7) + $4
[2014237D]{vcl100.bpl } Controls.TWinControl.WMSysCommand (Line 8254, "Controls.pas" + 16) + $7
[2015D049]{vcl100.bpl } Forms.TCustomForm.WMSysCommand (Line 5114, "Forms.pas" + 7) + $4
[20A0F76E]{coreide100.bpl} WorkFrm.TWorkForm.WMSysCommand (Line 71, "WorkFrm.pas" + 27) + $4
[20A0FBD6]{coreide100.bpl} MainWorkFrm.TMainWorkForm.WMSysCommand (Line 118, "MainWorkFrm.pas" + 2) + $4
[2013C527]{vcl100.bpl } Controls.TControl.WndProc (Line 5146, "Controls.pas" + 83) + $6
[0B0CDA31]{dxSkinsCoreD11.bpl} Dxskinsform.dxSkinGetControllerClassForWindow + $155
[201406A7]{vcl100.bpl } Controls.TWinControl.WndProc (Line 7304, "Controls.pas" + 111) + $6
[20159E7F]{vcl100.bpl } Forms.TCustomForm.WndProc (Line 3512, "Forms.pas" + 136) + $5
[2013FDD0]{vcl100.bpl } Controls.TWinControl.MainWndProc (Line 7073, "Controls.pas" + 3) + $6
[20040E4C]{rtl100.bpl } Classes.StdWndProc (Line 11583, "common\Classes.pas" + 8) + $0
[201407A3]{vcl100.bpl } Controls.TWinControl.DefaultHandler (Line 7334, "Controls.pas" + 23) + $17
[2015BFB6]{vcl100.bpl } Forms.TCustomForm.DefaultHandler (Line 4576, "Forms.pas" + 7) + $4
[2013CB71]{vcl100.bpl } Controls.TControl.WMNCLButtonDown (Line 5267, "Controls.pas" + 2) + $6
[2015CC34]{vcl100.bpl } Forms.TCustomForm.WMNCLButtonDown (Line 4965, "Forms.pas" + 11) + $4
[20A0F9D6]{coreide100.bpl} MainWorkFrm.TMainWorkForm.WMNCLButtonDown (Line 44, "MainWorkFrm.pas" + 1) + $4
[2013C527]{vcl100.bpl } Controls.TControl.WndProc (Line 5146, "Controls.pas" + 83) + $6
[0F1B3B11]{cxLibraryD11.bpl} Cxcontainer.TcxCustomInnerListBox.CNDrawItem + $695
[201406A7]{vcl100.bpl } Controls.TWinControl.WndProc (Line 7304, "Controls.pas" + 111) + $6
[20159E7F]{vcl100.bpl } Forms.TCustomForm.WndProc (Line 3512, "Forms.pas" + 136) + $5
[2013FDD0]{vcl100.bpl } Controls.TWinControl.MainWndProc (Line 7073, "Controls.pas" + 3) + $6
[20040E4C]{rtl100.bpl } Classes.StdWndProc (Line 11583, "common\Classes.pas" + 8) + $0
[20137642]{vcl100.bpl } Controls.FindControl (Line 2104, "Controls.pas" + 6) + $9
[201625F0]{vcl100.bpl } Forms.TApplication.ProcessMessage (Line 8105, "Forms.pas" + 23) + $1
[2016262A]{vcl100.bpl } Forms.TApplication.HandleMessage (Line 8124, "Forms.pas" + 1) + $4
[2016291F]{vcl100.bpl } Forms.TApplication.Run (Line 8223, "Forms.pas" + 20) + $3
[0042297A]{bds.exe } bds.bds (Line 195, "" + 7) + $7
[/more]. А после нее Access violation at address 20130288 in module 'vcl100.bpl'. Read of address 0000005C. При чем это происходит только на моем компьютере, у всех остальных разработчиков перенос библиотеки CommunicationLayer.dll прошел абсолютно безболезненно. Использую Delphi 2007 с обновлением, ОС WindowsXP. Настройки системы у всех одинаковые. Пробовала заново установить компоненты, стерев все следы предыдущей установки, заново ставить делфи, создала нового пользователя винды и под него поставила все компоненты. Библиотека не регистрируется.
Автор: Maks150988
Дата сообщения: 06.09.2011 14:01
smirnvlad
Сделал как вы сказали, правда пришлось отказаться от этих функций, ограничился проверкой на nil.
extended_listbox_src.zip
Собственно с демо примером не стыдно выкладывать наработки. Правда остается один воспрос, когда остается один элемент в списке, то при его удалении появляется исключение, я пока не понял где ошибка. Кто умнее меня, посмотрите что где не так с массивом, может где-надо что-то еще дополнительно проверить при удалении строки и освобождении памяти указателя.
Автор: R3Pa4eK
Дата сообщения: 07.09.2011 17:59
Как вывести картинку с помощью GDI+ на чужой хэндл (хэндл известный)? У меня ничего не получается. Картинка пропускает загрузку.
[more=Код]
library image;

uses
Windows, GDIPAPI, GDIPOBJ, GDIPUTIL;

{$R *.res}

procedure CreateImage(wnd: HWND; FileName: PChar; X, Y, W, H: Integer) stdcall;
var
img: TGPImage;
graph: TGPGraphics;
p: TGPRectF;
begin
try
img := TGPImage.Create(filename);

p.X:=x;
p.Y:=y;
p.Width:=w;
p.Height:=h;

graph := TGPGraphics.Create(getdc(wnd));
graph.DrawImage(img, p);

except
end;
end;


procedure ImageApplyChanges(wnd: HWND) stdcall;
begin
RedrawWindow(wnd, PRect(0), 0, RDW_FRAME or RDW_INVALIDATE);
InvalidateRect(wnd, PRect(0), true);
end;

procedure ImageDestroy(); stdcall;
begin
img.Free;
graph.Free;
end;



exports createimage;
exports ImageApplyChanges;
exports ImageDestroy;

begin
end.
[/more]
Автор: YuriyRR
Дата сообщения: 08.09.2011 11:40
R3Pa4eK

Цитата:
Картинка пропускает загрузку

а без вызова ImageApplyChanges она видна?
Автор: R3Pa4eK
Дата сообщения: 08.09.2011 18:23
YuriyRR
Нет.
Автор: YuriyRR
Дата сообщения: 09.09.2011 04:57
R3Pa4eK

Цитата:
на чужой хэндл

Точно не знаю, но как я мыслю - если у окна определена своя функция перерисовки то она и будет все стирать и рисовать свое.
Автор: ShIvADeSt
Дата сообщения: 09.09.2011 09:16

Цитата:
Как вывести картинку с помощью GDI+ на чужой хэндл (хэндл известный)? У меня ничего не получается. Картинка пропускает загрузку.

Вообще рисовать на чужом контексте это плохо, так как любой апдейт (а у Вас и redraw и invalidate), стирает все что нарисовано. А если на чужом окне натянут какой то контрол, то нарисовать не получится. Так как вы рисуете на контексте родительского окна, а контрол остается со своим изображением. Может лучше более понятно изложите задачу, что хотите получить? В крайнем случае можно рисовать на контексте десктопа (getdc(0) ).

И еще вы рисуете на клиентской части окна, у нее начальная позиция 0,0. Проверьте что Ваши параметры не выходят за границу окна.

Чтобы убедиться что с рисованием все нормально, проделайте все тоже самое в обычном оконном приложении на собственном DC.
Автор: R3Pa4eK
Дата сообщения: 09.09.2011 15:50
YuriyRR
ShIvADeSt
Проблема решена. Спасибо!

Автор: Edison007007
Дата сообщения: 10.09.2011 12:47
всем, доброго времени суток. Есть одна задачка, нужно написать процедуру для Label'a, которая бы получала координаты (Left, Top, Width, Height), и вторую которая бы устанавливала новые (NewLeft, NewTop, NewWidth, NewHeight)
Автор: smirnvlad
Дата сообщения: 10.09.2011 13:38
Edison007007

Цитата:
нужно написать процедуру для Label'a, которая бы получала координаты (Left, Top, Width, Height), и вторую которая бы устанавливала новые (NewLeft, NewTop, NewWidth, NewHeight)

уже написаны в TControl
через TRect SetBoundsRect GetBoundsRect
для установки через угол, ширину и высоту есть SetBounds
по аналогии можно написать GetBounds
proc GetBounds(var ALeft, ATop, AWidth, AHeight: Integer);
b
ALeft := Left;
...
e;
Автор: Edison007007
Дата сообщения: 10.09.2011 14:31

Цитата:
TRect SetBoundsRect GetBoundsRect

можно поподробней
Автор: smirnvlad
Дата сообщения: 10.09.2011 15:59
Edison007007
[more]
Код: [no]
function TControl.GetBoundsRect: TRect;
begin
Result.Left := Left;
Result.Top := Top;
Result.Right := Left + Width;
Result.Bottom := Top + Height;
end;

procedure TControl.SetBoundsRect(const Rect: TRect);
begin
with Rect do SetBounds(Left, Top, Right - Left, Bottom - Top);
end;

procedure TControl.SetBounds(ALeft, ATop, AWidth, AHeight: Integer);
begin
if CheckNewSize(AWidth, AHeight) and
((ALeft <> FLeft) or (ATop <> FTop) or
(AWidth <> FWidth) or (AHeight <> FHeight)) then
begin
InvalidateControl(Visible, False);
FLeft := ALeft;
FTop := ATop;
FWidth := AWidth;
FHeight := AHeight;
UpdateAnchorRules;
Invalidate;
Perform(WM_WINDOWPOSCHANGED, 0, 0);
RequestAlign;
if not (csLoading in ComponentState) then Resize;
end;
end;

Label.BoundsRect.Left
[/no]
Автор: R3Pa4eK
Дата сообщения: 10.09.2011 20:08
Выручайте. При использовании модуля DMWAPI кнопки на форме не хотят нормально отображаться. Как исправить?
Изображения
[more=Код]
library isAero;

uses
Windows,Composition,DWMAPI;

var
ISAeroGlassSourceM: TMargins;
Blur: PDWMBlurBehind;
ISAeroGlassSourceE: longbool;

function isAeroAddGlass(Handle: HWND; Top, Left, Right, Bottom: Integer): Boolean; stdcall;
begin with ISAeroGlassSourceM do begin
cxRightWidth := Top;
cxLeftWidth := Left;
cyTopHeight := Right;
cyBottomHeight := Bottom;
end;
CompositionServices.ExtendFrameIntoClientArea(Handle, @ISAeroGlassSourceM);
DwmEnableBlurBehindWindow(Handle, Blur);
UpdateWindow(Handle);
end;

function isAeroGlassEnabled: Boolean; stdcall;
begin
DwmIsCompositionEnabled(@ISAeroGlassSourceE);
result:= ISAeroGlassSourceE;
end;

exports isAeroAddGlass;
exports isAeroGlassEnabled;

begin
end.
[/more]
Автор: Dima335
Дата сообщения: 11.09.2011 04:19
Вопрос по базам. Есть БД (ADO), грид, в котором отображается результат запроса

Код: select Employee.*, p.fio from Employee e
INNER JOIN Person p ON e.ID=p.ID
Автор: Frodo_Torbins
Дата сообщения: 11.09.2011 13:51
R3Pa4eK
Это нормально. Чтобы правильно рисовалось, надо менять код отрисовки кнопок, или вообще заменить их своими.
Автор: R3Pa4eK
Дата сообщения: 11.09.2011 14:43
Frodo_Torbins

Цитата:
Чтобы правильно рисовалось, надо менять код отрисовки кнопок

Не подскажете как?
Автор: Frodo_Torbins
Дата сообщения: 11.09.2011 14:49
R3Pa4eK
Так: http://delphihaven.wordpress.com/2010/04/22/setting-up-a-custom-title-bar-reprise/ (коменты тоже читать).
Если же вы работаете с последними версиями VCL, то просто выставьте DoubleBuffered=True.
Автор: R3Pa4eK
Дата сообщения: 11.09.2011 17:30
Frodo_Torbins
Спасибо!

Ребята, я уже задолбался с этим GDI+. Мне нужно загрузить изображения на форму инсталлятора созданного в Inno Setup. Называется она WizardForm. Но у меня не получается. Люди подсказали, что нужно перекрыть оконную процедуру и уже в ней при сообщении WM_PAINT рисовать все что нужно. Но как это сделать я не знаю. Подскажите пожалуйста. [more=Исходник]
library isLogo;

uses
Windows, Messages, GDIPAPI, GDIPOBJ, GDIPUTIL;

{$R *.res}

var
img: TGPImage;
graph: TGPGraphics;
graphp: Pointer;
p: TGPRectF;

procedure create_logo(wnd: HWND; FileName: PChar; X, Y, W, H: Integer) stdcall;
begin
try
img := TGPImage.Create(filename);

p.X:=x;
p.Y:=y;
p.Width:=w;
p.Height:=h;

graph := TGPGraphics.Create(getdc(wnd));
graph.DrawImage(img, p);
GdipCreateFromHWND(wnd, graphp);
UpdateWindow(wnd);
except
end;
end;

procedure Free(); stdcall;
begin
img.Free;
graph.Free;
GdiplusShutdown(1);
end;

exports create_logo;
exports free;

begin
end.
[/more]
Автор: Frodo_Torbins
Дата сообщения: 11.09.2011 18:04
R3Pa4eK
Как по мне, так проще залезть в исходники Inno Setup и исправить все что нужно там.

Добавлено:
Dima335
Как вариант поместить на форму один компонент для таблицы Employee и один для Person. А связывать их уже ручками в коде.
Автор: R3Pa4eK
Дата сообщения: 11.09.2011 18:48
Frodo_Torbins

Цитата:

Как по мне, так проще залезть в исходники Inno Setup и исправить все что нужно там.

Это мне не подходит. Увы...
Автор: Dima335
Дата сообщения: 11.09.2011 23:03
Frodo_Torbins

Цитата:
Как вариант поместить на форму один компонент для таблицы Employee и один для Person. А связывать их уже ручками в коде.

У меня таблиц подобных Person на самом деле много.
Вот попробовал все-таки делать изменение во время отключенного adoquery, так возникает access violation. Возникает он в коде

Код: procedure TcxGridEditingController.UpdateValue;
begin
if IsEditing and FEdit.EditModified then
begin
FEdit.ValidateEdit(True);
FEditingItem.EditValue := FEdit.EditValue;
if FEdit <> nil then
FEdit.ModifiedAfterEnter := False;
end;
end;
Автор: wasilissk
Дата сообщения: 12.09.2011 06:19
Dima335
Наверно логично проверку if FEdit <> nil then перенести двумя строками выше и добавить begin .. end;

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374

Предыдущая тема: MPO File


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.