![]() |
out of system resources bei erzeugen und löschen von pal
HILFE, ich habe hier eine ärgerliche meldung.
[out of system resources ] Ich habe in meinem EMu das problem,daß ich die farben einer DIB ändern muß und zwar via palette. Nach etwa 100000 wechseln kommt eben die meldung. Kann es sein, daß die objekte immer weiter in den speicher wandern ? Oder kennt jemand eine lösung die palette ändern, ohne das objekt zu löschen und dann neu zu erzeugen ? nun habe ich folgensed codiert
Delphi-Quellcode:
bzw urspünglich
//SelectPalette(DIBDC,DIBhpalette,false);
if DIBhpalette <> 0 then DeleteObject(DIBhpalette); initpal(pal_entrys); CreatePalette(PLogPalette(@aNewHPalette)^); SelectPalette(DIBDC,DIBhpalette,false);
Delphi-Quellcode:
pal_changed = 1
then begin pal_changed:=0; DestroyDIBSurf; initpal(pal_entrys); // hier wird kein objekt erzeugt CreateDIBSurf(aNewHPalette,DIBWidth,DIBHeight); end; end; |
Re: out of system resources bei erzeugen und löschen von pa
CreatePalette() liefert dir ein logisches Palettenhandle zurück, was du aber anscheinend überhaupt nicht abspeicherst oder weiter verwendest - und somit auch nicht freigibst.
|
Re: out of system resources bei erzeugen und löschen von pa
hallo, es wir beim erstenmal bei dem start des emus erzeugt und verwendet.
due updates werden danach ausgeführt. start :
Delphi-Quellcode:
procedure CreateDIBSurf(oNewHPalette:TMyLogPalette; aW, aH: Word);
var lp1 : integer; begin DIBbits := nil; DIBhandle := 0; OLDPalette := 0; DIBhpalette := CreatePalette(PLogPalette(@oNewHPalette)^); DIBDC := CreateCompatibleDC(0); if palset <> 0 then OLDPalette:= SelectPalette(DIBDC, DIBhpalette, true); with DIBheader do begin with bmiHeader do begin biSize := sizeof(TGDIBitMapInfoHeader); biWidth := aW; biHeight := aH; biPlanes := 1; biBitCount := 8; biCompression := BI_RGB; biSizeImage := 0; biXPelsPerMeter := 0; biYPelsPerMeter := 0; biClrUsed := 0; biClrImportant := 0; end; for lp1:=0 to 255 do BMIcolors[lp1] := (lp1+0) and 255; { pal_indices } end; DIBWidth := aW; DIBHeight := aH; DIBWidth_b := ((DIBWidth+3) shr 2) shl 2; DIBSize := DIBWidth_b*DIBHeight; DIBWidth := ((DIBWidth+3) shr 2) shl 2; if OLDHandle<>0 then SelectObject(DIBDC, OLDHandle); if DIBhandle<>0 then DeleteObject(DIBhandle); DIBheader.BMIheader.biWidth := DIBWidth; DIBheader.BMIheader.biHeight :=-DIBHeight; { Top down for me please...} { the minus sign may or may not be necessary on your machine - I'm not sure } { without it - the DIB is bottom up - See old WinG documentation } DIBhandle := CreateDIBSection(DIBDC,pBitmapInfo(@DIBheader)^,DIB_PAL_COLORS,DIBbits,0,0); OLDHandle := SelectObject(DIBDC,DIBhandle); fillchar(dirty_line,1024,0); // zerro draw all lines !!! dirty_lines_on:=0; // = 1 it will bee use dirty lines end; und am ende
Delphi-Quellcode:
wechsel der palette
procedure DestroyDIBSurf;
begin if OLDHandle<>0 then SelectObject(DIBDC, OLDHandle); if DIBhandle<>0 then DeleteObject(DIBhandle); if DIBhpalette<>0 then SelectPalette(DIBDC,DIBhpalette,false); if DIBhpalette<>0 then DeleteObject(DIBhpalette); DeleteDC(DIBDC); end;
Delphi-Quellcode:
procedure update_pal;
begin if pal_changed = 1 then begin pal_changed:=0; DestroyDIBSurf; //SelectPalette(DIBDC,DIBhpalette,false); //DeleteObject(DIBhpalette); initpal(pal_entrys); // hier werden nur neu werte ugewiesen //CreatePalette(PLogPalette(@aNewHPalette)^); //SelectPalette(DIBDC,DIBhpalette,false); CreateDIBSurf(aNewHPalette,DIBWidth,DIBHeight); end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:20 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz