home *** CD-ROM | disk | FTP | other *** search
/ Chip 2000 February / Chip_2000-02_cd.bin / zkuste / Delphi / navody / tip2 / 505.txt < prev    next >
Text File  |  1999-11-15  |  4KB  |  111 lines

  1. {~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}
  2. { Downloaded from The Coder's Knowledge Base                         }
  3. { http://www.netalive.org/ckb/                                       }
  4. {~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}
  5. { @ CKB Header Version.: 1.01                                        }
  6. { @ Category ID........: delphi_misc                                 }
  7. { @ Added to database..: 14.10.98                                    }
  8. {~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}
  9. { @ Title..............: Data in executable                          }
  10. { @ Original Filename..: DataInExe.txt                               }
  11. { @ Author.............: Peter Below                                 }
  12. { @ Description........: How to include and retrieve data in/from exe }
  13. { @ Tested w. Compiler.: not tested yet                              }
  14. { @ Submitted by.......: Mike Orriss (mjo@3kcc.co.uk)                }
  15. {~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}
  16.  
  17.  
  18. You can include any kind of data as a RCDATA or user type resource. This is very simple. The following is from a message on a related item  and should show you the general technique.
  19.  
  20.  Type
  21.    TStrItem = String[39];  { 39 characters + length byte -> 40 bytes }
  22.    TDataArray= Array [0..7, 0..24] of TStrItem;
  23.  
  24.  Const
  25.    Data : TDataArray = (
  26.      ('..', ...., '..' ),  { 25 strings per row }
  27.      ...                   { 8 of these rows }
  28.      ('..', ...., '..' )); { 25 strings per row }
  29.  
  30. The data will end up in your data segment and consume 8K of it. If that is too much for you, put the actual data into a RCDATA resource.  For that you proceed like this. Write a small windowless program that declares the typed constant as above and does nothing more than  write it to a disk file:
  31.  
  32.  Program MakeData;
  33.  Type
  34.    TStrItem = String[39];  { 39 characters 0 length byte -> 40 bytes }
  35.    TDataArray= Array [0..7, 0..24] of TStrItem;
  36.  
  37.  Const
  38.    Data : TDataArray = (
  39.      ('..', ...., '..' ),  { 25 strings per row }
  40.      ...                   { 8 of these rows }
  41.      ('..', ...., '..' )); { 25 strings per row }
  42.  
  43.  Var
  44.    F: File of TDataArray;
  45.  Begin
  46.    Assign( F, 'data.dat' );
  47.    Rewrite(F);
  48.    Write(F, Data);
  49.    Close(F);
  50.  End.
  51.  
  52. Now prepare a resource file, lets call it DATA.RC. It contains only the following line:
  53.  
  54.  DATAARRAY RCDATA "data.dat"
  55.  
  56. Save it, open a DOS box, change to the directory you saved data.rc to (same as data.dat is in!), run the following command:
  57.  
  58.  brcc data.rc   (brcc32 for Delphi 2.0)
  59.  
  60. That gives you a data.res file you can now include in your Delphi project. At runtime you can now generate a pointer to that resource data  and access it as needed.
  61.  
  62.  
  63.  { in a Unit interface section  }
  64.  Type
  65.    TStrItem = String[39];  { 39 characters + length byte -> 40 bytes }
  66.    TDataArray= Array [0..7, 0..24] of TStrItem;
  67.    PDataArray= ^TDataArray;
  68.  Const
  69.    pData: PDataArray = Nil;   { use a Var in Delphi 2.0}
  70.  
  71.  Implementation
  72.  {$R DATA.RES}
  73.  
  74.  Procedure LoadDataResource;
  75.  Var
  76.    dHandle: THandle;
  77.  Begin
  78.    { pData := Nil; if pData is a Var }
  79.    dHandle := FindResource( hInstance, 'DATAARRAY' , RT_RCDATA );
  80.    If dHandle <> 0 Then Begin
  81.      dhandle := LoadResource( hInstance, dHandle );
  82.      If dHandle <> 0 Then
  83.        pData := LockResource( dHandle );
  84.    End;
  85.    If pData = Nil Then
  86.      { failed, issue appropriate error message, use WinProcs.MessageBox,
  87.        not VCL stuff, since the code here will execute as part of the
  88.        program startup sequence and VCL may not have initialized yet! }
  89.  End;
  90.  
  91.  Initialization
  92.    LoadDataResource;
  93.  End.
  94.  
  95. Now you can refer to items in the array with pData^[i,j]-syntax.
  96.  
  97.  - Peter Below
  98.  
  99.  
  100.  
  101.  
  102.  
  103.  
  104.  
  105.  
  106.  
  107.  
  108.  
  109.  
  110.  
  111.