Avatar billede cms Nybegynder
16. januar 2000 - 14:16 Der 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]

Hvad skal jeg gøre?

Mvh. chris :-) @ sinnova.dk
Avatar billede sjensen Nybegynder
16. januar 2000 - 22:43 #1
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
Avatar billede cms Nybegynder
18. januar 2000 - 17:20 #2
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.

jeg har også prøvet at lave en

showmessage(inttostr(GetRegionData(TheRgn, dw, nil)));

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!

er det problemet?
Avatar billede sjensen Nybegynder
24. januar 2000 - 10:32 #3
I dit eks. ovenstående, prøv at udskifte p : pointer med p : pchar

Det burde kunne få getmem til at virke rigtigt.

sjensen
Avatar billede blackthorne Nybegynder
24. januar 2000 - 15:40 #4
er det et transparent billed du vil vise, fordi så er der en nemmere og hurtigere løsning
Avatar billede cms Nybegynder
24. januar 2000 - 16:35 #5
blackthorne>>ja, det er det!
Avatar billede cms Nybegynder
24. januar 2000 - 16:37 #6
Men ellers tak, sjensen. Nu virker getmem og GetRegionData!
Avatar billede blackthorne Nybegynder
24. januar 2000 - 16:38 #7
så benyt følgende metode

procedure TForm1.Button1Click(Sender: TObject);

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);

    end;
  finally
    Bitmap.Free;
  end;
end;
Avatar billede cms Nybegynder
25. januar 2000 - 11:37 #8
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!
Avatar billede cms Nybegynder
25. januar 2000 - 11:37 #9
Men jeg giver sjensen pointene, for han svarede på mit oprindelige spørgsmål, og jeg har - tak - fået det til at virke!
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester