Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.01.04;
Скачать: CL | DM;

Вниз

Траблы с StringList   Найти похожие ветки 

 
Nameziz   (2008-11-24 12:19) [0]


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-24 12:24) [1]


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

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


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

попробуй:

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


 
Loginov Dmitry ©   (2008-11-24 20:04) [3]

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


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

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


 
NieL ©   (2008-11-25 12:06) [4]

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


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.


 
Palladin ©   (2008-11-25 12:09) [5]


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

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

http://delphimaster.net/view/2-1225802468/


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


> Palladin ©   (25.11.08 12:09) [5]
> > NieL ©   (25.11.08 12:06) [4]читать до полного просветленияhttp:
> //delphimaster.net/view/2-1225802468/


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


 
Palladin ©   (2008-11-25 12:39) [7]


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

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


 
clickmaker ©   (2008-11-25 12:43) [8]

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

да ну?


 
Cobalt ©   (2008-11-25 14:59) [9]


> 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 15:03) [10]

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

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


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


> 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);  ? :)

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



Страницы: 1 вся ветка

Текущий архив: 2009.01.04;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.013 c
15-1225721676
kazar
2008-11-03 17:14
2009.01.04
вопросы по Halcyon


2-1227161056
Valerik
2008-11-20 09:04
2009.01.04
ComboBox


8-1188662758
Dr. Andrew
2007-09-01 20:05
2009.01.04
Как получить один цвет из другого?


15-1225574351
er-acer
2008-11-02 00:19
2009.01.04
Патент программы с MySQL


2-1226488903
Vova
2008-11-12 14:21
2009.01.04
DeleteFile