Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> динамические массивы типа запись, работа с динамическими массивами 
:(
    Опции темы
СЭНСЭЙ
Дата 15.6.2014, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 432
Регистрация: 20.3.2006

Репутация: нет
Всего: нет



Пишу игру на делфи 7.
Использую динамические массивы типа Record
Допустим:
Код

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

tchars:array of tchar;

var
char:tchars;


Подскажите есть ли функции в делфи или сторонние бибилиотеки для работы с такими массивами.
Есть ли какие то наработанные алгоритмы для работы с такими массивами. Самое главное - удаление элемента по индексу.
PM MAIL   Вверх
drkot
Дата 15.6.2014, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: 5
Всего: 8



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

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


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
СЭНСЭЙ
Дата 16.6.2014, 01:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 432
Регистрация: 20.3.2006

Репутация: нет
Всего: нет



Не подходит мне TList так что буду обходится своими наработанными методами
PM MAIL   Вверх
drkot
Дата 22.6.2014, 04:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: 5
Всего: 8



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

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


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
Beltar
Дата 22.6.2014, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: 3
Всего: 7



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


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
СЭНСЭЙ
Дата 26.6.2014, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 432
Регистрация: 20.3.2006

Репутация: нет
Всего: нет



А вы мне можете пример какой нибудь привести?
А то ругаетесь непонятными словами.
PM MAIL   Вверх
PointerToNil
Дата 26.6.2014, 23:30 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата



*


Профиль
Группа: Участник
Сообщений: 108
Регистрация: 17.6.2013

Репутация: 3
Всего: 6



дженерики в дельфи 7 НЕ спасут  smile 

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

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


Это сообщение отредактировал(а) PointerToNil - 26.6.2014, 23:38
PM MAIL   Вверх
СЭНСЭЙ
Дата 27.6.2014, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 432
Регистрация: 20.3.2006

Репутация: нет
Всего: нет



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


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

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

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

А, да в Делфи же есть исходники. Форум можно закрывать, а вместо него выложить исходники.
PM MAIL   Вверх
Rennigth
Дата 29.6.2014, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 49
Всего: 76



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

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


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
CynicRus
Дата 3.7.2014, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 248
Регистрация: 31.5.2012

Репутация: нет
Всего: 5



Приведу пример такого 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.

Это сообщение отредактировал(а) CynicRus - 3.7.2014, 22:42
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0842 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.