![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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й курс полет нормальный), вот есть Тллист и в него дожны быть записаны указатели, на объект класса, который из воздуха не берется, а мне именно так и нужно) |