Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 20.05.2008, 20:57
Tovarisch Tovarisch вне форума
Прохожий
 
Регистрация: 18.03.2008
Сообщения: 33
Репутация: 10
По умолчанию Создание переменной из кода программы.

Господа, Здравствуйте.
Задача с инвертированными списками. Как бы в процессе появилась необходимость по появлению нового значения в параметрах, создавать для него переменную типа Tarray из кода программы(тип опять таки взян с вашего ресурса), прошу отписать о возможных методах решения.
Заранее благодарен.
Ответить с цитированием
  #2  
Старый 20.05.2008, 21:49
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,035
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

- динамический массив
- TList (указатели)
- Связанные списки и т.д.

Все зависит от конкретики задачи. в конце-концов, можно и БД писать.
Ответить с цитированием
  #3  
Старый 21.05.2008, 01:43
Tovarisch Tovarisch вне форума
Прохожий
 
Регистрация: 18.03.2008
Сообщения: 33
Репутация: 10
Радость

Tlist пожалуй подойдет спасибо, вся проблема была собственно в том что я человек неосведомленный мог долго копаться, а тут подсказали что искать).
Ответить с цитированием
  #4  
Старый 24.05.2008, 19:33
Tovarisch Tovarisch вне форума
Прохожий
 
Регистрация: 18.03.2008
Сообщения: 33
Репутация: 10
По умолчанию

Класс TDynArray
Код:
procedure TForm1.FormCreate(Sender: TObject);
var
p:pointer;
NewParam:TDynArray;
begin
NewParam.count:=2;
p:=@NewParam;
ParamList.Add(p);
end;
Возникло Исключение "Access violation at 00413ADA accessing 00000008", я так понимаю что проблема с размерами выделяемой памяти.
Не могу понять причину.Помогите пожалуйста.
Ответить с цитированием
  #5  
Старый 24.05.2008, 19:39
Аватар для Winny
Winny Winny вне форума
Продвинутый
 
Регистрация: 26.05.2007
Адрес: Планета земля, Россия, Москва
Сообщения: 620
Репутация: 30
По умолчанию

Перед строкой "NewParam.count:=2;" напиши:
Код:
NewParam:=TDynArray.Create
P.S.При Create могут быть параметры выполнения, а могут и не быть. Посмотри сам.
__________________

Ответить с цитированием
  #6  
Старый 25.05.2008, 18:12
Tovarisch Tovarisch вне форума
Прохожий
 
Регистрация: 18.03.2008
Сообщения: 33
Репутация: 10
По умолчанию

К сожаления не помогло более того, чисто ради эксперимента Поменял тип NewParam, на стринг(интегер, и еще много всяких), не помогло, то же исключение.
Ответить с цитированием
  #7  
Старый 25.05.2008, 19:33
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,035
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

А ParamList то создан? Т.е. для него Create вызван?
Ответить с цитированием
  #8  
Старый 26.05.2008, 16:24
AlexSku AlexSku вне форума
Специалист
 
Регистрация: 07.05.2007
Адрес: Москва
Сообщения: 884
Репутация: 21699
По умолчанию

p и NewParam - локальные переменные, они будут уничтожены после end (окончания FormCreate). Если данные нужны, то они должны быть или глобальными переменными, или полями формы.
Ответить с цитированием
  #9  
Старый 01.06.2008, 22:22
Tovarisch Tovarisch вне форума
Прохожий
 
Регистрация: 18.03.2008
Сообщения: 33
Репутация: 10
По умолчанию

Теперь собственно все понятно. Новозник другой вопрос.
Ниже приведен код который по идее должен при нажатии на буттон1 выдавать то что хранится в ParamList1.Items[0].p[0], но выдает белеберду, собственно причина условно понятна, я создаю в ходе процедур локальные переменные, память которых отдается обратно в кучу.Такой вопрос вот есть у меня динамический список, и мне в него нужно загнать еще 1 список который не удаляется, я так понимаю только гетмем остается?.
Код:
unit Unit1;

interface

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

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


procedure CreateList();

procedure SelectList(ParamName: string;ListName: Tlist;IndNum: integer);


var
  Form1: TForm1;
  Tfile:Text;

  ParamList1,ParamList2,ParamList3,ParamList4:Tlist;


implementation

uses unit2;



{$R *.dfm}


{------------------------------------------------------------------------------}
procedure CreateList();
var
StrBuf,Str: string;
ListNum: integer;
i:integer;
begin
ListNum:=0;
AssignFile(Tfile,'Enter.txt');
reset(Tfile);
While not EOF(Tfile) do
 begin
  Read(Tfile,StrBuf);
  for i:=1 to length(StrBuf) do
   begin
    if StrBuf[i]='&' then
     begin
      case ListNum of
        0:SelectList(Str,ParamList1,i);
        1:SelectList(Str,ParamList2,i);
        2:SelectList(Str,ParamList3,i);
        3:SelectList(Str,ParamList4,i);
      end;
      Str:='';
      ListNum:=ListNum+1;
     end
    else
     begin
      Str:=Str+StrBuf[i];
     end;
   end;
 end;
 CloseFile(Tfile);
end;
{------------------------------------------------------------------------------}
procedure SelectList(ParamName: string;ListName: Tlist;IndNum: integer);
var
i: integer;
Pda: ^TdynArray;
Pna: TdynArray;
begin
if ListName.Count=0 then
 begin
  Pna.Create(1);
  Pna.p[0]:=ParamName;
  Pna.Add('1');
  ListName.Add(@Pna);
 end
else begin
for i:=0 to ListName.Count-1 do
 begin
  pda:=ListName.Items[i];
  if pda.p[1]=ParamName then
   begin
    pda.Add(IntToStr(IndNum));
    break;
   end;
 end;
Pna.Create(1);
Pna.p[0]:=ParamName;
Pna.Add(IntToStr(IndNum));
ListName.Add(@Pna);
end;
end;
{------------------------------------------------------------------------------}
procedure TForm1.FormCreate(Sender: TObject);
begin
ParamList1:=Tlist.Create;
ParamList2:=Tlist.Create;
ParamList3:=Tlist.Create;
ParamList4:=Tlist.Create;
end;
{------------------------------------------------------------------------------}
procedure TForm1.Button1Click(Sender: TObject);
var
p: ^TDynArray;
begin
CreateList;
p:=ParamList1.Items[0];
Edit1.Text:=p.p[1];
end;

end.
Ответить с цитированием
  #10  
Старый 02.06.2008, 00:36
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,035
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Да, или использование класса (бо как тоже берет память из кучи). Только не забудь где-нить ссылку сохранить, а то потом не доберешься
Ответить с цитированием
  #11  
Старый 02.06.2008, 09:59
Tovarisch Tovarisch вне форума
Прохожий
 
Регистрация: 18.03.2008
Сообщения: 33
Репутация: 10
По умолчанию

А вот насчет класса, можно я поподробней расспрошу?
Класс чего мне собственно создать нужно, я просто в ООП впервые начал чтото делать(3й курс полет нормальный), вот есть Тллист и в него дожны быть записаны указатели, на объект класса, который из воздуха не берется, а мне именно так и нужно)
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 03:09.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter