16. januar 2000 - 14:16Der er
8 kommentarer og 1 løsning
GetRegionData problem
Hej. Jeg håber, nogen kan hjælpe mig mit lille problem.
Jeg har lavet en form, der bruger nogle windows-region funktioner til at vise et gennemsigtigt bitmap på skærmen!
Mit problem er, at det går lidt langsomt, og at jeg derfor gerne ville gemme region'ens data i en fil, så den bare kunne loades derfra, når man starter programmet!
Jeg fandt frem til, at man skal bruge funktionen GetRegionData, og for at få det frem igen, funktionen CreateRegionEx.
Mit problem er bare, at jeg ikke kan få GetRegionData til at virke! Den bliver ved med at sige, at jeg ikke har allokeret hukommelse nok!
Er det mon et spørgsmål om konvertering af 32-bit ints og 16-bit, eller har jeg gjort noget galt: [ps: jeg har allerede lavet regionen tidligere i programmet] [TheRgn er en handle til regionen]
var dw: dword; p: pointer; begin dw:=0; dw:=GetRegionData(TheRgn, dw, nil); GetMem(p, dw); try dw:=GetRegionData(TheRgn, dw, p); if dw<>1 then beep; finally FreeMem(p); end;
[senere havde jeg tænkt mig at gemme indholdet af det, p peger på, i en fil!] [men det sidste kald til GetRegionData returnerer det samme som det første]
Der bliver investeret massivt i AI. Teknologien er mere tilgængelig end nogensinde, og ambitionerne er høje. Alligevel oplever mange virksomheder, at resultaterne udebliver.
check dw efter første getregiondata kald for at sikre at du ikke får 0 eller 1 tilbage, fordi thergn ikke peger på noget alligevel. Hvis du får 0 eller 1 tilbage vil du ikke få allokeret noget hukommelse. Så inden getmen, test på dw.
Hvis den fejler er det fordi du ikke har fat i det du vil have, og måske fordi du ikke har udfyldt thereg strukturen godt nok.
sjensen>>jeg har ikke inkluderet den del af programmet, hvor TheRgn initialiseres. men ved bagefter at kalde SetWindowRegion (eller hvad den nu hedder) ved jeg, at TheRgn ER gyldig, og virkelig peger på noget.
hvor den altså skriver: "1488" eller noget lignende på skærmen. altså fordi man til netop denne region skal bruge 1488 bytes!
i win sdk-hjælpfilen til delphi skriver de i "quick info", at den i 95 skal bruge 16-bit integers. men delphiparametren til proceduren er jo en cardinal, altså en 32-bit!
var Bitmap : TBitMap; begin Bitmap := TBitmap.Create; try with Bitmap do begin LoadFromFile('c:\Program Files\Common Files\Borland Shared\Images\Splash\256color\factory.bmp'); Transparent := True; TransParentColor := BitMap.canvas.pixels[50,50]; Form1.Canvas.Draw(0,0,BitMap); TransparentMode := tmAuto; // Transparent color now is clDefault = TColor($20000000); Form1.Canvas.Draw(50,50,BitMap);
blackthorne>>jeg har brug for at vise en transparent billede som en slags splashscreen, når man starter programmet. jeg har fundet ud af at lave en window-region, der afskærer formens form (istedet for en grå firkant får den lige præcis den form - altså shape - der passer til billedet, og dermed er det transparent, og andre applikationer bliver vist nedenunder. desværre er denne metode relativt langsom - det tager 5-10 sek., og endnu længere tid på gamle maskiner. Derfor ville jeg gerne gemme dataene i en fil, og dermed kunne loade dem, når programmet starter - hvilket jeg ville regne med, ville spare en del tid! En splashscreen skal jo også helst vises med det samme - mens programmet indlæses!
Men jeg giver sjensen pointene, for han svarede på mit oprindelige spørgsmål, og jeg har - tak - fået det til at virke!
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.