Avatar billede zerohero Nybegynder
10. juli 2001 - 23:32 Der 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:

#define MyPic 256
//name: type:  file:
  MyPic Bitmap \"filnavn.bmp\"

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:

GetDeviceCaps(canvas.handle, horzsize);

(finder skærmans bredde)

Hvad gør jeg forkert?

ZeroHero
Avatar billede martinlind Nybegynder
10. juli 2001 - 23:36 #1
Har du været oppe på JB\'s site og kigge
Avatar billede zerohero Nybegynder
10. juli 2001 - 23:46 #2
Nope...

Hvad er nu lige URL\'en til den?
Avatar billede zerohero Nybegynder
10. juli 2001 - 23:58 #3
OK - Jeg har besøgt hans site, men fandt desværre intet...
Avatar billede borrisholt Novice
11. juli 2001 - 08:20 #4
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 ...

http://www.eksperten.dk/spm/59121

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 ....

Jens B
Avatar billede zerohero Nybegynder
11. juli 2001 - 10:43 #5
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?
Avatar billede zerohero Nybegynder
11. juli 2001 - 10:46 #6
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\"
Avatar billede borrisholt Novice
11. juli 2001 - 10:48 #7
zerohero  >> Har lige brugt det forleden dan med gif billeder ...

Jens B
Avatar billede zerohero Nybegynder
11. juli 2001 - 10:56 #8
Det var da mærkligt jeg prøver lige en gang til - helt for fra...
Avatar billede zerohero Nybegynder
11. juli 2001 - 11:02 #9
Dette her står i min .pas fil lige under implementation for at linke test.res til min project:

implementation

{$R *.DFM}
{$R test.res}

Og dette her er hvad der står i min .res fil:

MyPic Bitmap \"face.bmp\"

Burde det ikke være nok - eller mangler jeg at tilføre et eller andet? og når jeg så kompiler er det at Delphi brokker sig.
Avatar billede borrisholt Novice
11. juli 2001 - 11:06 #10
Lad os tage det HELT forfra.

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}

Jens B

Avatar billede borrisholt Novice
11. juli 2001 - 11:12 #11
hvis du vil vide hvor mange farver du har på skaærmen så brug :

GetDeviceCaps(GetDC(0),BITSPIXEL);

Jens B
Avatar billede zerohero Nybegynder
01. august 2001 - 11:00 #12
Hey BorrisHolt forresten ved du en kode der kan fortælle mig hvormange MB Ram jeg har på min computer og hvormange af dem der er fri?
Avatar billede borrisholt Novice
01. august 2001 - 11:01 #13
ja
Avatar billede zerohero Nybegynder
01. august 2001 - 11:03 #14
vil du dele den med os andre :) ???
Avatar billede borrisholt Novice
01. august 2001 - 11:15 #15
Så pyt da, nå nu du lige frem spørger ....

I store træk skal du bruge  TMemoryStatus som du så kan hente diverse ting ud af ....

Jeg har skrevet et stører system info projekt. Som fortæller en masse rare ting om dit system. Nedenfor har du memory delen af det .....

Jeg mangler et stack dumt til min dims ... Måske det var et job for dig ?



unit Memory;


interface

uses
  SysUtils, Windows, Classes;

type
  TMemory = class(TPersistent)
  private
    FMaxAppAddress: integer;
    FVirtualTotal: integer;
    FPageFileFree: integer;
    FVirtualFree: integer;
    FPhysicalFree: integer;
    FAllocGranularity: integer;
    FMinAppAddress: integer;
    FMemoryLoad: integer;
    FPhysicalTotal: integer;
    FPageFileTotal: integer;
    FPageSize: integer;
    FGDIRes: Byte;
    FUserRes: Byte;
    FSystemRes: Byte;

    function GetSystemRes: Byte;
    function GetGDIRes: Byte;
    function GetUSERRes: Byte;
  public
    procedure GetInfo;
    procedure Report(var sl :TStringList);
  published
    property PhysicalTotal :integer read FPhysicalTotal write FPhysicalTotal stored false;
    property PhysicalFree :integer read FPhysicalFree write FPhysicalFree stored false;
    property VirtualTotal :integer read FVirtualTotal write FVirtualTotal stored false;
    property VirtualFree :integer read FVirtualFree write FVirtualFree stored false;
    property PageFileTotal :integer read FPageFileTotal write FPageFileTotal stored false;
    property PageFileFree :integer read FPageFileFree write FPageFileFree stored false;
    property MemoryLoad :integer read FMemoryLoad write FMemoryLoad stored false;
    property AllocGranularity :integer read FAllocGranularity write FAllocGranularity stored false;
    property MaxAppAddress :integer read FMaxAppAddress write FMaxAppAddress stored false;
    property MinAppAddress :integer read FMinAppAddress write FMinAppAddress stored false;
    property PageSize :integer read FPageSize write FPageSize stored false;
    property Win9x_SystemRes: Byte read FSystemRes write FSystemRes stored false;
    property Win9x_GDIRes: Byte read FGDIRes write FGDIRes stored false;
    property Win9x_UserRes: Byte read FUserRes write FUserRes stored false;
  end;

implementation


{$IFDEF ONLYWIN9X}
const
  cSystem = 0;
  cGDI = 1;
  cUSER = 2;

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;


end.


Jens B
Avatar billede zerohero Nybegynder
01. august 2001 - 11:44 #16
1000 tak Borrisholt...

men hvad betyder

\"Jeg mangler et stack dumt til min dims\"

ZeroHero
Avatar billede borrisholt Novice
01. august 2001 - 11:46 #17
hov STACK DUMP.

Noget kode er kan læser hele stackeni gennem og dumper den ud på skærmen ...

Jens B
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