Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.07.2009, 11:11   #1
Zeraim
Ra-Ra ?
Форумчанин
 
Аватар для Zeraim
 
Регистрация: 06.03.2008
Сообщений: 286
По умолчанию Изменение размера динамического массива налету

У меня есть мой тип:
Код:
type
  MyType = record
    Name : string;
    Path : String;
    Ico : TIcon;
  end;
Далее я создаю массив:
Код:
mInfo : array of MyType;
А дело в том что я не могу сказать какой окончательный размер моего массива будет.
То есть просто SetLength(mInfo,...); не подходит, по скольку уже имеющаяся информация теряется.
Пробовал создавать еще один массив, через Copy копировать информацию, но к сожалению работает только со стрингами, остаются иконки.
И что с ними делать, без понятия.
Zeraim вне форума Ответить с цитированием
Старый 26.07.2009, 12:17   #2
N!ckeL
Форумчанин
 
Регистрация: 29.03.2008
Сообщений: 300
По умолчанию

Цитата:
А дело в том что я не могу сказать какой окончательный размер моего массива будет.
Создать максимально возможный массив.
Карп преодолевший водопад становится драконом.
N!ckeL вне форума Ответить с цитированием
Старый 26.07.2009, 12:25   #3
Daramant
Форумчанин
 
Регистрация: 06.01.2009
Сообщений: 340
По умолчанию

Цитата:
просто SetLength(mInfo,...); не подходит, по скольку уже имеющаяся информация теряется.
Почему? Информация не теряется. Цитата из help'a:
Цитата:
Existing characters in the string or elements in the array are preserved, but the content of newly allocated space is undefined
Для проверки набросал пример с твоими типами - действительно все работает.

Может, для большей ясности, приведи код, который не работает.

P.S. Если не принципиально, то лучше использовать классы вместо записей.
Если использовать классы, то у тебя будет массив указателей на объекты и, при изменении размера динамического массива, будут копироваться только они, а не все содержимое, как при использовании записей.
Истинный успех – это то, что Вы сделали в сравнении с тем, что могли бы сделать.
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили "Титаник".
Daramant вне форума Ответить с цитированием
Старый 26.07.2009, 12:29   #4
Zeraim
Ra-Ra ?
Форумчанин
 
Аватар для Zeraim
 
Регистрация: 06.03.2008
Сообщений: 286
По умолчанию

Цитата:
Сообщение от N!ckeL Посмотреть сообщение
Создать максимально возможный массив.
И зачем лишнюю память кушать ? Да и потом не красиво как то будет, использовать к примеру 130 элементов из 500.
Цитата:
Почему? Информация не теряется.
Хм, странно, сейчас еще раз проверю =\\
=================================== =================================== ======================
И правда SetLength работает, и странно почему он у меня до этого терял значения, видать где то накосячил.

Последний раз редактировалось Zeraim; 26.07.2009 в 13:01.
Zeraim вне форума Ответить с цитированием
Старый 26.07.2009, 12:48   #5
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
По умолчанию

Есть более деликатный способ реализации динамических массивов:

Код:
type
  MyType = record
    Name : string;
    Path : String;
    Ico : TIcon;
  end;
  MyTypeArray = array[0..0] of MyType;
  PMyTypeArray = ^MyTypeArray;

var
  mInfo: PMyTypeArray;

begin
  mInfo:=ReallocMemory(mInfo,sizeof(MyType)*10);
  mInfo[0].Name:='asdf';
  writeln(mInfo[0].Name);
end.
И все работает))
Kostia вне форума Ответить с цитированием
Старый 26.07.2009, 12:51   #6
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
По умолчанию

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

 type
  PMyType = ^MyType;
  MyType = record
    Name : string;
    Path : String;
    Ico : TIcon;
  end;  

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses ShellAPI;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
Var List :TList;
    PMy,ReadItm :PMyType;
    PName :Array[0..255]of Char;
    I :Integer;
    VarParam :Word;
