Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > динамические массивы типа запись


Автор: СЭНСЭЙ 15.6.2014, 16:09
Пишу игру на делфи 7.
Использую динамические массивы типа Record
Допустим:
Код

tchar=record
a,b,c:integer;
d:string;
end;

tchars:array of tchar;

var
char:tchars;


Подскажите есть ли функции в делфи или сторонние бибилиотеки для работы с такими массивами.
Есть ли какие то наработанные алгоритмы для работы с такими массивами. Самое главное - удаление элемента по индексу.

Автор: drkot 15.6.2014, 22:09
Цитата(СЭНСЭЙ @  15.6.2014,  16:09 Найти цитируемый пост)
удаление элемента по индексу.

массивы не предназначены для удаления элементов, алгоритмы есть, но они менее эффективны чем у списков.
так что стоит обратить внимание на класс TList

Автор: СЭНСЭЙ 16.6.2014, 01:33
Не подходит мне TList так что буду обходится своими наработанными методами

Автор: drkot 22.6.2014, 04:16
Цитата(СЭНСЭЙ @  16.6.2014,  01:33 Найти цитируемый пост)
Не подходит мне TList 

осмелюсь спросить, ЧЕМ?

Автор: Beltar 22.6.2014, 17:45
Блин, TList внутри и есть динамический массив. Хватит тупить. И вообще дженерики спасут отца русской демократии от бесконечного тайпкаста.

Автор: СЭНСЭЙ 26.6.2014, 22:39
А вы мне можете пример какой нибудь привести?
А то ругаетесь непонятными словами.

Автор: PointerToNil 26.6.2014, 23:30
дженерики в дельфи 7 НЕ спасут  smile 

люби книгу, твою мать - источник знаний!  smile 
связные списки: http://sdb.su/programmirovanie/delphi/239-fundamentalnye-algoritmy-i-struktury-dannyx-v-delphi-chast-3-iz-14.html

и второй незаменимый источник - исходники smile 
на всякий случай, там TList: %ProgramFiles%\Borland\Delphi7\Source\Rtl\Common\Classes.pas

Автор: СЭНСЭЙ 27.6.2014, 18:39
Цитата(PointerToNil @  26.6.2014,  23:30 Найти цитируемый пост)
люби книгу, твою мать - источник знаний!   


Тем кто любит книги на форуме в разделе для новичков делать нечего.

Мне на вокзале в справочном бюро никогда не отвечали "люби расписание - твою мать"

Добавлено через 5 минут и 13 секунд
Цитата(PointerToNil @  26.6.2014,  23:30 Найти цитируемый пост)
и второй незаменимый источник - исходники  

А, да в Делфи же есть исходники. Форум можно закрывать, а вместо него выложить исходники.

Автор: Rennigth 29.6.2014, 23:07
СЭНСЭЙ, все-таки к TList присмотрись... если так уж исходники динамиков нужны, то из него и бери, уже все отлаженно.

Добавлено через 2 минуты и 26 секунд
там только привязка на Pointer-ы а к ты на эти поинтеры свои рекорды привязывай.

Автор: CynicRus 3.7.2014, 22:41
Приведу пример такого TList:

Код

unit DTM_Structure;

interface
   uses
    System.Classes,System.SysUtils,Types,Vcl.Graphics;

 const
  TDTMPointSize = 5*SizeOf(integer)+Sizeof(boolean);
 type
  TDTMPoint = class
   private
    Fx: Integer;
    FY: Integer;
    FColor: Integer;
    FTolerance: integer;
    FAreaSize: integer;
    FBp: boolean;
    public
     procedure Reset;
     constructor Create;
     procedure DrawToCanvas(Render: TCanvas;aColor,Width,Height: integer);
     property x: Integer read Fx write Fx;
     property y: Integer read FY write FY;
     property Color: Integer read FColor write FColor;
     property Tolerance: Integer read FTolerance write FTolerance;
     property AreaSize: integer read FAreaSize write FAreaSize;
     property Bp: boolean read FBp write FBp;
  end;

  TDTMPointList = class
  private
    FDTMPoints: TList;
    function GetCount: Integer;
    function GetDTMPoint(Index: Integer): TDTMPoint;
  public
    constructor Create;
    destructor Destroy; override;
    procedure Clear;
    procedure Assign(Src: TDTMPointList);
    procedure Add(aDTMPoint: TDTMPoint); overload;
    procedure Add(aDTMPoints: TDTMPointList); overload;
    procedure Delete(Index: Integer); overload;
    procedure Delete(aDTMPoint: TDTMPoint); overload;
    function IndexOf(aDTMPoint: TDTMPoint): Integer;

    property Count: Integer read GetCount;
    property DTMPoint[Index: Integer]: TDTMPoint read GetDTMPoint; default;
  end;

