Форум: "Основная";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];
Внизработа с указателями в TList Найти похожие ветки
← →
ivanenko © (2004-03-22 17:25) [0]Прошу помочь: проблема с указателямив TList:
Есть структура
type
TListOfData = class(TPersistent)
private
FSeriesName : string[20];
FSeries : TList;
end;
PListOfData = ^TListOfData;
Далее есть список:
FListOfSeries : TList;
Процедура добавления TListOfData в список:
procedure TForm1.btnAddSeriesClick(Sender: TObject);
var iSeriesModalResult : Integer;
ASeries : PListOfData;
begin
vrSeriesEditor := TfrmSeriesEditor.Create(Application);
try
iSeriesModalResult := vrSeriesEditor.ShowModal;
IF iSeriesModalResult=mrOK Then begin
New(ASeries);
ASeries^.FSeriesName := мкSeriesEditor.ledSeriesName.Text;
FListOfSeries.Add(ASeries);
end;
finally
vrSeriesEditor.Free;
end;
end;
И, наконец, процедура чтения из списка:
procedure TForm1.ReadSeries;
var I : Integer;
Title : string[20];
ASeries : PListOfData;
begin
lstSeries.Clear;
IF FListOfSeries.Count>0 Then
For I:=0 To FListOfSeries.Count-1 Do begin
ASeries := FListOfSeries.Items[i];
Title := ASeries^.FSeriesName;
ShowMessage(Title);
end;
end;
Вопрос: при чтении списка вместо Title сплошной мусор. Что я делаю не так?
← →
Ega23 © (2004-03-22 17:36) [1]Разницу между record и class знаешь? Рекомендую сначала книжки почитать.
← →
Тимохов © (2004-03-22 17:39) [2]варианта решения два
либо tlistofdata сделать record, либо не пользоватся new, а вызывать конструктор.
т.е. я говорю, то же самое, что 1.
← →
Плохиш (2004-03-22 17:40) [3]
1ъ
> PListOfData = ^TListOfData;
Убрать
2.
> New(ASeries);
Заменить на
ASeries := TListOfData.Create;
3. Все ^ убрать
← →
Юрий Зотов © (2004-03-22 17:41) [4]1. PListOfData - выбросьте. Объект - это УЖЕ и так указатель.
2. При записи объект надо создавать. Сам по себе он не возникнет.
3. При чтении надо просто привести тип.
Процедура добавления TListOfData в список:
procedure TForm1.btnAddSeriesClick(Sender: TObject);
var
ASeries: TListOfData;
begin
with TfrmSeriesEditor.Create(nil) do
try
if ShowModal = mrOK then
begin
ASeries := TListOfData.Create;
ASeries.FSeriesName := ledSeriesName.Text;
FListOfSeries.Add(ASeries)
end
finally
Free
end
end;
И, наконец, процедура чтения из списка:
procedure TForm1.ReadSeries;
var
I: Integer;
begin
for I := 0 to FListOfSeries.Count - 1 do
ShowMessage(TListOfData(FListOfSeries[i]).FSeriesName)
end;
← →
ivanenko © (2004-03-22 17:44) [5]Я привел не весь код (чтобы не морочить всем голову). Так вот, перед вызовом btnAddSeriesClick у меня вызывается конструктор:
NewSeries := TListOfData.Create
Как я понимаю, процедура New выделяет память под указатель?
← →
Плохиш (2004-03-22 17:45) [6]Короче вторая часть [1]
← →
Тимохов © (2004-03-22 17:47) [7]
> ivanenko © (22.03.04 17:44) [5]
слушайте Юрия Зотова.
зачем делать что-то лишнее? :)))))
а, ну да, вторая часть 1 очень даже актуальна.
← →
Digitman © (2004-03-22 17:50) [8]
> Как я понимаю, процедура New выделяет память под указатель?
видимо, неправильно понимаешь
процедура New() выделяет память под структуру того типа, который декларирован в описании переменной, являющейся факт.параметром процедуры New() .. результат успешной работы процедуры New() - запись адреса выделенного блока памяти в ту переменную, которая была указана как факт.параметр проц-ры
← →
ivanenko © (2004-03-22 17:54) [9]Всем спасибо.
>Юрий Зотов © (22.03.04 17:41) [4]
Отдельная благодарность.
← →
Юрий Зотов © (2004-03-22 18:04) [10]Кстати, рекомендую использовать не TList, а TObjectList. Проще будет. Подробности - в справке.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.039 c