10. juli 2001 - 23:32Der er
16 kommentarer og 1 løsning
Resource Files & Screen Resolution
1. Ja, så er den galt igen! Jeg ved at samme spørgsmål har været oppe før her på Eksperten men...
når jeg linker en .res (eller .rc) fil der indeholder en \"filnavn.bmp\" til min Delphi application og kompiler skidtet, så brokker Delphi sig og skriver følgende:
[Error] RLINK32: Unsupported 16bit resource in file \"test.res\"
Jeg har læst i en bog at man kan definere en .bmp 8bit (256 farver)fil ved at gøre skrive følgende i min test.res fil:
Men det hjælper heller ikke... Hvad gør jeg forkert? Mit bitmap format skal helst være 24bit...
2. Her er lige et andet spørgsmål. Jeg ved godt nogle metoder hvor man kan finde skærm-opløsningen eks: 1024X768 og hvordan man ændre det. Men hvordan finder jeg farve opløsningen eks: 32bit Ægte Farver - og hvordan kan jeg ændre det... Jeg læste i en bog en metode der omhandlede emnet det ganske kort men jeg synes ikke rigtigt jeg kunne finde ud af det. Den skrev følgende metode:
GetDeviceCaps(canvas.handle, colorres);
Resultatet blev 24bit uanset, hvilken farve opløsning jeg valgte. Jeg kunne ikke rigtigt forstå det fordi metoden for at finde skærm-opløsningen virkede fint:
zerohero >> Jeg skal dybt beklage at eksemplet ikke findes på min side ... men her er et link til et tidligere svar jeg har givet i Eksperten til hvordan man kompilerer resourser ind i en exe fil ...
mht til sp. 2 så har borland været så flinke at implemtere en klasse ved avn Screen. Den ved en masse omkring din skærm, dog ikke hvem de sidder foran den :-)
Nå men prøs Screen.Width og Screen.Height du må selv gætte hvad de laver ....
Borrisholt>> Jeg kender godt til Screen men jeg synes ikke at jeg kan finde noget omkring color-resolution. Hvordan kan jeg finde farve opløningen via Screen?
Borrisholt>> Det er lige netop det spørgsmål jeg også har set på. Det kan godt være at det virker med WAVE-filer (har ikke prøvet) men prøv lige med en BITMAP, så brokker Delphi sig og skriver følgende:
[Error] RLINK32: Unsupported 16bit resource in file \"hest.res\"
lav et nyt projekt, og gem det i et biblotek. I samme folder ligger du din wav fil. Det skal lige siges at dette eksempel forudsætter du kalder din fil for correct.wav
Inde i Delphi vælger du File->New.. her fra vælger du så en Text. Som resultat af denne handling får du en alm text fil. (som endnu ikke er gemt, eller en del af dit projekt)
i din text fil skriver du så det følgende kode :
////// begin rc fil //////
//Name TYPE Filename MyPic Bitmap filnavn.bmp
////// end rc fil //////
Vælg file->Save As... Giv din text fil det ønskede navn, og HUST at ændere typen til en rc fil.
Der efter trykker du på tilføj fil knappen (den grønne plus) og til føjer din rc fil.
Så trykkes der på Compile, og vupti Construction complete. Nu er din wav fil en del af din exe fil !!!!!
Så skal vi bare have den hevet ud igen :
procedure ExtractFromRes(ResType, ResName : String); begin with TResourceStream.Create(HINSTANCE, Resname, Pchar(ResType)) do try Position := 0; SaveToFile(\'C:\\\' + ResName + \'.bmp\'); finally free; end; end;
procedure TForm1.Button1Click(Sender: TObject); begin ExtractFromRes(\'Bitmap\', \'MyPic\'); end;
di skal altså IKKE bruge \" inde i din rc fil og du skal IKKE selv skrive {$R test.res}
type function LoadLibrary16(LibraryName: PChar): THandle; stdcall; external kernel32 index 35; procedure FreeLibrary16(HInstance: THandle); stdcall; external kernel32 index 36; function GetProcAddress16(Hinstance: THandle; ProcName: PChar): Pointer; stdcall; external kernel32 index 37; procedure QT_Thunk; cdecl; external kernel32 name \'QT_Thunk\'; var hInst16: THandle; SR: Pointer;
function GetFreeSysRes(SysRes: Word): Word; var Thunks: Array[0..$20] of Word; begin Thunks[0]:=hInst16; hInst16:=LoadLibrary16(\'user.exe\'); if hInst16<32 then raise Exception.Create(\'Can\'\'t load USER.EXE!\'); FreeLibrary16(hInst16); SR:=GetProcAddress16(hInst16,\'GetFreeSystemResources\'); if not Assigned(SR) then raise Exception.Create(\'Can\'\'t get address of GetFreeSystemResources\'); asm push SysRes // push arguments mov edx, SR // load 16-bit procedure pointer call QT_Thunk // call thunk mov Result, ax // save the result end; end; {$ENDIF}
{ TMemory }
function TMemory.GetGDIRes: Byte; begin {$IFDEF ONLYWIN9X} Result:=GetFreeSysRes(cGDI) {$ELSE} Result:=0; {$ENDIF} end;
function TMemory.GetSystemRes: Byte; begin {$IFDEF ONLYWIN9X} Result:=GetFreeSysRes(cSystem) {$ELSE} Result:=0; {$ENDIF} end;
function TMemory.GetUSERRes: Byte; begin {$IFDEF ONLYWIN9X} Result:=GetFreeSysRes(cUser) {$ELSE} Result:=0; {$ENDIF} end;
procedure TMemory.GetInfo; var SI :TSystemInfo; MS :TMemoryStatus; begin ZeroMemory(@MS,SizeOf(MS)); MS.dwLength:=SizeOf(MS); GlobalMemoryStatus(MS); MemoryLoad:=MS.dwMemoryLoad; PhysicalTotal:=MS.dwTotalPhys; PhysicalFree:=MS.dwAvailPhys; VirtualTotal:=MS.dwTotalVirtual; VirtualFree:=MS.dwAvailVirtual; PageFileTotal:=MS.dwTotalPageFile; PageFileFree:=MS.dwAvailPageFile; ZeroMemory(@SI,SizeOf(SI)); GetSystemInfo(SI); AllocGranularity:=SI.dwAllocationGranularity; MaxAppAddress:=DWORD(SI.lpMaximumApplicationAddress); MinAppAddress:=DWORD(SI.lpMinimumApplicationAddress); PageSize:=DWORD(SI.dwPageSize); FSystemRes:=GetSystemRes; FGDIRes:=GetGDIRes; FUserRes:=GetUserRes; end;
procedure TMemory.Report(var sl: TStringList); begin with sl do begin Add(\'[Memory]\'); Add(FormatFloat(\'PhysMemTotal=0,##\',PhysicalTotal)); Add(FormatFloat(\'PhysMemFree=0,##\',PhysicalFree)); Add(FormatFloat(\'PageFileTotal=0,##\',PageFileTotal)); Add(FormatFloat(\'PageFileFree=0,##\',PageFileFree)); Add(FormatFloat(\'VirtMemTotal=0,##\',VirtualTotal)); Add(FormatFloat(\'VirtMemFree=0,##\',VirtualFree)); Add(FormatFloat(\'AllocGranularity=0,##\',AllocGranularity)); Add(Format(\'MinAppAddress=%x\',[MinAppAddress])); Add(Format(\'MaxAppAddress=%x\',[MaxAppAddress])); Add(FormatFloat(\'PageSize=0,##\',PageSize)); end; end;
Noget kode er kan læser hele stackeni gennem og dumper den ud på skærmen ...
Jens B
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.