Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2009.01.04;
Скачать: [xml.tar.bz2];

Вниз

Траблы с 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.006 c
2-1227161746
b@v
2008-11-20 09:15
2009.01.04
DBGrid и прокрутка


15-1226242743
ProgRAMmer Dimonych
2008-11-09 17:59
2009.01.04
Подскажите программку для создания видео


15-1226064105
Suspended
2008-11-07 16:21
2009.01.04
Пятничную задачку не хотите?


1-1202899639
Darvin
2008-02-13 13:47
2009.01.04
Приложение с несколькими chm файлами справки


15-1225720717
blackman
2008-11-03 16:58
2009.01.04
Что с сайтом?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский