![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Траблы с 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