begin
 List := TList.Create;
  Try
 // добавление
 New(PMy);
 PMy^.Name := 'Файловая оболочка';
 PMy^.Path := 'C:\WINDOWS\explorer.exe';
 {StrPCopy(PName, PMy^.Path);
  PMy^.Ico.Handle := ExtractAssociatedIcon(hInstance, PName, VarParam); {}
  // заносим в список
 List.Add(PMy);
   // List.Count  // <- всего записей в списке
 // Читаем
 for I:=0 tO List.Count-1 do
 begin
  ReadItm := List.Items[I];
  // что-то делаем с данными
  ShowMessage( ReadItm^.Name + #13#13 + ReadItm^.Path );
 end;
  // Чистим
 for I:=0 to List.Count-1 do
 begin
  ReadItm := List.Items[I];
  Dispose(ReadItm);
 end;
  Finally
 List.Free;
  End;
end;

end.
Alter вне форума Ответить с цитированием
Старый 26.07.2009, 12:57   #7
Daramant
Форумчанин
 
Регистрация: 06.01.2009
Сообщений: 340
По умолчанию

Цитата:
Kostia
Есть более деликатный способ реализации динамических массивов
Я бы сказал более извращенный.

Нет, конечно этот способ хорош, я реализовывал таким способом динамические массивы в Pascal'е. Но нужно пользоваться чем-то более высокоуровневым. И для этого есть array of и SetLength()
Истинный успех – это то, что Вы сделали в сравнении с тем, что могли бы сделать.
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили "Титаник".
Daramant вне форума Ответить с цитированием
Старый 26.07.2009, 13:10   #8
Daramant
Форумчанин
 
Регистрация: 06.01.2009
Сообщений: 340
По умолчанию

Alter зачем возиться с указателями на записи, если есть классы.
Тот же код, но, согласись, намного понятнее:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TMyType = class
  public
    Name : string;
    Path : String;
    Ico : TIcon;

    constructor Create(const aName, aPath: String; aIco: TIcon);
    destructor Destroy; override;
  end;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses ShellAPI;

{$R *.dfm}

{ TMyType }

constructor TMyType.Create(const aName, aPath: String; aIco: TIcon);
begin
  Name := aName;
  Path := aPath;
  Ico := aIco;
end;

destructor TMyType.Destroy;
begin

  inherited;
end;

procedure TForm1.Button1Click(Sender: TObject);
Var List :TList;
    I :Integer;
begin
 List := TList.Create;
  Try
 // Добавление (Ico я не заполнял)
 List.Add(TMyType.Create('Файловая оболочка', 'C:\WINDOWS\explorer.exe', nil));

 // читаем
 for I:=0 tO List.Count-1 do
   with TMyType(List[i]) do
    // что-то делаем
    ShowMessage(Name + #13#13 + Path);

  Finally
   List.Free;
  End;
end;

end.
Истинный успех – это то, что Вы сделали в сравнении с тем, что могли бы сделать.
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили "Титаник".
Daramant вне форума Ответить с цитированием
Старый 26.07.2009, 13:19   #9
0nni
Форумчанин
 
Аватар для 0nni
 
Регистрация: 24.07.2008
Сообщений: 279
По умолчанию

Daramant, согласен (только в деструктор дописать надо ). А если все это засунуть в TobjList или коллекцию, то вопросы распределения памяти вообще отпадут.
Сказал и загрустил от бесспорности своей правоты.
0nni вне форума Ответить с цитированием
Старый 26.07.2009, 13:44   #10
Daramant
Форумчанин
 
Регистрация: 06.01.2009
Сообщений: 340
По умолчанию

0nni
Цитата:
только в деструктор дописать надо
Конечно, Ico нужно освободить.
Цитата:
А если все это засунуть в TobjList
Я обычно TObjectList и использую, а точнее пишу обертку, чтобы постоянно не приводить типы TMyType(List[i]).
Alter использовал TList и я лишь переделал его пример.
Истинный успех – это то, что Вы сделали в сравнении с тем, что могли бы сделать.
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили "Титаник".
Daramant вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сохранение динамического массива Horus92 Помощь студентам 3 07.05.2009 12:36
Создание н-мерного динамического массива Парсифаль Общие вопросы C/C++ 33 02.05.2009 18:29
Удаление динамического массива Сергей089 Общие вопросы C/C++ 3 08.03.2009 13:13
Удаление элементов из динамического массива dashulka Общие вопросы Delphi 4 31.10.2008 14:03
Удаление элемента динамического массива Dogmat Помощь студентам 6 13.07.2008 14:33