Autor Téma: JCl filemapping Timer1Timer access violation error  (Přečteno 151 krát)

Offline vangog

  • Hrdina
  • ****
  • Příspěvků: 372
  • Karma: 0
    • Verze Delphi: 7
JCl filemapping Timer1Timer access violation error
« kdy: 06-11-2019, 09:59:08 »
Na Delphi 7 jsem si nainstaloval JCL. Jeden z příkladů obsahuje složku windows/filemapping a soubor MapTestForm:

Kód: Delphi [Vybrat]
  1. unit MapTestForm;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  7.   StdCtrls, ExtCtrls, JclFileUtils;
  8.  
  9. type
  10.   TTestForm = class(TForm)
  11.     mmData: TMemo;
  12.     Label1: TLabel;
  13.     edFile: TEdit;
  14.     edMap: TEdit;
  15.     odFile: TOpenDialog;
  16.     Label3: TLabel;
  17.     cmdFile: TButton;
  18.     cmdGo: TButton;
  19.     cmdWrite: TButton;
  20.     cbTime: TComboBox;
  21.     Timer1: TTimer;
  22.     Label5: TLabel;
  23.     Memo1: TMemo;
  24.     procedure cmdFileClick(Sender: TObject);
  25.     procedure FormCreate(Sender: TObject);
  26.     procedure cmdGoClick(Sender: TObject);
  27.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  28.     procedure Timer1Timer(Sender: TObject);
  29.     procedure cbTimeChange(Sender: TObject);
  30.     procedure cmdWriteClick(Sender: TObject);
  31.   private
  32.     FMap: TJclCustomFileMapping;
  33.     FView: TJclFileMappingView;
  34.   public
  35.     { Public declarations }
  36.   end;
  37.  
  38. var
  39.   TestForm: TTestForm;
  40.  
  41. implementation
  42.  
  43. {$R *.DFM}
  44.  
  45. uses
  46.   JclAnsiStrings,
  47.   MapWriteForm;
  48.  
  49. procedure TTestForm.cmdFileClick(Sender: TObject);
  50. begin
  51.   if odFile.Execute then
  52.     edFile.Text := odFile.Files[0];
  53. end;
  54.  
  55. procedure TTestForm.FormCreate(Sender: TObject);
  56. begin
  57.   cbTime.ItemIndex := 0;
  58. end;
  59.  
  60. procedure TTestForm.cmdGoClick(Sender: TObject);
  61. var
  62.   ViewIndex: Integer;
  63. begin
  64.   if edFile.Text <> '' then
  65.   begin
  66.     FMap := TJclFileMapping.Create(edFile.Text, fmOpenReadWrite, edMap.Text, PAGE_WRITECOPY, 0, nil);
  67.     ViewIndex := FMap.Add(GENERIC_READ or GENERIC_WRITE, GetFileSize(TJclFileMapping(FMap).FileHandle, nil), 0);
  68.     FView := FMap.Views[ViewIndex];
  69.   end
  70.   else
  71.   begin
  72.     FMap := TJclSwapFileMapping.Create(edMap.Text, PAGE_WRITECOPY, 4096, nil);
  73.     ViewIndex := FMap.Add(GENERIC_READ or GENERIC_WRITE, 4096, 0);
  74.     FView := FMap.Views[ViewIndex];
  75.   end;
  76.   cmdGo.Enabled := False;
  77.   cmdWrite.Enabled := True;
  78.   Timer1.Enabled := True;
  79.   Timer1Timer(Self);
  80. end;
  81.  
  82. procedure TTestForm.FormClose(Sender: TObject; var Action: TCloseAction);
  83. begin
  84.   FView.Free;
  85.   FMap.Free;
  86. end;
  87.  
  88. procedure TTestForm.Timer1Timer(Sender: TObject);
  89. var
  90.   S: AnsiString;
  91.   L: Cardinal;
  92. begin
  93.   mmData.Clear;
  94.  
  95.   SetLength(S, 4096);
  96.   FView.Position := 0;
  97.   L := FView.Read(S[1], 4096);
  98.   if L > 0 then
  99.   begin
  100.     StrResetLength(S);
  101.     mmData.Lines.Text := string(S);
  102.   end;
  103. end;
  104.  
  105. procedure TTestForm.cbTimeChange(Sender: TObject);
  106. begin
  107.   Timer1.Interval := (cbTime.ItemIndex + 1) * 1000;
  108. end;
  109.  
  110. procedure TTestForm.cmdWriteClick(Sender: TObject);
  111. var
  112.   S: AnsiString;
  113. begin
  114.   WriteForm := TWriteForm.Create(Self);
  115.   WriteForm.ShowModal;
  116.   S := AnsiString(WriteForm.mmWrite.Lines.Text);
  117.   if Length(S) > 0 then
  118.   begin
  119.     FView.Position := 0;
  120.     FView.Write(S[1], Length(S));
  121.   end;
  122. end;
  123.  
  124. end.
  125.  

Když to spustím, zadám soubor wav, který chci otevřít, zmáčknu tlačítko Go, tak mi program hlásí chybu Access Violation na řádku s Timer1Timer(Self);. Můžete mi vysvětlit v čem je chyba a jak to opravit, rozjet?

Případně vysvětlit co se od tohoto skriptu vlastně očekává (co má program dělat).
« Poslední změna: 06-11-2019, 10:16:19 od vangog »

Offline vangog

  • Hrdina
  • ****
  • Příspěvků: 372
  • Karma: 0
    • Verze Delphi: 7
Re:JCl filemapping Timer1Timer access violation error
« Odpověď #1 kdy: 06-11-2019, 10:38:45 »
Blíže jsem zjistil, že ta chyba nastane na řádku:
L := FView.Read(S[1], 4096);

Online Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2402
  • Karma: 103
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (Tokyo)
    • O Delphi v češtině
Re:JCl filemapping Timer1Timer access violation error
« Odpověď #2 kdy: 06-11-2019, 13:08:14 »
Případně vysvětlit co se od tohoto skriptu vlastně očekává (co má program dělat).

Pokud je zadany soubor, tak nacte az prvnich 4096 byte a zobrazi je v memo.
Existuje ten tvuj wav? Program jsem nezkousel, D7 nemam, ale ve vyssich verzi pouzivam TJclAnsiMappedTextReader
Embarcadero MVP - Czech republic