|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Создание переменной из кода программы.
Господа, Здравствуйте.
Задача с инвертированными списками. Как бы в процессе появилась необходимость по появлению нового значения в параметрах, создавать для него переменную типа Tarray из кода программы(тип опять таки взян с вашего ресурса), прошу отписать о возможных методах решения. Заранее благодарен. |
#2
|
|||
|
|||
- динамический массив
- TList (указатели) - Связанные списки и т.д. Все зависит от конкретики задачи. в конце-концов, можно и БД писать. |
#3
|
|||
|
|||
Tlist пожалуй подойдет спасибо, вся проблема была собственно в том что я человек неосведомленный мог долго копаться, а тут подсказали что искать).
|
#4
|
|||
|
|||
Класс TDynArray
Код:
procedure TForm1.FormCreate(Sender: TObject); var p:pointer; NewParam:TDynArray; begin NewParam.count:=2; p:=@NewParam; ParamList.Add(p); end; Не могу понять причину.Помогите пожалуйста. |
#5
|
||||
|
||||
Перед строкой "NewParam.count:=2;" напиши:
Код:
NewParam:=TDynArray.Create |
#6
|
|||
|
|||
К сожаления не помогло более того, чисто ради эксперимента Поменял тип NewParam, на стринг(интегер, и еще много всяких), не помогло, то же исключение.
|
#7
|
|||
|
|||
А ParamList то создан? Т.е. для него Create вызван?
|
#8
|
|||
|
|||
p и NewParam - локальные переменные, они будут уничтожены после end (окончания FormCreate). Если данные нужны, то они должны быть или глобальными переменными, или полями формы.
|
#9
|
|||
|
|||
Теперь собственно все понятно. Новозник другой вопрос.
Ниже приведен код который по идее должен при нажатии на буттон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
|
|||
|
|||
Да, или использование класса (бо как тоже берет память из кучи). Только не забудь где-нить ссылку сохранить, а то потом не доберешься
|
#11
|
|||
|
|||
А вот насчет класса, можно я поподробней расспрошу?
Класс чего мне собственно создать нужно, я просто в ООП впервые начал чтото делать(3й курс полет нормальный), вот есть Тллист и в него дожны быть записаны указатели, на объект класса, который из воздуха не берется, а мне именно так и нужно) |