****
  { TDTMPoint }

constructor TDTMPoint.Create;
begin
 inherited;
 Reset;
end;

procedure TDTMPoint.DrawToCanvas(Render: TCanvas;AColor,Width,Height: integer);
var
  rx, ry, z, w, h: Integer;
begin
 z := Max(AreaSize shr 1, 1);
 w := Width;
 h := Height;
  for rx := -z to z do
    for ry := -z to z do
      if (x + rx >= 0) and (x + rx < w) and (y + ry >= 0) and (y + ry < h) then
          Render.Pixels[x + rx , y + ry ] := AColor;
     // render.Picture.Assign(bmpBuffer);
end;

procedure TDTMPoint.Reset;
begin
 x:=0;
 y:=0;
 Color:=0;
 Tolerance:=0;
 AreaSize:=0;
 BP:=false;
end;

constructor TDTMPointList.Create;
begin
  FDTMPoints := TList.Create;
end;

destructor TDTMPointList.Destroy;
begin
  Clear;
  FDTMPoints.Free;
  inherited;
end;

procedure TDTMPointList.Delete(Index: Integer);
begin
  if (Index < 0) or (Index >= Count) then
    raise Exception.Create(ErrItemNotFound);

  DTMPoint[Index].Free;
  FDTMPoints.Delete(Index);
end;

procedure TDTMPointList.Delete(aDTMPoint: TDTMPoint);
begin
  Delete(IndexOf(aDTMPoint));
end;

procedure TDTMPointList.Add(aDTMPoints: TDTMPointList);
var
  I: Integer;
begin
  for I := 0 to aDTMPoints.Count - 1 do
    Add(aDTMPoints[I]);
end;

procedure TDTMPointList.Add(aDTMPoint: TDTMPoint);
begin
  FDTMPoints.Add(aDTMPoint);
end;

procedure TDTMPointList.Assign(Src: TDTMPointList);
begin
  Clear;
  Add(Src);
end;

procedure TDTMPointList.Clear;
var
  I: Integer;
begin
  for I := 0 to Count - 1 do
    DTMPoint[I].Free;
  FDTMPoints.Clear;
end;


function TDTMPointList.GetCount: Integer;
begin
  Result := FDTMPoints.Count;
end;

function TDTMPointList.GetDTMPoint(Index: Integer): TDTMPoint;
begin
  if (Index >= 0) and (Index < Count) then
    Result := TDTMPoint(FDTMPoints[Index])
  else
    Result := nil;
end;

function TDTMPointList.IndexOf(aDTMPoint: TDTMPoint): Integer;
begin
  Result := FDTMPoints.IndexOf(aDTMPoint);
end;


Вместо класса TDTMPoint - используешь свой TRecord. Можно унифицировать, если отказаться от рекордов.

Делаешь абстрактный класс с базовыми свойствами, и реализацию на основе TList для этого, например:

Код

TAbstractFile = class
   private
      FName: string;
      FSize: integer;
      FOffset: Integer;

    public
      Constructor Create;
      procedure Reset;virtual;abstract;
      property Name: string read Fname write FName;
      property Size: Integer read FSize write FSize;
      property Offset: integer read FOffset write FOffset;
  end;
****
TAbstractFileList = class
  private
    FAbstractFiles: TList;
    function GetCount: Integer;
    function GetAbstractFile(Index: Integer): TAbstractFile;
  public
    constructor Create;
    destructor Destroy; override;
    procedure Clear;
    procedure Assign(Src: TAbstractFileList);
    procedure Add(aAbstractFile: TAbstractFile); overload;
    procedure Add(aAbstractFiles: TAbstractFileList); overload;
    procedure Delete(Index: Integer); overload;
    procedure Delete(aAbstractFile: TAbstractFile); overload;
    function IndexOf(aAbstractFile: TAbstractFile): Integer;

    property Count: Integer read GetCount;
    property AbstractFile[Index: Integer]: TAbstractFile read GetAbstractFile; default;
  end;


Затем типы, которые необходимо загонять в списки - наследуешь от своего абстрактного класса, например:
Код

   TMyFileStruct = class(TAbstractFile)
    private
      FName: string;
      FSize: integer;
      FOffset: Integer;
    public
      Constructor Create;
      procedure Reset;overload;
      property Name;
      property Size;
      property Offset;
  end;



Потом создаёшь под этот тип экземпляр класса списка, и используешь с удобством списка. Без ручных велосипедов с массивами. При желании - можно запилить метод сортировки как Virtual;Abstract; затем унаследоваться - и впилить для каждого экземпляра ту сортировку, какую треба. Такой путь работает и в Delphi 7 и в XE > XE6.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)