Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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]



> 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.04 c
14-1082017092
Empleado
2004-04-15 12:18
2004.04.11
nostalgie


1-1079557605
lipskiy
2004-03-18 00:06
2004.04.11
Не получается зависимый перключатель на ToolButtons, HELP!


1-1082036179
alienserg
2004-04-15 17:36
2004.04.11
Вызов процедуры родительского окна из формы в DLL. Как?


9-1071007468
i4004
2003-12-10 01:04
2004.04.11
Кто знает?


1-1082637020
killer
2004-04-22 16:30
2004.04.11
StringGrid





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский