Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

График и отображаемый в память файл

Delphi , Файловая система , Файлы

График и отображаемый в память файл

unit MapGForm;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, SyncObjs, TeEngine, Series, ExtCtrls, TeeProcs, Chart, Grids,
  ComCtrls;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    Chart1: TChart;
    Series1: TBarSeries;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    hMapFile: THandle;
    MapFilePointer: Pointer;
  public
    procedure WmUser(var Msg: TMessage); message wm_user;
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
var
  Address: Pointer;
  X, Y, Total: Integer;
begin
  hMapFile := CreateFileMapping(
    $FFFFFFFF, // file handle ... or memory
    nil, // security
    Page_ReadWrite, // access rights
    0, // high memory size
    10000, // low memory size
    'DdhMappedFileGraph'); // mapped file name
  if hMapFile <> 0 then
    MapFilePointer := MapViewOfFile(
      hMapFile, // handle returned above
      File_Map_All_Access, // access rights
      0, 0, 0) // access the entire mapped file
  else
    ShowMessage('hMapFile = 0');
  if MapFilePointer = nil then
    ShowMessage('MapFilePointer = nil')
  else
  begin
    // add window to area
    Address := pChar(MapFilePointer) + 400;
    while PInteger(Address)^ <> 0 do
      Address := pChar(Address) + 4;
    PInteger(Address)^ := Handle;
  end;
  // start up chart
  Chart1.Series[0].Clear;
  for X := 0 to 9 do
  begin
    Total := 0;
    for Y := 0 to 9 do
    begin
      Address := pChar(MapFilePointer) + (X + Y * 10) * 4;
      Inc(Total, PInteger(Address)^);
    end;
    Chart1.Series[0].AddY(
      Total, IntToStr(X + 1), clRed);
  end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  UnMapViewOfFile(MapFilePointer);
  CloseHandle(hMapFile);
end;

procedure TForm1.WmUser(var Msg: TMessage);
var
  X, Y, Total: Integer;
  Address: Pointer;
begin
  // copy all the data to the graph
  for X := 0 to 9 do
  begin
    Total := 0;
    for Y := 0 to 9 do
    begin
      Address := pChar(MapFilePointer) + (X + Y * 10) * 4;
      Inc(Total, PInteger(Address)^);
    end;
    Chart1.Series[0].YValue[X] := Total;
  end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  X, Y: Integer;
  Address: Pointer;
begin
  X := Random(10);
  Y := Random(10);
  Address := pChar(MapFilePointer) + (X + Y * 10) * 4;
  PInteger(Address)^ := PInteger(Address)^ + Random(10);
  Address := pChar(MapFilePointer) + 400;
  while PInteger(Address)^ <> 0 do
  begin
    PostMessage(PInteger(Address)^, wm_user, 0, 0);
    Address := pChar(Address) + 4;
  end;
end;

initialization
  Randomize;
end.

Here is a translation of the content into Russian:

Создание формы

Процедура TForm1.FormCreate вызывается при создании формы. Она выполняет следующие задачи:

  1. Создает файл памяти с помощью функции CreateFileMapping.
  2. Маппит файл в указатель с помощью функции MapViewOfFile.
  3. Если маппинг неудачен, отображается сообщение об ошибке.
  4. Добавляет handle формы в конкретное место в маппированном файле.

Уничтожение формы

Процедура TForm1.FormDestroy вызывается при уничтожении формы. Она выполняет следующие задачи:

  1. Унимает файл из памяти с помощью функции UnMapViewOfFile.
  2. Закрывает handle файла с помощью функции CloseHandle.

Обработка сообщения WM_USER

Процедура TForm1.WmUser обрабатывает сообщение WM_USER, отправленное формой при необходимости обновить диаграмму новыми данными из файла памяти.

Обработка события таймера

Процедура TForm1.Timer1Timer вызывается каждый раз, когда таймер срабатывает. Она выполняет следующие задачи:

  1. Генерирует случайные координаты X и Y.
  2. Обновляет соответствующее значение в файле памяти с помощью указателя PInteger.
  3. Отправляет сообщение WM_USER форме для обновления диаграммы.

Инициализация случайных чисел

Секция initialization инициализирует генератор случайных чисел с помощью функции Randomize.

Предложения по улучшению кода

Вот некоторые предложения по улучшению кода:

  1. Обработка ошибок: Программа не обрабатывает ошибки должным образом. Например, если создание или маппинг файла памяти неудачен, программа отображает сообщение об ошибке, но продолжает работать. Лучше было бы обработать эти ошибки более надежно.
  2. Организация кода: Код формы немного плотный и трудновчитаемый. Рассмотрите возможность разбить его на меньшие процедуры или функции для упрощения поддержки.
  3. Названия переменных: Некоторые имена переменных, такие как Address и Total, не очень описательны. Рассмотрите возможность использовать более значимые имена.
  4. Кастинг типов: В некоторых местах код использует кастинг типов (например, pChar(Address)). Рассмотрите возможность использования более безопасных способов преобразования типов.

В статье описывается создание графика и отображаемого в память файла с помощью языка программирования Delphi, используя компоненты Chart и Grids.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Файлы ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-10-24 19:59:13/0.0036921501159668/0