Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Траблы с StringList


Nameziz ©   (2008-11-24 12:19:00) 


unit Unit1;

interface

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

resourcestring
 default_Item = 'Не выбрано';

type
 Tform_Test = class(TForm)
   procedure FormCreate(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 form_Test: Tform_Test;

implementation

{$R *.dfm}

procedure Tform_Test.FormCreate(Sender: TObject);
var
 L: TStrings;
 s: string;

 procedure Load;
 begin
   //
   L.InsertObject(0, 'TestItem', TObject(default_Item));
   //
 end;

begin
 L := TStringList.Create;
 try
   Load;
   ShowMessage(string(L.Objects[0]));
 finally
   L.Free;
 end;
end;

end.



Почему L.Objects[0] возвращает не default_Item, а почему-то 'Project1'.


Palladin   (2008-11-25 15:48:00) [1]


> NieL ©   (25.11.08 12:35) [6]

а вот так лучше смысл видишь?

Var
i:Integer;
l:TStringList;
begin
l:=TStringList.Create;
For i:=0 to 1000 Do
 Ins(l,IntToStr(999-i),IntToStr(i));
For i:=0 to l.Count-1 Do
 Memo1.Lines.Add(l[i]+#9+string(l.Objects[0]));
l.Free;
end;


за одно может просветишь, с чего вдруг AV выскакивает при l.Free и зачем varв объявлении procedure Ins(var L: TStringList; s, _FieldName: string); ? :)

саветчики млин )


clickmaker   (2008-11-25 15:03:00) [2]

> [9] Cobalt ©   (25.11.08 14:59)

да понятно, что указатель на стринг - 4 байта.
А если мы начнем присваивать этому полю локальные переменные, попутно добавляя в список?


Cobalt   (2008-11-25 14:59:00) [3]


> clickmaker ©   (25.11.08 12:43) [8]


type
   rec1 = record
     field1: Cardinal;
     field2: byte;
   end;
   rec2 = record
     field1: Cardinal;
     field2: byte;
     field3: string;
   end;

procedure TForm1.FormCreate(Sender: TObject);
begin
ShowMessage(IntToStr(SizeOf(rec1))+' - '+IntToStr(SizeOf(rec2)));
end;


"Движенья нет, сказал мудрец брадатый..."


clickmaker   (2008-11-25 12:43:00) [4]

> одно строковое поле в recorde ведь равно 4 байта

да ну?


Palladin   (2008-11-25 12:39:00) [5]


> дно строковое поле в recorde ведь равно 4 байта

строка - это не просто указатель, это указатель на структуру время жизни которой управляется rtl. доступ с приведением типов туда сюда может в какой то неожиданный для программиста момент лишить ее жизни. работать в таком режиме нужно с PChar, а не с String


NieL   (2008-11-25 12:35:00) [6]


> Palladin ©   (25.11.08 12:09) [5]
> > NieL ©   (25.11.08 12:06) [4]читать до полного просветленияhttp:
> //www.delphimaster.ru/cgi-bin/forum.pl?id=1225802468&n=18


Не вижу смысла в выделении памяти под запись, ведь автору, судя по вопросу, в объекте StringList'а нужно хранить одно строковое значение и ничего более, одно строковое поле в recorde ведь равно 4 байта, что соответствует допустимому размеру TObject, сохраняем и не паримся.


Palladin   (2008-11-25 12:09:00) [7]


> NieL ©   (25.11.08 12:06) [4]

читать до полного просветления

http://www.delphimaster.ru/cgi-bin/forum.pl?id=1225802468&n=18


NieL   (2008-11-25 12:06:00) [8]

Попробуй так:


unit Unit1;

interface

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

resourcestring
 default_Item = 'Не выбрано';

type
 Tform_Test = class(TForm)
   procedure FormCreate(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

 TItemAsObject = record
   FieldName: string;
 end;

var
 form_Test: Tform_Test;

implementation

{$R *.dfm}

procedure Ins(var L: TStringList; s, _FieldName: string);

 function _Ins: TObject;
 begin
   TItemAsObject(Result).FieldName := _FieldName;
 end;

begin
 L.InsertObject(0, s, _Ins);
end;

procedure Tform_Test.FormCreate(Sender: TObject);
var
 default_List: TStringList;
begin
 default_List := TStringList.Create;
 try
   Ins(
     default_List, 'TestItem', default_Item);
   ShowMessage(string(default_List.Objects[0]));
 finally
   default_List.Free;
 end;
end;

end.


Loginov Dmitry   (2008-11-24 20:04:00) [9]

> L.InsertObject(0, 'TestItem', TObject(default_Item));


Со строками так лучше не извращаться. Есть такая альтернатива:

L.Values['TestItem'] := default_Item;


DevilDevil   (2008-11-24 12:30:00) [10]

попробуй:

ShowMessage(pchar(L.Objects[0]));


Palladin   (2008-11-24 12:24:00) [11]


>  L.InsertObject(0, 'TestItem', TObject(default_Item));

1. и сколько ты после этого еще вставил в первую позицию элементов?
2. за такое вольное обращение с идентификатором типа String - эцих с гвоздями, пока не поймешь, что такое String


Наверх

Титульная страница Поиск, карта сайта Написать письмо